<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
There has to be one entity for each item to be referenced. 
An alternate method (rfc include) is described in the references. --><!ENTITY RFC5966 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5966.xml">
<!ENTITY I-D.ietf-tcpm-fastopen SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-fastopen">
<!ENTITY I-D.draft-ietf-dnsop-edns-tcp-keepalive SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-dnsop-edns-tcp-keepalive-00.xml">
<!ENTITY RFC1034 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml">
<!ENTITY RFC1035 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
<!ENTITY RFC1995 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1995.xml">
<!ENTITY RFC2119 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2136 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2136.xml">
<!ENTITY RFC2629 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2629.xml">
<!ENTITY RFC2845 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2845.xml">
<!ENTITY RFC4033 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4033.xml">
<!ENTITY RFC4034 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml">
<!ENTITY RFC4035 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4035.xml">
<!ENTITY RFC5936 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5936.xml">
<!ENTITY RFC7706 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7706.xml">
<!ENTITY RFC7719 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7719.xml">
<!ENTITY RFC3658 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3658.xml">
<!ENTITY RFC4509 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4509.xml">
<!ENTITY RFC5933 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5933.xml">
<!ENTITY RFC6605 PUBLIC "" "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6605.xml">
<!ENTITY RRNAME "ZONEMD">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="std" docName="draft-wessels-dns-zone-digest-01" ipr="trust200902">
  <!-- category values: std, bcp, info, exp, and historic
  ipr values: full3667, noModification3667, noDerivatives3667
  you can add the attributes updates="NNNN" and obsoletes="NNNN" 
  they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the 
    full title is longer than 39 characters -->

    <title abbrev="DNS Zone Digest">Message Digest for DNS Zones</title>

    <!-- add 'role="editor"' below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->

    <author fullname="Duane Wessels" initials="D." surname="Wessels">
      <organization>Verisign</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
        </postal>
        <phone>+1 703 948-3200</phone>
        <email>dwessels@verisign.com</email>
        <uri>http://verisign.com</uri>
      </address>
    </author>

    <author fullname="Piet Barber" initials="P." surname="Barber">
      <organization>Verisign</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
        </postal>
        <phone>+1 703 948-3200</phone>
        <email>pbarber@verisign.com</email>
        <uri>http://verisign.com</uri>
      </address>
    </author>

    <author fullname="Matt Weinberg" initials="M." surname="Weinberg">
      <organization>Verisign</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
        </postal>
        <phone>+1 703 948-3200</phone>
        <email>mweinberg@verisign.com</email>
        <uri>http://verisign.com</uri>
      </address>
    </author>

    <author fullname="Warren Kumari" initials="W." surname="Kumari">
      <organization>Google</organization>
      <address>
        <postal>
          <street>1600 Amphitheatre Parkway</street>
          <city>Mountain View</city>
          <region>CA</region>
          <code>94043</code>
        </postal>
        <email>warren@kumari.net</email>
      </address>
    </author>

    <author fullname="Wes Hardaker" initials="W." surname="Hardaker">
      <organization>USC/ISI</organization>
      <address>
        <postal>
          <street>P.O. Box 382</street>
          <city>Davis</city>
          <region>CA</region>
          <code>95617</code>
        </postal>
        <email>ietf@hardakers.net</email>
      </address>
    </author>

    <date month="May" year="2018"/>

    <area>General</area>

    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>DNS</keyword>
    <keyword>DNSSEC</keyword>
    <keyword>Checksum</keyword>
    <keyword>Hash</keyword>
    <keyword>Zone Transfer</keyword>

    <abstract>
      <t>
        This document describes a protocol and DNS Resource Record
        used to provide a message digest over DNS zone data.
        In particular, it describes how to compute, sign, represent,
        and use the message digest to verify the contents of a
        zone for accuracy and completeness.
        The &RRNAME; Resource Record type is introduced for conveying
        the message digest data.
      </t>
    </abstract>
  </front>

  <middle>

    <section title="Introduction">
      <t>
        In the DNS, a zone is the collection of authoritative resource
        records (RRs) sharing a common origin (<xref target="RFC7719"/>),
        which can be distributed from primary to secondary name
        servers.
        Zones are often stored as files on disk in the so-called
        master file format <xref target="RFC1034"/>.
        Sometimes zones are distributed outside of the DNS, with
        such protocols as FTP, HTTP, rsync, and so on.
        While zone files are self-contained, currently there is
        no way to verify the authenticity of a stand-alone zone
        file without relying on an external checksum or signature.
      </t>
      <t>
        This document introduces a new RR type that serves as a
        cryptographic message digest of the data in a zone file.
        It allows a receiver of the zone file to verify the zone file's
        authenticity, especially when used in combination with DNSSEC.
      </t>
      <t>
        DNS transaction signatures (TSIG <xref target="RFC2845"/>) uses a message
        digest to protect individual query and response messages.
        TSIG is generally used to authenticate and validate UPDATE <xref target="RFC2136"/>
        AXFR <xref target="RFC5936"/>, and IXFR <xref target="RFC1995"/> messages.
        However, TSIG's protections are ephemeral, existing only "on
        the wire," and are not retained after the transaction is complete.
        Additionally, TSIG utilizes shared secret keys, which
        are not available to third parties.
      </t>
      <t>
        The technique described in this document makes the message
        digest a part of the zone file itself, allowing anything
        to verify the zone file as a whole, no matter how it is
        transmitted.
      </t>
      <t>
        DNSSEC provides three strong security guarantees relevant
        to this protocol:
        <list style="numbers">
        <t>whether or not to expect DNSSEC records in the zone,</t>
        <t>whether or not to expect a &RRNAME; record in a signed zone, and</t>
        <t>whether or not the &RRNAME; record has been altered since it was signed.</t>
        </list>
      </t>
      <t>
        FOR DISCUSSION: currently this document does not require DNSSEC.
        Should it be a prerequisite?
      </t>
      <t>
        The motivation for including a message digest in a zone
        file comes largely from the DNS root zone.
        At the time of this writing, there is increased attention
        to the idea of widely distributing the root zone, beyond
        the root server system.
        <xref target="RFC7706"/> describes how a recursive resolver
        can serve the root zone via a loopback address.
        As the root zone spreads beyond its traditional deployment
        boundaries, the need for verification of the completeness of
        the zone contents becomes increasingly important.
      </t>
      <t>
        Nothing in this specification, however, is specific to the root zone.  The zone digest is
        designed to work with any DNS zone.
      </t>
      <t>
        This specification is OPTIONAL to implement by both publishers
        and consumers of zone file data.
      </t>
    </section>

    <section title="Terminology">
      <t>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
        document are to be interpreted as described in <xref target="RFC2119"/>.
      </t>
    </section>

    <section title="The &RRNAME; Resource Record" anchor="rrtype">
      <t>
        This section describes the &RRNAME; Resource Record, including its fields, wire format, and presentation format.
        The Type value for the &RRNAME; RR is TBD.
        The &RRNAME; RR is class independent.
        The RDATA of the resource record consists of three fields: Serial, Digest Type, and Digest.
      </t>
      <t>
        FOR DISCUSSION: This document is currently written as though
        a zone MUST NOT contain more than one &RRNAME; RR.
        Having exactly one &RRNAME; record per zone simplifies this
        protocol and eliminates confusion around downgrade attacks, at
        the expense of algorithm agility.
      </t>

      <section title="&RRNAME; RDATA Wire Format">
        <t>The &RRNAME; RDATA wire format is encoded as follows:</t>
        <figure><artwork align="left"><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Serial                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Digest Type  |                                               |
