<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-galvin-regext-epp-variants-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.1 -->
  <front>
    <title abbrev="EPP Variants">Domain variant support for EPP</title>
    <seriesInfo name="Internet-Draft" value="draft-galvin-regext-epp-variants-00"/>
    <author initials="J." surname="Galvin" fullname="James Galvin">
      <organization>Identity Digital</organization>
      <address>
        <postal>
          <city>Bellevue</city>
          <country>Washington</country>
        </postal>
        <email>jgalvin@identity.digital</email>
      </address>
    </author>
    <author initials="A." surname="Gulbrandsen" fullname="Arnt Gulbrandsen">
      <organization>ICANN</organization>
      <address>
        <postal>
          <street>6 Rond Point Schumann, Bd. 1</street>
          <city>Brussels</city>
          <code>1040</code>
          <country>Belgium</country>
        </postal>
        <email>arnt@gulbrandsen.priv.no</email>
        <uri>https://icann.org/ua</uri>
      </address>
    </author>
    <date year="2024" month="September" day="18"/>
    <area>Applications</area>
    <workgroup>EXTRA</workgroup>
    <keyword>EPP</keyword>
    <abstract>
      <?line 36?>

<t>This document defines an EPP extension allowing clients to learn about
and manipulate variant groups of domains, ie. groups of domains whose
names are equivalent in a registry-defined way and are tied to a
single registrant.</t>
    </abstract>
  </front>
  <middle>
    <?line 43?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Spelling is not necessarily uniform. For example, an è and an e may be
regarded as equivalent in some languages, and as different in others.</t>
      <t>Some registries plan to support this explicitly, with groups of
variant domains that can only be registered by the same registrant.</t>
      <t>This document defines an EPP extension allowing clients to learn about
and manipulate variant groups. (EPP is defined in <xref target="RFC5730"/>.)</t>
      <t>Registering a domain creates a variant group and the first domain in
the group becomes the group's primary domain. Subsequent domains in
the same group can only be registered by the same registrar, which
asserts that it is acting on behalf of the same registrant. Domains in
a variant group are transferred or deleted together with the primary
domain. The remainder of this document describes the specific details.</t>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="terms">
      <name>Terms</name>
      <t>Variant group: An implicit set of domains. This set is not expressed
explicitly in EPP, because it can be impractically large. At the time
of writing, a domain is registered whose a variant group would contain
10¹⁵ variants.</t>
      <t>Primary domain: The chronologically first domain in a variant group.</t>
      <t>Variant domain: A domain in a variant group.</t>
      <t>Allocatable variant: A domain that has not been registered, and which
is conceptually tied to an existing primary domain.</t>
      <t>Allocated variant: A domain that has been registered, and which is
tied to an existing primary domain.</t>
      <t>Grandfathered domain: A preexisting domain that would form a variant
group if it were registered now.</t>
      <t>Blocked domain: A domain that has not been registered, and which is
conceptually tied to one or more existing grandfathered domains.</t>
      <t>Normal domain: Any domain that has no variants, ie. its variant group
would consist of only the domain itself. "42.example" might be such a
domain, assuming that there are no equivalent variants of "42".</t>
    </section>
    <section anchor="epp-commands">
      <name>EPP Commands</name>
      <section anchor="epp-ltcheckgt-command">
        <name>EPP &lt;check&gt; command</name>
        <t>The EPP &lt;check&gt; command may return three new results:</t>
        <ul spacing="normal">
          <li>
            <t>The domain cannot be provisioned because it is a variant of a
primary domain, and the primary domain was not mentioned in the
&lt;check&gt; command.</t>
          </li>
          <li>
            <t>The domain cannot be provisioned because it is a variant of at
least one grandfathered domain.</t>
          </li>
          <li>
            <t>The domain cannot be provisioned because it is a variant in a group
that is currently being transferred to a different registrar.</t>
          </li>
        </ul>
        <t>TODO XML examples of at least one</t>
      </section>
    </section>
    <section anchor="epp-ltinfogt-command">
      <name>EPP &lt;info&gt; command</name>
      <t>The EPP &lt;info&gt; command is not extended, but its response is extended
with the name of the primary domain if the &lt;info&gt; command concerns a
variant domain.</t>
      <t>TODO XML example of response</t>
    </section>
    <section anchor="epp-lttransfergt-command">
      <name>EPP &lt;transfer&gt; command</name>
      <t>The EPP &lt;transfer&gt; command is modified as follows:</t>
      <ul spacing="normal">
        <li>
          <t>A transfer of a primary domain also transfers all of the variants
