<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml2rfc.ietf.org. -->
<!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 RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC1034 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml">
<!ENTITY RFC1035 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
<!ENTITY RFC7489 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7489.xml">
<!ENTITY RFC5585 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5585.xml">
<!ENTITY RFC5234 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml">
<!ENTITY RFC7208 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7208.xml">
<!ENTITY RFC7230 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7230.xml">
<!ENTITY RFC7231 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7231.xml">
<!ENTITY RFC6265 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6265.xml">
<!ENTITY RFC6454 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6454.xml">
<!ENTITY RFC3986 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml">
<!ENTITY RFC2965 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2965.xml">
<!ENTITY RFC4592 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4592.xml">
<!ENTITY RFC2818 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2818.xml">
<!ENTITY I-D.draft-sullivan-domain-origin-assert SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.draft-sullivan-domain-origin-assert-02.xml">
<!ENTITY I-D.draft-levine-orgboundary SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.draft-levine-orgboundary-02.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
     please see http://xml2rfc.ietf.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space 
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="info" docName="draft-deccio-dbound-organizational-domain-policy-03" 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="shortened title"-->
		<title abbrev="Organizational Domains and Use Policies">
			Organizational Domains and Use Policies for Domain Names
    </title>

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

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

    <author fullname="Casey Deccio" initials="C."
            surname="Deccio">
      <organization>Verisign Labs</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>USA</country>
        </postal>
        <phone>+1 703-948-3200</phone>
        <email>cdeccio@verisign.com</email>
      </address>
    </author>

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

    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->

    <!-- Meta-data Declarations -->

    <area>General</area>

    <workgroup>Internet Engineering Task Force</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <keyword></keyword>

    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->

    <abstract>
			<t>Various Internet protocols and applications require some mechanism for
				identifying policy surrounding the use Domain Name System (DNS) names.
				In this document we describe an extensible system in which domain name
				policies can be discovered at various levels in the DNS tree.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
			<t>The concepts of domains, subdomains, and administrative delegation are
				fundamental to the Domain Name System (DNS) <xref target="RFC1034" />
				<xref target="RFC1035" />.  The DNS namespace is hierarchical, and the
				management of subdomain space is delegated by one entity to another
				throughout.  However, policies governing the use of domain names do not
				always align with those lines of delegation.  There are currently no
				generally reliable methods to reconcile domain names with policy for
				their use.</t>

			<t>As a prominent example, <xref target="RFC6265">HTTP cookies</xref> have
				traditionally used ancestral relationships to determine allowable scope
				of information sharing and authorization.  For example, the server at
				www.example.com might set a cookie with a Domain attribute of
				example.com, because it is a subdomain of that name.  However, this
				simplistic authorization does not account for some cases, such as
				cookies with a Domain attribute corresponding to a so-called "public
				suffix".  <xref target="RFC6265" /> indicates that many user agents
				reject such cookies due to security and privacy concerns.  Even so, the
				public suffix designation is not apparent from either the names
				themselves or the delegations leading down to them from the root.
				Instead, a resource, such as Mozilla's <xref target="PSL">Public Suffix
					List (PSL)</xref>, is used to identify public suffixes.</t>

			<t>Another challenge with domain names is the ability to identify their
				respective Organizational Domains, for applications like
				<xref target="RFC7489">Domain-based Message Authentication, Reporting,
					and Conformance (DMARC)</xref>.  <xref target="RFC7489" /> includes
				heuristics to identify an organizational domain using a public suffix
				list (e.g., <xref target="PSL">Mozilla's PSL</xref>) "in the absence of
				more accurate methods".  Other applications have similarly relied on a
				public suffix list to define an organizational domain, whether for
				policy, forensics, or simple identification.  However, defining a "more
				accurate" method is desirable.</t>

			<t>In this document we describe a framework for more accurately
				identifying policy and organizational domains on a per-domain name
				basis.  The system described adds customization and flexibility to
				existing systems while being fully backwards compatible with previous
				mechanisms and default behaviors.</t>

			<section title="Reserved Words">
				<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 title="Solution Concepts">
			<t>The major questions to be addressed by a solution in this space are
				the identification of policy for a given domain name and the
				identification of an organizational domain for a given domain name.
				The questions are related in that the policy for a domain name might
				depend on its organizational domain name, either because that policy is
				defined by its organizational domain or because it depends on
				organizational boundaries.</t>

			<t>In previous solutions, policy has almost always been bound by direct
				ancestral relationships.  While that constraint might be lifted by
				future solutions, the solution documented herein respects the
				hierarchical order in the DNS: policies between domain names in which
				one is not a sub-domain of the other are non-existent and out of scope
				for this document.</t>

			<t>In this context the organizational domain for a given domain name will
				always be an ancestor of the domain name, if not the domain name
				itself.  Prior to this draft, one of the heuristics for determining the
				organizational domain was using a public suffix list: the
				organizational domain is the series of labels comprising the public
				suffix portion of the name, plus one label (<xref target="RFC6265" />).
				With that methodology, for any given domain name, not a public suffix,
				there was exactly one possible organizational domain.  In this work, an
				organizational domain can be designated at (mostly) arbitrary levels in
				the domain name's ancestry.</t>

			<t>The notion of a "public suffix" (i.e., as included in a public suffix
				list, such as Mozilla's <xref target="PSL">PSL</xref>) has brought to
				light the nature of policy associated with "registry controlled
				domains" (<xref target="RFC6265" />), sometimes viewed as extensions of
				top-level domains (TLDs), which have similar policy.  While domain names might
				appear in current versions of such lists for a variety of reasons, the
				impact of their designation is consistent: they are treated as
				special-purpose names, limited in their use by applications.  For
				example, HTTP cookies with a Domain attribute corresponding to a public
				suffix are rejected by most user agents.  Similarly, public suffixes
				cannot be organizational domains, e.g., for DMARC use. We refer to the
				set of names above the boundary separating public suffixes from their
				descendants as "policy-negative".</t>
		</section>

    <section title="Designating Organizational Domain and Use Policy">
			<t>In this section we describe the technical implementation for
				designating organization domain and use policy (ODUP) for domain
				names.</t>

			<section title="ODUP Name">
				<t>The "_odup" label, when used as part of a domain name, carries special
					meaning in the context of defining organizational domains and policy,
					and the resulting domain name is referred to as an ODUP name.  In an
					ODUP name the sequence of labels after the _odup label (i.e., higher
					in the DNS namespace tree) comprise the organizational domain, and
					the concatenation of the sequence of labels before it (i.e., lower in
					the DNS namespace tree) with those after it comprise the policy
					domain.</t>

				<t>For example, given the ODUP name foo.bar._odup.example.com, the
					organizational domain is example.com, and the policy domain is
					foo.bar.example.com.</t>

			</section>

			<section title="ODUP Statement">
				<t>A TXT record at an ODUP name contains an ODUP statement for the
					policy domain.  The formal syntax for an ODUP statement, using
					<xref target="RFC5234" />, is the following:

					<figure>
						<preamble></preamble>
						<artwork><![CDATA[
statement        =   version *( SP qual-directive )

version          =   "v=odup1"

qual-directive   =   qualifier directive [ arg-sep arg ]

qualifier        =   %x2B / %x2D
                          ; addition sign (+) or hyphen (-)

directive        =   1*( directive-char )
                          ; one or more <directive-char>s

directive-char   =   ALPHA / DIGIT / %x2D
                          ; letter, digit, or hyphen

arg-sep          =   %x3A
                          ; colon (:)

arg              =   1*( VCHAR )
                          ; one or more <VCHAR>s
							]]></artwork>
					</figure>
				</t>

				<section title="Version">
					<t>The ODUP statement begins with a version declaration.  At this time,
						the only defined version is "odup1", so the record MUST begin with
						"v=odup1".</t>
				</section>

				<section title="Directives">
					<t>Following the version declaration and a space is a series of zero
						or more space-separated directives, each prepended with a
						qualifier: either "+" or "-".  Additionally, each directive may
						optionally include a single argument, which is affixed to the end
						of the directive, immediately after a colon (":").
					</t>
					<t>Only two policy-related directives are defined in this document.
						Unless otherwise specified, no arguments are defined for the
						directives.
						<list style="symbols">
							<t>httpcookie - whether the domain name may (+) or may not (-) be
								used as the value of the Domain attribute of an HTTP Cookie.</t>
							<t>all - for directives not otherwise specified, the default
								policy is allow (+) or deny (-).</t>
						</list>
					</t>

					<t>The following directives do not carry policy information, but
						designate organizational domains or boundaries, or offer other
						non-policy information.  Only the "+" qualifier is
						valid with these directives:
						<list style="symbols">
							<t>org - specifies that the policy domain itself is an
								organizational domain (See
								<xref target="org-directive" />).</t>
							<t>bound - designates an organizational boundary below the policy
								domain.  Domain names below that boundary are organizational
								domains (See <xref target="bound-directive" />).  The bound
								directive may optionally include a numeric argument specifying
								the number of labels below the "_odup" label within the domain
								name owning the ODUP statement.  This is used to detect
								wildcard synthesis by ODUP resolvers (see
								<xref target="argument-to-bound-directive" />).</t>
							<t>fetch - designates a means for retrieving an ODUP policy realm
								in its entirety for local use.  An argument is required, which
								designates one or more comma-separated URLs to use for
								retrieving the realm (See
								<xref target="fetch-directive" />).</t>
						</list>
					</t>

				</section>
			</section>

			<section anchor="directive-considerations" title="Directive Considerations">
				<section anchor="all-directive" title="all Directive">
					<t>An ODUP statement MUST NOT have more than one "all" directive
						(with its accompanying qualifier).  If no "all" directive is
						supplied, an implicit "+all" is applied.</t>

					<t>The "all" directive SHOULD appear last in an ODUP statement.  This
						is for readability purposes only, as directive order otherwise
						doesn't matter.</t>

					<t>Because the "all" directive specifies the default policy for a
						given policy domain, other directives in the same statement simply
						specify exceptions to that default policy.  Thus, the qualifier for
						directives other than "all" SHOULD be the opposite as that used
						with "all".  The only side effect to non-adherence to this
						recommendation is the existence of superfluous directives (i.e.,
						because they are already implied with the default policy).
						Implementors MAY add such directives nonetheless, for added
						readability.</t>
				</section>

				<section anchor="directive-defaults" title="Directive Defaults">
					<t>The presence of each directive with its qualifier indicates
						intended policy associated with the name in question. Because the
						this draft introduces new behaviors, the positive ("+") value for
						any directive MUST match default behavior preceding this document,
						in order to maintain backwards compatibility.  In this manner,
						the default policy ("+all") matches previous behavior.</t>
				</section>

				<section anchor="org-directive" title="org Directive">
					<t>The "org" directive designates a specific domain name
						as an organizational domain.  Because the "org" directive
						designates a domain name as an organizational domain, subdomains of
						ODUP names whose statements include the "org" directive SHOULD NOT
						exist, and subdomains MUST NOT be queried for policy.</t>

					<t>For example, given the following ODUP statement:
						<list hangIndent="10" style="empty">
							<t>example._odup.com. IN TXT "v=odup1 +org"</t>
						</list>
						example.com is an organizational domain, and further policy
						information would be sought in the "_odup.example.com" DNS domain.
						The domain name foo.example._odup.com is irrelevant.</t>

					<t>An "org" directive MUST NOT appear together with a "bound"
						directive in the same ODUP statement.  Additionally, the "org"
						directive SHOULD NOT be accompanied by any other directives; any
						other directives MUST be ignored by software interpreting the
						statement.</t>
				</section>

				<section anchor="bound-directive" title="bound Directive">
					<t>Rather than specifying an organizational domain directly, like the
						"org" directive does, the "bound" directive specifies
						organizational domains indirectly by designating a boundary below
						which the organization domain exists.  The actual boundary might
						not be immediately below the policy name specified by the "bound"
						statement at the corresponding ODUP name.  Rather, it is a
						potentially uneven line dividing the subdomain space below that
						name.  This boundary is drawn immediately below the lowest name in an
						unbroken line of descendants of the ODUP name for which there are
						no ODUP statements that include "org".  Note that this line of
						descendants includes ODUP names with statements including "bound",
						statements with policy directives other than "org" and "bound", and
						existing ODUP names with no statements at all.  It does not,
						however, include non-existent ODUP names.</t>

					<t>For example, suppose the ODUP information for www.sub.example.com
						is being sought, and within the com organizational domain we find
						the following ODUP statement:
						<list hangIndent="10" style="empty">
							<t>example._odup.com. IN TXT "v=odup1 +bound"</t>
						</list>
						Having this knowledge, if a subsequent query for
						sub.example._odup.com/TXT results in a name error (NXDOMAIN), then the
						boundary exists immediately below example.com, such that
						sub.example.com is the organizational domain.  Likewise, if the query
						for sub.example._odup.com/TXT results in an ODUP statement with the
						"org" directive, such also indicates that the boundary is
						immediately below example.com.  However, if the query results in a
						NODATA response, then the boundary is below sub.example.com, and
						additional queries are required to determine its precise
						location.</t>

					<t>Subdomains of ODUP names with statements that include a "bound"
						directive are not restricted in the same way as they are in
						connection with the use of the "org" directive (See
						<xref target="org-directive" />).  However, subdomains of ODUP
						names having "bound" statements SHOULD NOT include statements that
						don't include "org" or "bound".  Any such statements MUST be
						ignored.</t>

					<t>"bound" directives SHOULD only be used in the policy-negative realm
						(see <xref target="policy-negative" />).  In other places, the same
						effect can typically be accomplished through use of the "org"
						directive.</t>

					<t>Finally, a "bound" directive MUST NOT appear together with an
						"org" directive in the same ODUP statement.</t>

					<section anchor="argument-to-bound-directive" title="Argument to bound directive">
						<t>Wildcard ODUP names (i.e.,  those whose leftmost, or lowest,
							label is *<xref target="RFC4592" />) are just as valid for ODUP
							names as they are generally for the DNS.  However, for wildcard
							ODUP names whose corresponding statements include "bound", the
							boundary might not be detected properly if it is not known that
							the record is synthesized from a wildcard.  Specifically, the
							wildcard synthesis would always yield a positive answer, and the
							lack of an NXDOMAIN response would cause an application
							identifying boundaries to continue to look for the longest
							match.</t>

						<t>The numeric argument to the bound directive is used when an ODUP
							statement is used at a wildcard DNS name.  The value is the
							number of non-* labels below the "_odup" label.  For example, the
							argument to the "bound" directive for the ODUP name
							*.b.a._odup.example.com. would always be 2.</t>
					</section>

				</section>

				<section anchor="fetch-directive" title="fetch Directive">
					<t>The "fetch" directive is used to designate one or more
						<xref target="RFC3986">Uniform Resource Identifiers (URIs)</xref>
						from which the ODUP statements for a given organizational domain
						can be downloaded for local reference.  The URIs, delimited by
						semi-colons, comprise the argument to the "fetch" directive.</t>

					<t>The statements for an organizational domain are downloaded either
						via <xref target="RFC1034">zone transfer</xref>, HTTP
						<xref target="RFC7230" /> <xref target="RFC7231" />,
						or <xref target="RFC2818" /> HTTPS.  In the case of an HTTP(s)
						download, the file is maintained in text format, structured as DNS
						zone master file <xref target="RFC1034" /> and retrieved using the
						GET method <xref target="RFC7231" />.  In any case, the contents of
						the download correspond to the records comprising the "_odup"
						subdomain of the organizational domain.</t>

					<t>The URI for a zone transfer uses "axfr" as its scheme.  The host
						component is optional; if not specified, any of the authoritative
						servers advertised in the NS record set may be used.  The path
						component is blank.  The following are valid URIs for use in the
						fetch directive for example.com:
						<list hangIndent="10" style="empty">
							<t>axfr://</t>
							<t>axfr://ns1.example.com</t>
							<t>http://www.example.com/odup.zone</t>
						</list>
					</t>

				</section>
			</section>

		</section>

		<section anchor="identifying-organizational-domain" title="Identifying Organizational Domain and Use Policy">
			<t>The process of identifying organizational domains and policies is
				referred to as ODUP resolution.  It involves methodically issuing DNS
				queries for DNS records of type TXT at ODUP names. The desired
				outcome for ODUP resolution is an organizational domain, a policy
				domain, and a policy.  The process is iterative and completes in O(n)
				(upper bound) time, where n corresponds to the number of labels in the
				name.  The algorithm finds the ODUP statement corresponding to the
				policy name that mostly closely matches the domain name being looked up
				within the lowest designated organizational domain.  Each iteration is
				as follows, beginning with the single right-most label (i.e., TLD) as
				the organizational domain.  We use www.example.com to illustrate policy
				lookup in each step.</t>

			<t>
				<list style="numbers">
					<t>Reset the longest matching record and the longest existing name.</t>

					<t>Begin with the ODUP name formed by prepending the "_odup" label to
						the current organizational domain, and with each subsequent
						iteration increase the number of policy domain labels below the
						"_odup" label by one to form an ODUP name.

						<vspace blankLines="1" />
						Example: If the current organizational domain is com, then the
						iterative ODUP names would be: _odup.com, example._odup.com,
						www.example._odup.com.
					</t>

					<t>Issue a query using the ODUP name formed in the previous step for a
						record of type TXT.</t>

					<t>If the query results in response code 0 (NOERROR), then save this
						ODUP name as the longest existing name.</t>

					<t>If the query yields a response with an ODUP policy, and either the
						ODUP statement includes an "org" or "bound" directive or the
						previous longest matching record includes neither an "org" nor a
						"bound" directive, then save the record as the longest matching
						record.</t>

					<t>If the query yields a response with an ODUP policy that includes
						an "org" directive, then go to Step 11.</t>

					<t>If the query yields a response with an ODUP policy that includes
						a "bound" directive, and the response is derived from a wildcard,
						go to Step 11.</t>

					<t>If the query results in response code 3 (name error or NXDOMAIN),
						go to Step 11.

						<vspace blankLines="1" />
						Example: If a query for _odup.com results in a name error, then we
						don't continue to example._odup.com.
					</t>

					<t>If all the labels have been exhausted, then go to Step 11.

						<vspace blankLines="1" />
						Example: If the current organizational domain is com, and we have
						already looked for policy at the ODUP names _odup.com,
						example._odup.com, and www.example._odup.com, then we go to Step 11.

					</t>

					<t>Return to step Step 2, increasing the number of labels of policy
						domain.

						<vspace blankLines="1" />
						Example: If the current organizational domain is com, and we have
						just looked for policy at _odup.com, then we would now look for
						policy at example._odup.com.
					</t>

					<t>If there was no positive response (i.e., longest matching record
						is not set), then return an empty policy under the current
						organizational domain.</t>

					<t>If the longest matching record includes an "org" directive, then
						return to Step 1, using the longest matching policy domain as the
						organizational domain.

						<vspace blankLines="1" />
						Example: If the ODUP statement at example._odup.com included an
						"org" directive, then we would next look for policy at
						_odup.example.com, then www._odup.example.com.
					</t>

					<t>If the longest matching record includes a "bound" directive, and
						the number of labels in the longest existing name is less than
						those in the name whose policy is being looked up, then return to
						Step 1, using the longest existing name domain, plus one label, as
						the organizational domain.

						<vspace blankLines="1" />
						Example: If the ODUP statement at _odup.com included a "bound"
						directive, then we would next look for policy at
						_odup.example.com, then www._odup.example.com.
					</t>

					<t>Return the record corresponding to the longest matching policy
						domain.</t> 
				</list>
			</t>

			<t><xref target="pseudo-code-odup" /> contains the pseudo-code for this
				algorithm.</t>

		</section>

		<section anchor="policy-negative" title="Policy-negative Realm">
			<t>The policy-negative realm is the portion of the DNS namespace that
				corresponds to so-called public suffixes.  The ODUP policies defining
				the policy-negative realm fall under the _odup subdomain of each TLD
				and consist of ODUP statements that use the "bound", "org", and "-all"
				directives.</t>

			<t>The result is that the ODUP statements defining the policy-negative
				realm comprise a PSL-like list.  In fact, the statements comprising
				the policy-negative realm can be derived from Mozilla's
				<xref target="PSL" /> and vice-versa.  See, for example, the tables in
				<xref target="psl-equivalence" />.  This is useful for several
				reasons.  The current applications and libraries using the PSL have a
				way to work in parallel, one being derived from the other, for
				backwards compatibility and possible transition.  It also enables
				consumer applications to work (fully or partially) offline by simply
				downloading all the policy-negative statements when those are
				sufficient for the purposes of the application.</t>

			<t>To enable local reference of ODUP statements within the
				policy-negative realm, "fetch" statements SHOULD be specified for ODUP
				statements found at ODUP names immediately under TLDs, e.g., _odup.com.
				Because the nature of TLDs has changed <xref target="NewgTLDs" />, some
				TLDs might not have a complete negative policy, and thus might be
				"below" the policy negative realm.  Such TLDs MAY choose to use a
				default policy (which is not negative) by not publishing an ODUP
				statement at all, in which case the inclusion of the "fetch" directive
				does not apply.</t>

			<t>Even when a self-contained listing of the policy-negative names is
				locally available but insufficient for the needs of the consumer
				application (i.e., a more specific assurance of policy is necessary),
				this resource can provide an efficient starting place for ODUP
				resolution.  Rather than starting with the TLD as the organizational
				domain, the shortest organizational domain below the policy-negative
				boundary is used first.  This increases efficiency by avoiding network
				latency associated with unnecessary DNS lookups.</t>

			<t>Working from a locally available version of the policy-negative realm
				is not only more efficient, but it also minimizes information
				disclosure to delegating authorities and is thus more
				privacy-adhering.</t>

			<t>Directives other than "bound", "org", "fetch", and "-all" MUST NOT
				be used in the policy-negative realm.</t>

			<section anchor="psl-equivalence" title="PSL/ODUP Equivalence Example">
				<texttable title="Select PSL Entries">
					<preamble></preamble>

					<ttcol align="center"></ttcol>

					<ttcol>PSL Entry</ttcol>

					<c>1</c>
					<c>uk</c>
					<c>2</c>
					<c>co.uk</c>
					<c>3</c>
					<c>*.ck</c>
					<c>4</c>
					<c>!www.ck</c>

				</texttable>

				<texttable title="Corresponding ODUP Names and Statements">
					<preamble>Note that "fetch" directives are excluded to maximize
						space.</preamble>

					<ttcol align="center"></ttcol>

					<ttcol align="right">ODUP Name</ttcol>
					<ttcol>ODUP Statement</ttcol>

					<c>1</c>
					<c>_odup.uk.</c>
					<c>"v=odup1 +bound -all"</c>
					<c>2</c>
					<c>co._odup.uk.</c>
					<c>"v=odup1 +bound -all"</c>
					<c>3</c>
					<c>*._odup.ck.</c>
					<c>"v=odup1 +bound:0 -all"</c>
					<c>4</c>
					<c>www._odup.ck.</c>
					<c>"v=odup1 +org"</c>

				</texttable>
			</section>

		</section>

		<!--
		- Performance considerations
		  - lookup latency, number of lookups
		  - performance
		  - privacy considerations - top-down (a la qname minimization)
		  - irregular "TLD" (underscore)
		  - administration of "_odup" "TLD"
		-->

		<section anchor="examples" title="Examples">
			<t>We provide several examples and in this section of ODUP designation,
				resolution, and potential application.</t>
			<section title="ODUP Resolution">
				<t>Example DNS entries are listed in
					<xref target="example-odup-policies" /> and illustrated in
					<xref target="example-namespace" />.  The resulting policies
					are listed in <xref target="example-effective-policies" />.</t>

				<texttable anchor="example-odup-policies" title="Example DNS entries">
					<ttcol align="right">Org. Domain</ttcol>
					<ttcol align="right">ODUP Name</ttcol>
					<ttcol align="left">ODUP Statement</ttcol>

					<c>uk.</c>
					<c>_odup.uk.</c>
					<c>"v=odup1 +bound -all"</c>

					<c>uk.</c>
					<c>co._odup.uk.</c>
					<c>"v=odup1 +bound -all"</c>

					<c>ck.</c>
					<c>_odup.ck.</c>
					<c>"v=odup1 +bound -all"</c>

					<c>ck.</c>
					<c>*._odup.ck.</c>
					<c>"v=odup1 +bound:0 -all"</c>

					<c>ck.</c>
					<c>www._odup.ck.</c>
					<c>"v=odup1 +org"</c>

					<c>a.uk.</c>
					<c>c.b._odup.a.uk.</c>
					<c>"v=odup1 +org"</c>

					<c>a.uk.</c>
					<c>e._odup.a.uk.</c>
					<c>"v=odup1 -httpcookie"</c>

					<c>c.b.a.uk.</c>
					<c>_odup.c.b.a.uk.</c>
					<c>"v=odup1 -httpcookie"</c>

					<postamble>
						Example ODUP statements and corresponding ODUP names and
						organizational domains.  Note that "fetch" directives are excluded
						to maximize space.
					</postamble>

				</texttable>

				<figure anchor="example-namespace">
          <artwork><![CDATA[                         .
                         |
                 +-------+-------+
                /                 \
              uk *                 ck *
               |                    |
           +---+---+              +-+-+
          /         \            /     \
      ===+===        \          /    ===+===
         a           co        h       www
         |            |        |
       +-+-+          |        |
      /     \      ===+===  ===+===
     b       e *      g        i
     |       |
  ===+===    |
     c *     f
     |
     d]]>
					</artwork>

					<postamble>Illustration of the namespace associated with ODUP names
						and statements listed in <xref target="example-odup-policies" />.
						Each node represents a DNS label in its place in the DNS namespace
						hierarchy.  Double horizontal lines (====) represent organizational
						boundaries, and asterisks (*) represent explicit policy
						statements.</postamble>

				</figure>

				<texttable anchor="example-odup-resolution-process" title="DNS Queries for ODUP Resolution Examples">
					<ttcol align="right">Domain Name</ttcol>
					<ttcol align="right">DNS Queries</ttcol>
					<ttcol>Responses</ttcol>
					<ttcol>Step</ttcol>

					<!-- uk -->

					<c>uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>14</c>

					<!-- a.uk -->

					<c>a.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>a._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>11</c>

					<!-- b.a.uk -->

					<c>b.a.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>a._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>b._odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>11</c>

					<!-- c.b.a.uk -->

					<c>c.b.a.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>a._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>b._odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>c.b._odup.a.uk/TXT</c>
					<c>+org</c>
					<c>12</c>

					<c></c>
					<c>_odup.c.b.a.uk/TXT</c>
					<c>-httpcookie</c>
					<c>14</c>

					<!-- d.c.b.a.uk -->

					<c>d.c.b.a.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>a._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>b._odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>c.b._odup.a.uk/TXT</c>
					<c>+org</c>
					<c>12</c>

					<c></c>
					<c>_odup.c.b.a.uk/TXT</c>
					<c>-httpcookie</c>
					<c>10</c>

					<c></c>
					<c>d._odup.c.b.a.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>14</c>

					<!-- e.a.uk -->

					<c>e.a.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>a._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>e._odup.a.uk/TXT</c>
					<c>-httpcookie</c>
					<c>14</c>

					<!-- f.e.a.uk -->

					<c>f.e.a.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>a._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.a.uk/TXT</c>
					<c>NODATA</c>
					<c>10</c>

					<c></c>
					<c>e._odup.a.uk/TXT</c>
					<c>-httpcookie</c>
					<c>10</c>

					<c></c>
					<c>f.e._odup.a.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>14</c>

					<!-- co.uk -->

					<c>co.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>co._odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>14</c>

					<!-- g.co.uk -->

					<c>g.co.uk</c>
					<c>_odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>co._odup.uk/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>g.co._odup.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>13</c>

					<c></c>
					<c>_odup.g.co.uk/TXT</c>
					<c>NXDOMAIN</c>
					<c>11</c>

					<!-- ck -->

					<c>ck</c>
					<c>_odup.ck/TXT</c>
					<c>+bound -all</c>
					<c>14</c>

					<!-- h.ck -->

					<c>h.ck</c>
					<c>_odup.ck/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>h._odup.ck/TXT</c>
					<c>+bound:0 -all</c>
					<c>14</c>

					<!-- i.h.ck -->

					<c>i.h.ck</c>
					<c>_odup.ck/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>h._odup.ck/TXT</c>
					<c>+bound:0 -all</c>
					<c>13</c>

					<c></c>
					<c>_odup.i.h.ck/TXT</c>
					<c>NXDOMAIN</c>
					<c>11</c>

					<!-- www.ck -->

					<c>www.ck</c>
					<c>_odup.ck/TXT</c>
					<c>+bound -all</c>
					<c>10</c>

					<c></c>
					<c>www._odup.ck/TXT</c>
					<c>+org</c>
					<c>12</c>

					<c></c>
					<c>_odup.www.ck/TXT</c>
					<c>NXDOMAIN</c>
					<c>11</c>

					<postamble>The sequence of queries, responses, and corresponding
						steps (i.e., from
						<xref target="identifying-organizational-domain" />) followed for
						ODUP resolution of each name.  The version information (i.e.,
						"v=odup1") has been stripped from the policy for readability.
					</postamble>

				</texttable>

				<texttable anchor="example-effective-policies" title="Effective ODUP Policies">
					<ttcol align="right">Domain Name</ttcol>
					<ttcol align="right">Org. Domain</ttcol>
					<ttcol align="right">Policy Domain</ttcol>
					<ttcol align="left">Policy ([D]efault, [E]xplicit, [I]nherited)</ttcol>

					<c>uk.</c>
					<c>uk.</c>
					<c>uk.</c>
					<c>-all (E)</c>

					<c>a.uk.</c>
					<c>a.uk.</c>
					<c>a.uk.</c>
					<c>+all (D)</c>

					<c>b.a.uk.</c>
					<c>a.uk.</c>
					<c>a.uk.</c>
					<c>+all (I)</c>

					<c>c.b.a.uk.</c>
					<c>c.b.a.uk.</c>
					<c>c.b.a.uk.</c>
					<c>-httpcookie +all (E)</c>

					<c>d.c.b.a.uk.</c>
					<c>c.b.a.uk.</c>
					<c>c.b.a.uk.</c>
					<c>-httpcookie +all (I)</c>

					<c>e.a.uk.</c>
					<c>a.uk.</c>
					<c>e.a.uk.</c>
					<c>-httpcookie +all (E)</c>

					<c>f.e.a.uk.</c>
					<c>a.uk.</c>
					<c>e.a.uk.</c>
					<c>-httpcookie +all (I)</c>

					<c>co.uk.</c>
					<c>uk.</c>
					<c>co.uk.</c>
					<c>-all (I)</c>

					<c>g.co.uk.</c>
					<c>g.co.uk.</c>
					<c>g.co.uk.</c>
					<c>+all (D)</c>

					<c>ck.</c>
					<c>ck.</c>
					<c>ck.</c>
					<c>-all (E)</c>

					<c>h.ck.</c>
					<c>ck.</c>
					<c>h.ck.</c>
					<c>-all (I)</c>

					<c>i.h.ck.</c>
					<c>i.h.ck.</c>
					<c>i.h.ck.</c>
					<c>+all (D)</c>

					<c>www.ck.</c>
					<c>www.ck.</c>
					<c>www.ck.</c>
					<c>+all (D)</c>

					<postamble>Policies resulting from the ODUP names and corresponding
						statements listed in <xref target="example-odup-policies" /> and
						illustrated in <xref target="example-namespace" />.  The version
						information (i.e., "v=odup1") has been stripped from the policy for
						readability.  [D]efault policy means that there was no explicit
						policy designated for the organization, so the default ("v=odup1
						+all") is used. [E]xplicit policy means that a policy is defined
						for the domain name in question.  [I]nherited policy means that it
						is inherited from the closest ancestor with default or explicit
						policy.</postamble>

				</texttable>

			</section>
		</section>

		<section title="Example Application Use">
			<t>While designating the manner in which ODUP is applied in applications
				is beyond the scope of this document, for added clarity and utility, we
				provide some examples of how it might be consumed, using the
				examples data <xref target="examples" /> for reference.</t>

			<section title="Public Suffix List Replacement">
				<t>As mentioned in <xref target="policy-negative" />, the ODUP
					statements within the policy-negative realm provide a drop-in
					replacement for the public suffix list(s) from which they are
					initially derived.  Whether used offline (i.e., having been been
					downloaded and optionally converted to a legacy list format) or
					learned through DNS queries, the applications that previously used a
					public suffix list, can use the contents of the _odup domain to
					achieve the same baseline behavior.  That includes HTTP cookie policy
					<xref target="RFC6265" />, identifying organizational domains for
					DMARC <xref target="RFC7489" />, and other use.</t>

				<t>Beyond this baseline behavior provided by installation of the
					policy-negative realm, ODUP provides the opportunity for additional
					functionality, described subsequently.</t>

			</section>

			<section title="HTTP Cookies">
				<t><xref target="RFC6265" /> directs user agents to reject HTTP cookies
					whose Domain attribute specifies a scope that does not include the
					origin server.  The origin server is within scope if its name is
					equal to or a subdomain of the value of the Domain attribute.
					Basically, this allows an origin server to set a cookie with a Domain
					attribute value of any domain name in its ancestry (but below the
					public suffix boundary).</t>

				<t>With ODUP policy HTTP cookies can be built on organizational
					boundaries, including not only the policy-negative realm, but also at
					other designated points.  For example, given the organizational
					boundary between b.a.uk and c.b.a.uk, the origin server d.c.b.a.uk
					can set a cookie for d.c.b.a.uk and c.b.a.uk, but not for b.a.uk.
					Likewise, when a user-agent has a cookie with domain b.a.uk, it will
					not send it when communicating with d.c.b.a.uk or c.b.a.uk because
					organizational boundaries supercede "domain-matching"
					(<xref target="RFC6265" />).</t>

				<t>In addition, cookie policies between organizational boundaries can
					be specified using the "httpcookie" directive.  For example, neither
					f.e.a.uk nor e.a.uk can be the value of the Domain attribute of an
					HTTP cookie, even though they are not public suffixes.  However, this
					doesn't mean that user agents communicating with f.e.a.uk or e.a.uk
					cannot set or return cookies for a.uk, so it is not particularly
					useful, except within the policy-negative realm.</t>

			</section>

			<section title="DMARC">
				<t>Whereas <xref target="RFC7489" /> includes only provides a single
					possible organizational domain for any given domain name, ODUP allows
					the organizational domain to be specified, such that it can be
					designated and identified from anywhere within the ancestral
					namespace.</t>

			</section>

		</section>

    <!-- Possibly a 'Contributors' section ... -->
    <section title="Contributors">
			<t>The namespace convention used for ODUP names resembles and was
				inspired by that developed in
				<xref target="I-D.levine-orgboundary" />, for which we
				acknowledge John Levine's efforts in this area.</t>
    </section>

    <section title="IANA Considerations">
			<t>This document contains no requests for IANA.</t>
    </section>

    <section anchor="security" title="Security Considerations">
			<t>Applications depending on the mechanisms herein described to learn
				organizational domains and polices for domain names have their own
				security considerations.  We reference <xref target="RFC6265" /> and
				<xref target="RFC7489" /> as examples of those.</t>

			<t>Because the ODUP resolution mechanisms themselves rely on DNS queries
				(and zone transfers and/or HTTP, for the policy-negative realm), its
				security is only as secure as that of the underlying lookup/download
				mechanisms themselves.  DNSSEC and HTTPS can be useful in ensuring
				authenticity of policy statements through the respective lookup
				mechanisms.</t>

			<t>The iterative query process utilized by ODUP resolution can be
				potentially revealing of queries to higher DNS authorities, in part
				because of the necessity of finding the longest matched ODUP names.
				This is in contrast to the principles of minimum disclosure to maximize
				DNS privacy.  This is mitigated by stopping at NXDOMAIN responses, as
				described in <xref target="identifying-organizational-domain" />.
				Additionally, referencing a locally downloaded version of the
				policy-negative realm for partial or "sufficient" ODUP resolution, as
				suggested in <xref target="policy-negative" /> can reduce queries to
				the _odup zone.</t>

    </section>
  </middle>

  <!--  *****BACK MATTER ***** -->

  <back>
    <!-- References split into informative and normative -->

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->

    <references title="Normative References">
			&RFC2119;
			&RFC4592;
      &RFC6265;
      &RFC5234;
			&RFC7231;
			&RFC3986;
    </references>

    <references title="Informative References">
			&RFC1034;
			&RFC1035;
			&RFC7230;
			&RFC2818;

			<reference anchor="PSL" target="https://publicsuffix.org/">
        <front>
          <title>Public Suffix List</title>

          <author>
            <organization>Mozilla Foundation</organization>
          </author>
          <date year="2016" />
        </front>
      </reference>

			<!--&RFC2965;-->

			<reference anchor="NewgTLDs" target="http://newgtlds.icann.org/">
        <front>
          <title>New Generic Top-Level Domains</title>

          <author>
            <organization>ICANN</organization>
          </author>
          <date year="2016" />
        </front>
      </reference>

			&RFC7489;

			&I-D.draft-levine-orgboundary;

			<!--&RFC5585;-->
			<!--&RFC7208;-->

			<!--&I-D.draft-sullivan-domain-origin-assert;-->

    </references>

		<section anchor="pseudo-code-odup" title="Pseudo-code for ODUP Resolution">

      <figure>
				<preamble></preamble>

        <artwork><![CDATA[function resolveODUP(N = [l(n)...l(1)], orgBoundary)
{
    Require: N = [l(n)...l(1)], n >= 1
      (a sequence of labels representing domain name, N)
    Require: orgBoundary, 1 <= orgBoundary <= n
      (an integer representing an index into N)
    Return: a three-tuple consisting of:
      - policyDomain, the domain name from the which the policy
        was derived
      - orgDomain, the organizational domain of N
      - policy, the raw policy resulting from TXT DNS queries

    // orgDomain consists of labels 1 through orgBoundary
    orgDomain := [l(orgBoundary)...l(1)]

    subDomainLabels := n - orgBoundary
    longestMatch := NULL
    longestMatchBoundary := NULL
    existingLabels := 0
    for all i in [0...subDomainLabels]
    {
        if i = 0
        {
            subDomain := []
        }
        else
        {
            subDomain := [l(orgBoundary + i)...l(orgBoundary + 1)]
        }
        testDomain := subDomain | ["_odup"] | orgDomain
        queryResult := queryDNS(testDomain, TXT)

        if queryResult is either NOERROR or NODATA AND i > 0
        {
            // Update existingLabels because the name exists.
            // Only do this for labels other than _odup
            // (hence the test for i > 0).
            existingLabels := existingLabels + 1
        }

        if queryResult is an answer
        {
            // Update longestMatch by giving org and bound highest
            // priority and ignoring policy statements below "bound".
            if queryResult includes "+org" OR
                queryResult includes "+bound" OR
                longestMatch doesn't include "+bound"
            {
                longestMatch := queryResult
                longestMatchBoundary := i
            }

            if queryResult includes "+org"
            {
                // If this was an organizational domain designation,
                // then don't go any further; the organization will
                // dictate policy
                break
            }
            if queryResult includes "+bound" AND
                was synthesized from wildcard
            {
                // If this was a boundary designation, and the answer
                // was synthesized from a wildcard, no further
                // lookups must be performed
                break
            }
        }
        else if queryResult is NXDOMAIN response
        {
            // An NXDOMAIN result means that no further lookups are
            // necessary, as there is no subtree
            break
        }
    }

    if longestMatch is not NULL
    {
        // If a policy has been found, then look for +org or +bound
        // directives, which will cause resolveODUP() to be called
        // recursively.  A +org directive indicates that the
        // organizational domain and policy are (at least) one level
        // lower than the value of longestMatchBoundary.
        if longestMatch includes "+org"
        {
            return
                resolveODUP(N, orgBoundary + longestMatchBoundary)
        }
        // A +bound directive indicates that the organizational domain
        // and policy are (at least) one level lower than the value of
        // existingLabels.
        else if longestMatch includes "+bound" AND
                orgBoundary + existingLabels <= n
            {
                return resolveODUP(N, orgBoundary + existingLabels)
            }
        }

        // With no +org or +bound directives present, the orgDomain and
        // policy remain as they were looked up, and are returned with
        // the policy domain
        return [l(orgBoundary + longestMatchBoundary)...l(1)],
            orgDomain, longestMatch
    }

    // Return an empty policy
    return orgDomain, orgDomain, ""

}]]></artwork>
		</figure>

		</section>


    <!-- Change Log

v00 2006-03-15  EBD   Initial version

v01 2006-04-03  EBD   Moved PI location back to position 1 -
                      v3.1 of XMLmind is better with them at this location.
v02 2007-03-07  AH    removed extraneous nested_list attribute,
                      other minor corrections
v03 2007-03-09  EBD   Added comments on null IANA sections and fixed heading capitalization.
                      Modified comments around figure to reflect non-implementation of
                      figure indent control.  Put in reference using anchor="DOMINATION".
                      Fixed up the date specification comments to reflect current truth.
v04 2007-03-09 AH     Major changes: shortened discussion of PIs,
                      added discussion of rfc include.
v05 2007-03-10 EBD    Added preamble to C program example to tell about ABNF and alternative 
                      images. Removed meta-characters from comments (causes problems).  -->
  </back>
</rfc>