+-+-+-+-+-+-+-+-+             Digest                            +
/                                                               /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

        <section title="The Serial Field">
          <t>
            The Serial field is a 32-bit unsigned integer in network
            order. It is equal to the serial number from the zone's
            SOA record (<xref target="RFC1035"/> section 3.3.13) for
            which the message digest was generated.
          </t>
          <t>
            FOR DISCUSSION: the serial number is included in order
            to make DNS response messages of type &RRNAME; meaningful.
            Without the serial number, a stand-alone &RRNAME; digest
            has no association to any particular zone file.  If
            there is agreement that &RRNAME; responses are not useful,
            this field could be removed.  See also the end of
            Security Considerations.
          </t>
        </section>

        <section title="The Digest Type Field">
          <t>
            The Digest Type field is an 8-bit unsigned integer, with
            meaning equivalent to the Digest Type of the DS resource record,
            as defined in section 5.1.3 of <xref target="RFC4034"/>.
          </t>
          <t>
            The status of &RRNAME; digest types (e.g., mandatory,
            optional, deprecated) SHALL always match the status for
            DS records.  This information can be found in the IANA
            protocol registry for DS digest types <xref target="iana-ds-digest-types"/>.
          </t>
          <t>
            At the time of this writing the following digest types are defined:
          </t>
            <texttable anchor="digest-type-table" title="Digest Types">
            <ttcol align="left">Value</ttcol>
            <ttcol align="left">Description</ttcol>
            <ttcol align="left">Status</ttcol>
            <ttcol align="left">Reference</ttcol>
            <c>1</c>
            <c>SHA1</c>
            <c>Mandatory</c>
            <c><xref target="RFC3658"/></c>
            <c>2</c>
            <c>SHA256</c>
            <c>Mandatory</c>
            <c><xref target="RFC4509"/></c>
            <c>3</c>
            <c>GOST R 34.11-94</c>
            <c>Optional</c>
            <c><xref target="RFC5933"/></c>
            <c>4</c>
            <c>SHA384</c>
            <c>Optional</c>
            <c><xref target="RFC6605"/></c>
            <!-- postamble>Data from https://www.iana.org/assignments/ds-rr-types/ds-rr-types.xhtml</postamble -->
            </texttable>
        </section>

        <section title="The Digest Field">
          <t>
            The Digest field is a variable-length sequence of octets
            containing the message digest.  <xref target="calculating"/>
            describes how to calculate the digest for a zone.
            <xref target="verifying"/> describes how to use the digest to
            verify the contents of a zone.
          </t>
        </section>
      </section>

      <section title="&RRNAME; Presentation Format">
        <t>
          The presentation format of the RDATA portion is as follows:
        </t>
        <t>
          The Serial field MUST be represented as an unsigned decimal integer.
        </t>
        <t>
          The Digest Type field MUST be represented as an unsigned decimal
          integer.
        </t>
        <t>
          The Digest MUST be represented as a sequence of case-insensitive
          hexadecimal digits.  Whitespace is allowed within the hexadecimal
          text.
        </t>
      </section>

      <section title="&RRNAME; Example">
        <t>
          The following example shows a &RRNAME; RR.
        </t>
        <figure><artwork>
