<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-hdong-dnsop-ml-dsa-mtl-dnssec-sigtag-ext-00" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="ML-DSA-MTL-DNSSEC-SIGTAG">Module-Lattice-Based Signatures with Merkle Tree Ladders (ML-DSA-MTL) for DNSSEC with SigTag Extension</title><seriesInfo value="draft-hdong-dnsop-ml-dsa-mtl-dnssec-sigtag-ext-00" stream="IETF" status="standard" name="Draft"></seriesInfo>
<author initials="H." surname="Dong" fullname="H. Dong"><organization>Verisign Labs</organization><address><postal><street>12061 Bluemont Way</street>
<city>Reston</city>
<code>20190</code>
<country>USA</country>
<region>VA</region>
</postal><email>hdong@verisign.com</email>
<uri>https://www.verisignlabs.com/</uri>
</address></author><author initials="A." surname="Kaizer" fullname="A. Kaizer"><organization>Verisign Labs</organization><address><postal><street>12061 Bluemont Way</street>
<city>Reston</city>
<code>20190</code>
<country>USA</country>
<region>VA</region>
</postal><email>akaizer@verisign.com</email>
<uri>https://www.verisignlabs.com/</uri>
</address></author><author initials="J." surname="Harvey" fullname="J. Harvey"><organization>Verisign Labs</organization><address><postal><street>12061 Bluemont Way</street>
<city>Reston</city>
<code>20190</code>
<country>USA</country>
<region>VA</region>
</postal><email>jsharvey@verisign.com</email>
<uri>https://www.verisignlabs.com/</uri>
</address></author><author initials="B." surname="Kaliski" fullname="B. Kaliski"><organization>Verisign Labs</organization><address><postal><street>12061 Bluemont Way</street>
<city>Reston</city>
<code>20190</code>
<country>USA</country>
<region>VA</region>
</postal><email>bkaliski@verisign.com</email>
<uri>https://www.verisignlabs.com/</uri>
</address></author><author initials="S." surname="Sheth" fullname="S. Sheth"><organization>Verisign Labs</organization><address><postal><street>12061 Bluemont Way</street>
<city>Reston</city>
<code>20190</code>
<country>USA</country>
<region>VA</region>
</postal><email>ssheth@verisign.com</email>
<uri>https://www.verisignlabs.com/</uri>
</address></author><date year="2026" month="September" day="28"></date>
<area>Internet</area>
<workgroup>DNSOP Working Group</workgroup>
<keyword>Signature</keyword>
<keyword>DNSSEC</keyword>
<keyword>Algorithm</keyword>

<abstract>
<t>This document describes a mechanism to reduce post-quantum cryptographic (PQC) network transmission overhead when using Merkle Tree Ladders (MTL) in DNS Security Extensions (DNSSEC). This document refers to this as SigTag and describes the use of EDNS(0) to enable its use. SigTag allows a client to indicate its knowledge of a specific MTL ladder. The DNS server can then use this signal to determine if it can omit the full underlying signature in its response, thereby reducing the message payload.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>Merkle Tree Ladder (MTL) is a technique for using an underlying signature scheme to authenticate an evolving series of messages. The application of the Module-Lattice-Based Digital Signature Algorithm (ML-DSA) <xref target="FIPS204"></xref> and MTL as a conservative post-quantum cryptographic (PQC) algorithm for DNS Security Extensions (DNSSEC) is detailed in <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>.</t>
<t>As specified in <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>, a DNSSEC RRSIG for MTL contains both a condensed signature (authentication path/Merkle tree inclusion proof) unique to an RRset and a signed ladder that contains a PQC signature. The signed ladder can potentially be used to authenticate multiple condensed signatures. A signed ladder is included in every RRSIG in <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>. This can provide computational and storage efficiency through ladder reuse but does not reduce network transmission overhead.</t>
<t>When a client already knows the ladder required for verification, the server does not need to retransmit it; the server can transmit only the condensed signatures, hence reducing network transmission overhead. This document specifically defines an EDNS(0) option that allows a client to signal its capability to use this mechanism, referred to hereafter as SigTag, or to indicate its knowledge of a specific SigTag.</t>

