<?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.3.8 -->

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

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

<rfc ipr="trust200902" docName="draft-ietf-rats-yang-tpm-charra-05" category="std">

  <front>
    <title abbrev="YANG-CHARRA for TPMs">A YANG Data Model for Challenge-Response-based Remote Attestation Procedures using TPMs</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="M." surname="Eckel" fullname="Michael Eckel">
      <organization abbrev="Fraunhofer SIT">Fraunhofer SIT</organization>
      <address>
        <postal>
          <street>Rheinstrasse 75</street>
          <city>Darmstadt</city>
          <code>64295</code>
          <country>Germany</country>
        </postal>
        <email>michael.eckel@sit.fraunhofer.de</email>
      </address>
    </author>
    <author initials="S." surname="Bhandari" fullname="Shwetha Bhandari">
      <organization abbrev="ThoughtSpot">ThoughtSpot</organization>
      <address>
        <email>shwetha.bhandari@thoughtspot.com</email>
      </address>
    </author>
    <author initials="E." surname="Voit" fullname="Eric Voit">
      <organization abbrev="Cisco">Cisco Systems</organization>
      <address>
        <email>evoit@cisco.com</email>
      </address>
    </author>
    <author initials="B." surname="Sulzen" fullname="Bill Sulzen">
      <organization abbrev="Cisco">Cisco Systems</organization>
      <address>
        <email>bsulzen@cisco.com</email>
      </address>
    </author>
    <author initials="L." surname="Xia" fullname="Liang Xia (Frank)">
      <organization abbrev="Huawei">Huawei Technologies</organization>
      <address>
        <postal>
          <street>101 Software Avenue, Yuhuatai District</street>
          <city>Nanjing</city>
          <region>Jiangsu</region>
          <code>210012</code>
          <country>China</country>
        </postal>
        <email>Frank.Xialiang@huawei.com</email>
      </address>
    </author>
    <author initials="T." surname="Laffey" fullname="Tom Laffey">
      <organization abbrev="HPE">Hewlett Packard Enterprise</organization>
      <address>
        <email>tom.laffey@hpe.com</email>
      </address>
    </author>
    <author initials="G." surname="Fedorkow" fullname="Guy C. Fedorkow">
      <organization abbrev="Juniper">Juniper Networks</organization>
      <address>
        <postal>
          <street>10 Technology Park Drive</street>
          <city>Westford</city>
          <region>Massachusetts</region>
          <code>01886</code>
        </postal>
        <email>gfedorkow@juniper.net</email>
      </address>
    </author>

    <date year="2021" month="January" day="14"/>

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

    <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 TPM-based Network Device Remote Integrity Verification. 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>

  <middle>


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

<t>This document is based on the terminology defined in the <xref target="I-D.ietf-rats-architecture"/> and uses the operational context defined in <xref target="I-D.ietf-rats-tpm-based-network-device-attest"/> as well as the interaction model and information elements defined in  <xref target="I-D.ietf-rats-reference-interaction-models"/>. The currently supported hardware security modules (HWM) are the Trusted Platform Module (TPM) <xref target="TPM1.2"/> and <xref target="TPM2.0"/> specified by the Trusted Computing Group (TCG). One ore more TPMs embedded in the components of a composite device - sometimes also referred to as an aggregate device - are required in order to use the YANG module defined in this document. A TPM is used as a root of trust for reporting (RTR) in order to retrieve attestation evidence from a composite device (quote primitive operation). Additionally, it is used as a root of trust for storage (RTS) in order to retain shielded secrets and store system measurements using a folding hash function (extend primitive operation).</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="the-yang-module-for-basic-remote-attestation-procedures" title="The YANG Module for Basic Remote Attestation Procedures">

<t>One or more TPMs MUST be embedded in the composite device that is providing attestation evidence via the YANG module defined in this document. The ietf-basic-remote-attestation YANG module enables a composite device to take on the role of Claimant and Attester in accordance with the Remote Attestation Procedures (RATS) architecture <xref target="I-D.ietf-rats-architecture"/> and the corresponding challenge-response interaction model defined in the <xref target="I-D.ietf-rats-reference-interaction-models"/> document. A fresh nonce with an appropriate amount of entropy MUST be supplied by the YANG client in order to enable a proof-of-freshness with respect to the attestation evidence provided by the attester running the YANG datastore. The functions of this YANG module are restricted to 0-1 TPMs per hardware component.</t>

<section anchor="yang-modules" title="YANG Modules">

<section anchor="ietf-tpm-remote-attestation" title="ietf-tpm-remote-attestation">
<t>This YANG module imports modules from <xref target="RFC6991"/>, <xref target="RFC8348"/>, <xref target="I-D.ietf-netconf-keystore"/>, ietf-tcg-algs.yang <xref target="ref-ietf-tcg-algs"/>.</t>

<section anchor="features" title="Features">

<t>This module supports the following features:</t>

<t>&lt;TPMs&gt; - Indicates that multiple TPMs on the device can support remote attestation,  This feature is applicable in cases where multiple line cards, each with its own TPM.</t>

<t>&lt;bios&gt;  - Indicates the device supports the retrieval of bios event logs.</t>

<t>&lt;ima&gt; - Indicates the device supports the retrieval of Integrity Measurement Architecture event logs.</t>

<t>&lt;netequip_boot&gt; - Indicates the device supports the retrieval of netequip boot event logs.</t>

</section>
<section anchor="identities" title="Identities">

<t>This module supports the following types of attestation event logs: &lt;ima&gt;, &lt;bios&gt;, and &lt;netequip_boot&gt;.</t>

</section>
<section anchor="rpcs" title="RPCs">

<section anchor="tpm20-challenge-response-attestation" title="&lt;tpm20-challenge-response-attestation&gt;">
<t>This RPC allows a Verifier to request a quote of PCRs from a TPM2.0 compliant cryptoprocessor.  Where the feature &lt;TPMs&gt; is active, and one or more &lt;certificate-name&gt; is not provided, all TPM2.0 compliant cryptoprocessors will respond.   A YANG tree diagram of this RPC is as follows:</t>

