<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml2rfc.tools.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. -->
]>
<?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.tools.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="std" docName="draft-xia-rats-pubsub-model-00" 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="Abbreviated Title">Using Netconf Pub/Sub Model for RATS
    Interaction Procedure</title>

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

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

    <author fullname="Liang Xia (Frank)" initials="L.X." surname="Xia">
      <organization>Huawei</organization>

      <address>
        <postal>
          <street>101 Software Avenue, Yuhuatai District,</street>

          <!-- Reorder these if your country does things differently -->

          <city>Nanjing, Jiangsu</city>

          <region/>

          <code>210012</code>

          <country>China</country>
        </postal>

        <phone/>

        <email>frank.xialiang@huawei.com</email>

        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>

    <author fullname="Wei Pan" initials="W.P." surname="Pan">
      <organization>Huawei</organization>

      <address>
        <postal>
          <street>101 Software Avenue, Yuhuatai District</street>

          <!-- Reorder these if your country does things differently -->

          <city>Nanjing, Jiangsu</city>

          <region/>

          <code>210012</code>

          <country>China</country>
        </postal>

        <phone/>

        <email>william.panwei@huawei.com</email>

        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>

    <date month="October" year="2019"/>

    <!-- 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>Security</area>

    <workgroup>Remote ATtestation ProcedureS</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>template</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>This draft defines the a new method of using the netconf pub/sub
      model in the RATS interaction procedure, to increse its flexibility,
      efficiency and scalability.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>Remote attestation is for acquiring the evidence about various
      integrity information from remote endpoints to assess its
      trustworthiness (aka, behave in the expected manner). These evidence
      should be about: system component identity, composition of system
      components, roots of trust, system component integrity, system component
      configuration, operational state and so on. <xref
      target="I-D.richardson-rats-usecases"/> describes possible use cases
      which remote attestation are using for different industries, like:
      network devices, FIDO authentication for onlline transaction,
      Cryptographic Key Attestation for mobile devices, and so on.</t>

      <t><xref target="I-D.birkholz-rats-architecture"/> lays a foundation of
      RATS architecture about the key RATS roles (i.e., Relying Party,
      Verifier, Attester and asserter) and the messages they exchange, as well
      as some key concepts. Based on it, <xref
      target="I-D.birkholz-rats-reference-interaction-model"/> specifies a
      basic challenge-response-based interaction model for the remote
      attestation procedure, which a complete remote attestation procedure is
      triggered by a challenge message originated from the verifier, and
      finished when the attester sends its response message back. This is a
      very generic interaction model with wide adoption. This document
      proposes an alternative interaction model for Remote attestation
      procedure, by customizing the IETF NETCONF pub/sub model <xref
      target="RFC8639"/><xref target="RFC8640"/><xref target="RFC8641"/>. With
      its nature of asynchronous communication, the new pub/sub model for
      remote attestation procedure is optimal for large-scale and loosely
      coupled distributed systems, especially for the network devices, which
      has the advantages as: loose coupling, scalability, time delivery
      sensitivity, supporting filtering capability, and so on. The pub/sub
      model can be used independently, or together with the challenge-response
      model to complement each other as a whole. Note that in which way these
      models are combinded together are currently out of the scope of this
      draft.</t>

      <t>In summary, by untilizing the pub/sub model in remote attestation
      procedure, the gained benefits are as below:<list style="symbols">
          <t>Flexibility: the verifier does not need to send the challenge
          message every time. The whole thing of the verifier is to subscibe a
          topic to the attester and then to anticipate the period or timely
          on-change notification from the attester about its integrity
          evidence.</t>

          <t>Efficiency: once the verifier has subscribed its interested
          topics related with its triggering condition to the attester, it
          will get all the condition triggerd notifications on time, which are
          the integrity related evidence for remote attestation in fact. It
          will ensure any integrity change/deviation of the remote endpoint to
          be detected with the minimum latency.</t>

          <t>Scalability: it will save a lot of challenge messages by
          replacing with single subscription message for one topic stream, and
          decrease the total number of stateful connection between the
          verifier and attester, especially for a very large scale network.
          Thus, the scalability of the solution will increase.</t>
        </list></t>

      <t>This document is organized as follows. Section 2 defines conventions
      and acronyms used. Section 3 discusses pub/sub model of remote
      attestation procedure.</t>
    </section>

    <section title="Conventions Used in This Document">
      <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>

      <t>This document uses terminology defined in<xref
      target="I-D.birkholz-rats-architecture"/><xref
      target="I-D.birkholz-rats-reference-interaction-model"/> for security
      related and RATS scoped terminology.</t>
    </section>

    <section title="Pub/sub Model for Remote Attestation Procedure">
      <section title="Solution Overview">
        <t>The following sequence diagram illustrates the reference remote
        attestation procedure by utilizing the netconf pub/sub model defined
        by this document.</t>

        <figure align="center"
                title="Figure 1: Pub/sub model of Remote Attestation">
          <artwork align="left">[Attester]                                                      [Verifier]
    |                                                               |
    | &lt;--Sub(nonce,authSecID,assertionSelection, event/period)      |
    |                                                               |
