Skip to main content

Transparent Handling of Internationalized Domain Names in Name Resolution APIs
draft-rodenhaeuser-idna-transparent-resolution-00

Document Type Active Internet-Draft (individual)
Author Luca Rodenhäuser
Last updated 2026-07-18
RFC stream (None)
Intended RFC status (None)
Formats
Stream Stream state (No stream defined)
Consensus boilerplate Unknown
RFC Editor Note (None)
IESG IESG state I-D Exists
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-rodenhaeuser-idna-transparent-resolution-00
Network Working Group                                     L. Rodenhäuser
Internet-Draft                                              18 July 2026
Intended status: Best Current Practice                                  
Expires: 19 January 2027

     Transparent Handling of Internationalized Domain Names in Name
                            Resolution APIs
           draft-rodenhaeuser-idna-transparent-resolution-00

Abstract

   Applications are expected to convert internationalized domain names
   to their ASCII-Compatible Encoding (A-label) form before invoking
   name resolution APIs.  In practice this conversion is performed
   inconsistently: different applications follow different IDNA
   standards, use different libraries, and ship different versions of
   the Unicode mapping tables, so that the same input string can resolve
   to different registrable domain names depending on which software
   component performs the conversion.

   This document specifies that name resolution services accept Unicode
   host names by default and perform the conversion to A-labels
   internally, exactly once, at the point where a name is handed to a
   specific resolution protocol.  The DNS wire format is unchanged: only
   A-labels appear in queries to the public DNS.  The conversion
   procedure is Unicode IDNA Compatibility Processing (UTS #46),
   nontransitional, with a mapping-table floor of Unicode 15.1.  This
   codifies the architectural recommendation of RFC 6055 and the
   deployed practice of several major platforms.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document is encouraged on the IETF DISPATCH
   working group mailing list (dispatch@ietf.org); DNS-specific aspects
   may also be raised on the DNSOP working group list (dnsop@ietf.org).
   Comments may also be sent directly to the author.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

Rodenhaeuser             Expires 19 January 2027                [Page 1]
Internet-Draft         Transparent IDN Resolution              July 2026

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 19 January 2027.

Copyright Notice

   Copyright (c) 2026 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.  Code Components
   extracted from this document must include Revised BSD License text as
   described in Section 4.e of the Trust Legal Provisions and are
   provided without warranty as described in the Revised BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
     1.1.  Requirements Language . . . . . . . . . . . . . . . . . .   5
   2.  Terminology . . . . . . . . . . . . . . . . . . . . . . . . .   5
   3.  Scope and Non-Goals . . . . . . . . . . . . . . . . . . . . .   5
   4.  Architecture  . . . . . . . . . . . . . . . . . . . . . . . .   6
     4.1.  Behavioral Requirements, Not API Signatures . . . . . . .   6
     4.2.  The Wire Format Remains A-Labels  . . . . . . . . . . . .   6
     4.3.  A Single Conversion Procedure . . . . . . . . . . . . . .   6
       4.3.1.  Table Version . . . . . . . . . . . . . . . . . . . .   7
     4.4.  Late Conversion . . . . . . . . . . . . . . . . . . . . .   8
   5.  Processing Requirements . . . . . . . . . . . . . . . . . . .   8
     5.1.  ASCII Fast Path . . . . . . . . . . . . . . . . . . . . .   8
     5.2.  Byte-Oriented Interfaces  . . . . . . . . . . . . . . . .   9
     5.3.  Unicode-Native Interfaces . . . . . . . . . . . . . . . .   9
     5.4.  Conversion  . . . . . . . . . . . . . . . . . . . . . . .   9
     5.5.  Length Limits and Root-Label Semantics  . . . . . . . . .   9
     5.6.  Search Lists  . . . . . . . . . . . . . . . . . . . . . .  10
     5.7.  Failure Handling  . . . . . . . . . . . . . . . . . . . .  10
     5.8.  Default Activation and Opt-Out  . . . . . . . . . . . . .  10
     5.9.  Access to the Converted Form  . . . . . . . . . . . . . .  10

Rodenhaeuser             Expires 19 January 2027                [Page 2]
Internet-Draft         Transparent IDN Resolution              July 2026

   6.  Non-DNS Name Services and Private Namespaces  . . . . . . . .  11
     6.1.  Multicast DNS and LLMNR . . . . . . . . . . . . . . . . .  11
     6.2.  Hosts File  . . . . . . . . . . . . . . . . . . . . . . .  11
     6.3.  Private DNS Namespaces Using UTF-8  . . . . . . . . . . .  11
   7.  Error Reporting . . . . . . . . . . . . . . . . . . . . . . .  12
   8.  Migration and Backward Compatibility  . . . . . . . . . . . .  12
   9.  Security Considerations . . . . . . . . . . . . . . . . . . .  13
     9.1.  Table-Version Skew  . . . . . . . . . . . . . . . . . . .  13
     9.2.  Divergence between Components . . . . . . . . . . . . . .  13
     9.3.  Residual Asymmetries  . . . . . . . . . . . . . . . . . .  13
     9.4.  Changed Attack Surface of Default Activation  . . . . . .  14
     9.5.  No New Wire Exposure  . . . . . . . . . . . . . . . . . .  14
     9.6.  Pass-Through of Non-UTF-8 Input . . . . . . . . . . . . .  14
     9.7.  Application-Side Pre-Conversion . . . . . . . . . . . . .  14
   10. IANA Considerations . . . . . . . . . . . . . . . . . . . . .  14
   11. References  . . . . . . . . . . . . . . . . . . . . . . . . .  14
     11.1.  Normative References . . . . . . . . . . . . . . . . . .  15
     11.2.  Informative References . . . . . . . . . . . . . . . . .  15
   Appendix A.  Survey of Existing Implementations . . . . . . . . .  17
   Appendix B.  Test Vectors . . . . . . . . . . . . . . . . . . . .  19
   Acknowledgements  . . . . . . . . . . . . . . . . . . . . . . . .  20
   Author's Address  . . . . . . . . . . . . . . . . . . . . . . . .  20

1.  Introduction

   The Domain Name System carries internationalized labels in an ASCII-
   Compatible Encoding: U-labels are converted to A-labels [RFC5890]
   before they appear in DNS queries.  IDNA deliberately placed this
   conversion inside applications so that existing APIs and servers
   could remain unchanged [RFC3490].  Fifteen years of deployment
   experience show the cost of that choice: every application converts
   for itself, and no two convert alike.

Rodenhaeuser             Expires 19 January 2027                [Page 3]
Internet-Draft         Transparent IDN Resolution              July 2026

   The resulting divergence is observable on three levels.  On the
   standards level, widely used runtime facilities still implement
   IDNA2003 (for example the java.net.IDN class and Python's built-in
   "idna" codec) while other components implement IDNA2008 with UTS #46
   mapping [UTS46].  On the library level, a single portable program may
   use a different conversion backend on every platform it supports.  On
   the table-version level, even components that agree on UTS #46
   nontransitional processing disagree when their copies of the Unicode
   mapping table differ in age: at the time of writing, the input
   "STRAẞE.de" is converted to "strasse.de" by implementations shipping
   tables older than Unicode 15.1 and to "xn--strae-oqa.de" by
   implementations with current tables -- two independently registrable
   domain names from one input string, on one host, depending on which
   library is asked.  The divergence even crosses layers within a single
   runtime and a single vendor; Appendix A records the observed state of
   common implementations.

   The consequences are not merely cosmetic.  When a security filter
   canonicalizes a name differently from the resolver that later looks
   it up, the filter examines one domain and the network connects to
   another.  When two applications on the same system convert
   differently, the same user input reaches different destinations.

   This document specifies the remedy that the IAB recommended in 2011:
   [RFC6055] concludes that it is inappropriate for applications calling
   general-purpose name resolution APIs to convert names to A-labels
   themselves, and that the conversion should instead be performed by
   the entity that knows which resolution protocol will be used -- the
   resolver, at the moment it decides to hand the name to the DNS.  The
   candidate mappings at the time included the local mapping of
   [RFC5895] and both modes of UTS #46, and no single choice could yet
   be recommended.  The original IDNA specification anticipated the same
   evolution, expecting that future resolver libraries would accept
   domain names in non-ASCII form and perform the ToASCII operation
   internally [RFC3490].  What RFC 6055 could not settle at the time --
   which of the competing mappings the resolver should apply -- has
   since been settled elsewhere: Unicode deprecated transitional
   processing, declared the industry transition to IDNA2008 behavior
   complete, and in Unicode 15.1 aligned the mapping of capital sharp s
   with nontransitional expectations [UTS46].

   Accordingly, this document requires that name resolution services
   accept Unicode input by default, without any opt-in flag or
   attribute; that they convert it with a single, versioned procedure
   (Section 4.3); that the conversion happens exactly once, at the
   protocol boundary (Section 4.4); and that nothing changes on the wire
   (Section 4.2).

Rodenhaeuser             Expires 19 January 2027                [Page 4]
Internet-Draft         Transparent IDN Resolution              July 2026

1.1.  Requirements Language

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in
   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

2.  Terminology

   Name resolution service
      Any interface that accepts a host name as a character or byte
      string and resolves it using one or more name resolution
      protocols, of which the DNS is typically one.  This includes C
      library stub resolver entry points such as getaddrinfo()
      [RFC3493], operating system name resolution services, resolvers
      embedded in language runtimes, and high-level lookup functions of
      DNS libraries.  It does not include interfaces that accept names
      already in DNS wire format (Section 3).

   Conversion point
      The place within a name resolution service at which a name is
      transformed into the encoding required by one specific resolution
      protocol.

   Table version
      The version of the Unicode IdnaMappingTable (and associated
      derived data) from which an implementation's UTS #46 processing is
      generated.

   U-label, A-label
      As defined in [RFC5890]; A-labels carry a Punycode-encoded
      [RFC3492] form of the label.

3.  Scope and Non-Goals

   This document applies to name resolution services as defined above:
   entry points that accept host names as text.  Interfaces that operate
   on names already in DNS wire format (for example res_mkquery()-level
   APIs) are out of scope; callers of such interfaces have already
   chosen an encoding.

   This document does not change the DNS wire format, and it
   deliberately does not define any negotiation mechanism for carrying
   Unicode names on the wire; the obstacles to such a mechanism, DNSSEC
   canonicalization first among them (Section 4.2), are outside its
   scope.  It does not constrain registry or registration policy (for
   which see [RFC5891]), does not specify the display direction

Rodenhaeuser             Expires 19 January 2027                [Page 5]
Internet-Draft         Transparent IDN Resolution              July 2026

   (conversion of A-labels to U-labels for presentation), does not
   modify URL or IRI processing (see [WHATWG-URL]), and does not address
   internationalized email.

   The requirement keywords of this document define conformance to the
   practice it specifies.  They impose no obligation on implementations
   that do not claim conformance, and they render no existing
   implementation invalid with respect to any other specification; in
   particular, conformance to this document is orthogonal to conformance
   to interface standards such as POSIX.

4.  Architecture

4.1.  Behavioral Requirements, Not API Signatures

   This document states requirements on the observable behavior of name
   resolution services.  It does not define function signatures, flag
   constants, or other language- or platform-specific interface details,
   which belong to the respective interface specifications (for POSIX,
   the Austin Group).  Appendix A maps the requirements onto existing
   interfaces informatively.

4.2.  The Wire Format Remains A-Labels

   Queries sent to the public DNS carry A-labels, exactly as today.
   Several properties of the deployed DNS depend on names being ASCII at
   the protocol layer: the DNSSEC canonical form is defined in terms of
   ASCII case folding only [RFC4034]; caches, case-randomizing
   resolvers, and middleboxes compare and copy names under the same
   assumption; and the entire registration ecosystem provisions
   A-labels.  While the DNS protocol itself places no restriction on the
   octets in a label [RFC2181], and UTF-8 labels do occur in private
   namespaces (Section 6.3), changing the encoding used in the public
   tree is a separate and much larger problem than the one this document
   solves.

4.3.  A Single Conversion Procedure

   Implementations MUST convert names using Unicode IDNA Compatibility
   Processing [UTS46], conforming to conformance clause C2
   (nontransitional processing), with the ToASCII operation
   parameterized as follows:

Rodenhaeuser             Expires 19 January 2027                [Page 6]
Internet-Draft         Transparent IDN Resolution              July 2026

           +=========================+=========================+
           | Parameter               | Value                   |
           +=========================+=========================+
           | UseSTD3ASCIIRules       | false                   |
           +-------------------------+-------------------------+
           | CheckHyphens            | false                   |
           +-------------------------+-------------------------+
           | CheckBidi               | true                    |
           +-------------------------+-------------------------+
           | CheckJoiners            | true                    |
           +-------------------------+-------------------------+
           | Transitional_Processing | false                   |
           +-------------------------+-------------------------+
           | VerifyDnsLength         | false (see Section 5.5) |
           +-------------------------+-------------------------+
           | IgnoreInvalidPunycode   | false                   |
           +-------------------------+-------------------------+

                      Table 1: UTS #46 ToASCII Profile

   Transitional processing (conformance clause C1) is deprecated by
   Unicode and MUST NOT be used, in any mode, including as a fallback
   for input that fails nontransitional processing.

   UseSTD3ASCIIRules is false because names containing underscores, such
   as service and policy labels of the form "_sip._tcp", must remain
   resolvable.  CheckHyphens is false because labels such as those
   beginning with "r3---" occur in deployed DNS content and must remain
   resolvable.  CheckBidi preserves conformance with the Bidi rule
   [RFC5893], and CheckJoiners preserves the contextual rules for joiner
   characters.  This parameter set is identical to the one used by the
   WHATWG URL Standard's domain-to-ASCII operation [WHATWG-URL]; a
   resolver conforming to this document therefore derives the same
   A-labels as the browsers running above it.

   Callers are not required to normalize their input: UTS #46 processing
   itself maps and normalizes to NFC, so input in NFD or mixed
   normalization forms is acceptable.

4.3.1.  Table Version

   Implementations MUST use mapping and validity data derived from
   Unicode version 15.1 or later, and SHOULD track the current Unicode
   version, following the review process established for IDNA in
   [RFC8753].

Rodenhaeuser             Expires 19 January 2027                [Page 7]
Internet-Draft         Transparent IDN Resolution              July 2026

   The floor of 15.1 is not arbitrary.  Unicode 15.1 is the version in
   which, as an explicit exception to the otherwise-guaranteed backward
   compatibility of the mapping table, the mapping of U+1E9E (LATIN
   CAPITAL LETTER SHARP S, "ẞ") was changed from "ss" to U+00DF (LATIN
   SMALL LETTER SHARP S, "ß"), which nontransitional processing treats
   as valid [UTS46].  Under older tables, the uppercase and lowercase
   spellings of the same word convert to two different registrable
   domain names (Section 9.1).  A floor below 15.1 would perpetuate
   exactly the divergence this document exists to remove.

4.4.  Late Conversion

   Conversion happens at the conversion point of each resolution
   protocol, not at the API boundary.  Name resolution services are
   protocol-independent: the same call may be satisfied by the DNS, by
   Multicast DNS [RFC6762], by LLMNR [RFC4795], by a hosts file, or by
   other mechanisms, and these protocols do not share an encoding.
   Multicast DNS, for example, uses UTF-8 on the wire.  A name converted
   to A-labels at the API boundary would therefore be wrong for some
   backends; a name converted at each protocol boundary is right for all
   of them.  This is the architecture recommended by [RFC6055] and
   implemented, for example, by systemd-resolved, which prepares both an
   IDNA form and a UTF-8 form of each question and lets the backend
   select the appropriate one.

5.  Processing Requirements

5.1.  ASCII Fast Path

   If the input consists entirely of ASCII characters -- including input
   that already contains A-labels -- the service MUST NOT apply any IDNA
   processing to it.  Behavior for such input remains octet-for-octet
   identical to the behavior of a service not implementing this
   document.

   This rule makes the conversion idempotent and protects the two
   largest classes of existing callers: applications that only ever
   resolve ASCII names, and applications that perform their own
   conversion and pass A-labels.  Neither can observe any change.  It
   also preserves the ability to resolve ASCII labels that merely
   resemble A-labels: names beginning with "xn--" are passed through
   without validation or re-mapping, as they are today.

Rodenhaeuser             Expires 19 January 2027                [Page 8]
Internet-Draft         Transparent IDN Resolution              July 2026

5.2.  Byte-Oriented Interfaces

   For interfaces that accept names as byte strings: if the input
   contains at least one non-ASCII octet and is valid UTF-8, the service
   MUST process it as described in Section 5.4.  UTF-8 validity is as
   defined in [RFC3629], which excludes surrogates and overlong forms.
   If the input contains non-ASCII octets but is not valid UTF-8, the
   service SHOULD pass it to the resolution protocol unchanged,
   preserving the historical eight-bit transparency of the DNS
   [RFC2181]; it MAY instead provide a configuration under which such
   input is rejected with an error (Section 7).

5.3.  Unicode-Native Interfaces

   For interfaces that accept names as Unicode strings (for example
   UTF-16 string types), any input containing non-ASCII characters MUST
   be processed as described in Section 5.4.  No byte-level heuristic is
   needed or permitted.

5.4.  Conversion

   Input selected by Section 5.2 or Section 5.3 MUST be converted by
   applying the ToASCII operation with the profile of Section 4.3 to the
   whole domain name.  The mapping step of UTS #46 itself handles the
   ideographic and fullwidth label separators (U+3002, U+FF0E, U+FF61),
   so no separate pre-processing of dots is required.  The conversion is
   performed exactly once, at the conversion point of the protocol that
   will carry the query (Section 4.4).

5.5.  Length Limits and Root-Label Semantics

   After conversion, the service MUST verify the DNS length limits on
   the converted form: at most 63 octets per label and at most 255
   octets for the name in wire format [RFC1035].  A single trailing dot
   denotes the root label and MUST retain its conventional meaning of
   marking the name fully qualified and suppressing search-list
   processing.  This is why the profile in Section 4.3 sets
   VerifyDnsLength to false: with that flag enabled, UTS #46 would
   reject the empty root label, whereas with it disabled the empty root
   label passes through and the service applies its own checks with the
   correct semantics.  Interior empty labels are invalid and MUST be
   rejected; only the single trailing empty label denoting the root is
   permitted.  Where search-list expansion applies (Section 5.6), the
   limits are verified for each candidate name actually queried.

Rodenhaeuser             Expires 19 January 2027                [Page 9]
Internet-Draft         Transparent IDN Resolution              July 2026

5.6.  Search Lists

   The service MUST convert the caller-supplied name before performing
   search-list expansion.  Configured search domains may themselves
   contain non-ASCII characters; they MUST be converted with the same
   procedure when the configuration is loaded, so that expansion
   concatenates A-label forms -- except where a search domain belongs to
   a private namespace configured as described in Section 6.3, in which
   case the form appropriate to that namespace is used.  Note that
   [RFC6055] documents deployments in which suffix search lists contain
   UTF-8.

5.7.  Failure Handling

   If mapping or validation of input on the IDNA path fails, the service
   MUST report an error that is distinguishable from a resolution
   failure such as "name not found" (Section 7).  Input that was
   recognized as Unicode MUST NOT be sent to the public DNS in
   unconverted form, and partial conversions MUST NOT be used: a name is
   converted completely or the call fails.  The pass-through behavior of
   Section 5.2 applies exclusively to input that is not valid UTF-8.

5.8.  Default Activation and Opt-Out

   Acceptance and conversion of Unicode input MUST be the default
   behavior of the service and MUST NOT require any per-call flag,
   option, attribute, or prior configuration.

   Implementations MUST provide a mechanism to disable the conversion --
   per call, per process, or per system -- for compatibility and
   diagnostic purposes.  An existing example of such a mechanism is the
   AI_DISABLE_IDN_ENCODING flag of the Windows getaddrinfo() family.

5.9.  Access to the Converted Form

   The service SHOULD make the converted (A-label) form of the queried
   name available to the caller, for example through the mechanism used
   to return canonical names or through another interface-specific
   channel where that mechanism already carries DNS-derived names.
   Protocol elements above the resolver -- TLS Server Name Indication
   [RFC6066], HTTP Host headers, and certificate identity verification
   [RFC9525] -- operate on A-labels; a caller that only holds the
   U-label form is forced to repeat the conversion itself, reintroducing
   the very divergence this document removes.

Rodenhaeuser             Expires 19 January 2027               [Page 10]
Internet-Draft         Transparent IDN Resolution              July 2026

   Names returned by the DNS (for example CNAME chains and PTR targets)
   remain in A-label form.  Conversion of results to U-labels for
   display MUST be available only on explicit request of the caller;
   presentation of internationalized names, and its associated spoofing
   concerns, are outside the scope of this document.

6.  Non-DNS Name Services and Private Namespaces

6.1.  Multicast DNS and LLMNR

   Names sent over Multicast DNS MUST be carried in the UTF-8 form
   specified by [RFC6762], not as A-labels.  The same applies to LLMNR
   [RFC4795].  The conversion point for these protocols therefore
   performs no ToASCII operation; the late-conversion architecture of
   Section 4.4 is what makes this correct.

6.2.  Hosts File

   Entries in a hosts file may be written as U-labels or as A-labels.
   When matching a looked-up name against hosts file entries, the
   service SHOULD apply the conversion procedure of Section 4.3 to both
   sides and compare the results, so that either spelling of an entry
   matches either spelling of a query.  If conversion of an entry or of
   the queried name fails, that side is matched by direct comparison of
   its UTF-8 form.

6.3.  Private DNS Namespaces Using UTF-8

   [RFC6055] documents a long-established practice of provisioning UTF-8
   names in private DNS namespaces, particularly in enterprise
   environments, and recommends that resolvers be liberal enough to
   reach names in such namespaces.  This document accommodates that
   practice without weakening the public case: queries sent to the
   public DNS MUST carry A-labels; for zones or network scopes that are
   explicitly configured as private UTF-8 namespaces, an implementation
   MAY send the UTF-8 form of a name in addition to, or instead of, the
   A-label form.  Such behavior MUST be bound to the configured scope
   and MUST NOT be a global default.  Note that DNS servers do not case-
   fold non-ASCII octets [RFC4343]; names in such namespaces match bit-
   for-bit, and provisioning conventions need to account for this.

Rodenhaeuser             Expires 19 January 2027               [Page 11]
Internet-Draft         Transparent IDN Resolution              July 2026

7.  Error Reporting

   Services distinguish at least the following failure classes on the
   IDNA path: mapping failures (input containing disallowed code
   points), validation failures (violations of the Bidi rule, the joiner
   context rules, or Punycode validity inside a mixed name), length
   failures (Section 5.5), and -- where the strict mode of Section 5.2
   is enabled -- invalid UTF-8.

   Errors of these classes MUST be reported through a code or condition
   distinct from resolution failures, so that callers can tell "this
   name cannot be encoded" apart from "this name does not exist".  An
   existing example is the EAI_IDN_ENCODE error of the GNU C library.
   Diagnostics SHOULD identify the offending label and, where possible,
   the offending code point position.

8.  Migration and Backward Compatibility

   Existing callers fall into three classes.  Applications that only
   resolve ASCII names are untouched by construction (Section 5.1).
   Applications that perform their own IDNA conversion hand ASCII to the
   service and are equally untouched; no double conversion can occur,
   since Punycode input is never re-mapped.  Applications that
   deliberately pass raw non-ASCII octets -- a small class, chiefly in
   private-namespace environments -- are served by the UTF-8 pass-
   through of Section 5.2, by Section 6.3, and by the opt-out of
   Section 5.8.

   Applications need not change to benefit, and need not wait to be
   safe: an application that continues to convert names itself remains
   correct indefinitely, because its A-label output takes the ASCII fast
   path unchanged (Section 5.1).  Until an application can rely on the
   services it uses conforming to this document, continuing to pre-
   convert is the prudent choice; the aim of this document is to make
   that burden unnecessary, not to forbid carrying it.

   Default-on conversion is not an experiment.  The Windows resolver has
   converted by default since Windows 8 with an opt-out flag, across
   more than a decade of deployment, without ecosystem breakage -- even
   though, as Appendix A records, the procedure behind that default is
   today the part most in need of the present specification.  The musl C
   library, which currently performs no IDN conversion, states as
   project policy that support, when added, will always be enabled
   rather than requiring application flags; this document supplies the
   specification such an implementation needs.

Rodenhaeuser             Expires 19 January 2027               [Page 12]
Internet-Draft         Transparent IDN Resolution              July 2026

   For implementations, the migration is incremental: a libc that today
   offers opt-in conversion makes that behavior the default, turns the
   opt-in flag into a no-op, adds an opt-out, and updates its mapping
   tables to meet the floor of Section 4.3.1; a runtime whose HTTP layer
   already converts extends the same procedure to its socket-level
   lookups.  Interface-level details for POSIX getaddrinfo() are a
   matter for the Austin Group and are sketched informatively in
   Appendix A.

9.  Security Considerations

9.1.  Table-Version Skew

   Until the floor of Section 4.3.1 is universally met, implementations
   with pre-15.1 tables convert "STRAẞE.de" to "strasse.de" while
   implementations with current tables convert it to "xn--strae-oqa.de".
   These are independently registrable domains: the operator of the .de
   registry admitted the letter "ß" on 16 November 2010 after a one-time
   sunrise phase for holders of the corresponding "ss" domains, and
   applies its ordinary first-come-first-served rules since -- there is
   no bundling requirement, and the registry itself noted at
   introduction time that software following the older standard would
   lead users entering "ß" to the "ss" domain, which need not belong to
   the same holder [DENIC2010].  An attacker who controls the name
   produced by the older tables receives the traffic of every client on
   the wrong side of the skew.  The table-version floor exists to shrink
   this window; until it closes, operators of names containing
   deviation-adjacent characters should consider holding both spellings.

9.2.  Divergence between Components

   Security decisions that compare domain names -- allowlists,
   blocklists, SSRF protections, pinning, access control -- are only
   sound if the comparing component and the resolving component
   canonicalize identically.  Such comparisons SHOULD be performed on
   the A-label form produced by the procedure of Section 4.3;
   Section 5.9 exists to make that form available.  Logs SHOULD record
   both the input form and the converted form of resolved names.

9.3.  Residual Asymmetries

   The conversion is deliberately context-free, and some case
   asymmetries therefore remain: the Greek capital sigma always maps to
   U+03C3, while a final lowercase sigma (U+03C2) is valid as written,
   so the uppercase and lowercase spellings of a Greek word ending in
   sigma still convert to different labels.  This document does not and
   cannot repair that; it only guarantees that every component disagrees
   in the same way.  Visual confusability between distinct code points

Rodenhaeuser             Expires 19 January 2027               [Page 13]
Internet-Draft         Transparent IDN Resolution              July 2026

   (homoglyphs) is likewise out of scope; see UTS #39 [UTS39] and the
   registry-side recommendations of [RFC5891].

9.4.  Changed Attack Surface of Default Activation

   Applications that implicitly relied on non-ASCII input never
   resolving -- using the resolver's previous behavior as an accidental
   input filter -- lose that property under this document.  Such
   applications should validate input explicitly and may use the opt-out
   of Section 5.8 during transition.

9.5.  No New Wire Exposure

   Because the wire format is unchanged (Section 4.2), this document
   introduces no new interactions with DNSSEC validation, caching, or
   on-path devices.

9.6.  Pass-Through of Non-UTF-8 Input

   The pass-through behavior of Section 5.2 preserves compatibility with
   eight-bit legacy deployments, but it is itself a canonicalization
   boundary: a component that leniently decodes malformed input as
   Unicode will canonicalize a byte sequence that the resolver forwards
   untouched, recreating the divergence of Section 9.2 at the encoding
   layer.  Deployments in security-sensitive contexts SHOULD enable the
   strict rejection mode of Section 5.2, and comparing components SHOULD
   NOT apply lenient decoding to input that the resolver treats as
   opaque bytes.

9.7.  Application-Side Pre-Conversion

   The status quo is itself a documented vulnerability: [RFC6055]
   observes that applications converting to A-labels before calling
   protocol-independent resolution APIs can be directed to attacker-
   controlled destinations wherever a namespace uses a different
   encoding, because the attacker can register the A-label spelling of a
   name whose canonical form in that namespace is UTF-8.  By moving
   conversion to the protocol-aware conversion point, this document
   removes the incentive and the need for application-side pre-
   conversion, and with it this class of attack.

10.  IANA Considerations

   This document has no IANA actions.  In particular, it deliberately
   does not define an EDNS(0) option or any other protocol element for
   negotiating name encodings on the wire.

11.  References

Rodenhaeuser             Expires 19 January 2027               [Page 14]
Internet-Draft         Transparent IDN Resolution              July 2026

11.1.  Normative References

   [RFC1035]  Mockapetris, P., "Domain names - implementation and
              specification", STD 13, RFC 1035, DOI 10.17487/RFC1035,
              November 1987, <https://www.rfc-editor.org/info/rfc1035>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC3629]  Yergeau, F., "UTF-8, a transformation format of ISO
              10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
              2003, <https://www.rfc-editor.org/info/rfc3629>.

   [RFC5890]  Klensin, J., "Internationalized Domain Names for
              Applications (IDNA): Definitions and Document Framework",
              RFC 5890, DOI 10.17487/RFC5890, August 2010,
              <https://www.rfc-editor.org/info/rfc5890>.

   [RFC5891]  Klensin, J., "Internationalized Domain Names in
              Applications (IDNA): Protocol", RFC 5891,
              DOI 10.17487/RFC5891, August 2010,
              <https://www.rfc-editor.org/info/rfc5891>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/info/rfc8174>.

   [UTS46]    The Unicode Consortium, "Unicode IDNA Compatibility
              Processing", Unicode Technical Standard #46, Revision 35,
              September 2025, <https://www.unicode.org/reports/tr46/>.

11.2.  Informative References

   [DENIC2010]
              DENIC eG, "German Alphabet In The Internet Now Complete
              With Eszett", Press release, 16 November 2010,
              <https://www.denic.de/en/whats-new/press-releases/article/
              german-alphabet-in-the-internet-now-complete-with-eszett-
              effective-16-november-the-letter-eszett-w/>.

   [RFC2181]  Elz, R. and R. Bush, "Clarifications to the DNS
              Specification", RFC 2181, DOI 10.17487/RFC2181, July 1997,
              <https://www.rfc-editor.org/info/rfc2181>.

Rodenhaeuser             Expires 19 January 2027               [Page 15]
Internet-Draft         Transparent IDN Resolution              July 2026

   [RFC3490]  Faltstrom, P., Hoffman, P., and A. Costello,
              "Internationalizing Domain Names in Applications (IDNA)",
              RFC 3490, DOI 10.17487/RFC3490, March 2003,
              <https://www.rfc-editor.org/info/rfc3490>.

   [RFC3492]  Costello, A., "Punycode: A Bootstring encoding of Unicode
              for Internationalized Domain Names in Applications
              (IDNA)", RFC 3492, DOI 10.17487/RFC3492, March 2003,
              <https://www.rfc-editor.org/info/rfc3492>.

   [RFC3493]  Gilligan, R., Thomson, S., Bound, J., McCann, J., and W.
              Stevens, "Basic Socket Interface Extensions for IPv6",
              RFC 3493, DOI 10.17487/RFC3493, February 2003,
              <https://www.rfc-editor.org/info/rfc3493>.

   [RFC4034]  Arends, R., Austein, R., Larson, M., Massey, D., and S.
              Rose, "Resource Records for the DNS Security Extensions",
              RFC 4034, DOI 10.17487/RFC4034, March 2005,
              <https://www.rfc-editor.org/info/rfc4034>.

   [RFC4343]  Eastlake 3rd, D., "Domain Name System (DNS) Case
              Insensitivity Clarification", RFC 4343,
              DOI 10.17487/RFC4343, January 2006,
              <https://www.rfc-editor.org/info/rfc4343>.

   [RFC4795]  Aboba, B., Thaler, D., and L. Esibov, "Link-Local
              Multicast Name Resolution (LLMNR)", RFC 4795,
              DOI 10.17487/RFC4795, January 2007,
              <https://www.rfc-editor.org/info/rfc4795>.

   [RFC5893]  Alvestrand, H. and C. Karp, "Right-to-Left Scripts for
              Internationalized Domain Names for Applications (IDNA)",
              RFC 5893, DOI 10.17487/RFC5893, August 2010,
              <https://www.rfc-editor.org/info/rfc5893>.

   [RFC5895]  Resnick, P. and P. Hoffman, "Mapping Characters for
              Internationalized Domain Names in Applications (IDNA)
              2008", RFC 5895, DOI 10.17487/RFC5895, September 2010,
              <https://www.rfc-editor.org/info/rfc5895>.

   [RFC6055]  Thaler, D., Klensin, J., and S. Cheshire, "IAB Thoughts on
              Encodings for Internationalized Domain Names", RFC 6055,
              DOI 10.17487/RFC6055, February 2011,
              <https://www.rfc-editor.org/info/rfc6055>.

Rodenhaeuser             Expires 19 January 2027               [Page 16]
Internet-Draft         Transparent IDN Resolution              July 2026

   [RFC6066]  Eastlake 3rd, D., "Transport Layer Security (TLS)
              Extensions: Extension Definitions", RFC 6066,
              DOI 10.17487/RFC6066, January 2011,
              <https://www.rfc-editor.org/info/rfc6066>.

   [RFC6762]  Cheshire, S. and M. Krochmal, "Multicast DNS", RFC 6762,
              DOI 10.17487/RFC6762, February 2013,
              <https://www.rfc-editor.org/info/rfc6762>.

   [RFC8753]  Klensin, J. and P. Faltstrom, "Internationalized Domain
              Names for Applications (IDNA) Review for New Unicode
              Versions", RFC 8753, DOI 10.17487/RFC8753, April 2020,
              <https://www.rfc-editor.org/info/rfc8753>.

   [RFC9525]  Saint-Andre, P. and R. Salz, "Service Identity in TLS",
              RFC 9525, DOI 10.17487/RFC9525, November 2023,
              <https://www.rfc-editor.org/info/rfc9525>.

   [UTS39]    The Unicode Consortium, "Unicode Security Mechanisms",
              Unicode Technical Standard #39,
              <https://www.unicode.org/reports/tr39/>.

   [WHATWG-URL]
              WHATWG, "URL Living Standard",
              <https://url.spec.whatwg.org/>.

Appendix A.  Survey of Existing Implementations

   This appendix is informative and records the state observed in July
   2026; it will age.  Source references are to the respective public
   repositories and vendor documentation at that time.

   +==================+===============================================+
   | Implementation   | Observed behavior                             |
   +==================+===============================================+
   | Windows (Winsock | Conversion on by default since Windows 8;     |
   | / NLS)           | opt-out via AI_DISABLE_IDN_ENCODING.  The     |
   |                  | native NLS path (IdnToAscii) maps "ß" to      |
   |                  | "ss"; its documentation still cites RFC 3490. |
   |                  | Toward enterprise DNS in domain networks,     |
   |                  | UTF-8 queries are used, per the practice      |
   |                  | described in RFC 6055.                        |
   +------------------+-----------------------------------------------+
   | .NET 5 and later | Nontransitional                               |
   | (ICU)            | (UIDNA_NONTRANSITIONAL_TO_ASCII with joiner-  |
   |                  | context checking); diverges from the platform |
   |                  | NLS path above.                               |
   +------------------+-----------------------------------------------+

Rodenhaeuser             Expires 19 January 2027               [Page 17]
Internet-Draft         Transparent IDN Resolution              July 2026

   | glibc            | Opt-in via AI_IDN; nontransitional via        |
   |                  | libidn2 (loaded at run time).  Effective      |
   |                  | table version equals that of the installed    |
   |                  | libidn2; the floor of this document requires  |
   |                  | libidn2 2.3.8 (March 2025) or later.          |
   +------------------+-----------------------------------------------+
   | musl             | No IDN conversion.  Project documentation     |
   |                  | states that support, when added, will always  |
   |                  | be enabled rather than requiring application  |
   |                  | options.                                      |
   +------------------+-----------------------------------------------+
   | Apple libc       | No IDN conversion of any kind (source         |
   | (Libinfo)        | inspection); non-ASCII input is passed        |
   |                  | through as UTF-8 octets.                      |
   +------------------+-----------------------------------------------+
   | WebKit           | UTS #46 via ICU with CheckBidi, joiner-       |
   |                  | context checking, and nontransitional         |
   |                  | processing, without STD3 rules -- equivalent  |
   |                  | to the profile of this document.              |
   +------------------+-----------------------------------------------+
   | systemd-resolved | Nontransitional via libidn2, but with a       |
   |                  | transitional fallback when input is           |
   |                  | disallowed, and a round-trip guard that       |
   |                  | discards conversions which do not round-trip. |
   |                  | Prepares per-protocol question forms (UTF-8   |
   |                  | and IDNA), matching the architecture of this  |
   |                  | document; the transitional fallback does not. |
   +------------------+-----------------------------------------------+
   | Go               | net/http converts via x/net/idna              |
   |                  | (nontransitional); the net package itself     |
   |                  | does not convert.  Tables are Unicode 15.0,   |
   |                  | moving to 17.0 with the Go 1.27 toolchain.    |
   +------------------+-----------------------------------------------+

     Table 2: Observed Behavior of Name Resolution Stacks (July 2026)

   For POSIX, the natural mapping of this document is: getaddrinfo()
   behaves by default as it does today with the GNU AI_IDN extension;
   AI_IDN becomes a no-op; a standardized counterpart to
   AI_DISABLE_IDN_ENCODING provides the opt-out of Section 5.8; and the
   error condition of Section 7 is surfaced as a distinct EAI_ value.
   Standardization of these interface details is a matter for the Austin
   Group.

Rodenhaeuser             Expires 19 January 2027               [Page 18]
Internet-Draft         Transparent IDN Resolution              July 2026

Appendix B.  Test Vectors

   The following vectors illustrate the profile of Section 4.3 with a
   table version meeting the floor of Section 4.3.1.  They were verified
   against an implementation generated from Unicode 17.0.0 data.  The
   authoritative conformance data is the IdnaTestV2.txt file published
   with [UTS46].

   +=====================+=====================+=======================+
   |Input                |Output               |Remark                 |
   +=====================+=====================+=======================+
   |straße.de            |xn--strae-oqa.de     |Nontransitional: ß is  |
   |                     |                     |preserved.             |
   +---------------------+---------------------+-----------------------+
   |STRAẞE.de            |xn--strae-oqa.de     |Requires table version |
   |                     |                     |15.1 or later; older   |
   |                     |                     |tables yield strasse.de|
   |                     |                     |(see Section 9.1).     |
   +---------------------+---------------------+-----------------------+
   |faß.de               |xn--fa-hia.de        |Transitional processing|
   |                     |                     |would yield fass.de and|
   |                     |                     |is forbidden.          |
   +---------------------+---------------------+-----------------------+
   |bloß.de              |xn--blo-7ka.de       |                       |
   +---------------------+---------------------+-----------------------+
   |müller-straße.de     |xn--mller-strae-     |Processing normalizes; |
   |(input in NFD)       |46a18a.de            |callers need not supply|
   |                     |                     |NFC.                   |
   +---------------------+---------------------+-----------------------+
   |σοφός.gr             |xn--0xagbn4a.gr      |Residual case asymmetry|
   |                     |                     |of final sigma         |
   |                     |                     |(Section 9.3).         |
   +---------------------+---------------------+                       |
   |ΣΟΦΌΣ.gr             |xn--0xahbl4a.gr      |                       |
   +---------------------+---------------------+-----------------------+
   |日本語。JP               |xn--wgv71a119e.jp    |Ideographic and        |
   |                     |                     |fullwidth separators   |
   |                     |                     |and characters are     |
   |                     |                     |mapped by the          |
   |                     |                     |processing itself.     |
   +---------------------+---------------------+-----------------------+
   |_dmarc.straße.de     |_dmarc.xn--strae-    |UseSTD3ASCIIRules=false|
   |                     |oqa.de               |admits the underscore  |
   |                     |                     |label.                 |
   +---------------------+---------------------+-----------------------+
   |_sip._tcp.example.com|_sip._tcp.example.com|ASCII fast path        |
   |                     |                     |(Section 5.1): no      |
   |                     |                     |processing at all.     |

Rodenhaeuser             Expires 19 January 2027               [Page 19]
Internet-Draft         Transparent IDN Resolution              July 2026

   +---------------------+---------------------+-----------------------+
   |xn--strae-oqa.de     |xn--strae-oqa.de     |ASCII fast path:       |
   |                     |                     |existing A-labels are  |
   |                     |                     |never re-mapped.       |
   +---------------------+---------------------+-----------------------+
   |⒈example.com         |error                |U+2488 is disallowed;  |
   |                     |                     |fails closed per       |
   |                     |                     |Section 5.7.           |
   +---------------------+---------------------+-----------------------+

                       Table 3: ToASCII Test Vectors

Acknowledgements

   The analysis in this document benefited from the public source code
   and issue trackers of the projects surveyed in Appendix A.  Reviewers
   and contributors will be acknowledged here as the document
   progresses.

Author's Address

   Luca Rodenhäuser
   Lindenstraße 11
   64380 Gundernhausen
   Germany
   Email: otzelot2021@outlook.de

Rodenhaeuser             Expires 19 January 2027               [Page 20]