<figure><artwork type="TREE"><![CDATA[
+---x tpm20-challenge-response-attestation {taa:TPM20}?
   +---w input
   |  +---w tpm20-attestation-challenge
   |     +---w nonce-value            binary
   |     +---w tpm20-pcr-selection* []
   |     |  +---w TPM20-hash-algo?   identityref
   |     |  +---w pcr-index*         tpm:pcr
   |     +---w certificate-name*      certificate-name-ref {tpm:TPMs}?
   +--ro output
      +--ro tpm20-attestation-response* []
         +--ro certificate-name       certificate-name-ref
         +--ro TPMS_QUOTE_INFO        binary
         +--ro quote-signature?       binary
         +--ro up-time?               uint32
         +--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>An example of an RPC challenge requesting PCRs 0-7 from a SHA256 bank could look like the following:</t>

<figure><artwork><![CDATA[
<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <tpm20-challenge-response-attestation>
      xmlns="urn:ietf:params:xml:ns:yang:ietf-tpm-remote-attestation">
    <nonce>110101010110011011111001010010100</nonce>
    <tpm20-pcr-selection>
      <TPM20-hash-algo
          xmlns:taa="urn:ietf:params:xml:ns:yang:ietf-tcg-algs">
        taa:TPM_ALG_SHA256
      </TPM20-hash-algo>
      <pcr-index>0</pcr-index>
      <pcr-index>1</pcr-index>
      <pcr-index>2</pcr-index>
      <pcr-index>3</pcr-index>
      <pcr-index>4</pcr-index>
      <pcr-index>5</pcr-index>
      <pcr-index>6</pcr-index>
      <pcr-index>7</pcr-index>
    </tpm20-pcr-selection>
  </tpm20-challenge-response-attestation>
</rpc>
]]></artwork></figure>

<t>and a successful response might be formated as follows:</t>

<figure><artwork><![CDATA[
<rpc-reply message-id="101"
  xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <tpm12-attestation-response
    xmlns="urn:ietf:params:xml:ns:yang:ietf-tpm-remote-attestation">
    <certificate-name
        xmlns:ks=urn:ietf:params:xml:ns:yang:ietf-keystore>
       ks:(instance of Certificate name in the Keystore)
    </certificate-name>
    <TPMS_QUOTE_INFO>
       (raw information from the TPM Quote, this includes a digest
       across the requested PCRs, the nonce, TPM2 time counters.)
    </TPMS_QUOTE_INFO>
    <quote-signature>
        (signature across TPMS_QUOTE_INFO)
    </quote-signature>
  </tpm12-attestation-response>
</rpc-reply>
]]></artwork></figure>

</section>
</section>
<section anchor="tpm12-challenge-response-attestation" title="&lt;tpm12-challenge-response-attestation&gt;">

<t>This RPC allows a Verifier to request a quote of PCRs from a TPM1.2 compliant cryptoprocessor.  Where the feature &lt;TPMs&gt; is active, and one or more &lt;certificate-name&gt; is not provided, all TPM1.2 compliant cryptoprocessors will respond.  A YANG tree diagram of this RPC is as follows:</t>

<figure><artwork type="TREE"><![CDATA[
+---x tpm12-challenge-response-attestation {taa:TPM12}?
   +---w input
   |  +---w tpm12-attestation-challenge
   |     +---w pcr-index*          pcr
   |     +---w nonce-value         binary
   |     +---w certificate-name*   certificate-name-ref {tpm:TPMs}?
   +--ro output
      +--ro tpm12-attestation-response* []
         +--ro certificate-name    certificate-name-ref
         +--ro up-time?            uint32
         +--ro TPM_QUOTE2?         binary
]]></artwork></figure>

</section>
<section anchor="log-retrieval" title="&lt;log-retrieval&gt;">

<t>This RPC allows a Verifier to acquire the evidence which was extended into specific PCRs.   A YANG tree diagram of this RPC is as follows:</t>

<figure><artwork type="TREE"><![CDATA[
+---x log-retrieval
   +---w input
   |  +---w log-selector* []
   |  |  +---w tpm-name*                  string
   |  |  +---w (index-type)?
   |  |  |  +--:(last-entry)
   |  |  |  |  +---w last-entry-value?    binary
   |  |  |  +--:(index)
   |  |  |  |  +---w last-index-number?   uint64
   |  |  |  +--:(timestamp)
   |  |  |     +---w timestamp?           yang:date-and-time
   |  |  +---w log-entry-quantity?        uint16
   |  +---w log-type        identityref
   +--ro output
      +--ro system-event-logs
         +--ro node-data* []
            +--ro tpm-name?     string
            +--ro up-time?      uint32
            +--ro log-result
               +--ro (attested_event_log_type)
                  +--:(bios)
                  |  +--ro bios-event-logs
                  |     +--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)
                  |  +--ro ima-event-logs
                  |     +--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-logs
                        +--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>

</section>
<section anchor="data-nodes" title="Data Nodes">

<t>This section provides a high level description of the data nodes containing the configuration and operational objects with the YANG model. For more details, please see the YANG model itself in <xref target="ref-ietf-tpm-remote-attestation"/>.</t>

<t>container &lt;rats-support-structures&gt; - This houses the set of information relating to a device’s TPM(s).</t>

<t>container &lt;tpms&gt; - Provides configuration and operational details for each supported TPM, including the tpm-firmware-version, PCRs which may be quoted, certificates which are associated with that TPM, and the current operational status.  Of note is the certificates which are associated with that TPM.  As a certificate is associated with a single Attestation key, knowledge of the certificate allows a specific TPM to be identified.</t>

<figure><artwork type="TREE"><![CDATA[
+--rw tpms
   +--rw tpm* [tpm-name]
      +--rw tpm-name                string
      +--ro hardware-based?         boolean
      +--ro tpm-physical-index?     int32 {ietfhw:entity-mib}?
      +--ro tpm-path?               string
      +--ro compute-node            compute-node-ref {tpm:TPMs}?
      +--ro tpm-manufacturer?       string
      +--rw tpm-firmware-version    identityref
      +--rw TPM12-hash-algo?        identityref
      +--rw TPM12-pcrs*             pcr
      +--rw tpm20-pcr-bank* [TPM20-hash-algo]
      |  +--rw TPM20-hash-algo    identityref
      |  +--rw pcr-index*         tpm:pcr
      +--ro tpm-status              enumeration
      +--rw certificates
         +--rw certificate* [certificate-name]
            +--rw certificate-name            string
            +--rw certificate-keystore-ref?   -> /ks:keystore/asymmetric-keys/asymmetric-key/certificates/certificate/name
            +--rw certificate-type?           enumeration
]]></artwork></figure>

<t>container &lt;attester-supported-algos&gt; - Identifies which TCG algorithms are available for use the Attesting platform.  This allows an operator to limit algorithms available for use by RPCs to just a desired set from the universe of all allowed by TCG.</t>

<figure><artwork type="TREE"><![CDATA[
+--rw attester-supported-algos
   +--rw tpm12-asymmetric-signing*   identityref {taa:TPM12}?
   +--rw tpm12-hash*                 identityref {taa:TPM12}?
   +--rw tpm20-asymmetric-signing*   identityref {taa:TPM20}?
   +--rw tpm20-hash*                 identityref {taa:TPM20}?
]]></artwork></figure>

<t>container &lt;compute-nodes&gt; - When there is more than one TPM supported, this container maintains the set of information related to the compute associated with a specific TPM.  This allows each specific TPM to identify on which &lt;compute-node&gt; it belongs.</t>

<figure><artwork type="TREE"><![CDATA[
+--rw compute-nodes {tpm:TPMs}?
   +--ro compute-node* [node-id]
      +--ro node-id                string
      +--ro node-physical-index?   int32 {ietfhw:entity-mib}?
      +--ro node-name?             string
      +--ro node-location?         string
]]></artwork></figure>

</section>
<section anchor="ref-ietf-tpm-remote-attestation" title="YANG Module">
<figure><artwork type="YANG"><![CDATA[
<CODE BEGINS> file ietf-tpm-remote-attestation@2020-12-17.yang
module ietf-tpm-remote-attestation {
  namespace "urn:ietf:params:xml:ns:yang:ietf-tpm-remote-attestation";
  prefix "tpm";

  import ietf-yang-types {
    prefix yang;
  }
  import ietf-hardware {
    prefix ietfhw;
  }
  import ietf-keystore {
    prefix ks;
  }
  import ietf-tcg-algs {
    prefix taa;
  }

  organization
   "IETF RATS (Remote ATtestation procedureS) Working Group";

  contact
   "WG Web  : <http://datatracker.ietf.org/wg/rats/>
    WG List : <mailto:rats@ietf.org>
    Author  : Eric Voit <evoit@cisco.com>
    Author  : Henk Birkholz <henk.birkholz@sit.fraunhofer.de>
    Author  : Michael Eckel <michael.eckel@sit.fraunhofer.de>
    Author  : Shwetha Bhandari <shwetha.bhandari@thoughtspot.com>
    Author  : Bill Sulzen <bsulzen@cisco.com>
    Author  : Liang Xia (Frank) <frank.xialiang@huawei.com>
    Author  : Tom Laffey <tom.laffey@hpe.com>
    Author  : Guy Fedorkow <gfedorkow@juniper.net>";

  description
    "A YANG module to enable a TPM 1.2 and TPM 2.0 based
     remote attestation procedure using a challenge-response
     interaction model and the TPM 1.2 and TPM 2.0 Quote
     primitive operations.

     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-12-15" {
    description
      "Initial version";
    reference
      "draft-ietf-rats-yang-tpm-charra";
  }

  /*****************/
  /*   Features    */
  /*****************/

  feature TPMs {
    description
      "The device supports the remote attestation of multiple 
      TPM based cryptoprocessors.";
  }


  /*****************/
  /*   Typedefs    */
  /*****************/

  typedef pcr {
    type uint8 {
      range "0..31";
    }
    description
      "Valid index number for a PCR.  At this point 0-31 is viable.";
  }  

  typedef compute-node-ref {
    type leafref {
      path "/tpm:rats-support-structures/tpm:compute-nodes" +
           "/tpm:compute-node/tpm:node-name";
    }
    description
      "This type is used to reference a hardware node.  It is quite 
      possible this leafref will eventually point to another YANG 
      module's node.";
  }

  typedef certificate-name-ref {
    type leafref {
      path "/tpm:rats-support-structures/tpm:tpms/tpm:tpm" +
           "/tpm:certificates/tpm:certificate/tpm:certificate-name";
    }
    description
      "A type which allows identification of a TPM based certificate.";
  }


  /******************/
  /*   Identities   */
  /******************/

  identity attested_event_log_type {
    description
      "Base identity allowing categorization of the reasons why and
      attested measurement has been taken on an Attester.";
  }

  identity ima {
    base attested_event_log_type;
    description
      "An event type recorded in IMA.";
  }

  identity bios {
    base attested_event_log_type;
    description
      "An event type associated with BIOS/UEFI.";
  }

  identity netequip_boot {
    base attested_event_log_type;
    description
      "An event type associated with Network Equipment Boot.";
  }

  /*****************/
  /*   Groupings   */
  /*****************/
  
  grouping TPM20-asymmetric-signing-algo {
    description
      "The signature scheme that is used to sign the TPM2 Quote 
      information response.";
    leaf TPM20-asymmetric-signing-algo {
      must "/tpm:rats-support-structures/tpm:attester-supported-algos"
         + "/tpm:tpm20-asymmetric-signing" {
         error-message "Not a platform supported " + 
                       "TPM20-asymmetric-signing-algo";
      }
      type identityref {
        base taa:asymmetric;
      }
      description
        "The signature scheme that is used to sign the TPM2.0
         Quote information response. This must be one of those 
         supported by a platform.";   
    default taa:TPM_ALG_RSA; 
    }
  }

  grouping TPM12-asymmetric-signing-algo {
    description
      "The signature scheme that is used to sign the TPM12 Quote 
      information response.";
    leaf TPM12-asymmetric-signing-algo {
      must "/tpm:rats-support-structures/tpm:attester-supported-algos"
         + "/tpm:tpm12-asymmetric-signing" {
         error-message "Not a platform supported " + 
                       "TPM12-asymmetric-signing-algo";
      }   
      type identityref {
        base taa:asymmetric;
      }
      description
        "The signature scheme that is used to sign the TPM1.2
         Quote information response. This must be one of those 
         supported by a platform.";   
    default taa:TPM_ALG_RSA;          
    }
  }  

  grouping TPM20-hash-algo {
    description
      "The cryptographic algorithm used to hash the TPM2 PCRs.  This
      must be from the list of platform supported options.";
    leaf TPM20-hash-algo {
      must "/tpm:rats-support-structures/tpm:attester-supported-algos"
         + "/tpm:tpm20-hash" {
         error-message "Not a platform supported TPM20-hash-algo";
      }
      type identityref {
        base taa:hash;
      }
      description
        "The hash scheme that is used to hash a TPM1.2 PCR. This 
        must be one of those supported by a platform.";            
    default taa:TPM_ALG_SHA256; 
    }
  }

  grouping TPM12-hash-algo {
    description
      "The cryptographic algorithm used to hash the TPM1.2 PCRs.";
    leaf TPM12-hash-algo {
      must "/tpm:rats-support-structures/tpm:attester-supported-algos"
         + "/tpm:tpm12-hash" {
         error-message "Not a platform supported TPM12-hash-algo";
      }
      type identityref {
        base taa:hash;
      }
      description
        "The hash scheme that is used to hash a TPM1.2 PCR. This 
        must be one of those supported by a platform.  This assumes
        that an algorithm other than SHA1 can be supported on some
        TPM1.2 cryptoprocessor variant."; 
      default taa:TPM_ALG_SHA1;         
    }
  } 

  grouping nonce {
    description
      "A nonce to show freshness and to allow the detection
      of replay attacks.";
    leaf nonce-value {
      type binary;
      mandatory true;
      description
        "This nonce SHOULD be generated via a registered
         cryptographic-strength algorithm. In consequence,
         the length of the nonce depends on the hash algorithm
         used. The algorithm used in this case is independent
         from the hash algorithm used to create the hash-value
         in the response of the attestor.";
    }
  }

  grouping tpm12-pcr-selection {
    description
      "A Verifier can request one or more PCR values using its
       individually created Attestation Key Certificate (AC).
       The corresponding selection filter is represented in this
       grouping.
       Requesting a PCR value that is not in scope of the AC used,
       detailed exposure via error msg should be avoided.";
    leaf-list pcr-index {
      /*  the following XPATH must be updated to ensure that only
            selectable PCRs are allowed in the RPC
      must "/tpm:rats-support-structures/tpm:tpms" +
           "/tpm:tpm[tpm-name = current()]" +
           "/tpm:tpm[TPM12-pcrs = current()]" {
        error-message "Acquiring this PCR index is not supported";
      }
      */
      type pcr;
      description
        "The numbers/indexes of the PCRs. At the moment this is limited
        to 32.";
    }
  }

  grouping tpm20-pcr-selection {
    description
      "A Verifier can acquire one or more PCR values, which are hashed 
       together in a TPM2B_DIGEST coming from the TPM2.  The selection 
       list of desired PCRs and the Hash Algorithm is represented in  
       this grouping.";
    list tpm20-pcr-selection {
      unique "TPM20-hash-algo";
      description
        "Specifies the list of PCRs and Hash Algorithms that can be   
        returned within a TPM2B_DIGEST.";
      reference
        "https://www.trustedcomputinggroup.org/wp-content/uploads/
         TPM-Rev-2.0-Part-2-Structures-01.38.pdf  Section 10.9.7";
      uses TPM20-hash-algo;
      leaf-list pcr-index {
        /*  the following XPATH must be updated to ensure that only
            selectable PCRs are allowed in the RPC
        must "/tpm:rats-support-structures/tpm:tpms" +
             "/tpm:tpm[tpm-name = current()]" +
             "/tpm:tpm20-pcr-bank[pcr-index = current()]" {
          error-message "Acquiring this PCR index is not supported";
        }
        */
        type tpm:pcr;
        description
          "The numbers of the PCRs that which are being tracked
          with a hash based on the TPM20-hash-algo.";
      }
    }
  }
  
  grouping certificate-name-ref {
    description
      "Identifies a certificate in a keystore.";
    leaf certificate-name {
      type certificate-name-ref;
        description
          "Identifies a certificate in a keystore.";
      mandatory true;
    }
  }

  grouping tpm-name {
    description
      "A unique TPM on a device.";
    leaf tpm-name {
      type string;
      description
        "Unique system generated name for a TPM on a device.";
    }
  }
  
  grouping tpm-name-selector {
    description
      "One or more TPM on a device.";
    leaf-list tpm-name {
      type string;
      config false;
      description
        "Name of one or more unique TPMs on a device.  If this object 
        exists, a selection should pull only the objects related to 
        these TPM(s).  If it does not exist, all qualifying TPMs that 
        are 'hardware-based' equals true on the device are selected.";
    }
  }

  grouping node-uptime {
    description
      "Uptime in seconds of the node.";
    leaf up-time {
      type uint32;
      description
        "Uptime in seconds of this node reporting its data";
    }
  }

  grouping tpm12-attestation {
    description
      "Contains an instance of TPM1.2 style signed cryptoprocessor 
      measurements.  It is supplemented by unsigned Attester 
      information.";
    uses node-uptime;
    leaf TPM_QUOTE2 {
      type binary;
      description
        "Result of a TPM1.2 Quote2 operation. This includes PCRs,
        signatures, locality, the provided nonce and other data which 
        can be further parsed to appraise the Attester.";
      reference
        "TPM1.2 commands rev116 July 2007, Section 16.5";  
    }
  }

  grouping tpm20-attestation {
    description
      "Contains an instance of TPM2 style signed cryptoprocessor 
      measurements.  It is supplemented by unsigned Attester 
      information.";
    leaf TPMS_QUOTE_INFO {
      mandatory true;
      type binary;
      description
        "A hash of the latest PCR values (and the hash algorithm used) 
        which have been returned from a Verifier for the selected PCRs 
        and Hash Algorithms.";
      reference
        "https://www.trustedcomputinggroup.org/wp-content/uploads/
        TPM-Rev-2.0-Part-2-Structures-01.38.pdf  Section 10.12.1";        
    }
    leaf quote-signature {
      type binary;
      description
        "Quote signature returned by TPM Quote.  The signature was
        generated using the key associated with the 
        certificate-name.";
    } 
    uses node-uptime;  
    list unsigned-pcr-values {
      description
        "PCR values in each PCR bank. This might appear redundant with
        the TPM2B_DIGEST, but that digest is calculated across multiple 
        PCRs.  Having to verify across multiple PCRs does not 
        necessarily make it easy for a Verifier to appraise just the 
        minimum set of PCR information which has changed since the last 
        received TPM2B_DIGEST.  Put another way, why should a Verifier 
        reconstruct the proper value of all PCR Quotes when only a 
        single PCR has changed?  

        To help this happen, if the Attester does know specific PCR 
        values, the Attester can provide these individual values via 
        'unsigned-pcr-values'.   By comparing this information to the 
        what has previously been validated, it is possible for a 
        Verifier to confirm the Attester's signature while eliminating 
        significant processing.";  
      uses TPM20-hash-algo;
      list pcr-values {
        key pcr-index;
        description
          "List of one PCR bank.";
        leaf pcr-index {
          type pcr;
          description
            "PCR index number.";
        }
        leaf pcr-value {
          type binary;
          description
            "PCR value.";
        }
      }
    }
  }  


  grouping log-identifier {
    description
      "Identifier for type of log to be retrieved.";
    leaf log-type {
      type identityref {
        base attested_event_log_type;
      }
      mandatory true;
      description
        "The corresponding measurement log type identity.";
    }
  }

  grouping boot-event-log {
    description
      "Defines an event log corresponding to the event that extended 
      the PCR";
    leaf event-number {
      type uint32;
      description
        "Unique event number of this event";
    }
    leaf event-type {
        type uint32;
        description
          "log event type";
    }
    leaf pcr-index {
      type pcr;
      description
        "Defines the PCR index that this event extended";
    }
    list digest-list {
      description 
        "Hash of event data";
      leaf hash-algo {
        type identityref {
          base taa:hash;
        }
        description
          "The hash scheme that is used to compress the event data in 
          each of the leaf-list digest items.";    
      }   
      leaf-list digest {
        type binary;
        description
          "The hash of the event data";
      }
    }
    leaf event-size {
      type uint32;
      description
        "Size of the event data";
    }
    leaf-list event-data {
      type uint8;
      description
        "The event data size determined by event-size";
    }
  }

  grouping bios-event-log {
    description
      "Measurement log created by the BIOS/UEFI.";
    list bios-event-entry {
      key event-number;
        description
          "Ordered list of TCG described event log
           that extended the PCRs in the order they
           were logged";
      uses boot-event-log;
    }
  }

  grouping ima-event {
    description
      "Defines an hash log extend event for IMA measurements";
    leaf event-number {
      type uint64;
      description
        "Unique number for this event for sequencing";
    }
    leaf ima-template {
      type string;
      description
        "Name of the template used for event logs
         for e.g. ima, ima-ng, ima-sig";
    }
    leaf filename-hint {
      type string;
      description
        "File that was measured";
    }
    leaf filedata-hash {
      type binary;
      description
        "Hash of filedata";
    }
    leaf filedata-hash-algorithm {
      type string;
      description
        "Algorithm used for filedata-hash";
    }
    leaf template-hash-algorithm {
      type string;
      description
        "Algorithm used for template-hash";
    }
    leaf template-hash {
      type binary;
      description
        "hash(filedata-hash, filename-hint)";
    }
    leaf pcr-index {
      type pcr;
      description
        "Defines the PCR index that this event extended";
    }
    leaf signature {
      type binary;
      description
        "The file signature";
    }
  }

  grouping ima-event-log {
    description
      "Measurement log created by IMA.";
    list ima-event-entry {
      key event-number;
      description
      "Ordered list of ima event logs by event-number";
       uses ima-event;
    }
  }

  grouping netequip-boot-event {
    description
      "Defines an hash log extend event for Network Equipment Boot.";
    leaf event-number {
      type uint64;
      description
        "Unique number for this event for sequencing";
    }
    leaf filename-hint {
      type string;
      description
        "File that was measured";
    }
    leaf filedata-hash {
      type binary;
      description
        "Hash of filedata";
    }
    leaf filedata-hash-algorithm {
      type string;
      description
        "Algorithm used for filedata-hash.";
      }
    leaf file-version {
      type string;
      description
        "File version information.";
    }
    leaf file-type {
      type string;
      description
        "Indicating at which boot stage the file is loaded,
         such as BIOS, BootLoader, etc.";
    }
    leaf pcr-index {
      type pcr;
      description
        "Defines the PCR index that this event extended";
    }
  }

  grouping network-equipment-boot-event-log {
    description
      "Measurement log created by Network Equipment Boot.";
    list boot-event-entry {
      key event-number;
      description
        "Ordered list of Network Equipment Boot event logs
         by event-number.";
      uses netequip-boot-event;
    }
  }

  grouping event-logs {
    description
      "A selector for the log and its type.";
    choice attested_event_log_type {
      mandatory true;
      description
        "Event log type determines the event logs content.";
      case bios {
        description
          "BIOS/UEFI event logs";
        container bios-event-logs {
          description
            "BIOS/UEFI event logs";
          uses bios-event-log;
        }
      }
      case ima {
        description
          "IMA event logs.";
        container ima-event-logs {
          description
            "IMA event logs.";
          uses ima-event-log;
        }
      }
      case netequip_boot {
        description
          "Network Equipment Boot event logs";
        container boot-event-logs {
          description
            "Network equipment boot event logs.";
          uses network-equipment-boot-event-log;
        }
      }
    }
  }

  /**********************/
  /*   RPC operations   */
  /**********************/

  rpc tpm12-challenge-response-attestation {
    if-feature "taa:TPM12";
    description
      "This RPC accepts the input for TSS TPM 1.2 commands made to the
       attesting device.";
    input {
      container tpm12-attestation-challenge {
        description
          "This container includes every information element defined
           in the reference challenge-response interaction model for
           remote attestation. Corresponding values are based on
           TPM 1.2 structure definitions";
        uses tpm12-pcr-selection;
        uses nonce;
        leaf-list certificate-name {
          if-feature "tpm:TPMs";
          must "/tpm:rats-support-structures/tpm:tpms" +
               "/tpm:tpm[tpm:tpm-firmware-version='taa:tpm12']" +
               "/tpm:certificates/" +
               "/tpm:certificate[certificate-name-ref=current()]" {
            error-message "Not an available TPM1.2 AIK certificate."; 
          }  
          type certificate-name-ref;
          description
            "When populated, the RPC will only get a Quote for the
            TPMs associated with these certificate(s).";
        }
      }
    }
    output {
      list tpm12-attestation-response {
        unique "certificate-name"; 
        description
          "The binary output of TPM 1.2 TPM_Quote/TPM_Quote2, including
           the PCR selection and other associated attestation evidence
           metadata";
        uses certificate-name-ref {
          description
            "Certificate associated with this tpm12-attestation.";
        }
        uses tpm12-attestation;   
      }
    }
  }

  rpc tpm20-challenge-response-attestation {
    if-feature "taa:TPM20";
    description
      "This RPC accepts the input for TSS TPM 2.0 commands of the
       managed device. ComponentIndex from the hardware manager YANG
       module to refer to dedicated TPM in composite devices,
       e.g. smart NICs, is still a TODO.";
    input {
      container tpm20-attestation-challenge {
        description
          "This container includes every information element defined
           in the reference challenge-response interaction model for
           remote attestation. Corresponding values are based on
           TPM 2.0 structure definitions";
        uses nonce;       
        uses tpm20-pcr-selection;
        leaf-list certificate-name {
          if-feature "tpm:TPMs";
          must "/tpm:rats-support-structures/tpm:tpms" +
               "/tpm:tpm[tpm:tpm-firmware-version='taa:tpm20']" +
               "/tpm:certificates/" +
               "/tpm:certificate[certificate-name-ref=current()]" {
            error-message "Not an available TPM2.0 AIK certificate."; 
          } 
          type certificate-name-ref;
            description
              "When populated, the RPC will only get a Quote for the
              TPMs associated with the certificates.";
        }
      }
    }
    output {
      list tpm20-attestation-response {
        unique "certificate-name";   
        description
          "The binary output of TPM2b_Quote in one TPM chip of the
           node which identified by node-id. An TPMS_ATTEST structure
           including a length, encapsulated in a signature";
        uses certificate-name-ref {
          description
            "Certificate associated with this tpm20-attestation.";
        }
        uses tpm20-attestation;
      }
    }
  }

  rpc log-retrieval {
    description
      "Logs Entries are either identified via indices or via providing
       the last line received. The number of lines returned can be
       limited. The type of log is a choice that can be augmented.";
    input {
      list log-selector {
        description
          "Selection of log entries to be reported.";    
        uses tpm-name-selector;
        choice index-type {
          description
            "Last log entry received, log index number, or timestamp.";
          case last-entry {
            description
              "The last entry of the log already retrieved.";
            leaf last-entry-value {
              type binary;
              description
                "Content of an log event which matches 1:1 with a
                 unique event record contained within the log.  Log
                 entries subsequent to this will be passed to the
                 requester.  Note: if log entry values are not unique,
                 this MUST return an error.";
            }
          }
          case index {
            description
              "Numeric index of the last log entry retrieved, or 
               zero.";
            leaf last-index-number {
              type uint64;
              description
                "The last numeric index number of a log entry.
                 Zero means to start at the beginning of the log.
                 Entries subsequent to this will be passed to the
                 requester.";
            }
          }
          case timestamp {
            leaf timestamp {
              type yang:date-and-time;
              description
                "Timestamp from which to start the extraction.  The 
                 next log entry subsequent to this timestamp is to 
                 be sent.";
            }
            description
              "Timestamp from which to start the extraction.";
          }
        }
        leaf log-entry-quantity {
          type uint16;
          description
            "The number of log entries to be returned. If omitted, it
             means all of them.";
        }
      }
      uses log-identifier;
    }

    output {
      container system-event-logs {
        description
          "The requested data of the measurement event logs";
        list node-data {
          unique "tpm-name";
          description
            "Event logs of a node in a distributed system
             identified by the node name";
          uses tpm-name;
          uses node-uptime;
          container log-result {
            description
              "The requested entries of the corresponding log.";
            uses event-logs;
          }
        }
      }
    }
  }

  /**************************************/
  /*   Config & Oper accessible nodes   */
  /**************************************/

  container rats-support-structures {
    description
      "The datastore definition enabling verifiers or relying
       parties to discover the information necessary to use the
       remote attestation RPCs appropriately.";
    container compute-nodes {
      if-feature "tpm:TPMs";
      description
        "Holds the set device subsystems/components in this composite
         device that support TPM operations.";
      list compute-node {
        key node-id;
        config false;
        min-elements 2;
        description
          "A component in this composite device that 
          supports TPM operations."; 
        leaf node-id {
          type string;
          description
            "ID of the compute node, such as Board Serial Number.";
        }
        leaf node-physical-index {
          if-feature ietfhw:entity-mib;
          type int32 {
            range "1..2147483647";
          }
          config false;
          description
           "The entPhysicalIndex for the compute node.";
          reference
           "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex";
        }
        leaf node-name {
          type string;
          description
            "Name of the compute node.";
        }
        leaf node-location {
          type string;
          description
            "Location of the compute node, such as slot number.";
        }
      }
    }
    container tpms {
      description
        "Holds the set of TPMs within an Attester.";
      list tpm {
        key tpm-name;
        unique "tpm-path";
          description
           "A list of TPMs in this composite device that RATS
           can be conducted with.";   
        uses tpm-name;
        leaf hardware-based {
          type boolean;
          config false;
          description
            "Answers the question: is this TPM is a hardware based 
            TPM?";
        }
        leaf tpm-physical-index {
          if-feature ietfhw:entity-mib;
          type int32 {
            range "1..2147483647";
          }
          config false;
          description
            "The entPhysicalIndex for the TPM.";
          reference
            "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex";
        } 
        leaf tpm-path {
          type string;
          config false;
          description
            "Path to a unique TPM on a device.  This can change agross 
            reboots.";
        }
        leaf compute-node {
          if-feature "tpm:TPMs";
          type compute-node-ref;
          config false;
          mandatory true;
          description
            "When there is more that one TPM, this indicates for which 
            compute node this TPM services.";
        }
        leaf tpm-manufacturer {
          type string;
          config false;
          description
            "TPM manufacturer name.";
        }
        leaf tpm-firmware-version {
          type identityref {
            base taa:cryptoprocessor;
          }       
          mandatory true;
          description
            "Identifies the cryptoprocessor API set supported.  This 
            cannot be configured.  However it is referenced via XPATH
            as part of configuration, so is shown as 'rw' 
            to eliminate YANG warnings related NMDA.";
        }
        uses TPM12-hash-algo {
          when "tpm-firmware-version = 'taa:tpm12'";
          refine TPM12-hash-algo {
            description
              "The hash algorithm overwrites the default used for PCRs 
              on this TPM1.2 compliant cryptoprocessor.";
          }
        } 
        leaf-list TPM12-pcrs {
          when "../tpm-firmware-version = 'taa:tpm12'";
          type pcr;
          description
            "The PCRs which may be extracted from this TPM1.2 
            compliant cryptoprocessor.";
        }           
        list tpm20-pcr-bank {
          when "../tpm-firmware-version = 'taa:tpm20'";
          key "TPM20-hash-algo";
          description
            "Specifies the list of PCRs that may be extracted for
            a specific Hash Algorithm on this TPM2 compliant 
            cryptoprocessor.  A bank is a set of PCRs which are 
            extended using a particular hash algorithm.";
          reference
            "https://www.trustedcomputinggroup.org/wp-content/uploads/
             TPM-Rev-2.0-Part-2-Structures-01.38.pdf  Section 10.9.7";
          leaf TPM20-hash-algo {
            must "/tpm:rats-support-structures"
               + "/tpm:attester-supported-algos"
               + "/tpm:tpm20-hash" {
              error-message "Not a platform supported TPM20-hash-algo";
            }
            type identityref {
              base taa:hash;
            }
            description
              "The hash scheme actively being used to hash a 
              one or more TPM2.0 PCRs.";
          }    
          leaf-list pcr-index {
            type tpm:pcr;
            description
              "Defines what TPM2 PCRs are available to be extracted.";
          }
        }             
        leaf tpm-status {
          type enumeration {
            enum operational {
              value 0;
              description
                "The TPM currently is currently running normally and
                is ready to accept and process TPM quotes.";
              reference
                "TPM-Rev-2.0-Part-1-Architecture-01.07-2014-03-13.pdf
                Section 12";
            }
            enum non-operational {
              value 1;
              description
                "TPM is in a state such as startup or shutdown which 
                precludes the processing of TPM quotes.";
            }
          }
          config false;
          mandatory true;
          description
            "TPM chip self-test status.";
        }
        container certificates {
          description
            "The TPM's certificates, including EK certificates
             and AK certificates.";
          list certificate {
            key "certificate-name";          
            description
              "Three types of certificates can be accessed via
               this statement, including Initial Attestation
               Key Cert, Local Attestation Key Cert or
               Endorsement Key Cert.";
            leaf certificate-name {
              type string;
              description
                "An arbitrary name uniquely identifying a certificate
                 associated within key within a TPM.";
            }      
            leaf certificate-keystore-ref {
              type leafref {
                path "/ks:keystore/ks:asymmetric-keys/ks:asymmetric-key"
                   + "/ks:certificates/ks:certificate/ks:name";
              }
              description
                "A reference to a specific certificate of an
                 asymmetric key in the Keystore.";
                 /* Note: It is also possible to import a grouping which 
                    allows local definition via an imported keystore 
                    schema. */
            }
            leaf certificate-type {
              type enumeration {
                enum endorsement-cert {
                  value 0;
                  description
                    "Endorsement Key (EK) Certificate type.";
                }
                enum initial-attestation-cert {
                  value 1;
                  description
                    "Initial Attestation key (IAK) Certificate type.";
                }
                enum local-attestation-cert {
                  value 2;
                  description
                    "Local Attestation Key (LAK) Certificate type.";
                }
              }
              description
                "Type of this certificate";
            }
          }
        }
      }
    }
    container attester-supported-algos {
      description
        "Identifies which TPM algorithms are available for use on an
        attesting platform.";
      leaf-list tpm12-asymmetric-signing {
        if-feature "taa:TPM12";
        when "../../tpm:tpms" +
             "/tpm:tpm[tpm:tpm-firmware-version='taa:tpm12']";
        type identityref {
          base taa:asymmetric;
        }
        description
          "Platform Supported TPM12 asymmetric algorithms.";  
      }
      leaf-list tpm12-hash {
        if-feature "taa:TPM12";
        when "../../tpm:tpms" +
             "/tpm:tpm[tpm:tpm-firmware-version='taa:tpm12']";
        type identityref {
          base taa:hash;
        }
        description
          "Platform supported TPM12 hash algorithms.";  
      }
      leaf-list tpm20-asymmetric-signing {
        if-feature "taa:TPM20";
        when "../../tpm:tpms" +
             "/tpm:tpm[tpm:tpm-firmware-version='taa:tpm20']";
        type identityref {
          base taa:asymmetric;
        }
        description
          "Platform Supported TPM20 asymmetric algorithms.";    
      }
      leaf-list tpm20-hash {
        if-feature "taa:TPM20";
        when "../../tpm:tpms" +
             "/tpm:tpm[tpm:tpm-firmware-version='taa:tpm20']";
        type identityref {
          base taa:hash;
        }
        description
          "Platform supported TPM20 hash algorithms.";  
      }          
    }
  }
}
<CODE ENDS>
]]></artwork></figure>

</section>
</section>
<section anchor="ietf-tcg-algs" title="ietf-tcg-algs">

<t>Cryptographic algorithm types were initially included within -v14 NETCONF’s iana-crypto-types.yang.  Unfortunately all this content including the algorithms needed here failed to make the -v15 used WGLC.   As a result this document has encoded the TCG Algorithm definitions of <xref target="TCG-Algos"/>, revision 1.32.  By including this full table as a separate YANG file within this document, it is possible for other YANG models to leverage the contents of this model.</t>

<section anchor="features-1" title="Features">

<t>There are two types of features supported &lt;TPM12&gt; and &lt;TPM20&gt;. Support for either of these features indicates that a cryptoprocessor supporting the corresponding type of TCG API is present on an Attester.  Most commonly, only one type of cryptoprocessor will be available on an Attester.</t>

</section>
<section anchor="identities-1" title="Identities">

<t>There are three types of identities in this model.</t>

<t>The first are the cryptographic functions supportable by a TPM algorithm, these include: &lt;asymmetric&gt;, &lt;symmetric&gt;, &lt;hash&gt;, &lt;signing&gt;, &lt;anonymous_signing&gt;, &lt;encryption_mode&gt;, &lt;method&gt;, and &lt;object_type&gt;.  The definitions of each of these are in Table 2 of <xref target="TCG-Algos"/>.</t>

<t>The second are API specifications for tpms: &lt;tpm12&gt; and &lt;tpm2&gt;.</t>

<t>The third are specific algorithm types.   Each algorithm type defines what cryptographic functions may be supported, and on which type of API specification.  It is not required that an implementation of a specific TPM will support all algorithm types.  The contents of each specific algorithm mirrors what is in Table 3 of <xref target="TCG-Algos"/>.</t>

</section>
<section anchor="ref-ietf-tcg-algs" title="YANG Module">
<figure><artwork type="YANG"><![CDATA[
<CODE BEGINS> ietf-tcg-algs@2020-09-18.yang
module ietf-tcg-algs {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-tcg-algs";
  prefix taa;

  organization
    "IETF RATS Working Group";

  contact
    "WG Web:   <http://datatracker.ietf.org/wg/rats/>
     WG List:  <mailto:rats@ietf.org>
     Author:   Eric Voit <mailto:evoit@cisco.com>";

  description
    "This module defines a identities for asymmetric algorithms.
    
     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).
     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-18 {
    description
      "Initial version";
    reference
      "RFC XXXX: tbd";
  }

  /*****************/
  /*   Features    */
  /*****************/

  feature TPM12 {
    description
      "This feature indicates algorithm support for the TPM 1.2 API
      as per TPM-main-1.2-Rev94-part-2, Section 4.8.";
  }

  feature TPM20 {
    description
      "This feature indicates algorithm support for the TPM 2.0 API 
      as per TPM-Rev-2.0-Part-1-Architecture-01.38 Section 11.4.";
  }


  /*****************/
  /*  Identities   */
  /*****************/
  
  /*  There needs to be collasping/verification of some of the identity  
      types between the various algorithm types listed below */

  identity asymmetric {
    description
      "A TCG recognized asymmetric algorithm with a public and 
      private key.";
    reference
      "http://trustedcomputinggroup.org/resource/tcg-algorithm-registry/
      TCG_Algorithm_Registry_r1p32_pub Table 2";
  }

  identity symmetric {
    description
      "A TCG recognized symmetric algorithm with only a private key.";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }

  identity hash {
    description
      "A TCG recognized hash algorithm that compresses input data to 
      a digest value or indicates a method that uses a hash.";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }

  identity signing {
    description
      "A TCG recognized signing algorithm";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }

  identity anonymous_signing {
    description
      "A TCG recognized anonymous signing algorithm.";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }

  identity encryption_mode {
    description
      "A TCG recognized encryption mode.";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }  

  identity method {
    description
      "A TCG recognized method such as a mask generation function.";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }
  
  identity object_type {
    description
      "A TCG recognized object type.";
    reference
      "TCG_Algorithm_Registry_r1p32_pub Table 2";
  }

  identity cryptoprocessor {
    description
      "Base identity identifying a crytoprocessor.";
  }
  
  identity tpm12 {
    if-feature "TPM12";
    base cryptoprocessor;
    description
      "Supportable by a TPM1.2.";
    reference
      "TPM-Main-Part-2-TPM-Structures_v1.2_rev116_01032011.pdf
      TPM_ALGORITHM_ID values, page 18";
  }
  
  identity tpm20 {
    if-feature "TPM12";
    base cryptoprocessor;
    description
      "Supportable by a TPM2.";
    reference  
      "TPM-Rev-2.0-Part-2-Structures-01.38.pdf
      The TCG Algorithm Registry. Table 9";
  } 
  
  identity TPM_ALG_RSA {
    if-feature "TPM12 or TPM20";
    base tpm12;  
    base tpm20;
    base asymmetric;
    base object_type;
    description
      "RSA algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and 
      RFC 8017. ALG_ID: 0x0001";    

  }

  identity TPM_ALG_TDES {
    if-feature "TPM12";
    base tpm12;  
    base symmetric;
    description
      "Block cipher with various key sizes (Triple Data Encryption
       Algorithm, commonly called Triple Data Encryption Standard)
       Note: was banned in TPM1.2 v94";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and 
      ISO/IEC 18033-3. ALG_ID: 0x0003";    

  }
  
  identity TPM_ALG_SHA1 {
    if-feature "TPM12 or TPM20";
    base hash;
    base tpm12;
    base tpm20;
    description
      "SHA1 algorithm - Deprecated due to insufficient cryptographic 
      protection.  However it is still useful for hash algorithms 
      where protection is not required.";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10118-3. ALG_ID: 0x0004";    

  }
  
  identity TPM_ALG_HMAC  {
    if-feature "TPM12 or TPM20";
    base tpm12;
    base tpm20;
    base hash;
    base signing;
    description
      "Hash Message Authentication Code (HMAC) algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3, 
      ISO/IEC 9797-2 and RFC2014. ALG_ID: 0x0005";    

  }
      
  identity TPM_ALG_AES  {
    if-feature "TPM12";
    base tpm12;
    base symmetric;
    description
      "The AES algorithm with various key sizes";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 18033-3. ALG_ID: 0x0006";    

  }

  identity TPM_ALG_MGF1 {
    if-feature "TPM20";
    base tpm20;
    base hash;
    base method;
    description
      "hash-based mask-generation function";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3,
      IEEE Std 1363-2000 and IEEE Std 1363a -2004.
      ALG_ID: 0x0007";    

  }
  
  identity TPM_ALG_KEYEDHASH {
    if-feature "TPM20";
    base tpm20;
    base hash;
    base object_type;   
    description
      "An encryption or signing algorithm using a keyed hash.  These 
      may use XOR for encryption or an HMAC for signing and may
      also refer to a data object that is neither signing nor 
      encrypting.";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      TCG TPM 2.0 library specification. . ALG_ID: 0x0008";

    }

  identity TPM_ALG_XOR {
    if-feature "TPM12 or TPM20";
    base tpm12;
    base tpm20;
    base hash;
    base symmetric;  
    description
      "The XOR encryption algorithm.";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      TCG TPM 2.0 library specification. ALG_ID: 0x000A";

  }

  identity TPM_ALG_SHA256 {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "The SHA 256 algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10118-3. ALG_ID: 0x000B";    

  }

  identity TPM_ALG_SHA384  {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "The SHA 384 algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10118-3. ALG_ID: 0x000C";

  }

  identity TPM_ALG_SHA512  {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "The SHA 512 algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10118-3. ALG_ID: 0x000D";    

  }

  identity TPM_ALG_NULL {
    if-feature "TPM20";
    base tpm20;
    description
      "NULL algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      TCG TPM 2.0 library specification. ALG_ID: 0x0010";     

  }

  identity TPM_ALG_SM3_256 {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "The SM3 hash algorithm.";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      GM/T 0004-2012 - SM3_256. ALG_ID: 0x0012";    

  }

  identity TPM_ALG_SM4 {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    description
      "SM4 symmetric block cipher";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      GB/T 32907-2016. ALG_ID: 0x0013";    

  }

  identity TPM_ALG_RSASSA {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;  
    description
      "Signature algorithm defined in section 8.2 (RSASSAPKCS1-v1_5)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and RFC 8017.
      ALG_ID: 0x0014";    

  }

  identity TPM_ALG_RSAES {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base encryption_mode;
    description
      "Signature algorithm defined in section 7.2 (RSAES-PKCS1-v1_5)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and RFC 8017
      ALG_ID: 0x0015";

  }

  identity TPM_ALG_RSAPSS {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;
    description
      "Padding algorithm defined in section 8.1 (RSASSA PSS)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and RFC 8017.
      ALG_ID: 0x0016";   

  }

  identity TPM_ALG_OAEP {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base encryption_mode;
    description
      "Padding algorithm defined in section 7.1 (RSASSA OAEP)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and RFC 8017.
      ALG_ID: 0x0017";  

  }

  identity TPM_ALG_ECDSA {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;
    description
      "Signature algorithm using elliptic curve cryptography (ECC)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 14888-3. ALG_ID: 0x0018";    

  }            

  identity TPM_ALG_ECDH {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base method;
    description
      "Secret sharing using ECC";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-56A and RFC 7748. ALG_ID: 0x0019";    

  }

  identity TPM_ALG_ECDAA {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;
    base anonymous_signing;
    description
      "Elliptic-curve based anonymous signing scheme";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      TCG TPM 2.0 library specification. ALG_ID: 0x001A";   

  }

  identity TPM_ALG_SM2 {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;
    base encryption_mode;
    base method;
    description
      "SM2 – depending on context, either an elliptic-curve based,
      signature algorithm, an encryption scheme, or a key exchange 
      protocol";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      A GM/T 0003.1–2012, GM/T 0003.2–2012, GM/T 0003.3–2012,
      GM/T 0003.5–2012 SM2. ALG_ID: 0x001B";    

  }

  identity TPM_ALG_ECSCHNORR {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;
    description
      "Elliptic-curve based Schnorr signature";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      TCG TPM 2.0 library specification. ALG_ID: 0x001C";       

  }

  identity TPM_ALG_ECMQV {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base method;
    description
      "Two-phase elliptic-curve key";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-56A. ALG_ID: 0x001D";    

  }

  identity TPM_ALG_KDF1_SP800_56A {
    if-feature "TPM20";
    base tpm20;
    base hash;
    base method;
    description
      "Concatenation key derivation function";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-56A  (approved alternative1) section 5.8.1.
      ALG_ID: 0x0020";    

  }

  identity TPM_ALG_KDF2  {
    if-feature "TPM20";
    base tpm20;
    base hash;
    base method;
    description
      "Key derivation function";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      IEEE 1363a-2004 KDF2 section 13.2. ALG_ID: 0x0021";    

  }

  identity TPM_ALG_KDF1_SP800_108 {
    base TPM_ALG_KDF2;
    description
      "A key derivation method";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-108 - Section 5.1 KDF. ALG_ID: 0x0022";    

  }            

  identity TPM_ALG_ECC {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base object_type;
    description
      "Prime field ECC";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 15946-1. ALG_ID: 0x0023";    

  }

  identity TPM_ALG_SYMCIPHER {
    if-feature "TPM20";
    base tpm20;
    description
      "Object type for a symmetric block cipher";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      TCG TPM 2.0 library specification. ALG_ID: 0x0025";          

  }            

  identity TPM_ALG_CAMELLIA {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    description
      "The Camellia algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 18033-3. ALG_ID: 0x0026";    

  }

  identity TPM_ALG_SHA3_256  {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "ISO/IEC 10118-3 - the SHA 256 algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST PUB FIPS 202. ALG_ID: 0x0027";          

  }

  identity TPM_ALG_SHA3_384 {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "The SHA 384 algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST PUB FIPS 202. ALG_ID: 0x0028";   

  }

  identity TPM_ALG_SHA3_512 {
    if-feature "TPM20";
    base tpm20;
    base hash;
    description
      "The SHA 512 algorithm";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST PUB FIPS 202. ALG_ID: 0x0029";   

  }

  identity TPM_ALG_CMAC {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base signing;
    description
      "block Cipher-based Message Authentication Code (CMAC)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 9797-1:2011 Algorithm 5. ALG_ID: 0x003F";   

  }

  identity TPM_ALG_CTR {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base encryption_mode;
    description
      "Counter mode";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10116. ALG_ID: 0x0040";    

  }

  identity TPM_ALG_OFB {
    base tpm20;
    base symmetric;
    base encryption_mode;
    description
      "Output Feedback mode";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10116. ALG_ID: 0x0041";    

  }

  identity TPM_ALG_CBC {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base encryption_mode;
    description
      "Cipher Block Chaining mode";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10116. ALG_ID: 0x0042";    

  }

  identity TPM_ALG_CFB {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base encryption_mode;
    description
      "Cipher Feedback mode";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10116. ALG_ID: 0x0043";    

  }

  identity TPM_ALG_ECB  {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base encryption_mode;
    description
      "Electronic Codebook mode";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      ISO/IEC 10116. ALG_ID: 0x0044";    

  }

  identity TPM_ALG_CCM  {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base signing;
    base encryption_mode;
    description
      "Counter with Cipher Block Chaining-Message Authentication 
      Code (CCM)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-38C. ALG_ID: 0x0050";    

  }

  identity TPM_ALG_GCM {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base signing;
    base encryption_mode;
    description
      "Galois/Counter Mode (GCM)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-38D. ALG_ID: 0x0051";    

  }
  
  identity TPM_ALG_KW {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base signing;
    base encryption_mode;
    description
      "AES Key Wrap (KW)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-38F. ALG_ID: 0x0052";    

  }
  
  identity TPM_ALG_KWP {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base signing;
    base encryption_mode;
    description
      "AES Key Wrap with Padding (KWP)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-38F. ALG_ID: 0x0053";    

  }
  
  identity TPM_ALG_EAX  {
    if-feature "TPM20";
    base tpm20;
    base symmetric;
    base signing;
    base encryption_mode;
    description
      "Authenticated-Encryption Mode";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      NIST SP800-38F. ALG_ID: 0x0054";    

  }
   
  identity TPM_ALG_EDDSA {
    if-feature "TPM20";
    base tpm20;
    base asymmetric;
    base signing;
    description
      "Edwards-curve Digital Signature Algorithm (PureEdDSA)";
    reference  
      "TCG_Algorithm_Registry_r1p32_pub Table 3 and
      RFC 8032. ALG_ID: 0x0060";    

  }

}
<CODE ENDS>
]]></artwork></figure>

<t>Note that not all cryptographic functions are required for use by ietf-tpm-remote-attestation.yang.  However the full definition of Table 3 of <xref target="TCG-Algos"/> will allow use by additional YANG specifications.</t>

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

<t>This document will include requests to IANA:</t>

<t>To be defined yet.  But keeping up with changes to ietf-tcg-algs.yang will be necessary.</t>

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

<t>The YANG module specified in this document defines a schema for data that is designed to be accessed via network management protocols such as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>.  The lowest NETCONF layer is the secure transport layer, and the mandatory-to-implement secure transport is Secure Shell (SSH) <xref target="RFC6242"/>.  The lowest RESTCONF layer is HTTPS, and the mandatory-to-implement secure transport is TLS <xref target="RFC8446"/>.</t>

<t>There are a number of data nodes defined in this YANG module that are writable/creatable/deletable (i.e., config true, which is the default).  These data nodes may be considered sensitive or vulnerable in some network environments.  Write operations (e.g., edit-config) to these data nodes without proper protection can have a negative effect on network operations.  These are the subtrees and data nodes and their sensitivity/vulnerability:</t>

<t>Container: &lt;/rats-support-structures/attester-supported-algos&gt;</t>

<t><list style="symbols">
  <t>&lt;tpm12-asymmetric-signing&gt;, &lt;tpm12-hash&gt;, &lt;tpm20-asymmetric-signing&gt;, and &lt;tpm20-hash&gt; all could be populated with algorithms which are not supported by the underlying physical TPM installed by the equipment vendor.</t>
</list></t>

<t>Container: &lt;/rats-support-structures/tpms&gt;</t>

<t><list style="symbols">
  <t>&lt;tpm-name&gt; - Although shown as ‘rw’, it is system generated</t>
  <t>&lt;tpm20-pcr-bank&gt; - It is possible to configure PCRs for extraction which are not being extended by system software.  This could unnecessarily use TPM resources.</t>
  <t>&lt;certificates&gt; - It is possible to provision a certificate which does not correspond to a Attestation Identity Key (AIK) within the TPM.</t>
</list></t>

<t>RPC: &lt;tpm12-challenge-response-attestation&gt; - Need to verify that the certificate is for an active AIK.</t>

<t>RPC: &lt;tpm20-challenge-response-attestation&gt; - Need to verify that the certificate is for an active AIK.</t>

<t>RPC: &lt;log-retrieval&gt; - Pulling lots of logs can chew up system resources.</t>

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

<t>Not yet.</t>

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

<t>Changes from version 04 to version 05:</t>

<t><list style="symbols">
  <t>YANG Dr comments covered</t>
</list></t>

<t>Changes from version 03 to version 04:</t>

<t><list style="symbols">
  <t>TPM1.2 Quote1 eliminated</t>
  <t>YANG model simplifications so redundant info isn’t exposed</t>
</list></t>

<t>Changes from version 02 to version 03:</t>

<t><list style="symbols">
  <t>moved to tcg-algs</t>
  <t>cleaned up model to eliminate sources of errors</t>
  <t>removed key establishment RPC</t>
  <t>added lots of XPATH which must all be scrubbed still</t>
  <t>Descriptive text added on model contents.</t>
</list></t>

<t>Changes from version 01 to version 02:</t>

<t><list style="symbols">
  <t>Extracted Crypto-types into a separate YANG file</t>
  <t>Mades the algorithms explicit, not strings</t>
  <t>Hash Algo as key the selected TPM2 PCRs</t>
  <t>PCR numbers are their own type</t>
  <t>Eliminated nested keys for node-id plus tpm-name</t>
  <t>Eliminated TPM-Name of “ALL”</t>
  <t>Added TPM-Path</t>
</list></t>

<t>Changes from version 00 to version 01:</t>

<t><list style="symbols">
  <t>Addressed author’s comments</t>
  <t>Extended complementary details about attestation-certificates</t>
  <t>Relabeled chunk-size to log-entry-quantity</t>
  <t>Relabeled location with compute-node or tpm-name where appropriate</t>
  <t>Added a valid entity-mib physical-index to compute-node and tpm-name to map it back to hardware inventory</t>
  <t>Relabeled name  to tpm_name</t>
  <t>Removed event-string in last-entry</t>
</list></t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<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>



<reference  anchor="RFC6991" target='https://www.rfc-editor.org/info/rfc6991'>
<front>
<title>Common YANG Data Types</title>
<author initials='J.' surname='Schoenwaelder' fullname='J. Schoenwaelder' role='editor'><organization /></author>
<date year='2013' month='July' />
<abstract><t>This document introduces a collection of common data types to be used with the YANG data modeling language.  This document obsoletes RFC 6021.</t></abstract>
</front>
<seriesInfo name='RFC' value='6991'/>
<seriesInfo name='DOI' value='10.17487/RFC6991'/>
</reference>



<reference  anchor="RFC8348" target='https://www.rfc-editor.org/info/rfc8348'>
<front>
<title>A YANG Data Model for Hardware Management</title>
<author initials='A.' surname='Bierman' fullname='A. Bierman'><organization /></author>
<author initials='M.' surname='Bjorklund' fullname='M. Bjorklund'><organization /></author>
<author initials='J.' surname='Dong' fullname='J. Dong'><organization /></author>
<author initials='D.' surname='Romascanu' fullname='D. Romascanu'><organization /></author>
<date year='2018' month='March' />
<abstract><t>This document defines a YANG data model for the management of hardware on a single server.</t></abstract>
</front>
<seriesInfo name='RFC' value='8348'/>
<seriesInfo name='DOI' value='10.17487/RFC8348'/>
</reference>



<reference anchor="I-D.ietf-netconf-keystore">
<front>
<title>A YANG Data Model for a Keystore</title>

<author initials='K' surname='Watsen' fullname='Kent Watsen'>
    <organization />
</author>

<date month='August' day='20' year='2020' />

<abstract><t>This document defines a YANG 1.1 module called "ietf-keystore" that enables centralized configuration of both symmetric and asymmetric keys.  The secret value for both key types may be encrypted or hidden.  Asymmetric keys may be associated with certificates. Notifications are sent when certificates are about to expire.  Editorial Note (To be removed by RFC Editor)  This draft contains placeholder values that need to be replaced with finalized values at the time of publication.  This note summarizes all of the substitutions that are needed.  No other RFC Editor instructions are specified elsewhere in this document.  Artwork in this document contains shorthand references to drafts in progress.  Please apply the following replacements:  *  "AAAA" --> the assigned RFC value for draft-ietf-netconf-crypto- types  *  "CCCC" --> the assigned RFC value for this draft  Artwork in this document contains placeholder values for the date of publication of this draft.  Please apply the following replacement:  *  "2020-08-20" --> the publication date of this draft  The following Appendix section is to be removed prior to publication:  *  Appendix A.  Change Log</t></abstract>

</front>

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



<reference anchor="I-D.ietf-rats-reference-interaction-models">
<front>
<title>Reference Interaction Models for Remote Attestation Procedures</title>

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

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

<author initials='C' surname='Newton' fullname='Christopher Newton'>
    <organization />
</author>

<author initials='L' surname='Chen' fullname='Liqun Chen'>
    <organization />
</author>

<date month='October' day='23' year='2020' />

<abstract><t>This document describes interaction models for remote attestation procedures (RATS).  Three conveying mechanisms - Challenge/Response, Uni-Directional, and Streaming Remote Attestation - are illustrated and defined.  Analogously, a general overview about the information elements typically used by corresponding conveyance protocols are highlighted.  Privacy preserving conveyance of Evidence via Direct Anonymous Attestation is elaborated on in the context of the Attester, Endorser, and Verifier role.</t></abstract>

</front>

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



<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='December' day='8' year='2020' />

<abstract><t>In network protocol exchanges it is often the case that one entity requires believable evidence about the operational state of a remote peer.  Such evidence is typically conveyed as claims about the peer's software and hardware platform, and is subsequently appraised in order to assess the peer's trustworthiness.  The process of generating and appraising this kind of evidence is known as remote attestation.  This document describes an architecture for remote attestation procedures that generate, convey, and appraise evidence about a peer's operational state.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-rats-architecture-08' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-rats-architecture-08.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='December' day='7' 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], as defined by the Trusted Computing Group (TCG).</t></abstract>