of that domain.</t>
        </li>
        <li>
          <t>A transfer of a variant domain returns en error.</t>
        </li>
      </ul>
    </section>
    <section anchor="epp-ltcreategt-command">
      <name>EPP &lt;create&gt; command</name>
      <t>The EPP &lt;create&gt; command may have three new errors, as described
in the &lt;check&gt; section above.</t>
      <t>The EPP &lt;create&gt; command's task is to provision a new normal
domain. The task of converting an allocatable domain into an allocated
domain is instead performed using the update command.</t>
    </section>
    <section anchor="epp-ltupdategt-command">
      <name>EPP &lt;update&gt; command</name>
      <t>The EPP &lt;update&gt; command is extended to cover two new major
tasks:</t>
      <t>When an EPP client wishes to provision a new domain in a variant
group, it uses the &lt;update&gt; command rather than the
&lt;create&gt; command. This informs the EPP server that the client
understands that the task is to provision a variant domain rather than
a new normal domain, and asserts that the two domains belong to the
same registrant.</t>
      <t>Note that depending on registry policy, the variant domain may
e.g. share name servers with the primary domain. This implies that the
set of elements required/permitted for a variant domain may differ
from that of a primary domain or a normal domain.</t>
      <t>TODO update XML that shows the primary domain specified</t>
      <t>When an EPP client wishes to turn a grandfathered domain into a
primary domain, it issues an &lt;update&gt; command including the list
of variant domains, which the EPP client thereby asserts belong to the
same registrant.</t>
      <t>TODO update XML that shows the list of variant domains specified</t>
    </section>
    <section anchor="epp-ltdeletegt-command">
      <name>EPP &lt;delete&gt; command</name>
      <t>The EPP &lt;delete&gt; command is extended with one new task: Deleting the
primary domain deletes all allocated variant groups along with the
primary domain.</t>
      <t>Deleting a variant group other than the primary deletes just that
domain.</t>
    </section>
    <section anchor="epp-renew-command">
      <name>EPP renew command</name>
      <t>The EPP renew command is not extended.</t>
      <t>The server <bcp14>MAY</bcp14> reject renewals while a variant group is being
transferred.</t>
    </section>
    <section anchor="epp-lttransfergt-query-command">
      <name>EPP &lt;transfer&gt; query command</name>
      <t>The EPP &lt;transfer&gt; query command is not extended.</t>
      <t>Note that because variant groups are transferred as a group, the
result of the a &lt;transfer&gt; query command is necessarily the same
for all domains in a group. Therefore, the result of &lt;transfer&gt;
query command for any domain in a variant group applies to all domains
in the group.</t>
    </section>
    <section anchor="result-codes">
      <name>Result codes</name>
      <t>The following additional result codes are defined:</t>
      <t>23x1: Change impossible because of a transfer in progress.</t>
      <t>23x2: Change impossible because something is not a variant.</t>
      <t>This error code is used when a change presupposes that two domains
belong to the same variant group, but the EPP server's implementation
disagrees.</t>
      <t>23x3: Change impossible due to invalid primary domain</t>
      <t>This error code is used when the primary domain specified in the
command is not registered, or is not registered via this registrar.</t>
      <t>23x4: Change impossible due to unspecified primary domain</t>
      <t>This error code is used when a command needs to specify a primary
domain, and does not.</t>
      <t>23x5: Specified domain is grandfathered</t>
      <t>This error code is used when a domain specifies a primary domain, and
the change is impossible because the specified domain is grandfathered
instead.</t>
      <t>23x6: Specified domain is allocatable, but not by you.</t>
      <t>This result code is used when a domain is a member of a variant set,
and the command did not refer to the primary domain.</t>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>If two domains are different according to the DNS rules and identical
in the eyes of the intended audience, then the audience may be
confused. Confusion can always have security-related effects.</t>
      <t>This extension expresses the relationships between variants clearly,