<section anchor="definitions"><name>Definitions</name>
<t>This document uses the terminology from <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref> as a baseline. Additional terms applicable to the concepts in this draft are provided here in alphabetical order:</t>

<dl spacing="compact">
<dt>SigTag</dt>
<dd>An identifier that refers to a specific signed MTL ladder.</dd>
</dl>
</section>
</section>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they appear in all capitals, as shown here.</t>
<t>The single pipe character, &quot;|&quot;, is used to denote concatenation as is done in <xref target="RFC4034"></xref>.</t>
<t>All RRSIG elements and EDNS(0) fields specified in this document are unsigned integers in network byte order (big endian order).</t>
</section>

<section anchor="sigtag_definition"><name>SigTag</name>
<t>SigTag uniquely identifies a specific signed ladder within a signer's scope. In this document, SigTag is defined in a way that a DNS client can construct a SigTag from a received or cached signed ladders. This document defines the SigTag for an MTL signature as the hash of the signed ladder:</t>
<t>SigTag = SHAKE128(SIGNED_LADDER, 256)</t>

<artwork anchor="snv"><![CDATA[0                       8                      16
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
//         SigTag = Signed Ladder Hash         //
|                 (32-octets)                   |
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
]]>
</artwork>
<t>The input to the hash function MUST be the serialization of the components of the Signed Ladder (shown in the figure below) as defined in Section 5.1.2 of <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>, including the signature size and the signature fields:</t>

<artwork anchor="sigtag_ladder"><![CDATA[                         1 1 1 1 1 1 
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
    +-------------------------------+
    |        Flags (2-octets)       |
    +-------------------------------+
    |                               |
    //             SID             //
    |          (32-octets)          |
    +-------------------------------+
    |     Rung Count (2-octets)     |
    +-------------------------------+
    |                               |
    //          Rung Data          //
    |      (32-octets per rung)     |
    +-------------------------------+
    |  Underlying Signature Length  |
    |          (4-octets)           |
    +-------------------------------+
    |                               |
    //    Underlying Signature     //
    |         (2420-octets)         |
    +-------------------------------+
]]>
</artwork>

<section anchor="mtl_type"><name>MTL-Type Value in RRSIG Resource Record</name>
<t>As defined in Section 4 of <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>, the signature field of the RRSIG RR begins with a one-octet MTL-Type, followed by the MTL Authentication Data:</t>

