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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

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

<rfc ipr="trust200902" docName="draft-birkholz-rats-network-device-subscription-01" category="std">

  <front>
    <title abbrev="RATS Subscription">Attestation Event Stream Subscription</title>

    <author initials="H." surname="Birkholz" fullname="Henk Birkholz">
      <organization abbrev="Fraunhofer SIT">Fraunhofer SIT</organization>
      <address>
        <postal>
          <street>Rheinstrasse 75</street>
          <city>Darmstadt</city>
          <code>64295</code>
          <country>Germany</country>
        </postal>
        <email>henk.birkholz@sit.fraunhofer.de</email>
      </address>
    </author>
    <author initials="E." surname="Voit" fullname="Eric Voit">
      <organization abbrev="Cisco">Cisco Systems, Inc.</organization>
      <address>
        <email>evoit@cisco.com</email>
      </address>
    </author>
    <author initials="W." surname="Pan" fullname="Wei Pan">
      <organization abbrev="Huawei">Huawei Technologies</organization>
      <address>
        <postal>
          <street>101 Software Avenue, Yuhuatai District</street>
          <city>Nanjing, Jiangsu</city>
          <region></region>
          <code>210012</code>
          <country>China</country>
        </postal>
        <phone></phone>
        <email>william.panwei@huawei.com</email>
      </address>
    </author>

    <date year="2020" month="October" day="06"/>

    <area>Security</area>
    <workgroup>RATS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document defines how to subscribe to an Event Stream of attestation related Evidence on TPM-based network devices.</t>



    </abstract>


  </front>

  <middle>


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

<t><xref target="I-D.ietf-rats-tpm-based-network-device-attest"/> and <xref target="I-D.ietf-rats-yang-tpm-charra"/> define the operational prerequisites and a YANG Model for the acquisition of Evidence from a TPM-based network device.  However there is a limitation inherant in the challenge-response interaction models upon which these documents are based. This limitation is that it is up to the Verifier to request Evidence.  The result is that the interval between the occurrence of a security event, and the event’s visibility within the Relying Party can be unacceptably long.</t>

<t>This limitation results in two adverse effects:</t>

<t><list style="numbers">
  <t>Evidence is not streamed to an interested Verifier as soon as it is generated.</t>
  <t>If it were to be streamed, the Evidence is not appraisable for freshness.</t>
</list></t>

<t>This specification addresses the first adverse effect by enabling a Verifier to subscribe via <xref target="RFC8639"/> to an &lt;attestation&gt; Event Stream which exists upon the Attester.  When subscribed, the Attester will continuously stream a requested set of Evidence to the Verifier.</t>

<t>The second adverse effect results from the nonce based challenge-response of <xref target="I-D.ietf-rats-yang-tpm-charra"/>. In that document an Attester must wait for a new nonce from a Verifier before it generates a new TPM Quote.  To address delays resulting from such a wait, this specification enables freshness to be asserted asynchronously.</t>

<t>By removing these two adverse effects, it becomes possible for a Verifier to continously maintain an appraisal of the Attested device without relying on continous polling.</t>

</section>
<section anchor="terminology" title="Terminology">

<t>The following terms are imported from <xref target="I-D.ietf-rats-architecture"/>: Attester, Evidence, Relying Party, and Verifier.  Also imported are the time definitions time(VG), time(NS), time(EG), time(RG), and time(RA) from that document’s Appendix A.  The following terms at imported from <xref target="RFC8639"/>: Event Stream, Subscription, Event Stream Filter, Dynamic Subscription.</t>

<section anchor="requirements-notation" title="Requirements Notation">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL
NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”,
“MAY”, and “OPTIONAL” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
</section>
<section anchor="operational-model" title="Operational Model">

<section anchor="sequence-diagram" title="Sequence Diagram">

<t><xref target="sequence"/> below is a sequence diagram which updates Figure 5 of <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/>.  This sequence diagram replaces the <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/> challenge-response interaction model with an <xref target="RFC8639"/> Dynamic Subscription to an  &lt;attestation&gt; Event Stream.  The contents of the &lt;attestation&gt; Event Stream are defined below within <xref target="attestationstream"/>.</t>

