<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.0.40 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC1034 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml">
<!ENTITY RFC1035 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2181 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2181.xml">
<!ENTITY RFC2308 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2308.xml">
<!ENTITY RFC2317 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2317.xml">
<!ENTITY RFC3597 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3597.xml">
<!ENTITY RFC4033 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4033.xml">
<!ENTITY RFC4034 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml">
<!ENTITY RFC4035 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4035.xml">
<!ENTITY RFC5234 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml">
<!ENTITY RFC7719 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7719.xml">
]>

<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>

<rfc ipr="trust200902" docName="draft-woodworth-bulk-rr-06" category="std" obsoletes="222" updates="2308, 4033, 4034, 4035">

  <front>
    <title abbrev="BULK RR">BULK DNS Resource Records</title>

    <author initials="J." surname="Woodworth" fullname="John Woodworth">
      <organization>CenturyLink, Inc.</organization>
      <address>
        <postal>
          <street>4250 N Fairfax Dr</street>
          <city>Arlington</city>
          <code>VA 22203</code>
          <country>USA</country>
        </postal>
        <email>John.Woodworth@CenturyLink.com</email>
      </address>
    </author>
    <author initials="D." surname="Ballew" fullname="Dean Ballew">
      <organization>CenturyLink, Inc.</organization>
      <address>
        <postal>
          <street>2355 Dulles Corner Blvd, Ste 200 300</street>
          <city>Herndon</city>
          <code>VA 20171</code>
          <country>USA</country>
        </postal>
        <email>Dean.Ballew@CenturyLink.com</email>
      </address>
    </author>
    <author initials="S." surname="Bindinganaveli Raghavan" fullname="Shashwath Bindinganaveli Raghavan">
      <organization>Hughes Network Systems</organization>
      <address>
        <postal>
          <street>11717 Exploration Lane</street>
          <city>Germantown</city>
          <code>MD 20876</code>
          <country>USA</country>
        </postal>
        <email>shashwath.bindinganaveliraghavan@hughes.com</email>
      </address>
    </author>
    <author initials="D.C." surname="Lawrence" fullname="David C Lawrence">
      <organization>Akamai Technologies</organization>
      <address>
        <postal>
          <street>150 Broadway</street>
          <city>Cambridge</city>
          <code>MA 02142-1054</code>
          <country>USA</country>
        </postal>
        <email>tale@akamai.com</email>
      </address>
    </author>

    <date year="2017" month="July"/>

    <area>Internet</area>
    <workgroup>DNSOP Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>The BULK DNS resource record type defines a method of pattern-based
creation of DNS resource records based on numeric substrings of query
names.  The intent of BULK is to simplify generic assignments in a
memory-efficient way that can be easily shared between the primary and
secondary nameservers for a zone.</t>



    </abstract>


    <note title="Ed note">


<t>Text inside square brackets ([]) is additional background
information, answers to frequently asked questions, general musings,
etc.  They will be removed before publication.  This document is being
collaborated on in GitHub at
&lt;https://github.com/vttale/bulk-rr&gt;.  The most recent
version of the document, open issues, etc should all be available
here.  The authors gratefully accept pull requests.</t>


    </note>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>The BULK DNS resource record defines a pattern-based method for
on-the-fly resource record generation.  It is essentially an enhanced
wildcard mechanism, constraining generated resource record owner names
to those that match a pattern of variable numeric substrings.  It is
also akin to the $GENERATE master file directive <xref target="bind-arm"/> without
being limited to numeric values and without creating all possible
records in the zone data.</t>

<t>For example, consider the following record:</t>

<figure><artwork><![CDATA[
example.com. 86400 IN BULK A (
                      pool-A-[0-255]-[0-255].example.com.
                      10.55.${1}.${2}
                   )
]]></artwork></figure>

<t>It will answer requests for pool-A-0-0.example.com through
pool-A-255-255.example.com with the IPv4 addresses 10.55.0.0 through
10.55.255.255.</t>

<t>Much larger record sets can be defined while minimizing the associated
requirements for server memory and zone transfer network bandwidth.</t>

<t>DNSSEC support is also described.  The Numeric Pattern Normalization
(NPN) resource record provides a way of generating pattern-based
DNSSEC signatures, and securely performing DNSSEC validation on such
signatures.</t>

<section anchor="background-and-terminology" title="Background and Terminology">

<t>The reader is assumed to be familiar with the basic DNS and DNSSEC
concepts described in <xref target="RFC1034"/>, <xref target="RFC1035"/>, <xref target="RFC4033"/>,
<xref target="RFC4034"/>, and <xref target="RFC4035"/>; subsequent RFCs that update them in
<xref target="RFC2181"/> and <xref target="RFC2308"/>; and DNS terms in <xref target="RFC7719"/>.</t>

<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>
<section anchor="the-bulk-resource-record" title="The BULK Resource Record">

<t>The BULK resource record enables an authoritative nameserver to
generate RRs for other types based upon the query received.</t>

<t>The Type value for the BULK RR type is TBD.</t>

<t>The BULK RR is class-independent.</t>

<section anchor="bulk-rdata-wire-format" title="BULK RDATA Wire Format">

<t>The RDATA for a BULK RR is as follows:</t>

<figure><artwork><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Match Type          |                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       Domain Name Pattern     /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                                                               /
/                      Replacement Pattern                      /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>Match Type identifies the type of the RRset to be generated by this
BULK record.  It is two octets corresponding to an RR TYPE code as
specified in <xref target="RFC1035"/>, Section 3.2.1.</t>