</front>

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


<reference anchor="TPM1.2" target="https://trustedcomputinggroup.org/resource/tpm-main-specification/">
  <front>
    <title>TPM 1.2 Main Specification</title>
    <author initials="." surname="TCG" fullname="Trusted Computing Group">
      <organization></organization>
    </author>
    <date year="2003" month="October" day="02"/>
  </front>
</reference>
<reference anchor="TPM2.0" target="https://trustedcomputinggroup.org/resource/tpm-library-specification/">
  <front>
    <title>TPM 2.0 Library Specification</title>
    <author initials="." surname="TCG" fullname="Trusted Computing Group">
      <organization></organization>
    </author>
    <date year="2013" month="March" day="15"/>
  </front>
</reference>
<reference anchor="TCG-Algos" target="hhttp://trustedcomputinggroup.org/resource/tcg-algorithm-registry/">
  <front>
    <title>TCG_Algorithm_Registry_r1p32_pub</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

    <references title='Informative References'>





<reference  anchor="RFC6241" target='https://www.rfc-editor.org/info/rfc6241'>
<front>
<title>Network Configuration Protocol (NETCONF)</title>
<author initials='R.' surname='Enns' fullname='R. Enns' role='editor'><organization /></author>
<author initials='M.' surname='Bjorklund' fullname='M. Bjorklund' role='editor'><organization /></author>
<author initials='J.' surname='Schoenwaelder' fullname='J. Schoenwaelder' role='editor'><organization /></author>
<author initials='A.' surname='Bierman' fullname='A. Bierman' role='editor'><organization /></author>
<date year='2011' month='June' />
<abstract><t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices.  It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages.  The NETCONF protocol operations are realized as remote procedure calls (RPCs).  This document obsoletes RFC 4741.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6241'/>
<seriesInfo name='DOI' value='10.17487/RFC6241'/>
</reference>



