<?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-03" 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="E." surname="Voit" fullname="Eric Voit">
      <organization abbrev="Cisco">Cisco Systems</organization>
      <address>
        <email>evoit@cisco.com</email>
      </address>
    </author>
    <author initials="S." surname="Bhandari" fullname="Shwetha Bhandari">
      <organization abbrev="Cisco">Cisco Systems</organization>
      <address>
        <email>shwethab@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="2020" month="September" day="30"/>

    <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 <xref target="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>

  <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.birkholz-rats-reference-interaction-model"/>. 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.birkholz-rats-reference-interaction-model"/> 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="tree-diagram" title="Tree Diagram">

<figure><artwork type="TREE"><![CDATA[
module: ietf-tpm-remote-attestation
  +--rw rats-support-structures
     +--rw compute-nodes!
     |  +--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
     +--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
     |     +--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?   leafref
     |           +--rw certificate-type?           enumeration
     +--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}?

  rpcs:
    +---x tpm12-challenge-response-attestation {taa:TPM12}?
    |  +---w input
    |  |  +---w tpm12-attestation-challenge
    |  |     +---w pcr-index*          pcr
    |  |     +---w nonce-value         binary
    |  |     +---w add-version?        boolean
    |  |     +---w certificate-name*   certificate-name-ref
    |  +--ro output
    |     +--ro tpm12-attestation-response* []
    |        +--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 rev-Major?   uint8
    |           |  |  +--ro rev-Minor?   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
    +---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
    |  +--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 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
    +---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="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.</t>

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

<t>&lt;tpm12-challenge-response-attestation&gt; - Allows a Verifier to request a quote of PCRs from a TPM1.2 compliant cryptoprocessor.  When one or more &lt;certificate-name&gt; is not provided, all TPM1.2 compliant cryptoprocessors will respond.</t>

<t>&lt;tpm20-challenge-response-attestation&gt; - Allows a Verifier to request a quote of PCRs from a TPM2.0 compliant cryptoprocessor.  When one or more &lt;certificate-name&gt; is not provided, all TPM2.0 compliant cryptoprocessors will respond.</t>

<t>&lt;log-retrieval&gt; - Allows a Verifier to acquire the evidence which was extended into specific PCRs.</t>

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

<t>container &lt;rats-support-structures&gt; - This exists when there are more than one TPM for a particular Attester.  This allows each specific TPM to identify on which &lt;compute-node&gt; it belongs.</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>

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

</section>
<section anchor="yang-module" title="YANG Module">
<figure><artwork type="YANG"><![CDATA[
<CODE BEGINS> file ietf-tpm-remote-attestation@2020-09-18.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 <shwethab@cisco.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-09-18" {
    description
      "Initial version";
    reference
      "draft-ietf-rats-yang-tpm-charra";
  }


  /*****************/
  /*   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.";
    }
  }

  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 compute-node-identifier {
    description
      "In a distributed system with multiple compute nodes
       this is the node identified by name and physical-index.";
    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";
    }
  }

  grouping tpm12-pcr-info-short {
    description
      "This structure is for defining a digest at release when the only
       information that is necessary is the release configuration.";
    uses tpm12-pcr-selection;
    leaf locality-at-release {
      type uint8;
      description
        "This SHALL be the locality modifier required to release the
         information (TPM 1.2 type TPM_LOCALITY_SELECTION)";
      reference
        "TPM Main Part 2 TPM Structures v1.2 July 2007
        Section 8.6";  
    }
    leaf digest-at-release {
      type binary;
      description
        "This SHALL be the digest of the PCR indices and PCR values
         to verify when revealing auth data (TPM 1.2 type
         TPM_COMPOSITE_HASH).";
      reference
        "TPM Main Part 2 TPM Structures v1.2 July 2007
        Section 5.4.1.";      
    }
  }

  grouping tpm12-version {
    description
      "This structure provides information relative the version of
      the TPM.";
    list version {
      description
        "This indicates the version of the structure
         (TPM 1.2 type TPM_STRUCT_VER). This MUST be 1.1.0.0.";
      reference
        "TPM Main Part 2 TPM Structures v1.2 July 2007
        Section 5.1.";  
      leaf major {
        type uint8;
        description
          "Indicates the major version of the structure.
           MUST be 0x01.";
      }
      leaf minor {
        type uint8;
        description
          "Indicates the minor version of the structure.
           MUST be 0x01.";
      }
      leaf rev-Major {
        type uint8;
        description
          "Indicates the rev major version of the structure.
           MUST be 0x00.";
      }
      leaf rev-Minor {
        type uint8;
        description
          "Indicates the rev minor version of the structure.
           MUST be 0x00.";
      }
    }
  }

  grouping tpm12-quote-info-common {
    description
      "These statements are within both quote variants of the TPM 1.2";
    reference
      "TPM Main Part 2 TPM Structures v1.2 July 2007, 
      Section 11.3 & 11.4.";
    leaf fixed {
      type binary;
      description
        "This SHALL always be the string 'QUOT' or 'QUO2'
         (length is 4 bytes).";
    }
    leaf external-data {
      type binary;
      description
        "160 bits of externally supplied data, typically a nonce.";
    }
    leaf signature-size {
      type uint32;
      description
       "The size of TPM 1.2 'signature' value.";
    }
    leaf signature {
      type binary;
      description
        "Signature over hash of tpm12-quote-info2'.";
    }
  }

  grouping tpm12-quote-info {
    description
      "This structure provides the mechanism for the TPM to quote the
       current values of a list of PCRs (as used by the TPM_Quote2
       command).";
    uses tpm12-version;
    leaf digest-value {
      type binary;
      description
        "This SHALL be the result of the composite hash algorithm using
         the current values of the requested PCR indices
         (TPM 1.2 type TPM_COMPOSITE_HASH.)";
    }
  }

  grouping tpm12-quote-info2 {
    description
      "This structure provides the mechanism for the TPM to quote the
       current values of a list of PCRs
       (as used by the TPM_Quote2 command).";
    leaf tag {
      type uint8;
      description
        "This SHALL be TPM_TAG_QUOTE_INFO2.";
    }
    uses tpm12-pcr-info-short;
  }

  grouping tpm12-cap-version-info {
    description
      "TPM returns the current version and revision of the TPM 1.2 .";
    list TPM_PCR_COMPOSITE {
      description
        "The TPM 1.2 TPM_PCRVALUEs for the pcr-indices.";
      reference
        "TPM Main Part 2 TPM Structures v1.2 July 2007, Section 8.2";
      uses tpm12-pcr-selection;
      leaf value-size {
        type uint32;
        description
          "This SHALL be the size of the 'tpm12-pcr-value' field
           (not the number of PCRs).";
      }
      leaf-list tpm12-pcr-value {
        type binary;
        description
          "The list of TPM_PCRVALUEs from each PCR selected in sequence
           of tpm12-pcr-selection.";
      }
      list version-info {
        description
          "An optional output parameter from a TPM 1.2 TPM_Quote2.";
        leaf tag {
          type uint16;  /* This should be converted into an ENUM */
          description
            "The TPM 1.2 version and revision
             (TPM 1.2 type TPM_STRUCTURE_TAG).
             This MUST be TPM_CAP_VERSION_INFO (0x0030)";
        }
        uses tpm12-version;
        leaf spec-level {
          type uint16;
          description
            "A number indicating the level of ordinals supported.";
        }
        leaf errata-rev {
          type uint8;
          description
            "A number indicating the errata version of the
             specification.";
        }
        leaf tpm-vendor-id {
          type binary;
          description
            "The vendor ID unique to each TPM manufacturer.";
        }
        leaf vendor-specific-size {
          type uint16;
          description
            "The size of the vendor-specific area.";
        }
        leaf vendor-specific {
          type binary;
          description
            "Vendor specific information.";
        }
      }
    }
  }

  grouping tpm12-pcr-composite {
    description
      "The actual values of the selected PCRs (a list of TPM_PCRVALUEs
       (binary) and associated metadata for TPM 1.2.";
    list TPM_PCR_COMPOSITE {
      description
        "The TPM 1.2 TPM_PCRVALUEs for the pcr-indices.";
      reference
        "TPM Main Part 2 TPM Structures v1.2 July 2007, Section 8.2";
      uses tpm12-pcr-selection;
      leaf value-size {
        type uint32;
        description
          "This SHALL be the size of the 'tpm12-pcr-value' field
           (not the number of PCRs).";
      }
      leaf-list tpm12-pcr-value {
        type binary;
        description
          "The list of TPM_PCRVALUEs from each PCR selected in sequence
           of tpm12-pcr-selection.";
      }
    }
  }

  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;
    uses compute-node-identifier;
    uses tpm12-quote-info-common;
    choice tpm12-quote {
      mandatory true;
      description
        "Either a tpm12-quote-info or tpm12-quote-info2, depending
         on whether TPM_Quote or TPM_Quote2 was used
         (cf. input field add-verson).";
      case tpm12-quote1 {
        description
          "BIOS/UEFI event logs";
        uses tpm12-quote-info;
        uses tpm12-pcr-composite;
      }
      case tpm12-quote2 {
        description
          "BIOS/UEFI event logs";
        uses tpm12-quote-info2;
      }
    }
  }

  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;
    uses compute-node-identifier;    
    list unsigned-pcr-values {
      description
        "PCR values in each PCR bank. This often should not be 
         necessary for TPM2, as the raw information needing 
         signature and hash validation will be coming from 
         the 'quote' leaf";  
      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 add-version {
          type boolean;
          description
            "Whether or not to include TPM_CAP_VERSION_INFO; if true,
             then TPM_Quote2 must be used to create the response.";
          reference
            "TPM Main Part 2 TPM Structures v1.2 July 2007, 
            Section 21.6";
        }
        leaf-list certificate-name {
          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 {
          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 {
      presence
        "Indicates that more than one TPM exists on a device.";
      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;
        uses compute-node-identifier;
        description
          "A components in this composite device that RATS which 
          supports TPM operations."; 
        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 {
          when "../../../compute-nodes";
          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" 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="yang-module-1" 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="RFC5246"/>.</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 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.birkholz-rats-reference-interaction-model">
<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='July' day='7' 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 for each interaction model, individually.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-birkholz-rats-reference-interaction-model-03' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-birkholz-rats-reference-interaction-model-03.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='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="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="RFC5246" target='https://www.rfc-editor.org/info/rfc5246'>
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
<author initials='T.' surname='Dierks' fullname='T. Dierks'><organization /></author>
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /></author>
<date year='2008' month='August' />
<abstract><t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol.  The TLS protocol provides communications security over the Internet.  The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5246'/>
<seriesInfo name='DOI' value='10.17487/RFC5246'/>
</reference>




    </references>



  </back>

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

-->

</rfc>