<t>Domain Name Pattern consists of a pattern encoded as a wire-format
fully qualified domain name.  The full name is used so that numeric
substrings above the zone cut can be captured in addition to those in
the zone.  It needs no length indicator for the entire field because
the root label marks its end.</t>

<t>Special characters are interpreted as per the following Augmented
Backus-Naur Form (ABNF) notation from <xref target="RFC5234"/>.</t>

<figure><artwork><![CDATA[
match         =  1*(range / string)

range         =  "[" decnum "-" decnum "]" /
                  "<" hexnum "-" hexnum ">"
                      ; create references for substitution
                      ; limit of 32 references

string        =  1*(ctext / quoted-char)

decnum        =  1*decdigit
                      ; constrained to 65535 maximum.

hexnum        =  1*hexdigit
                      ; constrained to ffff maximum.

octet         =  %x00-FF

decdigit      =  %x30-39
                      ; 0-9
hexdigit      =  decdigit / 0x41-0x46 / 0x61-66
                      ; 0-9, A-F, a-f

ctext         =  <any octet excepting "\">

quoted-char   = "\" octet
                       ; to allow special characters as literals
]]></artwork></figure>

<t>[ Should [] and &lt;&gt; be allowed as short for [0-255] and &lt;00-ff&gt;? ]</t>

<t>Interpretation of the Domain Name Pattern is described in detail in
the "BULK Replacement" section.</t>

<t>The limit of 32 references is meant to simplify implementation
details.  It is largely but not entirely arbitrary, as it could
capture every individual character of the text representation of a
full IPv6 address.</t>

<t>Replacement Pattern describes how the answer RRset MUST be generated
for the matching query.  It needs no length indicator because its end
can be derived from the RDATA length minus Match Type and Domain Name
Pattern lengths.  It uses the following additional ABNF elements:</t>

<figure><artwork><![CDATA[
replace       =   1*(reference / string)

reference     =   "$" "{" (positions / "*") [options] "}"

positions     =   (position / posrange) 0*("," (position / posrange))

posrange      =   position "-" position

position      =   1*decnum

options       =   delimiter [interval [padding]]

delimiter     =   "|" 0*(ctext | quoted-char)
                        ; "\|" to use "|" as delimiter
                        ; "\\" to use "\" as delimiter

interval      =   "|" *2decdigit

padding       =   "|" *2decdigit

]]></artwork></figure>

<t>[ Is this complexity beyond simple ${1}, ${2}, etc, really worth
it?  I definitely see how it could make for shorter replacement
patterns, but does it enhance their clarity and usability? ]</t>

<t>The Replacement Pattern MUST end in a period if it is intended to
represent a fully qualified domain name.</t>

</section>
<section anchor="the-bulk-rr-presentation-format" title="The BULK RR Presentation Format">

<t>Match Type is represented as an RR type mnemonic or with <xref target="RFC3597"/>'s
generic TYPE mechanism.</t>

<t>Domain Name Pattern is represented as a fully qualified domain name as
per <xref target="RFC1035"/> Section 5.1 rules for encoding whitespace and
other special characters.</t>

<t>Replacement Pattern is represented by the standard &lt;character-string&gt;
text rules for master files as per <xref target="RFC1035"/> section 5.1.</t>

<t>It is suggested that lines longer than 80 characters be wrapped with
parenthetical line continuation, per <xref target="RFC1035"/> Section 5.1, starting
after Match Type and ending after Replacement Pattern.</t>

</section>
</section>
<section anchor="bulk-replacement" title="BULK Replacement">

<t>When an authoritative nameserver receives a query for which it does
not have a matching name or a covering wildcard, it MUST then look for
BULK RRs at the zone apex, selecting all BULK RRs with a Match Type
that matches the query type and a Domain Name Pattern that matches the
query name.  Note that query type ANY will select all Match Types, and
all query types match a CNAME Match Type [ and DNAME? ].  One or more
answer RRs will be generated per the replacement rules below.
Examples are provided in an appendix.</t>

<t>By only triggering the BULK algorithm when the query name does not
exist, administrators are given the flexibility to explicitly override
the behaviour of specific names that would otherwise match the BULK
record's Domain Name Pattern.  This is unlike BIND's $GENERATE
directive, which adds the generated RRs to any existing names.</t>

<section anchor="matching-the-domain-name-pattern" title="Matching the Domain Name Pattern">

<t>A query name matches the Domain Name Pattern if the characters that
appear outside the numeric ranges match exactly and those within
numeric ranges have values that fall within the range.  Numeric
matches MUST be of the appropriate decimal or hexadecimal type as
specified by the delimiters in the pattern.  For example, if a range
is given as [0-255], then FF does not match even though its value as
a hexadecimal number is within the range.</t>

<t>When a query name matches a Domain Name Pattern, the value in each
numeric range is stored for use by the Replacement Pattern, with
reference numbers starting at 1 and counting from the left.  For
example, matching the query name host-24-156 against
host-[0-255]-[0-255] assigns 24 to ${1} and 156 to ${2}.</t>

</section>
<section anchor="record-generation-using-replacement-pattern" title="Record Generation using Replacement Pattern">