<figure title="YANG Subscription Model for Remote Attestation" anchor="sequence"><artwork><![CDATA[
.----------.                        .--------------------------.
| Attester |                        | Relying Party / Verifier |
'----------'                        '--------------------------'
   time(VG)                                              |
     |<---------establish-subscription(<attestation>)--time(NS)
     |                                                   |
   time(EG)                                              |
     |--filter(<pcr-extend>)---------------------------->|
     |--<tpm12-attestation> or <tpm20-attestation>------>|
     |                                                   |
     |                      verify time(EG) Evidence @ time(RG,RA)
     |                                                   |
     ~                                                   ~
   time(VG',EG')                                         |
     |--filter(<pcr-extend>)---------------------------->|
     |--<tpm12-attestation> or <tpm20-attestation>------>|
     |                                                   |
     |                     verify time(EG') Evidence @ time(RG',RA')


]]></artwork></figure>

<t><list style="symbols">
  <t>time(VG,RG,RA) are identical to the corresponding times from Figure 5 of <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/>.</t>
  <t>time(RG’,RA’) are subsequent instances of the corresponding times from Figure 5 of <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/>.</t>
  <t>time(NS): The Verifier generates a nonce and makes an <xref target="RFC8639"/> &lt;establish-subscription&gt; request.  This request also includes the augmentations defined in this document’s YANG model.  Key subscription RPC parameters include:  <list style="symbols">
      <t>the nonce</t>
      <t>a set of PCRs of interest which the Verifier wants to appraise</t>
      <t>an optional filter which can reduce the logged events on the &lt;attestation&gt; stream pushed to the Verifier.</t>
    </list></t>
  <t>time(EG) – An initial response of Evidence is returned to the Verifier.  This includes:  <list style="symbols">
      <t>A replay of filtered log entries which have extended into a PCR of interest since boot are sent in the &lt;pcr-extend&gt; notification.</t>
      <t>A signed TPM quote that contains at least the PCRs from the &lt;establish-subscription&gt; RPC are included in a &lt;tpm12-attestation&gt; or &lt;tpm20-attestation&gt;).  This quote must have included the nonce provided at time(NS).</t>
    </list></t>
  <t>time(VG’,EG’) – This occurs when a PCR is extended subsequent to time(EG).  Immediately after the extension, the following information needs to be pushed to the Verifier:  <list style="symbols">
      <t>Any values extended into a PCR of interest, and</t>
      <t>a signed TPM Quote showing the result the PCR extension.</t>
    </list></t>
</list></t>

</section>
<section anchor="continuously-verifying-freshness" title="Continuously Verifying Freshness">

<t>As there is no new Verifier nonce provided at time(EG’), it is important to validate the freshness of TPM Quotes which are delivered at that time.  The method of doing this verification will vary based on the capabilities of the TPM cryptoprocessor used.</t>

<section anchor="tpm-12-quote" title="TPM 1.2 Quote">

<t>The <xref target="RFC8639"/> notification format includes the &lt;eventTime&gt; object.  This can be used to determine the amount of time subsequent to the initial subscription each notification was sent.  However this time is not part of the signed results which are returned from the Quote, and therefore is not trustworthy as objects returned in the Quote.  Therefore a Verifier MUST periodically issue a new nonce, and receive this nonce within a TPM quote response in order to ensure the freshness of the results.  This can be done using the &lt;tpm12-challenge-response-attestation&gt; RPC from <xref target="I-D.ietf-rats-yang-tpm-charra"/>.</t>

</section>
<section anchor="tpm-2-quote" title="TPM 2 Quote">

<t>When the Attester includes a TPM2 compliant cryptoprocessor, internal time-related counters are included within the signed TPM Quote.  By including a initial nonce in the <xref target="RFC8639"/> subscription request, fresh values for these counters are pushed as part of the first TPM Quote returned to the Verifier. And then as shown by <xref target="I-D.birkholz-rats-tuda"/>, subsequent TPM Quotes delivered to the Verifier can the be appraised for freshness based on the predictable incrementing of these time-related countersr.</t>

<t>The relevant internal time-related counters defined within <xref target="TPM2.0"/> can be seen within &lt;tpms-clock-info&gt;.   These counters include the &lt;clock&gt;, &lt;reset-counter&gt;, and &lt;restart-counter&gt; objects.  The rules for appraising these objects are as follows:</t>

<t><list style="symbols">
  <t>If the &lt;clock&gt; has incremented for no more than the same duration as both the &lt;eventTime&gt; and the Verifier’s internal time since the initial time(EG) and any previous time(EG’), then the TPM Quote may be considered fresh. Note that <xref target="TPM2.0"/> allows for +/- 15% clock drift.  However many chips significantly improve on this maximum drift.  If available, chip specific maximum drifts SHOULD be considered during the appraisal process.</t>
  <t>If the &lt;reset-counter&gt;, &lt;restart-counter&gt; has incremented.  The existing subscription MUST be terminated, and a new &lt;establish-subscription&gt; SHOULD be generated.</t>
  <t>If a TPM Quote on any subscribed PCR has not been pushed to the Verifier for a duration of an Attester defined heartbeat interval, then a new TPM Quote notification should be sent to the Verifier.  This may often be the case, as certain PCRs might be infrequently updated.</t>
</list></t>