collectAssertions(assertionSelection)                               |
    | =&gt; assertions                                                 |
    |                                                               |
signAttestationEvidence(authSecID, assertions, nonce)               |
    | =&gt; signedAttestationEvidence                                  |
    |                                                               |
    | signedAttestationEvidence ----------------------------------&gt; |
    |                                                               |
    | verifyAttestationEvidence(signedAttestationEvidence, refAssertions)
    |                                          attestationResult &lt;= |
    |                                                               |
    | ............................................................. |
    |                                                               |
collectAssertions(assertionSelection)                               |
    | =&gt; assertions                                                 |
    |                                                               |
signAttestationEvidence(authSecID, assertions, nonce)               |
    | =&gt; signedAttestationEvidence                                  |
    |                                                               |
    | signedAttestationEvidence ----------------------------------&gt; |
    |                                                               |
    | verifyAttestationEvidence(signedAttestationEvidence, refAssertions)
    |                                          attestationResult &lt;= |
    |                                                               |
    | ............................................................. |
    |                                                               |
    |                                                               |
    |on-change/event happens                                        |
    |     |                                                         |
    |    \|/                                                        |
collectAssertions(assertionSelection)                               |
    | =&gt; assertions                                                 |
    |                                                               |
signAttestationEvidence(authSecID, assertions, nonce)               |
    | =&gt; signedAttestationEvidence                                  |
    |                                                               |
    | signedAttestationEvidence ----------------------------------&gt; |
    |                                                               |
    | verifyAttestationEvidence(signedAttestationEvidence, refAssertions)
    |                                          attestationResult &lt;= |
    |                                                               |
    | ............................................................. |   
 </artwork>
        </figure>

        <t>In short, the basic idea of pub/sub model for remote attestation is
        the verifier subscribes its interested event streams about the
        integrity evidence to the attester. After the subscription succeeds,
        the attester sends the subscribed integrity evidence back to the
        verifier. During subscription, the verifier may also specify how the
        attester returns the subscribed information, that is, the upate
        trigger as periodic subscription or on-change subscription. And when
        the selection filters are applied to the subscription, only the
        information that pass the filter will be distributed out.</t>

        <t>More detailed, the key steps of the remote attestation workflow
        with this model can be summarized as below (using the network devices
        as the example):<list style="symbols">
            <t>The verifier subscribes its interested event streams about the
            integrity evidence to the attester. More specifically:<list
                style="symbols">
                <t>The event stream here refers to various integrity evidence
                information related to device trustworthiness. The basic event
                streams may include: software integrity information (including
                PCR values and system boot logs) of each layer of the trust
                chain recorded during device booting time; device identity
                certificates &amp; Attestation Key certificate; operating
                system, application dynamic integrity information (e.g., IMA
                logs) and the device configuration information recorded during
                device running time.</t>

                <t>Periodic subscription is mainly used by the verifier for
                the general and non-critical information collection, which are
                not strictly time sensitive and aims for collecting the latest
                integrity evidence and checking the possible deviation. In
                contrary, on-change subscription is basically used to to
                monitor the critical integrity evidence (e.g., integrity
                values and log files during device booting time, or integrity
                values of some key service processes). If these integrity
                values change, notifications are sent immediately.</t>

                <t>The selection filters may be applied to the subscription,
                so that only the event records that pass the filter will be
                distributed out. Some specific examples include: event records
                of a component (e.g., line card) in the composite device, the
                event records in a specific time period that includes a start
                time and an end time, and so on.</t>
              </list></t>

            <t>Consider how to send the existing parameters (i.e., nonce, hash
            signature algorithm, and specified TPM name, etc.) carried in the
            challenge message of the previous challenge-response model to the
            attester through the subscription message of the new sub/pub model
            in advance, and the follow-up usage of them. A very important
            point is how to ensure that the nonce carried in every
            notification message is different, and both the attester and the
            verifier know the correct value in advance.</t>

            <t>Both configuration subscription and dynamic subscription are
            considered. More specifically:<list style="symbols">
                <t>Configure subscription is for the important security event
                stream. For example, it enables the monitoring the important
                integrity information by using the on-change mode.</t>

                <t>Dynamic subscription is for the normal integrity
                information, that is, periodically receive those related
                information during NETCONF Session. The corresponding
                subscription RPC needs to be established dynamically. This way
                can reduce unnecessary NETCONF sessions.</t>
              </list></t>

            <t>In addition to the update trigger of on-change, the other
            possible update trigger may be certain pre-defined events
            according to <xref target="I-D.bryskin-netconf-automation-yang"/>,
            that is: When these events occur, the specified integrity
            information is triggered to be sent, which is the relevant event
            stream plus optional selection filter. The events may include:
            device startup completion, device upgrade completion, specific
            attack event, active/standby switchover, line card
            insertion/removal/switchover, certificate life cycle event
            (expiration), etc.</t>

            <t>The attester notification delivery mechanisms thus vary as the
            above subscription mechanisms of verifier vary.</t>
          </list></t>

        <t>The following sections decribe the above key steps one by one.</t>
      </section>

      <section title="Remote Attestation Event Stream Definition">
        <t>The event streams here refers to various integrity evidence
        information related to device trustworthiness. The basic event streams
        may include: software integrity information (including PCR values and
        system boot logs) of each layer of the trust chain recorded during
        device booting time, device identity certificates &amp; Attestation
        Key certificate generation, operating system and application dynamic
        integrity information (e.g., IMA logs) recorded during device running
        time.</t>

        <t>The event streams are created and managed by the attester. And
        their formal definition should be conformed to the information model
        definition like Attestation Evidence or others in <xref
        target="I-D.birkholz-rats-information-model"/>, and the claim data
        model definition in <xref
        target="I-D.birkholz-rats-basic-yang-module"/> with YANG data format,
        and <xref target="I-D.ietf-rats-eat"/> with COSE data format.</t>
      </section>

      <section title="Remote Attestation Subscription Definition">
        <t>NETCONF pub/sub model provides several suscription types in which
        approriate one or more types are choosed and possibly used together to
        meet the service requirements.</t>

        <t>Particularly, periodic subscription is mainly used by the verifier
        for the general and non-critical information collection, which are not
        strictly time sensitive and aims for collecting the latest integrity
        information and checking the possible deviation. In contrary,
        on-change subscription is basically used to monitor the critical
        integrity evidence (e.g., integrity values and log files during device
        booting time, or integrity values of some key service processes). If
        these integrity values change, notifications are sent immediately.</t>

        <t>Besides, both configuration subscription and dynamic subscription
        are considered. In which, configure subscription is for the important
        security data stream as it lasts even the NETCONF session is closed.
        For example, it enables the monitoring of the status of important
        security event stream by using the on-change mode. On the other hand,
        dynamic subscription is for the general security event stream, that
        is, periodically receive those related information during NETCONF
        Session. The corresponding subscription RPC needs to be established
        dynamically. This way can reduce unnecessary NETCONF sessions.</t>

        <t>Furthermore, certain pre-defined events can be the update trigger
        too, that is: When these events occur, the specified integrity
        information is triggered to be sent, which is the relevant event
        stream plus optional selection filter. The events may include: device
        startup completion, device upgrade completion, specific attack event,
        active/standby switchover, line card insertion/removal/switchover,
        certificate life cycle event (expiration), etc.</t>
      </section>

      <section title="Remote Attestation Selection Filters Definition">
        <t>The selection filters may be applied to the subscription, so that
        only the event that pass the filter will be distributed out.</t>

        <t>A concrete example of selection filter is limiting the delivered
        event stream to those originated from a specific component with id
        ("xxxxxxxxxx") of a designated vendor ("xxx-vendor-device").</t>

        <section title="Remote Attestation Subscription Parameters Handling">
          <t>Most of the parameters carried in the subscription message are
          not changed during the remote attestation procedure, like: hash
          signature algorithm, specified TPM name and so on. Their main goal
          is to enable the dynamic negotiation with the attester about what
          information the verifier needs and how to construct them together. A
          very important point is how to ensure that the nonce carried in
          every notification message is different, and both the attester and
          the verifier know the correct value in advance. For this purpose,
          the basic idea is to ensure that the nonce in two sides of the
          communication is synchronously changed, and the randomness of the
          nonce is maintained. Specifically, there may be several ways to do
          it:<list style="symbols">
              <t>Verifier sends a seed with hash algorithm to the attester in
              the subscription message, and then perform the synchronization
              operation on both sides.</t>

              <t>In fact, the nonce does not need to be random every time. As
              long as the receive endpoint (here for verifier) can identify
              duplicated packets, other means may be used. For example: The
              timestamp and increasing count.</t>

              <t>The RATS TUDA mechanism <xref
              target="I-D.birkholz-rats-tuda"/> can also be used here to
              ensure the freshness of information.</t>
            </list></t>
        </section>
      </section>

      <section title="Remote Attestation Notification Distribution">
        <t>To be written.</t>
      </section>

      <section title="Summary">
        <t>Based on the above discussion, this section gives some examples to
        illustrate the overall application of sub/pub model to remote
        attestation procedure.</t>

        <t>Below is a configured subscription example with on-change update
        trigger, with specific contents as:<list style="symbols">
            <t>There are 3 integrity evidence related event streams as
            follows: pcr-trust-evidence, bios-log-trust-evidence and
            ima-log-trust-evidence. The subscribed one is
            pcr-trust-evidence.</t>

            <t>The other parameters of the subscription include: pcr-list:
            {{1, 3, 7}}, tcg-hash-algo-id: TPM_ALG_SHA256, nonce-value:
            0x564ac291, TPM_ALG_ID-value: TPM_ALG_ECDSA, pub-key-id:
            0x784a22bf, tpms: {"tpm1"}.</t>

            <t>The selection filter is set as follows: a specific component
            with id ("xxxxxxxxxx") of a designated vendor
            ("xxx-vendor-device").</t>
          </list></t>

        <figure align="center"
                title="Figure 2: Configured On-change Subscription Message">
          <artwork align="left">&lt;edit-config&gt;
    &lt;subscriptions
           xmlns="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"&gt;
        &lt;subscription&gt;
            &lt;id&gt;100&lt;/id&gt;
            &lt;stream&gt;pcr-trust-evidence&lt;/stream&gt;
            &lt;stream-subtree-filter&gt;
                &lt;xxx-vendor-device
                      xmlns="urn:xxx:params:xml:ns:yang:xxx-vendor-device "&gt;
                    &lt;device-id&gt;xxxxxxxxxx&lt;/device-id&gt;
                &lt;/xxx-vendor-device&gt;
            &lt;/stream-subtree-filter&gt;
            &lt;pcr-list&gt;
                &lt;pcr&gt;
                    &lt;pcr-indices&gt;1&lt;/pcr-indices&gt;
                    &lt;pcr-indices&gt;3&lt;/pcr-indices&gt;
                    &lt;pcr-indices&gt;7&lt;/pcr-indices&gt;
                    &lt;hash-algo&gt;
                        &lt;tcg-hash-algo-id&gt;TPM_ALG_SHA256&lt;/tcg-hash-algo-id&gt;
                    &lt;/hash-algo&gt;
                &lt;/pcr&gt;
            &lt;/pcr-list&gt;
            &lt;nonce-value&gt;0x564ac291&lt;/nonce-value&gt;
            &lt;TPM_ALG_ID-value&gt;TPM_ALG_ECDSA&lt;/TPM_ALG_ID-value&gt;
            &lt;pub-key-id&gt;0x784a22bf&lt;/pub-key-id&gt;
            &lt;tpms&gt;
                &lt;tpm-name&gt;tpm1&lt;/tpm-name&gt;
            &lt;/tpms&gt;
            &lt;yp:on-change&gt;
                &lt;yp:dampening-period&gt;100&lt;/yp:dampening-period&gt;
            &lt;/yp:on-change&gt;
        &lt;/subscription&gt;  
    &lt;/subscriptions&gt;