example.com. 86400 IN &RRNAME; ( 2018031500 4 FEBE3D4CE2EC2FFA4BA9
                                            9D46CD69D6D29711E552
                                            17057BEE7EB1A7B641A4
                                            7BA7FED2DD5B97AE499F
                                            AFA4F22C6BD647DE )
        </artwork></figure>
      </section>

    </section>

    <section title="Calculating the Digest" anchor="calculating">
      <section title="Canonical Format and Ordering">
        <t>
          Calculation of the zone digest REQUIRES the RRs in a zone
          to be in a consistent format and ordering.  Correct ordering
          of the zone depends on (1) ordering of owner names in the zone, (2)
          ordering of RRsets with the same owner name, and (3) ordering of
          RRs within an RRset.
        </t>
        <t>
          This specification adopts DNSSEC's canonical ordering for names
          (Section 6.1 of <xref target="RFC4034"/>),
          and canonical ordering for RRs within an RRset
          (Section 6.3 of <xref target="RFC4034"/>).
          It also adopts DNSSEC's canonical RR form
          (Section 6.2 of <xref target="RFC4034"/>).
          However, since DNSSEC does not define a canonical ordering for RRsets
          having the same owner name, that ordering is defined here.
        </t>
        <section title="Order of RRsets Having the Same Owner Name">
          <t>
            For the purposes of calculating the zone digest, RRsets having
            the same owner name MUST be numerically ordered by their numeric RR TYPE.
          </t>
        </section>
        <section title="Special Considerations for SOA RRs">
          <t>
            When AXFR is used to transfer zone data, the first and last
            records are always the SOA RR (<xref target="RFC5936"/>
            Section 2.2).  Because of this, zone files on disk often
            contain two SOA RRs.  When calculating the zone digest, the first
            SOA RR MUST be included and any subsequent SOA RRs MUST NOT be included.
          </t>
          <t>
            Additionally, per established practices, the SOA record
            is generally the first record in a zone file.  However,
            according to the requirement to sort RRsets with the
            same owner name by type, the SOA RR (type value 2) might not
            be first in the digest calculation.  If the zone has
            an A RR (type value 1) at the apex, it MUST be processed before
            the SOA RR.
          </t>
        </section>
      </section>
      <section title="Add &RRNAME; Placeholder">
        <t>
          In preparation for calculating the zone digest, any existing &RRNAME; records
          MUST first be deleted from the zone.
        </t>
        <t>
          Prior to calculation of the digest, and prior to signing with
          DNSSEC, a placeholder &RRNAME; record MUST be added to the
          zone.  This serves two purposes: (1) it allows the digest to cover
          the Serial and Digest Type field values, and (2) ensures that 
          appropriate denial-of-existence (NSEC, NSEC3) records are created
          if the zone is signed with DNSSEC.
        </t>
        <t>
          In the placeholder record, the Serial field MUST be
          set to the current SOA Serial.  The Digest Type field MUST be set
          to the value for the chosen digest algorithm. The Digest
          field MUST be set to all zeroes and of length appropriate
          for the chosen digest algorithm.
        </t>
      </section>
      <section title="Optionally Sign the Zone">
        <t>
          Following addition of the placeholder record, the zone MAY be signed with DNSSEC.
          Note that when the digest calculation is complete, and the &RRNAME; record is updated,
          the signature(s) for that record MUST be recalculated and
          updated as well.
          Therefore, the signer is not required to calculate a signature over the placeholder record at
          this step in the process, but it is harmless to do so.
        </t>
      </section>
      <section title="Calculate the Digest" anchor="calculating-calculating">
        <t>
          The zone digest is calculated by concatenating the canonical on-the-wire
          form of RRs in the zone, in the order described
          above, subject to the inclusion/exclusion rules described
          below, and then applying the digest algorithm:
        </t>
        <figure><artwork>