<artwork anchor="rrsig_signature"><![CDATA[                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   MTL-Type    |                                               |
+-+-+-+-+-+-+-+-+                                               |
|                    MTL Authentication Data                    |
/                                                               /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]>
</artwork>
<t>This document adds a new MTL-Type value to the MTL-Types registry maintained by IANA:</t>

<ul spacing="compact">
<li>The MTL-Type MUST be set to condensed (0x02) for condensed signatures.</li>
</ul>
</section>
</section>

<section anchor="the-sigtag-edns-0-option"><name>The SigTag EDNS(0) Option</name>
<t>A SigTag-aware DNS client may signal its support for, or knowledge of a specific SigTag by including the SigTag EDNS(0) option in its query as described in <xref target="RFC6891"></xref>.</t>

<section anchor="option_format"><name>Option Format</name>
<t>The SigTag EDNS(0) option is encoded as follows:</t>

<artwork anchor="use_sigtag_in_the_dns_opt_field"><![CDATA[0                       8                      16
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                  OPTION-CODE                  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                 OPTION-LENGTH                 |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
//                 OPTION-DATA                 //
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
]]>
</artwork>
<t>Where:</t>

<dl spacing="compact">
<dt>OPTION-CODE</dt>
<dd>The 2-octet EDNS(0) option code assigned to the MTL SigTag, TBD.</dd>
<dt>OPTION-LENGTH</dt>
<dd>A 2-octet field containing the length of the OPTION-DATA field.</dd>
<dt>OPTION-DATA</dt>
<dd>Zero or more SigTag values.</dd>
</dl>
</section>
</section>

<section anchor="use-of-sigtag-by-clients"><name>Use of SigTag by Clients</name>
<t>A SigTag-aware client MAY include the SigTag EDNS(0) option in its query.</t>

<section anchor="client-handling-of-sigtag-in-queries"><name>Client Handling of SigTag in Queries</name>

<section anchor="client_sno"><name>With No Knowledge of SigTags</name>
<t>If a SigTag-aware client has no knowledge of any SigTags, it SHOULD signal its support for SigTag by leaving the EDNS(0) OPTION-DATA field empty and set the OPTION-LENGTH field to 0. This enables the client to determine whether the server supports SigTag (Section <xref target="serv_handling"></xref>). The SigTag format is illustrated as follows:</t>

<artwork anchor="eg_sno"><![CDATA[0                       8                      16
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|               OPTION-CODE = TBD               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|             OPTION-LENGTH = 0x0000            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
]]>
</artwork>
</section>

<section anchor="client_snk"><name>With Known SigTag(s)</name>
<t>The client SHOULD include any SigTag values it believes are relevant to the current query in the OPTION-DATA field and set the OPTION-LENGTH field to the length of the OPTION-DATA field to signal its knowledge of one or more specific ladders to the server:</t>

<artwork anchor="eg_snk"><![CDATA[0                       8                      16
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|               OPTION-CODE = TBD               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                 OPTION-LENGTH                 |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
|                                               |
//           OPTION-DATA = SigTag(s)          //
|            (32-octets per SigTag)            |
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
]]>
</artwork>
<t>The 32-octet per SigTag value is obtained by hashing the respective signed ladder, as specified in <xref target="sigtag_definition"></xref>.</t>
</section>
</section>

<section anchor="summary-of-expected-client-queries"><name>Summary of Expected Client Queries</name>
<table><name>Expected DNS Client Behavior
</name>
<thead>
<tr>
<th>Support SigTag</th>
<th>Know SigTag</th>
<th>Query</th>
</tr>
</thead>

<tbody>
<tr>
<td>N</td>
<td>-</td>
<td>-</td>
</tr>

<tr>
<td>Y</td>
<td>N</td>
<td>SigTag EDNS(0) with empty OPTION-DATA</td>
</tr>

<tr>
<td>Y</td>
<td>Y</td>
<td>SigTag EDNS(0) with SigTag in OPTION-DATA</td>
</tr>
</tbody>
</table></section>

<section anchor="selection-of-the-sigtag"><name>Selection of the SigTag</name>
<t>A DNS message MAY include multiple different SigTags under conditions such as multiple signers, key rollovers, or scenarios where the client maintains multiple cached ladders. When multiple SigTags are included in the OPT meta-RR, they MUST be concatenated into a single OPTION-DATA field. This document limits the maximum number of SigTags in one DNS query to 8 SigTags to bound the potential overhead of this approach.</t>
<t>It is RECOMMENDED that a SigTag-aware DNS client advertise SigTags that are most relevant in the client's preferred order to minimize subsequent queries and ensure that the client retains valid signed ladders for a given period.</t>
</section>

<section anchor="client-handling-of-sigtag-in-responses"><name>Client Handling of SigTag in Responses</name>
<t>The client SHOULD determine that the server supports SigTag by verifying that the response does not return an RCODE of FORMERR, as specified in <xref target="RFC6891"></xref>. If the server supports SigTag, the client MUST ignore any data present within the OPTION-DATA field of the SigTag EDNS(0) option.</t>
</section>
</section>

<section anchor="serv_handling"><name>Use of SigTag by Servers</name>

<section anchor="serv_query"><name>Server Handling of SigTag in Queries</name>
<t>If the client includes the SigTag EDNS(0) option, the server MUST also include the SigTag EDNS(0) option in the response to signal its support for SigTag. The server MUST set the EDNS(0) OPTION-LENGTH to 0 and leave the OPTION-DATA field empty in its response, as the client will construct its SigTag values from received or cached ladders.</t>
<t>If a received query does not contain the SigTag EDNS(0) option, the server MUST NOT include the SigTag EDNS(0) option in its response, in accordance with <xref target="RFC6891"></xref>.</t>
<t>If a received query includes the SigTag EDNS(0) option and the OPTION-LENGTH does not match the internal boundaries of the payload, or if the option payload contains more than 8 instances of SigTag, the server MUST treat the query as malformed and return a response with the RCODE set to FORMERR as specified in <xref target="RFC6891"></xref>.</t>
</section>

<section anchor="serv_resp"><name>Server Handling of SigTag in Responses</name>
<t>For each MTL RRSIG in the response, the server SHOULD process as follows:</t>

<ul spacing="compact">
<li>If no matching SigTag is advertised: the server MUST return a full signature as described in Section 5.1 of <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>.</li>
<li>If a valid, matching SigTag is advertised: the server SHOULD return a condensed signature as defined in Section 5.1.1 of <xref target="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec"></xref>, where the condensed signature can be verified relative to the signed ladder associated with the SigTag value. The associated MTL-Type MUST be set to condensed (0x02) as specified in <xref target="mtl_type"></xref>.</li>
</ul>
<t>If the server no longer possesses the signed ladder referenced by the client-provided SigTag, the server MUST return a full signature.</t>

<section anchor="summary-of-expected-server-responses-per-rrsig"><name>Summary of Expected Server Responses Per RRSIG</name>
<table><name>Expected DNS Server Behavior Per RRSIG
</name>
<thead>
<tr>
<th>Request Supports SigTag</th>
<th>Request Has A Matching SigTag</th>
<th>Respond</th>
</tr>
</thead>

<tbody>
<tr>
<td>N</td>
<td>-</td>
<td>Full Sig</td>
</tr>

<tr>
<td>Y</td>
<td>N</td>
<td>Full Sig</td>
</tr>

<tr>
<td>Y</td>
<td>Y</td>
<td>Condensed Sig</td>
</tr>
</tbody>
</table></section>

<section anchor="serv_dedup"><name>Deduplication Optimization</name>
<t>When a client signals its support for SigTag, the server SHOULD treat this as an indication that the following deduplication optimization is supported. The server SHOULD perform a deduplication optimization when all of the following conditions are met:</t>

<ul spacing="compact">
<li>Multiple RRSIG records in the response have condensed signatures that can be verified using the same signed ladder, and</li>
<li>The signed ladder does not match any SigTag advertised by the client.</li>
</ul>
<t>To perform this optimization, the server SHOULD deduplicate its response by including each common signed ladder within a full signature only once. When deduplication is performed, the full signature MUST be present in the first RRSIG that requires it. Other RRSIG records within the response that can be verified by the same signed ladder as in the full signature SHALL be condensed signatures.</t>
</section>
</section>
</section>

<section anchor="operational-and-security-considerations"><name>Operational and Security Considerations</name>
<t>Clients should be aware that using SigTag may expose knowledge of specific ladders which could, e.g., reveal information about previous queries a client has made or allow a client to be tracked by an authoritative who provides unique SigTag values to every client. Clients concerned about this MAY transmit only an empty SigTag every time to achieve the de-duplication benefits without revealing known SigTags or engage in strategies such as flushing their SigTag related cache when changing IP addresses or interfaces to limit tracking by such properties.</t>
<t>Clients concerned about query retries MAY perform their SigTag-enabled queries directly over TCP. These clients will still benefit from the bandwidth savings provided by including SigTags in their TCP-based DNS requests, provided that the server has a condensed signature that can be verified using the ladder identified by the SigTag.</t>
<t>Clients caching signed ladders MUST store them in association with their respective signers.</t>
<t>If a SigTag-enabled client receives a server response that cannot be validated, the client MAY retry using one of the following fallback strategies:</t>

<ul spacing="compact">
<li>Resend the request including the SigTag EDNS(0) option with an empty OPTION-DATA field.</li>
<li>Resend the request without the SigTag EDNS(0) option and expect to receive full signatures.</li>
<li>Direct the request with the SigTag EDNS(0) option to a different DNS server.</li>
</ul>
<t>Examples of such invalid responses include, but are not limited to, mismatched condensed signatures or missing payloads.</t>
</section>

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

<section anchor="implementations"><name>Implementation Status</name>
<t>NOTE: Please remove this section and the reference to RFC 7942 prior to publication as an RFC.</t>
<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 RFC 7942.  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 RFC 7942, &quot;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&quot;.</t>
<t>For testing purposes, SigTag has been implemented in the following DNS open-source applications:</t>

<ul spacing="compact">
<li>LDNS for key generation, zone signing, and zone verification with MTL: <eref target="https://github.com/Verisign/mtl-mode-ldns"></eref></li>
<li>NSD authoritative name server with MTL: <eref target="https://github.com/verisign/mtl-mode-nsd"></eref></li>
<li>Unbound recursive resolver with MTL: <eref target="https://github.com/Verisign/mtl-mode-unbound"></eref></li>
</ul>
<t>These implementations depend on the reference implementation of MTL which is available in C.  The MTL library can be found at <eref target="https://github.com/Verisign/MTL"></eref>.</t>
</section>

<section anchor="acknowledgements"><name>Acknowledgements</name>
<t>This I-D has drawn from helpful examples of document structure and specification text from various DNSSEC algorithm RFCs. The authors express their gratitude to the authors of those RFCs for their contributions. Special thanks are also extended to Daniel McVicker for his valuable suggestions and contributions.</t>
</section>

</middle>

<back>
<references><name>References</name>
<references><name>Normative References</name>
<reference anchor="FIPS204" target="https://doi.org/10.6028/NIST.FIPS.204">
  <front>
    <title>Module-Lattice-Based Digital Signature Standard</title>
    <author>
      <organization>National Institute of Standards and Technology (NIST)</organization>
    </author>
    <date year="2024" month="August" day="13"></date>
  </front>
  <seriesInfo name="FIPS PUB" value="204"></seriesInfo>
  <seriesInfo name="DOI" value="10.6028/NIST.FIPS.204"></seriesInfo>
</reference>
<reference anchor="I-D.kaizer-dnsop-ml-dsa-mtl-dnssec" target="https://datatracker.ietf.org/doc/html/draft-kaizer-dnsop-ml-dsa-mtl-dnssec-00">
  <front>
    <title>Module-Lattice-Based Signatures with Merkle Tree Ladders (ML-DSA-MTL) for DNSSEC</title>
    <author fullname="Andrew Kaizer" initials="A." surname="Kaizer">
      <organization>Verisign Labs</organization>
    </author>
    <author fullname="Joe Harvey" initials="J." surname="Harvey">
      <organization>Verisign Labs</organization>
    </author>
    <author fullname="Burt Kaliski" initials="B." surname="Kaliski">
      <organization>Verisign Labs</organization>
    </author>
    <author fullname="Swapneel Sheth" initials="S." surname="Sheth">
      <organization>Verisign Labs</organization>
    </author>
    <date year="2026" month="July" day="6"></date>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-kaizer-dnsop-ml-dsa-mtl-dnssec-00"></seriesInfo>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
</references>
<references><name>Informative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6891.xml"/>
</references>
</references>

<section anchor="change-log"><name>Change Log</name>

<ul empty="true" spacing="compact">
<li>00: Initial draft of the document.</li>
</ul>
</section>

</back>

</rfc>