&lt;/edit-config&gt;
</artwork>
        </figure>

        <t>Below is a dynamic subscription RPC example with periodic update
        trigger, with specific contents as:<list style="symbols">
            <t>There are 3 integrity evidence related event streams as
            follows: pcr-trust-evidence, bios-log-trust-evidence and
            ima-log-trust-evidence. The subscribed one is
            bios-log-trust-evidence.</t>

            <t>The other parameters of the dynamic subscription include: tpms:
            {"tpm1"}, last-entry-value: 0xa34568baac79, log-type: bios,
            pcr-list: {{2, 4, 8}}, tcg-hash-algo-id: TPM_ALG_SHA256.</t>

            <t>The selection filter is set as follows: a specific component
            with id ("xxxxxxxxxx") of a designated vendor
            ("xxx-vendor-device").</t>

            <t>Subscription period: 500 centiseconds.</t>
          </list></t>

        <figure align="center"
                title="Figure 3: Dynamic Periodic Subscription Message">
          <artwork align="left">&lt;rpc netconf:message-id="101"
       xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;establish-subscription
          xmlns="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"&gt;
        &lt;stream&gt;bios-log-trust-evidence&lt;/stream&gt;
        &lt;stream-subtree-filter&gt;
            &lt;xxx-vendor-device
                  xmlns="urn:xxx:params:xml:ns:yang:xxx-vendor-device "&gt;
                &lt;device-id&gt;xxxxxxxxxx&lt;/device-id&gt;
            &lt;/xxx-vendor-device&gt;
        &lt;/stream-subtree-filter&gt;
        &lt;tpms&gt;
            &lt;tpm-name&gt;tpm1&lt;/tpm-name&gt;
        &lt;/tpms&gt;
        &lt;last-entry-value&gt;0xa34568baac79&lt;/last-entry-value&gt;
        &lt;log-type&gt;bios&lt;/log-type&gt;
        &lt;pcr-list&gt;
            &lt;pcr&gt;
                &lt;pcr-indices&gt;2&lt;/pcr-indices&gt;
                &lt;pcr-indices&gt;4&lt;/pcr-indices&gt;
                &lt;pcr-indices&gt;8&lt;/pcr-indices&gt;
                &lt;hash-algo&gt;
                    &lt;tcg-hash-algo-id&gt;TPM_ALG_SHA256&lt;/tcg-hash-algo-id&gt;
                &lt;/hash-algo&gt;
            &lt;/pcr&gt;
        &lt;/pcr-list&gt;
        &lt;yp:periodic&gt;
            &lt;yp:period&gt;500&lt;/yp:period&gt;
        &lt;/yp:periodic&gt;
    &lt;/establish-subscription&gt;