<reference  anchor="RFC8040" target='https://www.rfc-editor.org/info/rfc8040'>
<front>
<title>RESTCONF Protocol</title>
<author initials='A.' surname='Bierman' fullname='A. Bierman'><organization /></author>
<author initials='M.' surname='Bjorklund' fullname='M. Bjorklund'><organization /></author>
<author initials='K.' surname='Watsen' fullname='K. Watsen'><organization /></author>
<date year='2017' month='January' />
<abstract><t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t></abstract>
</front>
<seriesInfo name='RFC' value='8040'/>
<seriesInfo name='DOI' value='10.17487/RFC8040'/>
</reference>



<reference  anchor="RFC6242" target='https://www.rfc-editor.org/info/rfc6242'>
<front>
<title>Using the NETCONF Protocol over Secure Shell (SSH)</title>
<author initials='M.' surname='Wasserman' fullname='M. Wasserman'><organization /></author>
<date year='2011' month='June' />
<abstract><t>This document describes a method for invoking and running the Network Configuration Protocol (NETCONF) within a Secure Shell (SSH) session as an SSH subsystem.  This document obsoletes RFC 4742.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6242'/>
<seriesInfo name='DOI' value='10.17487/RFC6242'/>
</reference>



<reference  anchor="RFC8446" target='https://www.rfc-editor.org/info/rfc8446'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2018' month='August' />
<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='8446'/>
<seriesInfo name='DOI' value='10.17487/RFC8446'/>
</reference>




    </references>



  </back>