digest = digest_algorithm( RR(1) | RR(2) | RR(3) | ... )

where "|" denotes concatenation, and

RR(i) = owner | type | class | TTL | RDATA length | RDATA
        </artwork></figure>
        <section title="Inclusion/Exclusion Rules">
          <t>
            When calculating the digest, the following inclusion/exclusion rules apply:
            <list style="symbols">
            <t>More than one SOA MUST NOT be included.</t>
            <t>The placeholder &RRNAME; RR MUST be included.</t>
            <t>If the zone is signed, DNSSEC RRs MUST be included, except:</t>
            <t>The RRSIG covering &RRNAME; MUST NOT be included.</t>
            </list>
          </t>
        </section>
      </section>
      <section title="Update &RRNAME; RR">
        <t>
          Once the zone digest has been calculated, its value is then copied to the Digest field of the &RRNAME; record.
        </t>
        <t>
          If the zone is signed with DNSSEC, the appropriate RRSIG records covering the &RRNAME;
          record MUST then be added.  Because the &RRNAME; placeholder was added prior to signing,
          the zone will already have the appropriate denial-of-existence (NSEC, NSEC3) records.
        </t>
      </section>
    </section>

    <section title="Verifying Zone Message Digest" anchor="verifying">
      <t>
        The recipient of a zone that has a message digest record can verify the zone
        by calculating the digest as follows:
      </t>
      <t>
        <list style="numbers">
          <t anchor="verify-check-dnssec">
            The verifier SHOULD first determine
            whether or not to expect DNSSEC records in the zone.
            This can be done by examining locally configured trust
            anchors, or querying for (and validating) DS RRs in the
            parent zone.  For zones that are provably unsigned,
            digest validation continues at step <xref target="verify-check-serials" format="counter"/> below.
          </t>
          <t anchor="verify-check-existence">
            For zones that are provably signed, the existence of
            the &RRNAME; record MUST be verified.  If the &RRNAME;
            record provably does not exist, digest verification
            cannot be done.  If the &RRNAME; record does provably
            exist, but is not found in the zone, digest verification
            MUST NOT be considered successful.
          </t>
          <t>
            For zones that are provably signed, the SOA RR and
            &RRNAME; RR(set) MUST have valid signatures, chaining
            up to a trust anchor.  If DNSSEC validation of the SOA
            or &RRNAME; records fails, digest verification MUST NOT
            be considered successful.
          </t>
          <t anchor="verify-check-serials">
            The SOA Serial field MUST exactly match the &RRNAME;
            Serial field.  If the fields to not match, digest
            verification MUST NOT be considered successful.
          </t>
          <t>
            The &RRNAME; Digest Type field MUST be checked.  If the
            verifier does not support the given digest type, it
            SHOULD report that the zone digest could not be verified
            due to an unsupported algorithm.
          </t>
          <t>
            The zone digest is calculated using the algorithm
            described in <xref target="calculating-calculating"/>.
            Note in particular that digested &RRNAME;
            RRs MUST be placeholders and
            their RRSIGs are not included in the digest.
          </t>
          <t>
            The calculated digest is compared to the received digest.
            If the two digest values match, verification is considered
            successful.  Otherwise, verification MUST NOT be
            considered successful.
          </t>
          <t>
            If the zone is to be served and transferred, the original
            (not placeholder) &RRNAME; RRs MUST be sent to recipients
            so that downstream clients can verify the zone.
          </t>
        </list>
      </t>
    </section>

    <section title="IANA Considerations" anchor="iana">
      <section title="&RRNAME; RRtype">
        <t>
          This document uses a new DNS RR type, &RRNAME;, whose
          value TBD has been allocated by IANA from the "Resource
          Record (RR) TYPEs" subregistry of the "Domain Name System
          (DNS) Parameters" registry.
        </t>
      </section>
      <section title="&RRNAME; Digest Type">
        <t>
          The &RRNAME; Digest Type field has the same semantics as the DS RR Digest Type field.
          Thus, it does not add new IANA protocol registry requirements.
        </t>
      </section>
    </section>

    <section title="Security Considerations" anchor="security">
      <section title="Attacks Against the Zone Digest">
        <t>
          The zone digest allows the receiver to verify that the zone
          contents haven't been modified since the zone was
          generated/published.  Verification is strongest when the
          zone is also signed with DNSSEC.
          An attacker, whose goal is to modify zone content before
          it is used by the victim, may consider a number of different
          approaches.
        </t>
        <t>
          The attacker might perform a downgrade attack to an unsigned
          zone.  This is why <xref target="verifying"/> RECOMMENDS
          that the verifier determine whether or not to expect DNSSEC
          signatures for the zone in step <xref target="verify-check-dnssec" format="counter"/>.
        </t>
        <t>
          The attacker might perform a downgrade attack by removing
          the &RRNAME; record.  This is why <xref target="verifying"/>
          REQUIRES that the verifier checks DNSSEC denial-of-existence
          proofs in step <xref target="verify-check-existence" format="counter"/>.
        </t>
        <t>
          The attacker might alter the Digest Type or Digest fields
          of the &RRNAME; record.  Such modifications are detectable
          only with DNSSEC validation.
        </t>
      </section>
      <section title="Attacks Utilizing the Zone Digest">
        <t>
          Nothing in this specification prevents clients from making,
          and servers from responding to, &RRNAME; queries.  One might
          consider how well &RRNAME; responses could be used in
          a distributed denial-of-service amplification attack.
        </t>
        <t>
          The &RRNAME; RR is moderately sized, much like the DS RR.
          A single &RRNAME; RR contributes approximately 40 to 65
          octets to a DNS response, for currently defined digest
          types.  Certainly other query types result in larger
          amplification effects (i.e., DNSKEY).
        </t>
        <t>
          FOR DISCUSSION:
          The primary purpose of the &RRNAME; record is to verify
          a zone file prior to being loaded or served by a name server.
          We could allow a name server implementation to respond to
          &RRNAME; queries with the REFUSED RCODE without loss of
          functionality.  Note that refusal would prevent ensuring that a
          zone-walk is complete. 
        </t>
        <!-- t>
          General record modification, addition or deletion will
          be caught by checking either the value of the &RRNAME;
          or regular DNSSEC validation.
        </t -->
      </section>
    </section>

    <section title="Privacy Considerations" anchor="privacy">
      <t>This specification has no impacts on user privacy.</t>
    </section>

    <section title="Acknowledgments" anchor="acknowledgments">
      <t>
        The authors wish to thank David Blacka, Scott Hollenbeck, and Rick Wilhelm
        for providing feedback on early drafts of this document.
      </t>
    </section>

    <section anchor="Implementation" title="Implementation Status">
      <section title="Authors' Implementation">
        <t>
          The authors are currently working on an implementation in
          C, using the ldns library <xref target="ldns"/>.  This implementation is able to
          perform the following functions:
          <list style="symbols">
          <t>Read input zone file, output zone file with &RRNAME; placeholder.</t>
          <t>Compute zone digest over signed zone file and update &RRNAME; record.</t>
          <t>Re-compute DNSSEC signature over &RRNAME; record.</t>
          <t>Verify zone digest from input zone file.</t>
          </list>
        </t>
        <t>
          The authors expect to be able to release this implementation as open source following
          submission of this Internet-Draft.
        </t>
      </section>
    </section>

    <section anchor="Changes" title="Change Log">
      <t>RFC Editor: Please remove this section.</t>
      <t>This section lists substantial changes to the document as it is being worked on.</t>
      <t>From -00 to -01:
      <list style="symbols">
        <t>Removed requirement to sort by RR CLASS.</t>
        <t>Added Kumari and Hardaker as coauthors.</t>
        <t>Added Change Log section.</t>
        <t>Minor clarifications and grammatical edits.</t>
      </list></t>
    </section>

  </middle>
  <back>

    <references title="Normative References">
    &RFC2119;
    &RFC1034;
    &RFC1035;
    &RFC4034;
    &RFC3658;
    &RFC4509;
    &RFC5933;
    &RFC6605;

     <reference anchor="iana-ds-digest-types" target="https://www.iana.org/assignments/ds-rr-types/ds-rr-types.xhtml">
        <front>
          <title>Delegation Signer (DS) Resource Record (RR) Type Digest Algorithms</title>
          <author>
            <organization>IANA</organization>
          </author>
          <date year="2012" month="April" day="3"/>
        </front>
     </reference>

     <reference anchor="ldns" target="https://www.nlnetlabs.nl/projects/ldns/">
        <front>
          <title>The ldns Library</title>
          <author>
            <organization>NLNet Labs</organization>
          </author>
          <date year="2018" month="March" day="27"/>
        </front>
     </reference>

    </references>

    <references title="Informative References">
    &RFC1995;
    &RFC2136;
    &RFC2845;
    &RFC5936;
    &RFC7706;
    &RFC7719;
    </references>

  </back>
</rfc>