&lt;/rpc&gt;
     </artwork>
        </figure>

        <t>Below is a configured subscription RPC example with pre-defined
        events as the update trigger, with specific contents as:<list
            style="symbols">
            <t>There are 3 integrity evidence related event streams as
            follows: pcr-trust-evidence, bios-log-trust-evidence and
            ima-log-trust-evidence. The subscribed one is
            pcr-trust-evidence.</t>

            <t>The other parameters of the subscription include: pcr-list:
            {{1, 3, 7}}, tcg-hash-algo-id: TPM_ALG_SHA256, nonce-value:
            0x564ac291, TPM_ALG_ID-value: TPM_ALG_ECDSA, pub-key-id:
            0x784a22bf, tpms: {"tpm1"}.</t>

            <t>The selection filter is set as follows: a specific component
            with id ("xxxxxxxxxx") of a designated vendor
            ("xxx-vendor-device").</t>

            <t>The event which triggers the intergrity evidence delivery is
            defined as: id: 1001, type: master-slave-swithover</t>
          </list></t>

        <figure align="center"
                title="Figure 4: Configured Event-triggered Subscription Message">
          <artwork align="left">
     </artwork>
        </figure>
      </section>
    </section>

    <section title="The YANG Module for Sub/pub Model Remote Attestation Procedures">
      <section title="Tree Format">
        <t>To be written.</t>
      </section>

      <section title="Raw Format">
        <t>To be written.</t>
      </section>
    </section>

    <section title="Security Considerations">
      <t>To be written</t>
    </section>

    <section title="Acknowledgements">
      <t>Thanks to ...</t>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>To be written, possibly.</t>
    </section>
  </middle>

  <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">
      <!--?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->

      <?rfc include="reference.RFC.2119"?>

      <?rfc include="reference.RFC.8639"?>

      <?rfc include="reference.RFC.8640"?>

      <?rfc include="reference.RFC.8641"?>
    </references>

    <references title="Informative References">
      <!-- Here we use entities that we defined at the beginning. -->

      <?rfc include="reference.I-D.richardson-rats-usecases"?>

      <?rfc include="reference.I-D.birkholz-rats-architecture"?>

      <?rfc include="reference.I-D.birkholz-rats-reference-interaction-model"?>

      <?rfc include="reference.I-D.birkholz-rats-information-model"?>

      <?rfc include="reference.I-D.birkholz-rats-basic-yang-module"?>

      <?rfc include="reference.I-D.ietf-rats-eat"?>

      <?rfc include="reference.I-D.birkholz-rats-tuda"?>

      <?rfc include="reference.I-D.bryskin-netconf-automation-yang"?>

      <!-- A reference written by by an organization not a person. -->
    </references>
  </back>
</rfc>