<figure><artwork><![CDATA[
.----------.                        .--------------------------.
| Attester |                        | Relying Party / Verifier |
'----------'                        '--------------------------'
   time(VG',EG')                                         |
     |-<tpm20-attestation>------------------------------>|
     |                                    :              |
     ~                           Heartbeat interval      ~
     |                                    :              |
   time(EG')                              :              |
     |-<tpm20-attestation>------------------------------>|
     |                                                   |
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="attestationstream" title="Remote Attestation Event Stream">

<t>The &lt;attestation&gt; Event Stream is an <xref target="RFC8639"/> complaint Event Stream which is defined within this section and within the YANG Module of <xref target="I-D.ietf-rats-yang-tpm-charra"/>. This Event Stream contains YANG notifications which carry Evidence which assists a Verifier in appraising the Trustworthiness Level of an Attester. Data Nodes within <xref target="configuring"/> allow the configuration of this Event Stream’s contents on an Attester.</t>

<t>This &lt;attestation&gt; Event Stream may only be exposed on Attesters supporting <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/>.  As with <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/>, it is up to the Verifier to understand which types of cryptoprocessors and keys are acceptable.</t>

<section anchor="subscription-to-the-attestation-event-stream" title="Subscription to the &lt;attestation&gt; Event Stream">

<t>To establish a subscription to an Attester in a way which provides provably fresh Evidence, initial randomness must be provided to the Attester. This is done via the augmentation of a &lt;nonce-value&gt; into <xref target="RFC8639"/> the &lt;establish-subscription&gt; RPC.   Additionally, a Verifier must ask for PCRs of interest from a platform.</t>

<figure><artwork><![CDATA[
  augment /sn:establish-subscription/sn:input:
    +---w nonce-value    binary
    +---w pcr-index*     tpm:pcr
]]></artwork></figure>

<t>The result of the subscription will be that passing of the following information:</t>

<t><list style="numbers">
  <t>&lt;tpm12-attestation&gt; and &lt;tpm20-attestation&gt; notifications which include the provided &lt;nonce-value&gt;.  These attestation notifications MUST at least include all the &lt;pcr-indicies&gt; requested in the RPC.</t>
  <t>a series of &lt;pcr-extend&gt; notifications which reference the requested PCRs on all TPM based cryptoprocessors on the Attester.</t>
  <t>&lt;tpm12-attestation&gt; and &lt;tpm20-attestation&gt; notifications generated within a few seconds of the &lt;pcr-extend&gt; notifications.  These attestation notifications MUST at least include any PCRs extended.</t>
</list></t>

<t>If the Verifier does not want to see the logged extend operations for all PCRs available from an Attester, an Event Stream Filter should be applied.  This filter will remove Evidence from any PCRs which are not interesting to the Verifier.</t>

</section>
<section anchor="replaying-a-history-of-previous-tpm-extend-operations" title="Replaying a history of previous TPM extend operations">

<t>Unless it is relying on Known Good Values, a Verifier will need to acquire a history of PCR extensions since the Attester has been booted.  This history may be requested from the Attester as part of the &lt;establish-subscription&gt; RPC.  This request is accomplished by placing a very old &lt;replay-start-time&gt; within the original RPC request.  As the very old &lt;replay-start-time&gt; will pre-date the time of Attester boot, a &lt;replay-start-time-revision&gt; will be returned in the &lt;establish-subscription&gt; RPC response, indicating when the Attester booted.  Immediately following the response (and before the notifications above)  one or more &lt;pcr-extend&gt; notifications which document all extend operations which have occurred for the requested PCRs since boot will be sent.  Many extend operations to a single PCR index on a single TPM SHOULD be included within a single notification.</t>

<t>Note that if a Verifier has a partial history of extensions, the &lt;replay-start-time&gt; can be adjusted so that known extensions are not forwarded.</t>

<t>The end of this history replay will be indicated with the <xref target="RFC8639"/> &lt;replay-completed&gt; notification.  For more on this sequence, see Section 2.4.2.1 of <xref target="RFC8639"/>.</t>

<t>After the &lt;replay-complete&gt; notification is provided, a TPM Quote will be requested and the result passed to the Verifier via a &lt;tpm12-attestation&gt; and &lt;tpm20-attestation&gt; notification.  If there have been any additional extend operations which have changed a subscribed PCR value in this quote, these MUST be pushed to the Verifier before the &lt;tpm12-attestation&gt; and &lt;tpm20-attestation&gt; notification.</t>

<t>At this point the Verifier has sufficient Evidence appraise the reported extend operations for each PCR, as well compare the expected value of the PCR value against that signed by the TPM.</t>

<section anchor="tpm2-heartbeat" title="TPM2 Heartbeat">

<t>For TPM2, make sure that every requested PCR is sent within an &lt;tpm20-attestation&gt; no less frequently than once per heartbeat interval.   This MAY be done with a single &lt;tpm20-attestation&gt; notification that includes all requested PCRs every heartbeat interval.  This MAY be done with several &lt;tpm20-attestation&gt; notifications at different times during that heartbeat interval.</t>

</section>
</section>
<section anchor="yang-notifications-placed-on-the-attestation-event-stream" title="YANG notifications placed on the &lt;attestation&gt; Event Stream">

<section anchor="pcr-extend" title="pcr-extend">

<t>This notification documents when a subscribed PCR is extended within a single TPM cryptoprocessor.  It SHOULD be emmitted no less than the &lt;marshalling-period&gt; after an the PCR is first extended.  (The reason for the marshalling is that it is quite possible that multiple extensions to the same PCR have been made in quick succession, and these should be reflected in the same notification.)  This notification MUST be emmitted prior to a &lt;tpm12-attestation&gt; or &lt;tpm20-attestation&gt; notification which has included and signed the results of any specific PCR extension.   If pcr extending events occur during the generation of the &lt;tpm12-attestation&gt; or &lt;tpm20-attestation&gt; notification, the marshalling period MUST be extended so that a new &lt;pcr-extend&gt; is not sent until the corresponding notifications have been sent.</t>

<figure><artwork><![CDATA[
    +---n tpm-extend
       +--ro certificate-name?    certificate-name-ref
       +--ro pcr-index-changed*   tpm:pcr
       +--ro attested-event* []
          +--ro attested-event
             +--ro extended-with             binary
             +--ro (event-details)?
                +--:(bios-event-log)
                |  +--ro bios-event-entry* [event-number]
                |     +--ro event-number    uint32
                |     +--ro event-type?     uint32
                |     +--ro pcr-index?      pcr
                |     +--ro digest-list* []
                |     |  +--ro hash-algo?   identityref
                |     |  +--ro digest*      binary
                |     +--ro event-size?     uint32
                |     +--ro event-data*     uint8
                +--:(ima-event-log)
                |  +--ro ima-event-entry* [event-number]
                |     +--ro event-number               uint64
                |     +--ro ima-template?              string
                |     +--ro filename-hint?             string
                |     +--ro filedata-hash?             binary
                |     +--ro filedata-hash-algorithm?   string
                |     +--ro template-hash-algorithm?   string
                |     +--ro template-hash?             binary
                |     +--ro pcr-index?                 pcr
                |     +--ro signature?                 binary
                +--:(netequip-boot)
                   +--ro boot-event-entry* [event-number]
                      +--ro event-number               uint64
                      +--ro filename-hint?             string
                      +--ro filedata-hash?             binary
                      +--ro filedata-hash-algorithm?   string
                      +--ro file-version?              string
                      +--ro file-type?                 string
                      +--ro pcr-index?                 pcr
]]></artwork></figure>

<t>Each &lt;pcr-extend&gt; MUST include one or more values being extended into the PCR.   These are passed within the &lt;extended-with&gt; object.  For each extension, details of the event SHOULD be provided within the &lt;event-details&gt; object.<vspace />
The format of any included &lt;event-details&gt; is identified by the &lt;event-type&gt;.  This document includes two YANG structures which may be inserted into the &lt;event-details&gt;.  These two structures are: &lt;ima-event-log&lt; and &lt;bios-event-log&gt;.  Implementations wanting to provide additional documentation of a type of PCR extension may choose to define additional YANG structures which can be placed into &lt;event-details&gt;.</t>

</section>
<section anchor="tpm12-attestation" title="tpm12-attestation">

<t>This notification contains an instance of a TPM1.2 style signed cryptoprocessor measurement. It is supplemented by Attester information which is not signed. This notification is generated and emitted from an Attester when at least one PCR identified within the subscribed &lt;pcr-indices&gt; has changed from the previous &lt;tpm12-attestation&gt; notification.  This notification MUST NOT include the results of any PCR extensions not previously reported by a &lt;pcr-extend&gt;.  This notification SHOULD be emitted as soon as a TPM Quote can extract the latest PCR hashed values.  This notification MUST be emitted prior to a subsequent &lt;pcr-extend&gt;.</t>

<figure><artwork><![CDATA[
    +---n tpm12-attestation {taa:TPM12}?
       +--ro certificate-name?            certificate-name-ref
       +--ro up-time?                     uint32
       +--ro node-id?                     string
       +--ro node-physical-index?         int32 {ietfhw:entity-mib}?
       +--ro fixed?                       binary
       +--ro external-data?               binary
       +--ro signature-size?              uint32
       +--ro signature?                   binary
       +--ro (tpm12-quote)
          +--:(tpm12-quote1)
          |  +--ro version* []
          |  |  +--ro major?      uint8
          |  |  +--ro minor?      uint8
          |  |  +--ro revMajor?   uint8
          |  |  +--ro revMinor?   uint8
          |  +--ro digest-value?          binary
          |  +--ro TPM_PCR_COMPOSITE* []
          |     +--ro pcr-index*         pcr
          |     +--ro value-size?        uint32
          |     +--ro tpm12-pcr-value*   binary
          +--:(tpm12-quote2)
             +--ro tag?                   uint8
             +--ro pcr-index*             pcr
             +--ro locality-at-release?   uint8
             +--ro digest-at-release?     binary
]]></artwork></figure>

<t>All YANG objects above are defined within <xref target="I-D.ietf-rats-yang-tpm-charra"/>.  The &lt;tpm12-attestation&gt; is not replayable.</t>

</section>
<section anchor="tpm20-attestation" title="tpm20-attestation">

<t>This notification contains an instance of TPM2 style signed cryptoprocessor measurements. It is supplemented by Attester information which is not signed. This notification is generated at two points in time:</t>

<t><list style="symbols">
  <t>every time at least one PCR has changed from a previous tpm20-attestation. In this case, the notification SHOULD be emitted within 10 seconds of the corresponding &lt;pcr-extend&gt; being sent:</t>
  <t>after a locally configurable minimum heartbeat period since a previous tpm20-attestation was sent.</t>
</list></t>

<figure><artwork><![CDATA[
    +---n tpm20-attestation {taa:TPM20}?
       +--ro certificate-name?      certificate-name-ref
       +--ro TPMS_QUOTE_INFO        binary
       +--ro quote-signature?       binary
       +--ro up-time?               uint32
       +--ro node-id?               string
       +--ro node-physical-index?   int32 {ietfhw:entity-mib}?
       +--ro unsigned-pcr-values* []
          +--ro TPM20-hash-algo?   identityref
          +--ro pcr-values* [pcr-index]
             +--ro pcr-index    pcr
             +--ro pcr-value?   binary
]]></artwork></figure>
<t>All YANG objects above are defined within <xref target="I-D.ietf-rats-yang-tpm-charra"/>.  The &lt;tpm20-attestation&gt; is not replayable.</t>

</section>
</section>
<section anchor="filtering-evidence-at-the-attester" title="Filtering Evidence at the Attester">

<t>It can be useful <spanx style="emph">not</spanx> to receive all Evidence related to a PCR.  An example of this is would be a when a Verifier maintains known good values of a PCR.  In this case, it is not necessary to send each extend operation.</t>

<t>To accomplish this reduction, when an RFC8639 &lt;establish-subscription&gt; RPC is sent, a &lt;stream-filter&gt; as per RFC8639, Section 2.2 can be set to discard a &lt;pcr-extend&gt;  notification when the &lt;pcr-index-changed&gt; is uninteresting to the verifier.</t>

</section>
<section anchor="replaying-previous-pcr-extend-events" title="Replaying previous PCR Extend events">

<t>To verify the value of a PCR, a Verifier must either know that the value is a known good value <xref target="KGV"/> or be able to reconstruct the hash value by viewing all the PCR-Extends since the Attester rebooted. Wherever a hash reconstruction might be needed, the &lt;attestation&gt; Event Stream MUST support the RFC8639 &lt;replay&gt; feature. Through the &lt;replay&gt; feature, it is possible for a Verifier to retrieve and sequentially hash all of the PCR extending events since an Attester booted. And thus, the Verifier has access to all the evidence needed to verify a PCR’s current value.</t>

</section>
<section title="Configuring the &lt;attestation&gt; Event Stream" anchor="configuring">

<t><xref target="attestationconfig"/> is tree diagram which exposes the operator configurable elements of the &lt;attestation&gt; Event Stream. This allows an Attester to select what information should be available on the stream. A fetch operation also allows an external device such as a Verifier to understand the current configuration of stream.</t>

<t>Almost all YANG objects below are defined via reference from <xref target="I-D.ietf-rats-yang-tpm-charra"/>. There is one object which is new with this model however. &lt;tpm2-heartbeat&gt; defines the maximum amount of time which should pass before a subscriber to the Event Stream should get a &lt;tpm20-attestation&gt; notification from devices which contain a TPM2.</t>

<figure title="Configuring the \&lt;attestation\&gt; Event Stream" anchor="attestationconfig"><artwork><![CDATA[
  +--ro rats-support-structures
     +--ro tpms* [tpm-name]
     |  +--ro tpms:leafref-to-keystore?    string
     |  +--ro (tpms:subscribable)?
     |     +--:(tpms:tpm12-stream) {tpm:TPM12}?
     |     |  +--ro tpms:pcr-index*        pcr
     |     +--:(tpms:tpm20-stream) {tpm:TPM20}?
     |        +--ro tpms:pcr-list* []
     |           +--ro tpms:pcr
     |              +--ro tpms:pcr-index*                    pcr
     |              +--ro (tpms:algo-registry-type)
     |                 +--:(tpms:tcg)
     |                 |  +--ro tpms:tcg-hash-algo-id?       uint16
     |                 +--:(tpms:ietf)
     |                    +--ro tpms:ietf-ni-hash-algo-id?   uint8
     +--ro tpms:marshalling-period?           uint8
     +--ro tpms:TPM_SIG_SCHEME-value?         enumeration {tpm:TPM12}?
     +--ro (tpms:signature-identifier-type) {tpm:TPM20}?
     |  +--:(tpms:TPM_ALG_ID)
     |  |  +--ro tpms:TPM_ALG_ID-value?       enumeration
     |  +--:(tpms:COSE_Algorithm)
     |     +--ro tpms:COSE_Algorithm-value?   int32
     +--ro tpms:tpm20-heartbeat?              uint8
]]></artwork></figure>

</section>
</section>
<section anchor="YANG-Module" title="YANG Module">

<t>This YANG module imports modules from <xref target="I-D.ietf-rats-yang-tpm-charra"/> and <xref target="RFC8639"/>.  It is also work-in-progress.</t>

<figure><artwork type="YANG"><![CDATA[
<CODE BEGINS> ietf-rats-attestation-stream@2020-09-17.yang
module ietf-tpm-remote-attestation-stream {
  yang-version 1.1;
  namespace 
     "urn:ietf:params:xml:ns:yang:ietf-tpm-remote-attestation-stream";
  prefix tras;

  import ietf-subscribed-notifications { 
    prefix sn;
    reference
      "RFC 8639: Subscription to YANG Notifications";    
  }
  import ietf-tpm-remote-attestation { 
    prefix tpm; 
    reference  
      "draft-ietf-rats-yang-tpm-charra";  
  } 
  import ietf-tcg-algs {
    prefix taa;
  }
   
  organization "IETF";
  contact
    "WG Web:   <http://tools.ietf.org/wg/rats/>
     WG List:  <mailto:rats@ietf.org>

     Editor:   Eric Voit
               <mailto:evoit@cisco.com>";
               
  description
    "This module contains conceptual YANG specifications for  
     subscribing to attestation streams being generated from TPM chips.
    
     Copyright (c) 2020 IETF Trust and the persons identified
     as authors of the code. All rights reserved.

     Redistribution and use in source and binary forms, with
     or without modification, is permitted pursuant to, and
     subject to the license terms contained in, the Simplified
     BSD License set forth in Section 4.c of the IETF Trust's
     Legal Provisions Relating to IETF Documents
     (https://trustee.ietf.org/license-info).
     
     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC
     itself for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
     'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
     'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
     are to be interpreted as described in BCP 14 (RFC 2119)
     (RFC 8174) when, and only when, they appear in all
     capitals, as shown here.";
  
  revision 2020-09-17 {
    description
      "Initial version.";    
    reference 
      "draft-birkholz-rats-network-device-subscription";
  }
   
  /*
   * IDENTITIES
   */
   
  identity pcr-unsubscribable {
    base sn:establish-subscription-error;
    description
      "Requested PCR is subscribable by the Attester.";
  }
  
  
  /*
   * Groupings
   */ 

  grouping heartbeat {
    description
      "Allows an Attester to push verifiable, current TPM PCR values 
      even when there have been no recent changes to PCRs.";    
    leaf tpm20-subscription-heartbeat {
      type uint16;
      description
        "Number of seconds before the Attestation stream should send a 
        new notification with a fresh quote.  This allows confirmation 
        that the PCR values haven't changed since the last 
        tpm20-attestation.";
    }
  }
  
  
  /*
   * RPCs
   */ 
  
  augment "/sn:establish-subscription/sn:input" {
    when 'derived-from-or-self(sn:stream, "attestation")';
    description
      "This augmentation adds a nonce to as a subscription parameters
       that apply specifically to datastore updates to RPC input.";
    uses tpm:nonce;
    leaf-list pcr-index {
      type tpm:pcr;
      min-elements 1;
      description
        "The numbers/indexes of the PCRs. This will act as a filter for  
        the subscription so that 'tpm-extend' notifications related to 
        non-requested PCRs will not be sent to a subscriber.";
    }
  }
  
  /*
   * NOTIFICATIONS
   */  

  notification pcr-extend {
    description
      "This notification indicates that one or more PCRs have been
      extended within a TPM based cryptoprocessor.  In less than the 
      'marshalling-period', it MUST be followed with either a 
      corresponding tpm12-attestation or tpm20-attestation notification 
      which exposes the result of the PCRs updated.";
    uses tpm:certificate-name-ref;
    leaf-list pcr-index-changed {
      type tpm:pcr;
      min-elements 1;
      description
        "The number of each PCR extended.  This list MUST contain the
        set of PCRs descibed within the event log details.  This leaf
        can be derived from the list of attested events, but exposing
        it here allows for easy filtering of the notifications of 
        interest to a verifier.";
    }
    list attested-event {
      description
        "A set of events which extended an Attester PCR.  The sequence  
        of elements represented in list must match the sequence of   
        events placed into the TPM's PCR.";
      container attested-event {
        description
          "An instance of an event which extended an Attester PCR";
        leaf extended-with {
          type binary;
          mandatory true;
          description
            "Information extending the PCR.";
        }
        choice event-details {
          description
            "Contains the event happened the Attester thought  
            was worthy of recording in a PCR.
            
            choices are of types defined by the identityref 
            base tpm:attested_event_log_type";
          
          case bios-event-log {
            description
              "BIOS/UEFI event log format";
            uses tpm:bios-event-log;
          }
          case ima-event-log {
            description
              "IMA event log format";
            uses tpm:ima-event-log;
          }
          case netequip-boot-event-log {
            description
              "IMA event log format";
            uses tpm:network-equipment-boot-event-log;
          }
        }       
      }
    }
  }  

  notification tpm12-attestation {
    if-feature "taa:TPM12";
    description
      "Contains an instance of TPM1.2 style signed cryptoprocessor 
      measurements.  It is supplemented by unsigned Attester 
      information.";
    uses tpm:certificate-name-ref {
      description
        "Certificate associated with this tpm20-attestation.";
    }        
    uses tpm:tpm12-attestation;
  }

  notification tpm20-attestation {
    if-feature "taa:TPM20";
    description
      "Contains an instance of TPM2 style signed cryptoprocessor 
      measurements.  It is supplemented by unsigned Attester 
      information.";
    uses tpm:certificate-name-ref {
      description
        "Certificate associated with this tpm20-attestation.";
    }  
    uses tpm:tpm20-attestation;
  } 


  /*
   * DATA NODES
   */  

  augment "/tpm:rats-support-structures" {
    description
      "Defines platform wide 'attestation' stream subscription 
      parameters.";   
    leaf marshalling-period {
      config true;
      type uint8;
      default 5;
      description
        "The maximum number of seconds between the time an event  
        extends a PCR, and the 'tpm-extend' notification which reports 
        it to a subscribed Verifier.  This period allows multiple 
        extend operations bundled together and handled as a group.";
    }
    leaf tpm12-subscribed-signature-scheme {
      if-feature "taa:TPM12";
      type leafref {
        path "../tpm:attester-supported-algos" +
               "/tpm:tpm12-asymmetric-signing"; 
      }
      description
        "A single signature-scheme which will be used to sign the  
        evidence from a TPM 1.2. which is then placed onto the 
        'attestation' event stream.";
    }
    leaf tpm20-subscribed-signature-scheme {
      if-feature "taa:TPM20";
      type leafref {
        path "../tpm:attester-supported-algos" +
               "/tpm:tpm20-asymmetric-signing"; 
      }
      description
        "A single signature-scheme which will be used to sign the  
        evidence from a TPM 2.0. which is then placed onto the 
        'attestation' event stream.";
    }    
    uses heartbeat{
      if-feature "taa:TPM20";
    }
  }
  
  augment "/tpm:rats-support-structures/tpm:tpms" {
    description
      "Allows the configuration 'attestation' stream parameters for a 
      TPM.";  
    leaf subscription-aik {
      config true;
      type tpm:certificate-name-ref;
      description 
        "Identifies the certificate-name associated with the 
        notifications in the 'attestation' stream.";
    }
    choice subscribable {
      config true;
      description
        "Indicates that the set of notifications which comprise the  
        'attestation' event stream can be modified or tuned by a 
        network administrator.";
      case tpm12-stream {
        if-feature "taa:TPM12";
        description
          "Configuration elements for a TPM1.2 event stream.";
        uses tpm:TPM12-hash-algo;
        leaf-list tpm12-pcr-index {
          type tpm:pcr;
          description
            "The numbers/indexes of the PCRs which can be subscribed.";
        }
      }
      case tpm20-stream {
        if-feature "taa:TPM20";
        description
          "Configuration elements for a TPM2.0 event stream.";
        uses tpm:TPM20-hash-algo;
        leaf-list tpm20-pcr-index {
          type tpm:pcr;
          description
            "The numbers/indexes of the PCRs which can be subscribed.";
        }
      }
    }
  }  
}
<CODE ENDS>
]]></artwork></figure>

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

<t>To be written.</t>

</section>
<section anchor="IANA" title="IANA Considerations">

<t>To be written.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference anchor="I-D.ietf-rats-architecture">
<front>
<title>Remote Attestation Procedures Architecture</title>

<author initials='H' surname='Birkholz' fullname='Henk Birkholz'>
    <organization />
</author>

<author initials='D' surname='Thaler' fullname='Dave Thaler'>
    <organization />
</author>

<author initials='M' surname='Richardson' fullname='Michael Richardson'>
    <organization />
</author>

<author initials='N' surname='Smith' fullname='Ned Smith'>
    <organization />
</author>

<author initials='W' surname='Pan' fullname='Wei Pan'>
    <organization />
</author>

<date month='September' day='1' year='2020' />

<abstract><t>In network protocol exchanges, it is often the case that one entity (a Relying Party) requires evidence about a remote peer to assess the peer's trustworthiness, and a way to appraise such evidence.  The evidence is typically a set of claims about its software and hardware platform.  This document describes an architecture for such remote attestation procedures (RATS).</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-rats-architecture-06' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-rats-architecture-06.txt' />
</reference>



<reference anchor="I-D.ietf-rats-tpm-based-network-device-attest">
<front>
<title>TPM-based Network Device Remote Integrity Verification</title>

<author initials='G' surname='Fedorkow' fullname='Guy Fedorkow'>
    <organization />
</author>

<author initials='E' surname='Voit' fullname='Eric Voit'>
    <organization />
</author>

<author initials='J' surname='Fitzgerald-McKay' fullname='Jessica Fitzgerald-McKay'>
    <organization />
</author>

<date month='September' day='18' year='2020' />

<abstract><t>This document describes a workflow for remote attestation of the integrity of firmware and software installed on network devices that contain Trusted Platform Modules [TPM1.2], [TPM2.0].</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-rats-tpm-based-network-device-attest-04' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-rats-tpm-based-network-device-attest-04.txt' />
</reference>



<reference anchor="I-D.ietf-rats-yang-tpm-charra">
<front>
<title>A YANG Data Model for Challenge-Response-based Remote Attestation Procedures using TPMs</title>

<author initials='H' surname='Birkholz' fullname='Henk Birkholz'>
    <organization />
</author>

<author initials='M' surname='Eckel' fullname='Michael Eckel'>
    <organization />
</author>

<author initials='E' surname='Voit' fullname='Eric Voit'>
    <organization />
</author>

<author initials='S' surname='Bhandari' fullname='Shwetha Bhandari'>
    <organization />
</author>

<author initials='B' surname='Sulzen' fullname='Bill Sulzen'>
    <organization />
</author>

<author initials='L' surname='Xia' fullname='Liang Xia'>
    <organization />
</author>

<author initials='T' surname='Laffey' fullname='Tom Laffey'>
    <organization />
</author>

<author initials='G' surname='Fedorkow' fullname='Guy Fedorkow'>
    <organization />
</author>

<date month='September' day='30' year='2020' />

<abstract><t>This document defines a YANG RPC and a minimal datastore required to retrieve attestation evidence about integrity measurements from a device following the operational context defined in [I-D.ietf-rats-tpm-based-network-device-attest].  Complementary measurement logs are also provided by the YANG RPC originating from one or more roots of trust of measurement.  The module defined requires at least one TPM 1.2 or TPM 2.0 and corresponding Trusted Software Stack included in the device components of the composite device the YANG server is running on.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-rats-yang-tpm-charra-03' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-rats-yang-tpm-charra-03.txt' />
</reference>



<reference  anchor="RFC8639" target='https://www.rfc-editor.org/info/rfc8639'>
<front>
<title>Subscription to YANG Notifications</title>
<author initials='E.' surname='Voit' fullname='E. Voit'><organization /></author>
<author initials='A.' surname='Clemm' fullname='A. Clemm'><organization /></author>
<author initials='A.' surname='Gonzalez Prieto' fullname='A. Gonzalez Prieto'><organization /></author>
<author initials='E.' surname='Nilsen-Nygaard' fullname='E. Nilsen-Nygaard'><organization /></author>
<author initials='A.' surname='Tripathy' fullname='A. Tripathy'><organization /></author>
<date year='2019' month='September' />
<abstract><t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams.  Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t></abstract>
</front>
<seriesInfo name='RFC' value='8639'/>
<seriesInfo name='DOI' value='10.17487/RFC8639'/>
</reference>


<reference anchor="TPM2.0" target="https://trustedcomputinggroup.org/resource/tpm-library-specification/">
  <front>
    <title>TPM 2.0 Library Specification</title>
    <author >
      <organization>TCG</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>




<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>




    </references>

    <references title='Informative References'>





<reference anchor="I-D.birkholz-rats-tuda">
<front>
<title>Time-Based Uni-Directional Attestation</title>

<author initials='A' surname='Fuchs' fullname='Andreas Fuchs'>
    <organization />
</author>

<author initials='H' surname='Birkholz' fullname='Henk Birkholz'>
    <organization />
</author>

<author initials='I' surname='McDonald' fullname='Ira McDonald'>
    <organization />
</author>

<author initials='C' surname='Bormann' fullname='Carsten Bormann'>
    <organization />
</author>

<date month='July' day='13' year='2020' />

<abstract><t>This documents defines the method and bindings used to conduct Time- based Uni-Directional Attestation (TUDA) between two RATS (Remote ATtestation procedureS) entities over the Internet.  TUDA does not require a challenge-response handshake and thereby does not rely on the conveyance of a nonce to prove freshness of remote attestation Evidence.  Conversely, TUDA enables the creation of Secure Audit Logs that can constitute Evidence about current and past operational states of an Attester.  Every RATS entity requires access to a trustable and synchronized time-source.  A Handle Distributor takes on the corresponding role of a Time Stamp Authority (TSA) to provide Time Stamp Tokens (TST) to all RATS entities.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-birkholz-rats-tuda-03' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-birkholz-rats-tuda-03.txt' />
</reference>


<reference anchor="KGV" target="https://trustedcomputinggroup.org/wp-content/uploads/TCG-NetEq-Attestation-Workflow-Outline_v1r9b_pubrev.pdf">
  <front>
    <title>KGV</title>
    <author >
      <organization>TCG</organization>
    </author>
    <date year="2003" month="October"/>
  </front>
</reference>


    </references>


<section anchor="change-log" title="Change Log">

<t>v00-v01</t>

<t><list style="symbols">
  <t>rename notification: pcr-extended, which supports multiple PCRs</t>
  <t>netequip boot added</t>
  <t>YANG structure extension removed</t>
  <t>Matched to structural changes made within charra</t>
</list></t>

</section>
<section numbered="no" anchor="acknowledgements" title="Acknowledgements">

<t>Thanks to …</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