making it a little more difficult for a would-be impersonator to
register a variant of another registrant's existing domain.</t>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC5730">
        <front>
          <title>Extensible Provisioning Protocol (EPP)</title>
          <author fullname="S. Hollenbeck" initials="S." surname="Hollenbeck"/>
          <date month="August" year="2009"/>
          <abstract>
            <t>This document describes an application-layer client-server protocol for the provisioning and management of objects stored in a shared central repository. Specified in XML, the protocol defines generic object management operations and an extensible framework that maps protocol operations to objects. This document includes a protocol specification, an object mapping template, and an XML media type registration. This document obsoletes RFC 4930. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="69"/>
        <seriesInfo name="RFC" value="5730"/>
        <seriesInfo name="DOI" value="10.17487/RFC5730"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 253?>

<section anchor="open-issues">
      <name>Open issues</name>
      <t>Open issue: Assign numbers to the error codes, properly.</t>
      <t>Open issue: Not clear that there are any security considerations here
— the relationships between the domains may have some, but those exist
outside EPP, EPP merely describes them. In Italian, caffe and caffè
are variants of the same thing, it's not clear that linking them in a
protocol affects security in any way.</t>
      <t>Open issue: Check how to insert a DS record in a variant domain.</t>
      <t>Open issue: Can a unicode upgrade cause domains to become
grandfathered?  Yes, I think, and the terminology covers it, but as of
now, it's difficult for the EPP client to understand the situation.
Extending the &lt;info&gt; command would help here, perhaps.</t>
      <t>Open issue: Creating a primary domain now consists of a two-step
process, &lt;create&gt; and then &lt;update&gt;. The first step turns
all variants into blocked domains, the second makes them
allocatable. It's not clear to me why the two-step process is
desirable, compared to a one-step process where a &lt;create&gt;
command creates a primary domain if the variant group contains other
domains than that one. That needs a couple of sentences of
explanation, or else a change.</t>
      <t>Open issue: &lt;Delete&gt; now cascades and deletes many domains.
Should it instead turn any variant domains into grandfathered domains?</t>
      <t>Open issue: Should the &lt;info&gt; of the primary domain also return