<t>The Replacement Pattern generates the record data by replacing the
${&#8230;} references with data captured from the query name, and copying
all other characters literally.</t>

<t>The simplest form of reference uses only the reference number between
the braces, "{" and "}".  The value of the reference is simply
copied directly from the matching position of the query name.</t>

<t>The next form of reference notation uses the asterisk, "*".  With
${*}, all captured values in order of ascending position, delimited by
its default delimiter (described below), are placed in the answer.</t>

<t>Numeric range references, such as ${1-4}, replaces all values captured
by those references, in order, delimited by the default delimiter
described below.  To reverse the order in which they are copied,
reverse the upper and lower values, such as ${4-1}.  This is useful
for generating PTR records from query names in which the address is
encoded in network order.</t>

<t>Similar to range references, separating positions by commas creates
sets for replacement. For example, ${1,4} would be replaced by the
first and fourth captured values, delimited its default delimiter.
This notation may be combined with the numeric range form, such as 
${3,2,1,8-4}.</t>

<section anchor="delimiters" title="Delimiters">

<t>A reference can specify a delimiter to use by following a vertical
bar, "|", with zero or more characters.  Zero characters, such as in
${1-3|}, means no delimiter is used, while other characters up to an
unescaped vertical bar or closing brace are copied between position
values in the replacement.  The default delimiter is the hyphen, "-".</t>

</section>
<section anchor="delimiter-intervals" title="Delimiter intervals">

<t>A second vertical bar in the reference options introduces a delimiter
interval.  The default behavior of a multi-position reference is to
combine each captured value specified with a delimiter between each.
With a delimiter interval the delimiters are only added between every
Nth value.  For example, ${*|-|4} adds a hyphen between every group of
four captured positions.  This can be a handy feature in the IPv6
reverse namespace where every nibble is captured as a separate value
and generated hostnames include sets of 4 nibbles.  An empty or 0
value for the delimiter interval MUST be interpreted as the default
value of 1.</t>

</section>
<section anchor="padding-length" title="Padding length">

<t>The fourth and final reference option determines the field width of
the copied value.  Shorter values MUST be padded with leading zeroes
("0") and longer values MUST be truncated to the width.</t>

<t>The default behavior, and that of an explicit empty padding length, is
that the captured query name substring is copied exactly.  A width of
zero "0" is a signal to "unpad", and any leading zeros MUST be
removed. [ Unnecessary complexity? ]</t>

<t>If a delimiter interval greater than 1 is used, captured values
between the intervals will be concatenated and the padding or
unpadding applied as a unit and not individually.  An example of this
would be ${*||4|4} which would combine each range of 4 captured values
and pad or truncate them to a width of 4 characters.</t>

<t>[ If this is kept, the element/feature should probably be renamed
from "padding" since it is just as likely to truncate. ]</t>

</section>
<section anchor="final-processing" title="Final processing">

<t>The string that results from all replacements is converted to the
appropriate RDATA format for the record type.  If the conversion
fails, the SERVFAIL rcode MUST be set on the response.</t>

<t>The TTL of each RR generated by a BULK RR is the TTL of the
corresponding BULK record itself.  [ BULK should probably have its
own TTL field because using that of the record itself feels like bad
design.  On the other hand, if BULK is never meant to be queried for
directly and only appears in authoritative data, its own TTL is pretty
useless normally. ]</t>

<t>If the generated record type is one that uses domain names in its
resource record data, such as CNAME, a relative domain names MUST be
fully qualified with the origin domain of the BULK RR.</t>

</section>
</section>
</section>
<section anchor="the-npn-resource-record" title="The NPN Resource Record">

<t>The Numeric Pattern Normalization (NPN) resource record provides
pre-processing information to reduce the number of possible variants
that can be generated by a BULK RR into one signable record.  By
identifying parts of the dynamic resource record which should be
ignored or represented as a static value, one exemplar record and
signature is used to validate all other records that match the
pattern.</t>

<t>For example, a pattern replacement like pool-A-${1}-${2}.example.com
that generates PTR records for pool-A-0-0.example.com through
pool-A-255-255.example.com would have an NPN record that signals a
validating resolver to verify all pool-A-#-#.example.com names against
a record for pool-A-9-9.example.com.</t>

<t>Though it is imperfect in that forged records could be validated as
legitimate, it is nevertheless an improvement over the security
afforded by non-DNSSEC DNS.</t>

<t>The Type value for the NPN RR type is TBD.</t>

<t>The NPN RR is class independent and has no special TTL requirements.</t>

<section anchor="npn-rdata-wire-format" title="NPN RDATA Wire Format">

<t>The RDATA for an NPN RR consists of a 2 octet Match Type field, a 1
octet Flags field, a 1 octet Owner Ignore field, a 1 octet Left Ignore
field and a 1 octet Right Ignore field.</t>

<figure><artwork><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Match Type          |     Flags     |  Owner Ignore |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Left Ignore  |  Right Ignore |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>Match Type indicates the type of the RRset with which this record is
associated.</t>

<t>Flags defines additional processing parameters for data normalization.
This document defines only the Period-As-Number flag "." (position 5),
the Hyphen-As-Number "-" (position 6) and the hexadecimal flag "X"
(position 7).  All other flags are reserved for future use.</t>

<figure><artwork><![CDATA[
 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|Reserved |.|-|X|
+-+-+-+-+-+-+-+-+

Bits 0-4: Reserved for future

Bit    5: Period As Number (.) Flag
   If 0, periods are treated as non-digits.
   If 1, periods will be processed as digits.

Bit    6: Hyphen As Number (-) Flag
   If 0, hyphens are treated as non-digits.
   If 1, hyphens will be processed as digits.

Bit    7: Hexadecimal (X) Flag
   If 0, numeric digits include only 0-9.
   If 1, numeric digits include a-f in addition to 0-9.
]]></artwork></figure>

<t>Owner Ignore defines the number of octets in the owner name, as
counted from the left, which MUST be ignored by the normalization
process.  This field offers additional security to pattern based
signatures which may not be immediately apparent.  By restricting the
leftmost characters defined by this value, ultimately the length of
the generated portion of the accompanying BULK RR will be confined
accordingly.</t>

<t>Left Ignore defines the number of octets of the generated RDATA, as
counted from the left, which MUST be ignored by the normalization
process.</t>

<t>Right Ignore defines the number of octets of the generated RDATA, as
counted from the right, which MUST be ignored by the normalization
process.</t>

</section>
<section anchor="the-npn-rr-presentation-format" title="The NPN RR Presentation Format">

<t>Match Type is represented as an RR type mnemonic or with <xref target="RFC3597"/>'s
generic TYPE mechanism.</t>

<t>Flags is a string of characters indicating the status of each bit as
per the following table.  The characters can appear in any order.</t>

<figure><artwork><![CDATA[
+------------------+-----------+-----------+
|       Flag       |   Unset   |    Set    |
+------------------+-----------+-----------+
| Period As Number |           |     .     |
+------------------+-----------+-----------+
| Hyphen As Number |           |     -     |
+------------------+-----------+-----------+
|   Hexadecimal    |     9     |     f     |
+------------------+-----------+-----------+
]]></artwork></figure>

<t>Owner Ignore, Left Ignore, and Right Ignore are displayed as unsigned
decimal integers, ranging from 0 through 255.</t>

</section>
<section anchor="use-and-normalization-processing-of-npn-rrs" title="Use and Normalization Processing of NPN RRs">

<t>[ This section needs reworking still, and should perhaps be pulled
out into a separate document.  Notably one of issues that is not
really described well is that, as designed so far, at signing time the
NPN record has to be associated with the matching BULK record, which
is slightly problematic with regard to the idea that NPNs are
suggested to be extended to be used in the future with other
patterns-based record generation.  Once the appropriate BULK record is
selected, the signer would then have to understand its semantics to
fake up the exemplar to sign &#8211; raising the question as to why it
doesn't also know the appropriate values for the Ignore fields, since
it will have to understand what the static and variable parts are.</t>

<t>One way around all this is to just sign the BULK record itself and return
it in the additional section along with the answer, so that the
resolver could validate not only a signature but the resulting record
based on the substitution algorithm.  It'd still be problematic for
older DNSSEC validators that don't grok BULK, but no more so than not
grokking NPN. Unfortunately to them in both cases the type-appropriate
answer itself will be unsigned and thus fail validation. ]</t>

<t>This document provides a minor yet significant modification to DNSSEC
regarding how RRsets will be signed or verified.  Specifically the
Signature Field of <xref target="RFC4034"/>, Section 3.1.8.  Prior to processing into
canonical form, signed zones may contain associated RRs where; owner,
class and type of a non NPN RR directly corresponds with an NPN RR
matching owner, class and Match Type.  If this condition exists the
NPN RR's RDATA defines details for processing the associated RDATA
into a "Normalized" format.  Normalized data is based on pre-canonical
formatting and zero padded for "A" and "AAAA" RR types for acceptable
precision during the process.  This concept will become clearer in the
NPN pseudocode and examples provided in the sections to follow.</t>

<t>The rules for this transformation are simple:</t>

<t><list style="symbols">
  <t>For RR's Owner field, characters from the beginning to the index of
the Owner Ignore value or the final string of characters belonging to
the zone's ORIGIN MUST NOT be modified by this algorithm.  While the
Owner Ignore value is not used for BULK records but is included with
the expectation other pattern-based resource records may emerge and
leverage NPN records for their DNSSEC support requirements.</t>
  <t>For RR's RDATA field, character from beginning to the index of Left
Ignore value or characters with index of Right Ignore value to the end
MUST NOT be modified by this algorithm.</t>
  <t>In the remaining portion of both Owner and RDATA strings of numeric
data, defined as character "0" through "f" or "0" through "9"
depending on whether or not the Hexadecimal flag is set or not, MUST
be consolidated to a single character and set to the highest value
defined by the Hexadecimal flag.  Examples may be found in the
following section.  If period-as-number or hyphen-as-number flags are
set whichever are used ("." or "-") would be treated as part of the
number and consolidated where appropriate.</t>
</list></t>

<t>Once the normalization has been performed the signature will continue
processing into canonical form using the normalized RRs in the place
of original ones.</t>

<t>NPN RRs MAY be included in the "Additional" section to provide a hint
of the NPN processing required for the verification path.</t>

<t>It is important to note, properly sizing the Ignore fields is critical
to minimizing the risk of spoofed signatures.  Never intentionally set
all Ignore values to zero in order to make validation easier as it
places the validity of zone data at risk. Only accompany RRs which are
pattern derived (such as BULK) with NPN records as doing so may
unnecessarily reduce the confidence level of generated signatures.</t>

<section anchor="pseudocode-for-npn-normalization-processing" title="Pseudocode for NPN Normalization Processing">

<t>This section provides a simple demonstration of process flow for NPN
rdata normalization and DNSSEC signatures.</t>

<t>The pseudocode provided below assumes all associated RRs are valid
members of a DNSSEC-compatible RRset, including BULK generated ones.</t>

<figure><artwork><![CDATA[
   for rr in rrset
       if (has_NPN<rr.owner, rr.class, rr.type>)
           rr.rdata_normal = NPN_normalize<rr.rdata>
           add_to_sigrrset<NPN.owner, rr.class, rr.type,
               rr.rdata_normal>
           next
       else
           add_to_sigrrset<rr.owner, rr.class, rr.type, rr.rdata>
           next

   process_canonical_form<sigrrset>

   dnssec_sign<sigrrset>
]]></artwork></figure>

<t>Similar logic MUST be used for determining DNSSEC validity of RRsets
in validating nameservers for signatures generated based on NPN
normalization.</t>

</section>
</section>
<section anchor="pattern-based-dnssec-support" title="Pattern Based DNSSEC support">

<t>The NPN resource record could be used to support other dynamic RR
types which do not currently exist.</t>

</section>
</section>
<section anchor="known-limitations" title="Known Limitations">

<t>This section defines known limitations of the BULK resource type.</t>

<section anchor="unsupported-nameservers" title="Unsupported Nameservers">

<t>Authoritative nameservers that do not understand the semantics of the
new record type will not be able to deliver the intended answers even
when the type appears in their zone data This significantly affects
the interoperability of primary versus secondary authorities that are
not all running the same software.  Adding new RRs which affect
handling by authoritative servers, or being unable to add them, is an
issue that needs to be explored more thoroughly within dnsop.</t>

<t>On the resolver side, rolling out a new semantics in DNSSEC has also
proven to be difficult in the past.  Lacking NPN support effectively
means that operators using BULK will have to forego DNSSEC signing of
the affected zones, or do online signing of the dynamically generated
records.</t>

</section>
</section>
<section anchor="security-considerations" title="Security Considerations">

<t>Two known security considerations exist for the BULK resource record,
DNSSEC and DDOS attack vectors.</t>

<section anchor="dnssec-signature-strategies" title="DNSSEC Signature Strategies">

<t>DNSSEC was designed to provide validation for DNS resource records.
In a nutshell this requires each (owner, class, type) tuple to have
its own signature.  This essentially defeats the purpose of providing
large generated blocks of RRs in a single RR as each generated RR
would require its own legitimate RRSIG record.</t>

<t>In the following sections several options are discussed to address
this issue.  Of the options, on-the-fly provides the most secure
solution and NPN provides the most flexible.</t>

<section anchor="on-the-fly-signatures" title="On-the-fly Signatures">

<t>This solution requires authoritative nameservers to sign generated
records as they are created.  Not all authoritative nameserver
implementations offer on-the-fly signatures, and even with those that
do not all operators will want to keep signing keys online, so this
solution would either require all implementations to support
on-the-fly signing or be ignored by implementations which can not or
will not comply.</t>

<t>No changes to validating resolvers is required to support this
solution.</t>

</section>
<section anchor="normalized-npn-based-signatures" title="Normalized (NPN-Based) Signatures">

<t>This solution provides the most flexible solution as nameservers
without on-the-fly signing capabilities can still support signatures
for BULK records.  The down side to this solution is it requires
additional DNSSEC-aware resolver support.</t>

<t>It has been pointed out that due to this limitation, creation of
DNSSEC-signed BULK RRs requiring NPN support SHOULD be formally
discouraged until such time a respectable percentage (&gt;80%) of
validating resolvers in-the-wild possess NPN processing capabilities.
Until that time, on-the-fly signing and unsigned records offer the
intended capabilities of the BULK specification, while requiring zero
new features to support RR resolution. The authors would like to
encourage opening this door for pattern based technologies such as NPN
records as a solution to BULK RRs as well as other pattern based RRs
to come. Given enough time, enough nameservers will be patched and
upgraded for unrelated reasons and by means of simple attrition can
supply a level of inertia and eventually widespread adoption can be
assumed.</t>

<t>NPN records are likely to be a topic of great debate as to their own
security limitations.  It is, however, the authors' belief that while
any logic which limits the input of digital signatures lessens the
validity of those signatures, the limitation is minimal and the gain
is significant.  The main reason for this is as a general rule, RRs
used in a generic manner such as conventional $GENERATE RRs or
scripted mass pattern generated RRs have a lesser importance than
other RRs in managed zones.  These therefore inherently pose less risk
by means of attack and have a much less reward by defeating security
measures.</t>

<t>This being said, care must still be taken to set the Ignore fields
appropriately to minimize exposure and only use NPN RRs to secure
pattern-based records such as BULK.</t>

</section>
<section anchor="non-dnssec-zone-support-only" title="Non-DNSSEC Zone Support Only">

<t>As a final option zones which wish to remain entirely without DNSSEC
support may serve such zones without either of the above solutions and
records generated based on BULK RRs will require zero support from
recursive (resolving) nameservers.</t>

</section>
</section>
<section anchor="dnssec-validator-details" title="DNSSEC Validator Details">

<t>Verification of DNSSEC signed BULK generated RRs may be performed
against on-the-fly signatures with zero modification to their
behavior.  However, verification using NPN records would require
changes to the logic to incorporate processing RDATA generated by BULK
logic as described above so the results will be compatible.</t>

</section>
<section anchor="ddos-attack-vectors-and-mitigation" title="DDOS Attack Vectors and Mitigation">

<t>As an additional defense against Distributed Denial Of Service (DDOS)
attacks against recursive (resolving) nameservers it is highly
recommended shorter TTLs be used for BULK RRs than others.  While
disabling caching with a zero TTL is not recommended, as this would
only result in a shift of the attack target, a balance will need to be
found.  While this document uses 24 hours (86400 seconds) in its
examples, values between 300 to 900 seconds are likely more
appropriate and is RECOMMENDED.  What is ultimately deemed appropriate
may differ from zone to zone and administrator to administrator.</t>

<t>[ I am unclear how this helps DDOS mitigation against anyone at all. ]</t>

</section>
<section anchor="implications-of-large-scale-dns-records" title="Implications of Large-Scale DNS Records">

<t>The production of such large-scale records in the wild may have some
unintended side-effects.  These side-effects could be of concern or
add unexpected complications to DNS based security offerings or
forensic and anti-spam measures.  While outside the scope of this
document, implementers of technology relying on DNS resource records
for critical decision making must take into consideration how the
existence of such a volume of records might impact their technology.</t>

<t>Solutions to the magnitude problem for BULK generated RRs are expected
be similar if not identical to that of existing wildcard records, the
core difference being the resultant RDATA will be unique for each
requested Domain Name within its scope.</t>

<t>The authors of this document are confident that by careful
consideration, negative_side-effects produced by implementing the
features described in this document can be eliminated from any such
service or product.</t>

</section>
</section>
<section anchor="privacy-considerations" title="Privacy Considerations">

<t>Neither the BULK nor NPN records introduce any new privacy concerns to
DNS data.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>IANA is requested to assign numbers for two DNS resource record types
identified in this document: BULK and NPN.</t>

</section>
<section anchor="acknowledgments" title="Acknowledgments">

<t>This document was created as an extension to the DNS
infrastructure. As such, many people over the years have contributed
to its creation and the authors are appreciative to each of them even
if not thanked or identified individually.</t>

<t>A special thanks is extended for the kindness, wisdom and technical
advice of Robert Whelton (CenturyLink, Inc.) and Gary O'Brien
(Secure64).</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC1034;
&RFC1035;
&RFC2119;
&RFC2181;
&RFC2308;
&RFC2317;
&RFC3597;
&RFC4033;
&RFC4034;
&RFC4035;
&RFC5234;


    </references>

    <references title='Informative References'>

&RFC7719;
<reference anchor="bind-arm" target="https://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.html">
  <front>
    <title>BIND 9 Configuration Reference</title>
    <author >
      <organization>Internet Systems Consortium</organization>
    </author>
    <date year="2016"/>
  </front>
</reference>


    </references>


<section anchor="bulk-examples" title="BULK Examples">

<section anchor="example-1" title="Example 1">

<figure><artwork><![CDATA[
$ORIGIN 2.10.in-addr.arpa.
@ 86400 IN BULK PTR (
          [0-255].[0-255].[0-255].[0-255].in-addr.arpa.
          pool-${4-1}.example.com.
        )
]]></artwork></figure>

<t>A query received for the PTR of 4.3.2.10.in-addr.arpa will create the
references ${1} through ${4} with the first four labels of the query
name.  The ${4-1} reference in the replacement pattern will then
substitute them in reverse with the default delimiter of hyphen
between every character and no special field width modifications.  The
TTL of the BULK RR is used for the generated record, making the
response:</t>

<figure><artwork><![CDATA[
4.3.2.10.in-addr.arpa 86400 IN PTR pool-10-2-3-4.example.com.
]]></artwork></figure>

</section>
<section anchor="example-2" title="Example 2">

<figure><artwork><![CDATA[
$ORIGIN 2.10.in-addr.arpa.
@ 86400 IN BULK PTR (
          [0-255].[0-255].[0-255].[0-255].in-addr.arpa.
          pool-${2,1|||3}.example.com.
        )
]]></artwork></figure>

<t>Example 2 is similar to Example 1, except that it modifies the
replacement pattern.  The empty option after the first
vertical bar causes no delimiters to be inserted, while the second
empty option that would keep the delimiter interval as 1.  The latter
is relevant because the final value, padding of 3, is applied over
each delimiter interval even when no delimiter is used.  Not all
captures from the substring are required to be used in the response.</t>

<t>The result is that a query for the PTR of 4.3.2.10.in-addr.arpa
generates this response:</t>

<figure><artwork><![CDATA[
4.3.2.10.in-addr.arpa 86400 IN PTR pool-003004.example.com.
]]></artwork></figure>

<t>[ Admittedly you can't do this very effectively without the field
width complexity. Is this sort of name common?  Does it need support?
Admittedly $GENERATE had the feature, but is that reason enough? ]</t>

<t>[ Change this to a hex matching example? ]</t>

</section>
<section anchor="example-3" title="Example 3">

<t>This example contains a classless IPv4 delegation on the /22 CIDR
boundary as defined by <xref target="RFC2317"/>.  The network for this example is
"10.2.0/22" delegated to a nameserver "ns1.sub.example.com.". RRs for
this example are defined as:</t>

<figure><artwork><![CDATA[
$ORIGIN 2.10.in-addr.arpa.
@    7200 IN BULK CNAME [0-255].[0-3] ${*|.}.0-3
0-3 86400 IN NS ns1.sub.example.com.
]]></artwork></figure>

<t>A query for the PTR of 25.2.2.10.in-addr.arpa is received and the BULK
record with the CNAME Match Type matches all query types.  25 and 2
are captured as references, and joined in the answer by the period
(".") character as a delimiter, with ".0-3" then appended literally
and fully qualified by the origin domain.  The final synthesized
record is:</t>

<figure><artwork><![CDATA[
25.2.2.10.in-addr.arpa 7200 IN CNAME 25.2.0-3.2.10.in-addr.arpa.
]]></artwork></figure>

<t>[ Without $* and options complexity, the pattern to get the same
result is just ${1}.{$2}.0-3 which is not really significantly onerous
to enter, and slightly less arcane looking to comprehend. ]</t>

</section>
</section>
<section anchor="npn-examples" title="NPN Examples">

<section anchor="example-1-1" title="EXAMPLE 1">

<figure><artwork><![CDATA[
2.10.in-addr.arpa. 86400 IN BULK PTR (
                                 [0-255].[0-10].2.10.in-addr.arpa.
                                 pool-A-${1}-${2}.example.com.
                            )
2.10.in-addr.arpa. 86400 IN NPN  PTR 9 0 7 13
]]></artwork></figure>

<t>A query for the PTR of address 10.2.3.44 would match As shown
previously in BULK RR examples the query would match the BULK record
for the query name 44.3.2.10.in-addr.arpa, generating a PTR to
pool-A-3-44.example.com as the answer.</t>

<t>By protecting the "Ignore" characters from the generated RR's RDATA
the focus for normalization becomes "3-44" as illustrated below.</t>

<figure><artwork><![CDATA[
  0 1 2 3 4 5 6 7
                v---------
    p o o l - A - 3 - 4 4 . e x a m p l e . c o m .
                 ---------^
                          1 1 1 1                  
                          3 2 1 0 9 8 7 6 5 4 3 2 1 0
]]></artwork></figure>

<t>Everything to the left of "3-44" will remain intact, as will
everything to its right.  The remaining characters will be processed
for digits between 0 and 9 as indicated by the NPN record's
hexadecimal flag 9, and each run of digits replaced by the single character
"9".  The final Normalized RDATA for *.2.10.in-addr.arpa would
therefore become pool-A-9-9.example.com., and its signature would be
based on this value to cover all possible permutations of the
pool-A-${1}-${2}.example.com replacement pattern.</t>

<t>Since the validating nameserver would use the identical
NPN record for processing and comparison, all RRs generated by the
BULK record can now be verified with a single signature.</t>

</section>
<section anchor="example-2-1" title="EXAMPLE 2">

<t>This example contains a classless IPv4 delegation on the /22 CIDR
boundary as defined by <xref target="RFC2317"/>.  The network for this example is
"10.2.0/22" delegated to a nameserver "ns1.sub.example.com.".  RRs for
this example are defined as:</t>

<figure><artwork><![CDATA[
$ORIGIN 2.10.in-addr.arpa.
0-3 86400 IN      NS    ns1.sub.example.com.
    86400 IN BULK CNAME [0-255].[0-3] ${*|.}.0-3
    86400 IN NPN  CNAME 9 0 0 23
]]></artwork></figure>

<t>For this example, a query of "10.2.2.65" would enter the nameserver as
"65.2.2.10.in-addr.arpa." and a "CNAME" RR with the RDATA of
"65.2.0-3.2.10.in-addr.arpa." would be generated.</t>

<t>By protecting the "Ignore" characters from the generated RR's RDATA
the focus for normalization becomes "65.2" as illustrated below.</t>

<figure><artwork><![CDATA[
       0
       v---------
         6 5 . 2 . 0 - 3 . 2 . 1 0 . i n - a d d r . a r p a .
        ---------^
                 2 2 2 2 1 1 1 1 1 1 1 1 1 1                  
                 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
]]></artwork></figure>

<t>Everything to the left of "65.2" will remain intact as will everything
to its right.  The remaining characters will be processed for digits
from 0 through 9 as indicated by the NPN record's hexadecimal flag
"9", with each run replaced by the single character "9".  The final
normalized RDATA would therefore become 9.9.0-3.2.10.in-addr.arpa
and its signature would be based on this normalized RDATA field.
This new normalized string would be used as an RDATA for the
wildcard label of 2.10.in-addr.arpa now encompassing all
possible permutations of the ${*|.}.0-3.2.10.in-addr.arpa. pattern.</t>

<t>As in example 1, the validatating resolver would use the same NPN
record for comparison.</t>

</section>
<section anchor="example-3-1" title="EXAMPLE 3">

<t>This example provides reverse logic for example 1 by providing an IPv4
address record for a requested hostname.  For this example the query is
defined as an A record for pool-A-3-44.example.com, with an origin
of example.com.  RRs for this example are defined as:</t>

<figure><artwork><![CDATA[
example.com. 86400 IN BULK A (
                                   pool-A-[0-10]-[0-255]
                                   10.2.${*}
                                  )
example.com. 86400 IN NPN  A 9 0 8 0
]]></artwork></figure>

<t>By protecting the "Ignore" characters from the generated RR's RDATA
the focus for normalization becomes "003.044" as illustrated below.</t>

<figure><artwork><![CDATA[
                0 1 2 3 4 5 6 7 8
                                v--------------
                  0 1 0 . 0 0 2 . 0 0 3 . 0 4 4
                                 ---------------^
                                                0
]]></artwork></figure>

<t>This example illustrates a key point about NPN records; since they are
pre-canonical they MUST operate on a strict subset of WIRE formatted
data.  For A and AAAA records this means the "Ignore" fields are based
on zero padded data.  In this example our generated record MUST be
converted into "010.002.003.044" (shown above) prior to processing.
After processing, wire format would become "0x0A02032C" (shown in
hexadecimal).  This format would be too imprecise for normalization so
padded decimal is used.</t>

<t>Everything to the left of "003.044" will remain intact as will
everything to its right.  The remaining characters will be processed
for digits between 0 and 9 as indicated by the NPN record's
hexadecimal flag "9" and each run replaced by the single character
"9".  The final Normalized RDATA would therefore become 10.2.9.9 and
its signature would be based on this normalized RDATA field. This
new normalized A RR would be used as an RDATA for the wildcard
label of "*.example.com." now encompassing all possible permutations
of the 10.2.${*} pattern.</t>

</section>
<section anchor="example-4" title="EXAMPLE 4">

<t>This example provides similar logic for an IPv6 AAAA record.  For this
example the query is defined as an AAAA record for
pool-A-ff-aa.example.com with an origin of example.com..  RRs for this
example are defined as:</t>

<figure><artwork><![CDATA[
example.com. 86400 IN BULK AAAA (
                                   pool-A-[0-ffff]-[0-ffff]
                                   fc00::${1}:${2}
                                )
example.com. 86400 IN NPN  AAAA X 0 30 0
]]></artwork></figure>

<t>By protecting the "Ignore" characters from the generated RR's RDATA
the focus for normalization becomes "00ff:00aa" as illustrated below.</t>

<figure><artwork><![CDATA[
                      1 1 1 1 1 1 1 1 1 1 2 2
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

    f c 0 0 : 0 0 0 0 : 0 0 0 0 : 0 0 0 0 : -/-/

  4 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1
  0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9
   /-/-/- . . . . . . . . . . . . . . . . . . . . . . . . -/-/-/
                          2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4
                          1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
                                            v------------------
                     /-/- 0 0 0 0 : 0 0 0 0 : 0 0 f f : 0 0 a a
                                             -------------------^
                        2 1 1 1 1 1 1 1 1 1 1 
                        0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
]]></artwork></figure>

<t>This example reinforces the point on pre-canonical processing of NPN
records; they MUST operate on a strict subset of WIRE formatted
data. For A and AAAA records this means the "Ignore" fields are
based on zero padded data.  In this example our generated record MUST
be converted into "fc00:0000:0000:0000:0000:0000:00ff:00aa" (shown
above) prior to processing.  After processing, wire format would
become "0xFC000000000000000000000000FF00AA" (shown in
hexadecimal). This format is slightly misleading as it is truly only
16 bytes of WIRE data and would be too imprecise for normalization so
padded hexadecimal is used.</t>

<t>Everything to the left of "00ff:00aa" will remain intact as will
everything to its right.  The remaining characters will be processed
for numbers between "0" and "f" as indicated by the NPN record's
hexadecimal flag "X" and each run replaced by the single character
"f".  The final Normalized RDATA would therefore become "fc00::f:f"
and its signature would be based on this "normalized" RDATA
field. This new "normalized" "AAAA" RR would be used as an RDATA for
the wildcard label of *.example.com now encompassing all possible
permutations of the "fc00::${1}:${2}" pattern.</t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
QqGvj22TWJmRuVqjb049YzpSX5yT+9lMaGluj0vaoYZkoFs0OA298ehHOf/1
HbIuL796WOUE7S0Owbu7Bzv6zC082iz03fQVJ6xv9IPd1YTul1pztTfcHQ3z
YoCI7TCrVkRgf+48rglnetMHNvmnMl33b3u0eB+fqtV2UVuf6OQf0DTuPEMl
IBOQoNfDkJ+b0IZbq0qkDb5U2YYObNwdzpcNEQRXsT5XGjhxTxl+0kCI48TH
46mXK5CnDXY2ugcFb5RhoR8LEwpzw6N6QieuAMNmtyGCQep8TLsJTrsaKTmY
m3ZsST0AVfEmtmNIGzUEQ7Q522w60PdKUUuWuRWE7769fQsC3WCjeLt3iSYG
+4OD9obLNidUufcvp8q9/u6HDx/2P0KZAV5tgudbkAXu6muTftFduS801jav
W0hFiUvbAomrLD11A3WaVhMp7nzR7p3lU5tkbnK3EB9w1KpRsqpNa/ykoSkn
C4QGN5rNkMTeVfAWDKxh7bJw72AO+B4cseRTj8mFRjJzuy+5WG0iAwluWORu
mUySHUhhb+sKFvMrvs9+Uqgam/dI4DumCDpHLTr9TLxf5DPXSb/hjwkbkzaE
ZKz8NvYYjcgB2soc5GyMyf8gtM/In7ks17BLvuKSAjmTCFCTLHGIh8h+kDQw
Ig1ia6FhaJNel1Lwx72P4DyWxZ/whCPpW86On4Y//mQSKGIo7iwT5ar2VN/X
1WpbG44ESthX+hnRah5xAEHm5wLLM/c+nsBRDPzJvm3JhX21KHxvIS15R3CJ
E64cX+MH7hHJuNPwADjAdmdvzz569vjYTOC9crFC62inPiFt997VlVK57zEY
Yph+WvI9erSZe8MRDdrzc/lK0aR5da+od4dEj60d7Q39Y8NMa9Sscknd64NP
EYH0ureXCEFp7JyIuv233G5peDWk94b+j0RHJt826Do6t0P9e4e06k1KlnP1
opy9oZX0QY6qbaPzdOha225VTTuwd8hD8bPKW63X0s6OuOK/S0ZZq/2mL7yV
ilmDktedVFu2GutpD8MecNRjNa2Nqd0s9ljlxlPdRjg6S6sNjn+6kpS9X6Lf
eo3Mo8dFHrb2GmT6HRVc8UUE2OaFiWj4UZn9y9sSz9U8fOT1vhaYaL/xkrR7
E+pwTJR8fOyJn5r565d7TDS+17qPLUkBaataqCTZV6456cMuuJ4L9MflpI1J
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
tmhPr2Ns9BKr7/8Awo4b/UedAAA=

-->

</rfc>