<!-- ##markdown-source:
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
7IH+34Q36jYzTedTy5iBOsVgHnpV+RBJV6+ARG0KynBhtxtHFDdJN6H8gFwF
hbjxE/QKQoTVUCjF07bBaItMOujKgUcqkbQnCyAXGMe3wkQOIV16zMcoGRIh
Y/2mrAtwQxcun05q/vDaRVzbp+d3GwdYoauWeYqXMlmcLCh87zf1i06+VDha
qfQD2F4FEV4RAGwxvI0vOHJekCg1OH6cTYg7JIiu8M5arVtTHESo9k3Rbwyd
6ExVovRcXJ4beQCjYBZEIx2Eg/FNtWeqIz5ylJTc1le6xiEdWVNS9mCLWu2I
H81r3OY1lg/hDJsFugQD21SXjovaL1ROgElCnKjVKlI4pgSOl2odAmlHI0R3
5Xtn+8XB/hPsWy7vjMJM7yKYeHgTjlgfwxMaOWZzPwQLxydzo9dXtwisUHZD
+ZgRX4aTTEaqC2Z4qxNlBvCqATVn3eKpcT73zcA1gUFXPryfGMYzDdBen1ZE
Yw2bRUJfwcdZjEoEQk2io2KaXuE+Q8/1C7TVidEn0N435CNhOdirrYMnWTdi
yD9OemfvNCGbz0bKTiOIqFMaMuqaHfmU4UO3f2R6yVEN2SRHIszpSf9uTAZV
VqWqKvhPGyKKb5Vh5sbmv1eWNjZxufKGW+QYUo9c29jIFBYIl4whJ1dLE98C
R/p62yZL0OcS6hNIZWy6TR0E+g6RpUVSy2JQPVJPsCtvyoZUFjGC9dnp1G69
vIP4yltPOfmVb70ty7wVqQWsd0OP6SogzoVXECQAvj7fO3i7PzhD1bGOZqnP
u7zvzABVO0okVnZgjGDySvYd0jAdvbRkW5rhIOj0xlR7A9uuho5AOzPYuUqB
UJRDShdVBoqV5tNq/Hrc7phlFCbJ1M14MS7QPImkqqoAw6YeQv7KBQZg37hV
R4m9nXkU2zLKtuezSeyP0m2zfTDc6Wlw43WaLe/Eh93Z8QZ6f3qtdnPneXM2
uhT6drLdar5oPtOjIuvxHNTUuzqK9CfRpM+hSnelS8I5UikLXBMepZJGPQCV
MnTKolSSVkn7XFO0DLldmmXTKl4GQw4uAhoYWQtZYpOy7CPpw4nZmsOWZo60
MllzNao1tyVlV5bG0DVnbI+7S1llOfJmwULYETrLul8KvruNolyWLSXx9gBL
6bokZnjjgrcN8hbUmW+uGTlPNhOspXk/ctsyiKiRn6kxvmes6LdsXdUwtON2
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

-->

</rfc>