the list of allocated variants? Probably not — at the moment, this
extension has the client send a set that the server checks, and the
server may need to generate a set for checking, but the server does
not need to generate a list for returning.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA71a224cxxF976/oUICVBLsrUpZva8MKRco2A4lURPqGIAh6
Z3p3W5yZHk/3cLUwBCT/kA/Io38gD3m1/8RfklPVPdddUjYM5MVa9vR01+VU
1akaT6dT4bwq0r+rzBZ6Ln1Va2HKin85//Dw8KPDhyJRfi6dT4WrF7lxztjC
b0tsP3t69ZlQlVZzeVyWmcFGPHNis5rLp99cvTwWIrVJoXLsTSu19FOj/XJa
6ZV+7ae6LKc3qjKq8G56eCiENz7DzlObK1PI+Ei6uixt5eXSVvLpixdCLRaV
vpnTb/lVfF1kqsCduhDXm7mQchp21n5tq7mYyiDCn/FfJz9X2Y0psMlWeOUs
1QXu3cpTszJeZVhP8OdcPtFZpm9gDizYuvAV1r5Wbm2Klbf0uoaU2Vy+WvF5
fzLxoFkaD2puPa6gxOd1tqhgaKe7m0+Oz8/xh/OV1jDw+/KlLVL5whrsv0zW
da6KYiKfpDN51EkFtzidOZYqxelHh48O+yJC7JWp804+hev/tOqun5WVuZkV
Fjvqyszl2vvSzR88gPOKYgbJHtRKiMJWOZx5o8maLz87ee+Ddw/nQphi2T0Q
0+lUqgXkV4kX4mptnIS76xyGkKlemgLWVgU7Cv7WBQFHqiyzGxhRJpnBRie9
lZmGlDjK1l5ASgnNTVlnyusWBavK1qWTdokrCB5uIo2e7S7Lzdo6LQp2NaAp
9Xe1uVEZyQRQKQnwGYi8nQYJU7lRW0mX0mZvsACBlHAQMdPNbkgwC/rmJk0z
LcQ9eQaD27ROCPJCXJbAC6kFIxTWy0In2jkIn21lXRgy20x+Bgjr1yovMz0h
y/z0Q7i5kBo6b+VCC1yoqhRSKDcS3dlcS8J5rVbaTcKbsLhZLnUV91i/1pWD
qJe0OQpvYIkSL5JiTTB5cpZ+TTGLoNtO5Mb4dWdN0Zi9sapfKy+BEGmLjOSM
Z+PiVC62eKylU/nIXv8PRMzk7+k0uij6E2b4/vsI2TdvZn8Q4mWUle5QUSWZ
IG15Emd4IJuV1FmayjX640xBa2HHQieW0NWu3Id9K5Orahv3z+RlvXBwn+6Z
MJ7BZgoH/Qp7VvDQ2iRroRD+lY8OMZ4UR/SRZrDkQq9VtqRo2OeQmFhZkh2t
CfzY5YAlkgFATXWmPYfDShOsAkTo4KisaJS9WtM99DvFNr596HiXVGYRLeZK
nZilSbDskaAIrPfkS4I6jmD3P4sYJwBpea23cmOr1MmD519eXh1Mwr/y/IJ/
v3z6ly/PXj49pd+XXxw/e9b+EHHH5RcXXz477X51b55cPH/+9Pw0vIxVOVgS
B8+Pvz0IcXZw8eLq7OL8+NkBwWuoHpvOkg+RuHVVVmw15USjN0PyycmLH/99
9AjQ/B2w+fDo6KM3b+IfHx598Ah/bNa6CLcxJsKfsNhWqLJEOHD6yjKgpqT6
QhnASbe2m0LCOxp2/ONfyTJ/m8tPFkl59OjTuEAKDxYbmw0W2Wa7KzsvByPu
WdpzTWvNwfrI0kN5j78d/N3Yvbf4yWPkWS2nRx8+/lQQeK50lTshvuoDGmUX
UZuH/Cad9r0SQYCFA2kxJmskwgrZWqeiS4lkbmSWCYW7qp2mYKOAJT/nJZU8
VMwM+zJVrVCJjj3D25tcC9y1qQxF5aRLOLirF+RcpnaSz8bWWYpiXiA0CnF0
+ON/f/7nf5o9FCovBnlmzqGXrCtb2MyuokCjzDW+ZNaZqjnl+M7dx8jPYHZq
kbXJt/cKJ6K1CoZcaF30tAxwDokL6kOvRJe+ZinbUovi9xr7KYWNsmh7NXbe
cfHtl8Lm4hfd8zmRo6WiNIfdnVkAi/al/rXBT1TUO3uJ4EKzJKRscFDf3YXd
4Jon0OZ6cMGvMyLps9eIIO+UsnNLhKcReLVHKcLQOVG4rBOi2O4RowVd4FkG
eXmAC9FC1eE6ii7OWhQCDZY8iOpyJg8ePZxF0nMA+rRak4YgIlBHxRJCqczV
OQnNIrDInFghSI8FNTLRdTj2gGsHlf8Tm+dEb/F3WHgn8x8na51cv7PyH0NK
fhwKyq2PmYIhe9cVWQKeB4nbYMHVmXegu+gqrjr1iC6zswASe2OIyVDt7pKF
6XMLCKzApEfIm7RsY7gOThqgQAUmHMzeoWZkv+yz3y6ep8PBu8ibhd6Lnt94
C2eXgB5cFRgMskJdEX1lGsQI6NEQitsew23ZEJHLi9ML+c3zZw2hdkGJToMG
G2Qv6ltuR8L4aVcWQFFTisBF7TkEAIYSiNeS2XN4KlpeRE1HQ75GDjVhde9t
HNEVeJka0e49WtLxjRB9BRuj3a7kvh2kRm5hXxMajqUlKh6xftx6gi071ggM
xLY7HDOTqHoTpeRkXlJ+gJ/xwUOlYwTCvkjYVWWrWV/PwNrvCOqd5xzVa3Wj
ezHN5wYC1ZI0ESJsFF5Oc39HnciNnr3tLjQCXrlrMiuQ24YEdKRbuafOBqyZ
d8MIgMANaD03KKEhagpuW5hDCVNNQRQdq0BW91qlstQVVSS4snYhlWpZlyn1
TF2W6EwZHt1uyt3nfdSTgglsUkm/saxerl7ZSpBGBKCvQV+bVi/0degf3Frv
tcwe9hGq6YRyCFKJa12zR6qKkxThLOTI/b6JrC9MMMJ5JBu6qZvwcuBvQVZR
UyvDozHXPbvFt2P8duKIvuMHOX/QxvHZsGLTKS50Zsl/ltXZ7avPrdcxrHQJ
b8Tur5lsyNKCw24n/WBshEMwCD1bzdA4cHmls4MJ3E5/JzukkuGITOtOYhFJ
NbrE0LZVoYdLHwCHufFE2mhkt2MfiseQ0sWysnk4cF+G4ZcHtmsSYkQ15UV+
m7ogty/txmYT4XI3ILnmq701L4aeGFduLm6uDgON2+KlSLI6bWIxg3eoNRjN
VmJn3yIyCsdCLLYtUt4GircYJossbTzY6VmoSw2h9b89New+H6QGBhJxCAI/
Bc1cntIb0RAjU8ZBQyghakz4m5mUYu0biIodBt9eMG6p7CA5dACJl76qnWdb
ifaoYAcQDki/o/5geUwUYoGIOQW9LLa/QgUJb6Fikquz3bbPuMB9RI/7zG4t
79/VGgq8vcgP9u0RtUsjDWEb23w0FFKu4W+cW0Sgxk3ZV79Egt5UtBlRCc4S
WdZCsqOJXCQrjQ06ZLPuxvFdYngXn9k1Nrt9rVRlzGe2f3nDAprel0ZTfCVN
210wdmBJjLU0NUQPkKCq3jY2XBxHohQ+fPf10VyeAIErnh1Y5wyV9sbqnPta
SgQBUFxWNI+Y8bsP73qXhsJ+3Zs7t2o281fmOiwXbcE7KY+WsDEJp9Log6bC
rk3uXSkSg6wTJooDMwZqPCym90Ox4LLAH4REapyCRjpq9O4+jdKax2imQK9n
0lEif4sud2X+pnMaxUG/v8aZO6vyxqgw6Os3HRD+0R3C10V37a9SQLXALbRO
GZThpG1XFkWfP6RWs8RBpvfm8rK9uCOGg3L2VglGhnM7BZlv5hl2RE5gBWNI
9oa8d0gTSWuQ//398vd4cMAZ95pbubV1g+5e2N2iD3eguc4X43YD/GUimv67
MX9q0ggEisUI+51ic09earSt9NnwhAYg4Irhy6f8/l7z5I0QZ8sBreOs0Pay
KklsFbhBuOX0/FJWdcaEAjDlz4kJ+oWYkfQ2tLj0mwbNXGkV2IVG98jZMexr
lpoPSmgtlmSWGYmKX8RZE+4kNmrrQmfkoszTSmdcfDWkTHjgGEDTfqtpJqUu
puMs6L02JZUwv6HRVTulSegrTradiFxdc4qi9JSBGgItPKoia5iEHBiYIs+U
pmHCCkaKxOoteUE0cTkaWRShuHc86L6To3kde+vs+Px411O0+iZ81Vuo5Jo2
XoBOR1onRPfHXB4D5KtCFjXhyDUu64IJLA5ZG0Jn29nwTVTZYIjxaIvKU2P4
MEfrhKNN4ud//OsOK3eTNte1uFQOmpRM82U2hrC1p8PDOJvydI7js+3ww0w+
k2eFPPPIvgqhnihAgJFIv376gT7zD+ZvbT3g8kN8+H7IoT1lM1NcR9KXcw0G
b7PeJhZELyCsswA9hkUAypEBT6gZlyCyoTwQGwYMThEsmiJoWNtbpw9OILjT
V1hOE3WJTIR/Q7ZqP3Da+F1PDPLUYym/JeeesZrX3cDOU5PDU/dt6IORC30w
veIvqIXdRKMMUT6m+VQ1ml4zGNX4mv09E0+ZrDX9w97hURjDrnVWMmgmNAVY
q9KNTUD9cKDHo0IJOZsprotUZGOnCLaSnEV0bTKedkRJx21PGGmErw/0PndV
ThC7aoHDzdRiMAZ3gdoBCJanNdcRj6KX/oHNEbwsQIxMv22aZ5ZYRolpTg5w
myqUDtiqVO04EY3JcPMmhORIy5YwdB+K98/0hrQyfrtxoe8Qve/ncbyO68lQ
ysdST6W/jpM9pymxJ5zo+VOUKhgJTFF0xh+MQu0duZdEP+2aMvapcolKYzVp
up2848RAyOWawUOdbBwhhT4Ye8ZtIvtt7weFx0NJ4pk7eN0/FuUhYhj4iX6X
utMGusfyRWUX8OeWUUC5MU5OcktEc8JkTXSVij5jdAMdMi3KJX/0a2cusU/j
aZ9rQ1vEZUqq5CJCzQr9W0WddTiB4pjf4szXMOD4HlEzEf4XkJ2XWT96O+iM
12fif7xB4BCFJQAA

-->

</rfc>
