<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-opsawg-secure-tacacs-yang-12" category="std" consensus="true" submissionType="IETF" obsoletes="9105" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="YANG for TACACS+ over TLS">A YANG Data Model for Terminal Access Controller Access-Control System Plus (TACACS+)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-opsawg-secure-tacacs-yang-12"/>
    <author fullname="Mohamed Boucadair" role="editor">
      <organization>Orange</organization>
      <address>
        <email>mohamed.boucadair@orange.com</email>
      </address>
    </author>
    <author fullname="Bo Wu">
      <organization>Huawei Technologies</organization>
      <address>
        <email>mlana.wubo@huawei.com</email>
      </address>
    </author>
    <date year="2025" month="June" day="24"/>
    <area>Operations and Management</area>
    <workgroup>Operations and Management Area Working Group</workgroup>
    <keyword>TLS</keyword>
    <keyword>device management</keyword>
    <keyword>network operator</keyword>
    <keyword>provider network</keyword>
    <keyword>AAA</keyword>
    <keyword>authentication</keyword>
    <keyword>authorization</keyword>
    <keyword>accounting</keyword>
    <abstract>
      <?line 40?>

<t>This document defines a Terminal Access Controller Access-Control
   System Plus (TACACS+) client YANG module that augments the System
   Management data model, defined in RFC 7317, to allow devices to make
   use of TACACS+ servers for centralized Authentication, Authorization,
   and Accounting (AAA). Specifically, this document defines a YANG module for TACACS+ over TLS 1.3.</t>
      <t>This document obsoletes RFC 9105.</t>
    </abstract>
  </front>
  <middle>
    <?line 50?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The System Management data model <xref target="RFC7317"/> defines separate functionality to support local and Remote Authentication Dial In User Service (RADIUS) authentication:</t>
      <dl>
        <dt>User Authentication Model:</dt>
        <dd>
          <t>Defines a list of user names with
associated passwords and a configuration leaf to decide the order
in which local or RADIUS authentication is used.</t>
        </dd>
        <dt>RADIUS Client Model:</dt>
        <dd>
          <t>Defines a list of RADIUS servers used by a
 device for centralized user authentication.</t>
        </dd>
      </dl>
      <t><xref target="RFC9105"/> defines a YANG module ("ietf-system-tacacs-plus") that augments the System Management data model <xref target="RFC7317"/> for the management of Terminal Access Controller Access-Control System Plus (TACACS+) clients as an alternative to RADIUS servers <xref target="RFC2865"/>. Typically, the "ietf-system-tacacs-plus" module is used to configure a TACACS+ client on a device to support deployment scenarios with centralized authentication, authorization, and accounting servers.</t>
      <t>This document defines a YANG module for managing TACACS+ clients (<xref target="sec-module"/>), including TACACS+ over TLS 1.3 clients <xref target="I-D.ietf-opsawg-tacacs-tls13"/>. This document obsoletes <xref target="RFC9105"/>.</t>
      <t>The YANG module in this document conforms to the Network Management
   Datastore Architecture (NMDA) defined in <xref target="RFC8342"/>.</t>
      <section anchor="changes-since-rfc-9105">
        <name>Changes Since RFC 9105</name>
        <t>The following changes have been made to <xref target="RFC9105"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Add support for TLS <xref target="I-D.ietf-opsawg-tacacs-tls13"/></t>
          </li>
          <li>
            <t>Add a constraint to ensure that the list of servers is unique per address/port number</t>
          </li>
          <li>
            <t>Update the description of 'address' to be consistent with the type</t>
          </li>
          <li>
            <t>Fix a must statement under 'tacacs-plus'</t>
          </li>
          <li>
            <t>Fix errors in the example provided in Appendix A of <xref target="RFC9105"/></t>
          </li>
          <li>
            <t>Add an example to illustrate the use of VRF</t>
          </li>
          <li>
            <t>Add new examples to illustrate the use of TACACS+TLS data nodes</t>
          </li>
        </ul>
        <t>Detailed YANG changes are listed in <xref target="sec-module"/>.</t>
      </section>
      <section anchor="editorial-note-to-be-removed-by-rfc-editor">
        <name>Editorial Note (To be removed by RFC Editor)</name>
        <ul empty="true">
          <li>
            <t>Note to the RFC Editor: This section is to be removed prior to publication.</t>
          </li>
        </ul>
        <t>This document 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.</t>
        <t>Please apply the following replacements:</t>
        <ul spacing="normal">
          <li>
            <t>XXXX --&gt; the assigned RFC number for this I-D</t>
          </li>
          <li>
            <t>SSSS --&gt; the assigned RFC number for <xref target="I-D.ietf-opsawg-tacacs-tls13"/></t>
          </li>
          <li>
            <t>TBD  --&gt; the assigned port number in <xref section="7" sectionFormat="of" target="I-D.ietf-opsawg-tacacs-tls13"/></t>
          </li>
          <li>
            <t>2024-12-11 --&gt; the actual date of the publication of this document</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>The terminology for describing YANG data models is defined in
   <xref target="RFC7950"/>.</t>
      <t>The document uses the terms defined in <xref section="2" sectionFormat="of" target="I-D.ietf-opsawg-tacacs-tls13"/> and <xref section="3" sectionFormat="of" target="RFC8907"/>.</t>
      <t>'client' refers to TACACS+ client, while 'server' refers to TACACS+ server.</t>
      <section anchor="tree-diagrams">
        <name>Tree Diagrams</name>
        <t>The tree diagram used in this document follows the notation defined
   in <xref target="RFC8340"/>.</t>
      </section>
    </section>
    <section anchor="design-of-the-tacacs-data-model">
      <name>Design of the TACACS+ Data Model</name>
      <t>This module is used to configure a TACACS+ client on a device to
   support deployment scenarios with centralized authentication,
   authorization, and accounting servers.  Authentication is used to
   validate a user's username and password, authorization allows the
   user to access and execute commands at various privilege levels
   assigned to the user, and accounting keeps track of the activity of a
   user who has accessed the device.</t>
      <t>The "ietf-system-tacacs-plus" module augments the '/sys:system' path
   defined in the "ietf-system" module with the contents of the 'tacacs-plus'
   grouping.  Therefore, a device can use local, RADIUS, or
   TACACS+ authentication to validate users who attempt to access the
   device by several mechanisms, e.g., a command line interface or a
   web-based user interface.</t>
      <t>The 'server' list, which is directly under the 'tacacs-plus'
   container, holds a list of TACACS+ servers and uses 'server-type' to
   distinguish between Authentication, Authorization, and Accounting
   (AAA) services. The list of servers is for redundancy.</t>
      <t>When there are multiple interfaces connected to a TACACS+ client or
   server, the source address of outgoing TACACS+ packets could be
   specified, or the source address could be specified through the
   interface IP address setting or derived from the outbound interface
   from the local Forwarding Information Base (FIB). For a TACACS+
   server located in a Virtual Private Network (VPN), a VPN Routing and
   Forwarding (VRF) instance needs to be specified.</t>
      <t>The 'statistics' container under the 'server' list is a collection of
   read-only counters for sent and received messages from a configured
   server.</t>
      <t>The YANG module for TACACS+ client has the structure shown in <xref target="tree-overview"/>.</t>
      <figure anchor="tree-overview">
        <name>Tree Structure Overview</name>
        <artwork><![CDATA[
augment /sys:system:
  +--rw tacacs-plus
     +--rw client-credentials* [id] {credential-reference}?
     |  +--rw id                       string
     |  +--rw (auth-type)?
     |     +--:(certificate)
     |     |  ...
     |     +--:(raw-public-key) {tlsc:client-ident-raw-public-key}?
     |     |  ...
     |     +--:(tls13-epsk) {tlsc:client-ident-tls13-epsk}?
     |        ...
     +--rw server-credentials* [id] {credential-reference}?
     |  +--rw id                 string
     |  +--rw ca-certs!
     |  |  ...
     |  +--rw ee-certs!
     |  |  ...
     |  +--rw raw-public-keys! {tlsc:server-auth-raw-public-key}?
     |  |  ...
     |  +--rw tls13-epsks?       empty
     |          {tlsc:server-auth-tls13-epsk}?
     +--rw server* [name]
        +--rw name                           string
        +--rw server-type
        |       tacacs-plus-server-type
        +--rw domain-name?                   inet:domain-name
        +--rw sni-enabled?                   boolean
        +--rw address                        inet:host
        +--rw port?                          inet:port-number
        +--rw (security)
        |  +--:(tls)
        |  |  +--rw client-identity!
        |  |  |  +--rw (ref-or-explicit)?
        |  |  |     +--:(ref)
        |  |  |     |  +--rw credentials-reference?
        |  |  |     |          sys-tcs-plus:client-credentials-ref
        |  |  |     |          {credential-reference}?
        |  |  |     +--:(explicit)
        |  |  |        +--rw (auth-type)?
        |  |  |           +--:(certificate)
        |  |  |           |  ...
        |  |  |           +--:(raw-public-key)
        |  |  |           |     {tlsc:client-ident-raw-public-key}?
        |  |  |           |  ...
        |  |  |           +--:(tls13-epsk)
        |  |  |                 {tlsc:client-ident-tls13-epsk}?
        |  |  |              ...
        |  |  +--rw server-authentication
        |  |  |  +--rw (ref-or-explicit)?
        |  |  |     +--:(ref)
        |  |  |     |  +--rw credentials-reference?
        |  |  |     |          sys-tcs-plus:server-credentials-ref
        |  |  |     |          {credential-reference}?
        |  |  |     +--:(explicit)
        |  |  |        +--rw ca-certs!
        |  |  |        |  ...
        |  |  |        +--rw ee-certs!
        |  |  |        |  ...
        |  |  |        +--rw raw-public-keys!
        |  |  |        |       {tlsc:server-auth-raw-public-key}?
        |  |  |        |  ...
        |  |  |        +--rw tls13-epsks?             empty
        |  |  |                {tlsc:server-auth-tls13-epsk}
        |  |  +--rw hello-params {tlscmn:hello-params}?
        |  |     +--rw tls-versions
        |  |     |  +--rw min?   identityref
        |  |     |  +--rw max?   identityref
        |  |     +--rw cipher-suites
        |  |        +--rw cipher-suite*
        |  |                tlscsa:tls-cipher-suite-algorithm
        |  +--:(obfuscation)
        |     +--rw shared-secret?           string
        +--rw (source-type)?
        |  +--:(source-ip)
        |  |  +--rw source-ip?               inet:ip-address
        |  +--:(source-interface)
        |     +--rw source-interface?        if:interface-ref
        +--rw vrf-instance?
        |       -> /ni:network-instances/network-instance/name
        +--rw single-connection?             boolean
        +--rw timeout?                       uint16
        +--ro statistics
           +--ro discontinuity-time?    yang:date-and-time
           +--ro connection-opens?      yang:counter64
           +--ro connection-closes?     yang:counter64
           +--ro connection-aborts?     yang:counter64
           +--ro connection-failures?   yang:counter64
           +--ro connection-timeouts?   yang:counter64
           +--ro messages-sent?         yang:counter64
           +--ro messages-received?     yang:counter64
           +--ro errors-received?       yang:counter64
           +--ro sessions?              yang:counter64
           +--ro cert-errors?           yang:counter64
           +--ro rpk-errors?            yang:counter64
                   {tlsc:server-auth-raw-public-key}?
]]></artwork>
      </figure>
      <t>Specifically, the module is designed to cover the following key requirements specified in <xref target="I-D.ietf-opsawg-tacacs-tls13"/>:</t>
      <ul spacing="normal">
        <li>
          <t>TLS 1.3 <xref target="RFC8446"/> <bcp14>MUST</bcp14> be used for transport.</t>
        </li>
        <li>
          <t>Earlier TLS versions <bcp14>MUST NOT</bcp14> be used.</t>
        </li>
        <li>
          <t>The cipher suites offered or accepted <bcp14>SHOULD</bcp14> be configurable.</t>
        </li>
        <li>
          <t>Implementations <bcp14>MAY</bcp14> support Raw Public Keys (RPKs) and Pre-Shared Keys (PSKs).</t>
        </li>
        <li>
          <t>Implementations <bcp14>MUST</bcp14> support the ability to configure the server's domain name, so that it may be included in the TLS Server Name Indication (SNI) extension.</t>
        </li>
      </ul>
      <t>The following new data nodes are supported compared to <xref target="RFC9105"/>:</t>
      <dl>
        <dt>'client-credentials' and 'server-credentials':</dt>
        <dd>
          <t>Defines a set credentials that can be globally provisioned and then referenced under specific servers.</t>
        </dd>
        <dt>'domain-name':</dt>
        <dd>
          <t>Provides a domain name of the server per <xref section="3.3" sectionFormat="of" target="I-D.ietf-opsawg-tacacs-tls13"/>. This is the TLS TACACS+ server's domain name that is  included in the SNI extension. This domain name is distinct from the IP address/hostname used for the underlying transport connection.</t>
        </dd>
        <dt>'sni-enabled':</dt>
        <dd>
          <t>Controls activation of Server Name Indication (SNI) (<xref section="3" sectionFormat="of" target="RFC6066"/>). This parameter can be used only if a domain name is provided.</t>
        </dd>
        <dt>'client-identity':</dt>
        <dd>
          <t>Specifies the identity credentials that the client may present when
establishing a connection to a server. Client identities can be configured at the top level and then referenced for specific server instances. Alternatively, client identities can be configured explicitly under each server instance.</t>
        </dd>
        <dt>'server-authentication':</dt>
        <dd>
          <t>Specifies how a client authenticates servers. Server credentials can be configured at the top level and then referenced for specific server instances. Alternatively, client identities can be configured explicitly under each server instance.</t>
        </dd>
        <dt>'hello-params':</dt>
        <dd>
          <t>Controls TLS versions and cipher suites to be used when establishing TLS sessions.</t>
        </dd>
        <dt>'discontinuity-time':</dt>
        <dd>
          <t>The time on the most recent occasion at which the client suffered a discontinuity
(a configuration action to reset all counters, re-initialization, etc.).</t>
        </dd>
        <dt>'cert-errors':</dt>
        <dd>
          <t>Number of connection failures due to certificate issues.</t>
        </dd>
        <dt>'rpk-errors':</dt>
        <dd>
          <t>Number of raw public key related connection failures.</t>
        </dd>
      </dl>
    </section>
    <section anchor="sec-module">
      <name>TACACS+ Client Module</name>
      <t>This YANG module uses types and groupings defined in <xref target="RFC6991"/>, <xref target="RFC8341"/>, <xref target="RFC8343"/>, <xref target="RFC8529"/>, <xref target="RFC9640"/>, <xref target="RFC9641"/>,
<xref target="RFC9642"/>, and <xref target="RFC9645"/>.</t>
      <t>The module augments <xref target="RFC7317"/>.</t>
      <t>The module also cites <xref target="RFC6520"/>, <xref target="RFC9257"/>, and <xref target="RFC9258"/>.</t>
      <sourcecode type="yang"><![CDATA[
<CODE BEGINS> file "ietf-system-tacacs-plus@2025-01-23.yang"
module ietf-system-tacacs-plus {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-system-tacacs-plus";
  prefix sys-tcs-plus;

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-system {
    prefix sys;
    reference
      "RFC 7317: A YANG Data Model for System Management";
  }
  import ietf-netconf-acm {
    prefix nacm;
    reference
      "RFC 8341: Network Configuration Access Control Model";
  }
  import ietf-interfaces {
    prefix if;
    reference
      "RFC 8343: A YANG Data Model for Interface Management";
  }
  import ietf-network-instance {
    prefix ni;
    reference
      "RFC 8529: YANG Data Model for Network Instances";
  }
  import ietf-crypto-types {
    prefix ct;
    reference
      "RFC 9640: YANG Data Types and Groupings for Cryptography";
  }
  import ietf-truststore {
    prefix ts;
    reference
      "RFC 9641: A YANG Data Model for a Truststore";
  }
  import ietf-keystore {
    prefix ks;
    reference
      "RFC 9642: A YANG Data Model for a Keystore";
  }
  import ietf-tls-common {
    prefix tlscmn;
    reference
      "RFC 9645: YANG Groupings for TLS Clients and TLS Servers";
  }
  import ietf-tls-client {
    prefix tlsc;
    reference
      "RFC 9645: YANG Groupings for TLS Clients and TLS Servers";
  }

  organization
    "IETF OPSAWG (Operations and Management Area Working Group)";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
     WG List:  <mailto:opsawg@ietf.org>

     Editor:   Mohamed Boucadair
               <mailto:mohamed.boucadair@orange.com>
     Author:   Bo Wu
               <lana.wubo@huawei.com>
     Author:   Guangying Zheng
               <zhengguangying@huawei.com>";
  description
    "This module provides management of TACACS+ clients.

     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.

     Copyright (c) 2025 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 Revised 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).

     All revisions of IETF and IANA published modules can be found
     at the YANG Parameters registry
     (https://www.iana.org/assignments/yang-parameters).

     This version of this YANG module is part of RFC XXXX; see the
     RFC itself for full legal notices.";

  revision 2025-01-23 {
    description
      "This revision adds TLS support. Specifically, this revision
       adds:
         - a new feature 'credential-reference'
         - a new container 'client-credentials'
         - a new container 'server-credentials'
         - a new leaf 'domain-name'
         - a new leaf 'sni-enabled'
         - TLS as a new security choice
         - a new leaf 'discontinuity-time' under 'statistics'
         - a new leaf 'cert-errors' under 'statistics'
         - a new leaf 'rpk-errors' under 'statistics'
       Also, this revision:
         - updates the reference of 'tacacs-plus' identity
           to also cite RFC SSSS
         - fixes a must statement under 'tacacs-plus' by adding
           a missing prefix
         - requires that the servers list must be unique per
           address/port number.
         - updates the description of the 'name' under 'server'
           list to better reflect the intended use and clarifies
           the difference with the new domain-name
         - updates the description of the 'address' to be
           consistent with the type
         - removes the default statement for the 'port' under
           'server' list because a distinct default port number
           is used for TACACS+TLS
         - updates the 'port' leaf under 'server' list to enumerate
           the various TACACS+ default port numbers
         - added a constraint on the VRF with 'source-interface'
           is also provided
         - updates the description of timeout to remove redundant
           text with the default statement";
    reference
      "RFC XXXX: A YANG Data Model for Terminal Access Controller
                 Access-Control System Plus (TACACS+)";
  }

  revision 2021-08-05 {
    description
      "Initial revision.";
    reference
      "RFC 9105: A YANG Data Model for Terminal Access Controller
                 Access-Control System Plus (TACACS+)";
  }

  feature credential-reference {
    description
      "Indicates whether service credentials references are
       supported.";
  }

  identity tacacs-plus {
    base sys:authentication-method;
    description
      "Indicates AAA operation using TACACS+.";
    reference
      "RFC SSSS: Terminal Access Controller Access-Control
                 System Plus (TACACS+) over TLS 1.3
       RFC 8907: The TACACS+ Protocol";
  }

  typedef tacacs-plus-server-type {
    type bits {
      bit authentication {
        description
          "Indicates that the TACACS+ server is providing
           authentication services.";
      }
      bit authorization {
        description
          "Indicates that the TACACS+ server is providing
           authorization services.";
      }
      bit accounting {
        description
          "Indicates that the TACACS+ server is providing accounting
           services.";
      }
    }
    description
      "The type can be set to authentication, authorization,
       accounting, or any combination of the three types.";
  }

  typedef client-credentials-ref {
    type leafref {
      path "/sys:system/sys-tcs-plus:tacacs-plus"
         + "/sys-tcs-plus:client-credentials/sys-tcs-plus:id";
    }
    description
      "Defines a type to reference client credentials.";
  }

  typedef server-credentials-ref {
    type leafref {
      path "/sys:system/sys-tcs-plus:tacacs-plus"
         + "/sys-tcs-plus:server-credentials/sys-tcs-plus:id";
    }
    description
      "Defines a type to reference server credentials.";
  }

  grouping statistics {
    description
      "Grouping for TACACS+ statistics attributes, including TLS
       specifics.";
    container statistics {
      config false;
      description
        "A collection of server-related statistics objects.";
      leaf discontinuity-time {
        type yang:date-and-time;
        description
          "The time on the most recent occasion at which the
           TACACS+ client suffered a discontinuity. Examples of 
           discontinuity can be a configuration action to reset
           all counters, re-initialization of the system, or any
           other events that prevent reliable contiguous tracking
           of counters.";
      }
      leaf connection-opens {
        type yang:counter64;
        description
          "Number of new connection requests sent to the server,
           e.g., socket open.";
      }
      leaf connection-closes {
        type yang:counter64;
        description
          "Number of connection close requests sent to the server,
           e.g., socket close.";
      }
      leaf connection-aborts {
        type yang:counter64;
        description
          "Number of aborted connections to the server. These do
           not include connections that are closed gracefully.";
      }
      leaf connection-failures {
        type yang:counter64;
        description
          "Number of connection failures to the server.";
      }
      leaf connection-timeouts {
        type yang:counter64;
        description
          "Number of connection timeouts to the server.";
      }
      leaf messages-sent {
        type yang:counter64;
        description
          "Number of messages sent to the server.";
      }
      leaf messages-received {
        type yang:counter64;
        description
          "Number of messages received from the server.";
      }
      leaf errors-received {
        type yang:counter64;
        description
          "Number of error messages received from the server.";
      }
      leaf sessions {
        type yang:counter64;
        description
          "Number of TACACS+ sessions completed with the server.
           If the Single Connection Mode was not enabled, the number
           of sessions is the same as the number of
           'connection-closes'. If the Single Connection Mode was
           enabled, a single TCP connection may contain multiple
           TACACS+ sessions.";
      }
      leaf cert-errors {
        type yang:counter64;
        description
          "Number of connection failures due to certificate
           issues.";
      }
      leaf rpk-errors {
        if-feature "tlsc:server-auth-raw-public-key";
        type yang:counter64;
        description
          "Number of RPK-related connection failures.";
      }
    }
  }

  grouping certificate {
    description
      "Specifies a certificate that can be used for client
       identity.";
    uses "ks:inline-or-keystore-end-entity-cert-with-key-"
       + "grouping" {
      refine "inline-or-keystore/inline/inline-definition" {
        must 'not(public-key-format) or derived-from-or-self'
           + '(public-key-format, "ct:subject-public-key-'
           + 'info-format")';
      }
      refine "inline-or-keystore/central-keystore/"
           + "central-keystore-reference/asymmetric-key" {
        must 'not(deref(.)/../ks:public-key-format) or '
           + 'derived-from-or-self(deref(.)/../ks:public-'
           + 'key-format, "ct:subject-public-key-info-'
           + 'format")';
      }
    }
  }

  grouping raw-private-key {
    description
      "Specifies raw private key (RPK) that can be used for
       client identity.";
    uses ks:inline-or-keystore-asymmetric-key-grouping {
      refine "inline-or-keystore/inline/inline-definition" {
        must 'not(public-key-format) or derived-from-or-self'
           + '(public-key-format, "ct:subject-public-key-'
           + 'info-format")';
      }
      refine "inline-or-keystore/central-keystore/"
           + "central-keystore-reference" {
        must 'not(deref(.)/../ks:public-key-format) or '
           + 'derived-from-or-self(deref(.)/../ks:public-'
           + 'key-format, "ct:subject-public-key-info-format")';
      }
    }
  }

  grouping tls13-epsk {
    description
      "An External Pre-Shared Key (EPSK) is established or
       provisioned out-of-band, i.e., not from a TLS connection.
       An EPSK is a tuple of (Base Key, External Identity, Hash).
       When Pre-Shared Keys (PSKs) are provisioned out of band,
       the PSK identity and the Key Derivation Function (KDF) hash
       algorithm to be used with the PSK must also be
       provisioned.";
    reference
      "RFC 8446: The Transport Layer Security (TLS) Protocol
                 Version 1.3, Section 4.2.11
       RFC 9257: Guidance for External Pre-Shared Key (PSK) Usage
                 in TLS, Section 6
       RFC 9258: Importing External Pre-Shared Keys (PSKs) for
                 TLS 1.3, Section 5.1";
    uses ks:inline-or-keystore-symmetric-key-grouping;
    leaf external-identity {
      type string;
      mandatory true;
      description
        "A sequence of bytes used to identify an EPSK. A label for
         a pre-shared key established externally.";
      reference
        "RFC 8446: The Transport Layer Security (TLS) Protocol
                   Version 1.3, Section 4.2.11
         RFC 9257: Guidance for External Pre-Shared Key (PSK)
                   Usage in TLS, Section 4.1";
    }
    leaf hash {
      type tlscmn:epsk-supported-hash;
      default "sha-256";
      description
        "For externally established PSKs, the Hash algorithm must be
         set when the PSK is established or default to SHA-256 if no
         such algorithm is defined.";
      reference
        "RFC 8446: The Transport Layer Security (TLS) Protocol
                   Version 1.3, Section 4.2.11";
    }
    leaf context {
      type string;
      description
        "The context used to determine the EPSK, if any exists. For
         example, context may include information about peer roles or
         identities to mitigate Selfie-style reflection attacks.";
      reference
        "RFC 9258: Importing External Pre-Shared Keys (PSKs) for
                   TLS 1.3, Section 5.1 ";
    }
    leaf target-protocol {
      type uint16;
      description
        "Specifies the protocol for which a PSK is imported for
         use.";
      reference
        "RFC 9258: Importing External Pre-Shared Keys (PSKs) for
                   TLS 1.3, Section 3 ";
    }
    leaf target-kdf {
      type uint16;
      description
        "The KDF for which a PSK is imported for use.";
      reference
        "RFC 9258: Importing External Pre-Shared Keys (PSKs) for
                   TLS 1.3, Section 3";
    }
  }

  grouping client-identity {
    description
      "Identity credentials that a TLS client may present when
       establishing a connection to a TLS server. When configured,
       and requested by the TLS server when establishing a TLS
       session, these credentials are passed in the Certificate
       message.";
    reference
      "RFC 8446: The Transport Layer Security (TLS) Protocol
                 Version 1.3, Section 4.4.2";
    choice auth-type {
      description
        "A choice amongst authentication types.";
      case certificate {
        container certificate {
          description
            "Specifies the client identity using a certificate.";
          uses certificate;
        }
      }
      case raw-public-key {
        if-feature "tlsc:client-ident-raw-public-key";
        container raw-private-key {
          description
            "Specifies the client identity using RPK.";
          uses raw-private-key;
        }
      }
      case tls13-epsk {
        if-feature "tlsc:client-ident-tls13-epsk";
        container tls13-epsk {
          description
            "An EPSK is established or provisioned out-of-band.";
          uses tls13-epsk;
        }
      }
    }
  }

  grouping client-identity-with-ref {
    description
      "Identity credentials that the TLS client may present when
       establishing a connection to a TLS server. When configured,
       and requested by the TLS server when establishing a TLS
       session, these credentials are passed in the Certificate
       message.";
    choice ref-or-explicit {
      description
        "A choice between a reference or explicit configuration.";
      case ref {
        description
          "Provides a reference to a client identity.";
        leaf credentials-reference {
          if-feature "credential-reference";
          type sys-tcs-plus:client-credentials-ref;
          description
            "Specifies the client credentials reference.";
        }
      }
      case explicit {
        description
          "Explicit configuration of the client identity.";
        uses client-identity;
      }
    }
  }

  grouping server-authentication {
    description
      "Specifies how a TLS client can authenticate TLS servers.
       Any combination of credentials is additive and unordered.";
    container ca-certs {
      presence "Indicates that Certification Authority (CA) 
                certificates have been configured.
                This statement is present so the mandatory descendant
                nodes do not imply that this node must be 
                configured.";
      description
        "A set of CA certificates used by the TLS client to
         authenticate TLS server certificates.
         A server certificate is authenticated if it has a valid
         chain of trust to a configured CA certificate.";
      reference
        "RFC 9641: A YANG Data Model for a Truststore";
      uses ts:inline-or-truststore-certs-grouping;
    }
    container ee-certs {
      presence "Indicates that End Entity (EE) certificates have been
                configured.
                This statement is present so the mandatory descendant
                nodes do not imply that this node must be 
                configured.";
      description
        "A set of server certificates (i.e., end entity certificates)
         used by a TLS client to authenticate certificates
         presented by TLS servers. A server certificate is
         authenticated if it is an exact match to a configured server
         certificate.";
      reference
        "RFC 9641: A YANG Data Model for a Truststore";
      uses ts:inline-or-truststore-certs-grouping;
    }
    container raw-public-keys {
      if-feature "tlsc:server-auth-raw-public-key";
      presence "Indicates that raw public keys have been configured.
                This statement is present so the mandatory descendant
                nodes do not imply that this node must be
                configured.";
      description
        "A set of raw public keys used by a TLS client to
         authenticate raw public keys presented by the TLS server.
         A raw public key is authenticated if it is an exact match
         to a configured raw public key.";
      reference
        "RFC 9641: A YANG Data Model for a Truststore";
      uses ts:inline-or-truststore-public-keys-grouping {
        refine "inline-or-truststore/inline/inline-definition/"
             + "public-key" {
          must 'derived-from-or-self(public-key-format,'
             + ' "ct:subject-public-key-info-format")';
        }
        refine "inline-or-truststore/central-truststore/"
             + "central-truststore-reference" {
          must 'not(deref(.)/../ts:public-key/ts:public-key-'
             + 'format[not(derived-from-or-self(., "ct:subject-'
             + 'public-key-info-format"))])';
        }
      }
    }
    leaf tls13-epsks {
      if-feature "tlsc:server-auth-tls13-epsk";
      type empty;
      description
        "Indicates that a TLS client can authenticate TLS servers
         using configured EPSKs.";
    }
  }

  grouping server-authentication-with-ref {
    description
      "Specifies how a TLS client can authenticate TLS servers.";
    choice ref-or-explicit {
      description
        "A choice between a reference of explicit configuration.";
      case ref {
        description
          "Provides a reference to server credentials.";
        leaf credentials-reference {
          if-feature "credential-reference";
          type sys-tcs-plus:server-credentials-ref;
          description
            "Specifies the server credentials reference.";
        }
      }
      case explicit {
        description
          "Explicit configuration of credentials of a server.";
        uses server-authentication;
      }
    }
  }

  grouping hello-params {
    description
      "Configurable parameters for the TLS Hello message.";
    reference
      "RFC SSSS: Terminal Access Controller Access-Control
                 System Plus (TACACS+) over TLS 1.3,
                 Section 5.1";
    uses tlscmn:hello-params-grouping {
      refine "tls-versions/min" {
        must "not(derived-from-or-self(current(), "
           + "'tlscmn:tls12'))" {
          error-message
            "TLS 1.2 is not supported as min TLS version";
        }
      }
      refine "tls-versions/max" {
        must "not(derived-from-or-self(current(), "
           + "'tlscmn:tls12'))" {
          error-message
            "TLS 1.2 is not supported as max TLS version";
        }
      }
    }
  }

  grouping tls-client {
    description
      "A grouping for configuring a TLS client without any
       consideration for how an underlying TCP session is
       established.";
    container client-identity {
      presence "Indicates that a TLS-level client identity has been
                configured.
                This statement is present so the mandatory descendant
                do not imply that this node must be configured.";
      description
        "Identity credentials that a TLS client may present when
         establishing a connection to a TLS server.";
      uses client-identity-with-ref;
    }
    container server-authentication {
      must 'credentials-reference or ca-certs or ee-certs or '
         + 'raw-public-keys or tls13-epsks';
      description
        "Specifies how a TLS client can authenticate TLS servers.";
      uses server-authentication-with-ref;
    }
    container hello-params {
      if-feature "tlscmn:hello-params";
      description
        "Configurable parameters for the TLS Hello message.";
      uses hello-params;
    }
  }

  grouping tacacs-plus {
    description
      "Grouping for TACACS+ attributes.";
    container tacacs-plus {
      must "not(derived-from-or-self(../sys:authentication"
         + "/sys:user-authentication-order, "
         + "'sys-tcs-plus:tacacs-plus'))"
         + " or bit-is-set(server/server-type,'authentication')" {
        error-message
          "When 'tacacs-plus' is used as a system authentication
           method, a TACACS+ authentication server must be
           configured.";
        description
          "When 'tacacs-plus' is used as an authentication method,
           a TACACS+ server must be configured.";
      }
      description
        "Container for TACACS+ configurations and operations.";
      list client-credentials {
        if-feature "credential-reference";
        key "id";
        description
          "Identity credentials that a TLS client may present
           when establishing a connection to a TLS server.
           A list of client credentials that can be referenced
           when configuring server instances.";
        nacm:default-deny-write;
        leaf id {
          type string;
          description
            "An identifier that uniquely identifies a client 
             identity within the device configuration.";
        }
        uses client-identity;
      }
      list server-credentials {
        if-feature "credential-reference";
        key "id";
        description
          "Identity credentials that a TLS client may use
           to authenticate a TLS server.";
        nacm:default-deny-write;
        leaf id {
          type string;
          description
            "An identifier that uniquely identify server
             credentials within the device configuration.";
        }
        uses server-authentication;
      }
      list server {
        key "name";
        unique "address port";
        ordered-by user;
        description
          "List of TACACS+ servers used by the device.";
        leaf name {
          type string;
          description
            "A name that is used to uniquely identify a TACACS+
             server within the device configuration.
             This name is not to be confused with the domain-name.";
        }
        leaf server-type {
          type tacacs-plus-server-type;
          mandatory true;
          description
            "Server type: authentication/authorization/accounting and
             various combinations.";
        }
        leaf domain-name {
          type inet:domain-name;
          description
            "Provides a domain name of the TACACS+ server.";
          reference
            "RFC SSSS: Terminal Access Controller Access-Control
                       System Plus (TACACS+) over TLS 1.3,
                       Section 3.4.2";
        }
        leaf sni-enabled {
          type boolean;
          must '../domain-name' {
            error-message
              "A domain name must be provided to make use of Server
               Name Indication (SNI).";
          }
          description
            "Enables the use of SNI, when set to true. Disables the
             use of SNI, when set to false.";
          reference
            "RFC 6066: Transport Layer Security (TLS) Extensions:
                       Extension Definitions, Section 3
             RFC SSSS: Terminal Access Controller Access-Control
                       System Plus (TACACS+) over TLS 1.3,
                       Section 3.4.2";
        }
        leaf address {
          type inet:host;
          mandatory true;
          description
            "The IP address or name of the TACACS+ server.";
        }
        leaf port {
          type inet:port-number;
          mandatory true;
          description
            "The port number of TACACS+ server.
             Default port number for legacy TACACS+ is 49,
             while it is TBD for TACACS+TLS.";
        }
        choice security {
          mandatory true;
          description
            "Security mechanism between TACACS+ client and server.";
          case tls {
            description
              "TLS is used to secure TACACS+ exchanges.";
            reference
              "RFC SSSS: Terminal Access Controller Access-Control
                         System Plus (TACACS+) over TLS 1.3";
            uses tls-client;
          }
          case obfuscation {
            leaf shared-secret {
              type string {
                length "1..max";
              }
              description
                "The shared secret, which is known to both the
                 TACACS+ client and server. TACACS+ server
                 administrators SHOULD configure a shared secret with
                 a minimum length of 16 characters.
                 It is highly recommended that this shared secret is
                 at least 32 characters long and sufficiently complex
                 with a mix of different character types,
                 i.e., upper case, lower case, numeric, and
                 punctuation.  Note that this security mechanism is
                 best described as 'obfuscation' and not 'encryption'
                 as it does not provide any meaningful integrity,
                 privacy, or replay protection.

                 The use of obfuscation is deprecated in favor
                 of TLS.

                 This choice is provided in the model to accommodate
                 installed base.";
              reference
                "RFC 8907: The TACACS+ Protocol
                 RFC SSSS: Terminal Access Controller Access-Control
                            System Plus (TACACS+) over TLS 1.3";
              nacm:default-deny-all;
            }
          }
        }
        choice source-type {
          description
            "The source address type for outbound TACACS+ packets.";
          case source-ip {
            leaf source-ip {
              type inet:ip-address;
              description
                "Specifies the source IP address for TACACS+ outbound
                 packets.";
            }
          }
          case source-interface {
            leaf source-interface {
              type if:interface-ref;
              description
                "Specifies the interface from which the IP address
                 is derived for use as the source for outbound
                 TACACS+ packets.";
            }
          }
        }
        leaf vrf-instance {
          type leafref {
            path "/ni:network-instances/ni:network-instance/ni:name";
          }
          must "(not(../source-interface)) or "
             + "(current() = /if:interfaces/if:interface"
             + "[if:name = current()/../source-interface]"
             + "/ni:bind-ni-name)" {
            error-message
              "VRF instance must match the network instance of the
               source interface.";
          }
          description
            "Specifies the VPN Routing and Forwarding (VRF) instance
             to use to communicate with the TACACS+ server.
             If 'source-interface' is configured, this value MUST 
             match the network instance bound to the source interface
             (via bind-ni-name).";
          reference
            "RFC 8529: YANG Data Model for Network Instances";
        }
        leaf single-connection {
          type boolean;
          default "false";
          description
            "Indicates whether the Single Connection Mode is enabled
             for the server.";
          reference
            "RFC 8907: The TACACS+ Protocol, Section 4.3";
        }
        leaf timeout {
          type uint16 {
            range "1..max";
          }
          units "seconds";
          default "5";
          description
            "The number of seconds that the device will wait for a
             response from each TACACS+ server before trying with a
             different server.";
        }
        uses statistics;
      }
    }
  }

  augment "/sys:system" {
    description
      "Augments the system model with the tacacs-plus data nodes.";
    uses tacacs-plus;
  }
}
<CODE ENDS>
]]></sourcecode>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>The same operational considerations discussed in <xref section="6" sectionFormat="of" target="I-D.ietf-opsawg-tacacs-tls13"/> apply for this document.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section is modeled after the template described in <xref section="3.7" sectionFormat="of" target="I-D.ietf-netmod-rfc8407bis"/>.</t>
      <t>The "ietf-ac-common" YANG module defines a data model that is
designed to be accessed via YANG-based management protocols, such as
NETCONF <xref target="RFC6241"/> and RESTCONF <xref target="RFC8040"/>. These YANG-based management protocols (1) have to
use a secure transport layer (e.g., SSH <xref target="RFC4252"/>, TLS <xref target="RFC8446"/>, and
QUIC <xref target="RFC9000"/>) and (2) have to use mutual authentication.</t>
      <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/>
   provides the means to restrict access for particular NETCONF or
   RESTCONF users to a preconfigured subset of all available NETCONF or
   RESTCONF protocol operations and content.</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).  All writable data nodes are likely to be
sensitive or vulnerable in some network environments.  Write
operations (e.g., edit-config) and delete operations to these data
nodes without proper protection or authentication can have a negative
effect on network operations.  The following subtrees and data nodes
have particular sensitivities/vulnerabilities:</t>
      <dl>
        <dt>'server':</dt>
        <dd>
          <t>This list contains the data nodes used
to control the TACACS+ servers used by the device. Unauthorized
access to this list could enable an attacker to assume complete
control over the device by pointing to a compromised TACACS+
server, or to modify the counters to hide attacks against the
device.</t>
        </dd>
        <dt>'shared-secret':</dt>
        <dd>
          <t>This leaf controls the key
known to both the TACACS+ client and server. Unauthorized access
to this leaf could make the device vulnerable to attacks;
therefore, it has been restricted using the "default-deny-all"
access control defined in <xref target="RFC8341"/>.  When setting, it is highly
recommended that the leaf is at least 32 characters long and
sufficiently complex with a mix of different character types,
i.e., upper case, lower case, numeric, and punctuation.</t>
        </dd>
        <dt>'client-identity' and 'server-authentication':</dt>
        <dd>
          <t>Any modification to a key or reference to a key may dramatically alter the implemented security policy. For this reason, the NACM extension "default-deny-write" has been set.</t>
        </dd>
      </dl>
      <t>This YANG module uses groupings from other YANG modules that define nodes that may be considered sensitive or vulnerable in network environments. Refer to <xref section="5.3" sectionFormat="of" target="RFC9642"/> and <xref section="5.3" sectionFormat="of" target="RFC9645"/> for information as to which nodes may be considered sensitive or vulnerable in network environments.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to update the following URI in the "ns" subregistry within
   the "IETF XML Registry" <xref target="RFC3688"/>:</t>
      <artwork><![CDATA[
   URI:  urn:ietf:params:xml:ns:yang:ietf-system-tacacs-plus
   Registrant Contact:  The IESG.
   XML:  N/A; the requested URI is an XML namespace.
]]></artwork>
      <t>IANA is requested to register the following YANG module in the "YANG Module
   Names" registry <xref target="RFC6020"/> within the "YANG Parameters" registry group:</t>
      <artwork><![CDATA[
   Name:  ietf-system-tacacs-plus
   Namespace:  urn:ietf:params:xml:ns:yang:ietf-system-tacacs-plus
   Prefix:  sys-tcs-plus
   Maintained by IANA?  N
   Reference:  RFC XXXX
]]></artwork>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7317">
          <front>
            <title>A YANG Data Model for System Management</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="August" year="2014"/>
            <abstract>
              <t>This document defines a YANG data model for the configuration and identification of some common system properties within a device containing a Network Configuration Protocol (NETCONF) server. This document also includes data node definitions for system identification, time-of-day management, user management, DNS resolver configuration, and some protocol operations for system management.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7317"/>
          <seriesInfo name="DOI" value="10.17487/RFC7317"/>
        </reference>
        <reference anchor="I-D.ietf-opsawg-tacacs-tls13">
          <front>
            <title>Terminal Access Controller Access-Control System Plus over TLS 1.3 (TACACS+ over TLS)</title>
            <author fullname="Thorsten Dahm" initials="T." surname="Dahm">
         </author>
            <author fullname="John Heasley" initials="J." surname="Heasley">
              <organization>NTT</organization>
            </author>
            <author fullname="dcmgash@cisco.com" initials="" surname="dcmgash@cisco.com">
              <organization>Cisco Systems, Inc.</organization>
            </author>
            <author fullname="Andrej Ota" initials="A." surname="Ota">
              <organization>Google Inc.</organization>
            </author>
            <date day="21" month="June" year="2025"/>
            <abstract>
              <t>   The Terminal Access Controller Access-Control System Plus (TACACS+)
   protocol provides device administration for routers, network access
   servers, and other networked computing devices via one or more
   centralized TACACS+ servers.  This document adds Transport Layer
   Security (TLS 1.3) support to TACACS+ and obsoletes former inferior
   security mechanisms.

   This document updates RFC 8907.


              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-opsawg-tacacs-tls13-23"/>
        </reference>
        <reference anchor="RFC8342">
          <front>
            <title>Network Management Datastore Architecture (NMDA)</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>Datastores are a fundamental concept binding the data models written in the YANG data modeling language to network management protocols such as the Network Configuration Protocol (NETCONF) and RESTCONF. This document defines an architectural framework for datastores based on the experience gained with the initial simpler model, addressing requirements that were not well supported in the initial model. This document updates RFC 7950.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8342"/>
          <seriesInfo name="DOI" value="10.17487/RFC8342"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <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="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC6066">
          <front>
            <title>Transport Layer Security (TLS) Extensions: Extension Definitions</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <date month="January" year="2011"/>
            <abstract>
              <t>This document provides specifications for existing TLS extensions. It is a companion document for RFC 5246, "The Transport Layer Security (TLS) Protocol Version 1.2". The extensions specified are server_name, max_fragment_length, client_certificate_url, trusted_ca_keys, truncated_hmac, and status_request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6066"/>
          <seriesInfo name="DOI" value="10.17487/RFC6066"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <date month="July" year="2013"/>
            <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="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability. There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content. This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
        <reference anchor="RFC8343">
          <front>
            <title>A YANG Data Model for Interface Management</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document defines a YANG data model for the management of network interfaces. It is expected that interface-type-specific data models augment the generic interfaces data model defined in this document. The data model includes definitions for configuration and system state (status information and counters for the collection of statistics).</t>
              <t>The YANG data model in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
              <t>This document obsoletes RFC 7223.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8343"/>
          <seriesInfo name="DOI" value="10.17487/RFC8343"/>
        </reference>
        <reference anchor="RFC8529">
          <front>
            <title>YANG Data Model for Network Instances</title>
            <author fullname="L. Berger" initials="L." surname="Berger"/>
            <author fullname="C. Hopps" initials="C." surname="Hopps"/>
            <author fullname="A. Lindem" initials="A." surname="Lindem"/>
            <author fullname="D. Bogdanovic" initials="D." surname="Bogdanovic"/>
            <author fullname="X. Liu" initials="X." surname="Liu"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document defines a network instance module. This module can be used to manage the virtual resource partitioning that may be present on a network device. Examples of common industry terms for virtual resource partitioning are VPN Routing and Forwarding (VRF) instances and Virtual Switch Instances (VSIs).</t>
              <t>The YANG data model in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8529"/>
          <seriesInfo name="DOI" value="10.17487/RFC8529"/>
        </reference>
        <reference anchor="RFC9640">
          <front>
            <title>YANG Data Types and Groupings for Cryptography</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="October" year="2024"/>
            <abstract>
              <t>This document presents a YANG 1.1 (RFC 7950) module defining identities, typedefs, and groupings useful to cryptographic applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9640"/>
          <seriesInfo name="DOI" value="10.17487/RFC9640"/>
        </reference>
        <reference anchor="RFC9641">
          <front>
            <title>A YANG Data Model for a Truststore</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="October" year="2024"/>
            <abstract>
              <t>This document presents a YANG module for configuring bags of certificates and bags of public keys that can be referenced by other data models for trust. Notifications are sent when certificates are about to expire.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9641"/>
          <seriesInfo name="DOI" value="10.17487/RFC9641"/>
        </reference>
        <reference anchor="RFC9642">
          <front>
            <title>A YANG Data Model for a Keystore</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="October" year="2024"/>
            <abstract>
              <t>This document presents a YANG 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.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9642"/>
          <seriesInfo name="DOI" value="10.17487/RFC9642"/>
        </reference>
        <reference anchor="RFC9645">
          <front>
            <title>YANG Groupings for TLS Clients and TLS Servers</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="October" year="2024"/>
            <abstract>
              <t>This document presents four YANG 1.1 modules -- three IETF modules and one supporting IANA module.</t>
              <t>The three IETF modules are "ietf-tls-common", "ietf-tls-client", and "ietf-tls-server". The "ietf-tls-client" and "ietf-tls-server" modules are the primary productions of this work, supporting the configuration and monitoring of TLS clients and servers.</t>
              <t>The IANA module is "iana-tls-cipher-suite-algs". This module defines YANG enumerations that provide support for an IANA-maintained algorithm registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9645"/>
          <seriesInfo name="DOI" value="10.17487/RFC9645"/>
        </reference>
        <reference anchor="RFC6520">
          <front>
            <title>Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension</title>
            <author fullname="R. Seggelmann" initials="R." surname="Seggelmann"/>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen"/>
            <author fullname="M. Williams" initials="M." surname="Williams"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document describes the Heartbeat Extension for the Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) protocols.</t>
              <t>The Heartbeat Extension provides a new protocol for TLS/DTLS allowing the usage of keep-alive functionality without performing a renegotiation and a basis for path MTU (PMTU) discovery for DTLS. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6520"/>
          <seriesInfo name="DOI" value="10.17487/RFC6520"/>
        </reference>
        <reference anchor="RFC9257">
          <front>
            <title>Guidance for External Pre-Shared Key (PSK) Usage in TLS</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="J. Hoyland" initials="J." surname="Hoyland"/>
            <author fullname="M. Sethi" initials="M." surname="Sethi"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>This document provides usage guidance for external Pre-Shared Keys (PSKs) in Transport Layer Security (TLS) 1.3 as defined in RFC 8446. It lists TLS security properties provided by PSKs under certain assumptions, then it demonstrates how violations of these assumptions lead to attacks. Advice for applications to help meet these assumptions is provided. This document also discusses PSK use cases and provisioning processes. Finally, it lists the privacy and security properties that are not provided by TLS 1.3 when external PSKs are used.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9257"/>
          <seriesInfo name="DOI" value="10.17487/RFC9257"/>
        </reference>
        <reference anchor="RFC9258">
          <front>
            <title>Importing External Pre-Shared Keys (PSKs) for TLS 1.3</title>
            <author fullname="D. Benjamin" initials="D." surname="Benjamin"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>This document describes an interface for importing external Pre-Shared Keys (PSKs) into TLS 1.3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9258"/>
          <seriesInfo name="DOI" value="10.17487/RFC9258"/>
        </reference>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9105">
          <front>
            <title>A YANG Data Model for Terminal Access Controller Access-Control System Plus (TACACS+)</title>
            <author fullname="B. Wu" initials="B." role="editor" surname="Wu"/>
            <author fullname="G. Zheng" initials="G." surname="Zheng"/>
            <author fullname="M. Wang" initials="M." role="editor" surname="Wang"/>
            <date month="August" year="2021"/>
            <abstract>
              <t>This document defines a Terminal Access Controller Access-Control System Plus (TACACS+) client YANG module that augments the System Management data model, defined in RFC 7317, to allow devices to make use of TACACS+ servers for centralized Authentication, Authorization, and Accounting (AAA). Though being a standard module, this module does not endorse the security mechanisms of the TACACS+ protocol (RFC 8907), and TACACS+ be used within a secure deployment.</t>
              <t>The YANG module in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9105"/>
          <seriesInfo name="DOI" value="10.17487/RFC9105"/>
        </reference>
        <reference anchor="RFC2865">
          <front>
            <title>Remote Authentication Dial In User Service (RADIUS)</title>
            <author fullname="C. Rigney" initials="C." surname="Rigney"/>
            <author fullname="S. Willens" initials="S." surname="Willens"/>
            <author fullname="A. Rubens" initials="A." surname="Rubens"/>
            <author fullname="W. Simpson" initials="W." surname="Simpson"/>
            <date month="June" year="2000"/>
            <abstract>
              <t>This document describes a protocol for carrying authentication, authorization, and configuration information between a Network Access Server which desires to authenticate its links and a shared Authentication Server. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2865"/>
          <seriesInfo name="DOI" value="10.17487/RFC2865"/>
        </reference>
        <reference anchor="RFC8907">
          <front>
            <title>The Terminal Access Controller Access-Control System Plus (TACACS+) Protocol</title>
            <author fullname="T. Dahm" initials="T." surname="Dahm"/>
            <author fullname="A. Ota" initials="A." surname="Ota"/>
            <author fullname="D.C. Medway Gash" initials="D.C." surname="Medway Gash"/>
            <author fullname="D. Carrel" initials="D." surname="Carrel"/>
            <author fullname="L. Grant" initials="L." surname="Grant"/>
            <date month="September" year="2020"/>
            <abstract>
              <t>This document describes the Terminal Access Controller Access-Control System Plus (TACACS+) protocol, which is widely deployed today to provide Device Administration for routers, network access servers, and other networked computing devices via one or more centralized servers.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8907"/>
          <seriesInfo name="DOI" value="10.17487/RFC8907"/>
        </reference>
        <reference anchor="RFC8340">
          <front>
            <title>YANG Tree Diagrams</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="215"/>
          <seriesInfo name="RFC" value="8340"/>
          <seriesInfo name="DOI" value="10.17487/RFC8340"/>
        </reference>
        <reference anchor="I-D.ietf-netmod-rfc8407bis">
          <front>
            <title>Guidelines for Authors and Reviewers of Documents Containing YANG Data Models</title>
            <author fullname="Andy Bierman" initials="A." surname="Bierman">
              <organization>YumaWorks</organization>
            </author>
            <author fullname="Mohamed Boucadair" initials="M." surname="Boucadair">
              <organization>Orange</organization>
            </author>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <date day="5" month="June" year="2025"/>
            <abstract>
              <t>   This document provides guidelines for authors and reviewers of
   specifications containing YANG data models, including IANA-maintained
   modules.  Recommendations and procedures are defined, which are
   intended to increase interoperability and usability of Network
   Configuration Protocol (NETCONF) and RESTCONF Protocol
   implementations that utilize YANG modules.  This document obsoletes
   RFC 8407.

   Also, this document updates RFC 8126 by providing additional
   guidelines for writing the IANA considerations for RFCs that specify
   IANA-maintained modules.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-rfc8407bis-28"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <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">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <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="RFC4252">
          <front>
            <title>The Secure Shell (SSH) Authentication Protocol</title>
            <author fullname="T. Ylonen" initials="T." surname="Ylonen"/>
            <author fullname="C. Lonvick" initials="C." role="editor" surname="Lonvick"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>The Secure Shell Protocol (SSH) is a protocol for secure remote login and other secure network services over an insecure network. This document describes the SSH authentication protocol framework and public key, password, and host-based client authentication methods. Additional authentication methods are described in separate documents. The SSH authentication protocol runs on top of the SSH transport layer protocol and provides a single authenticated tunnel for the SSH connection protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4252"/>
          <seriesInfo name="DOI" value="10.17487/RFC4252"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
      </references>
    </references>
    <?line 1237?>

<section anchor="example-tacacs-authentication-configuration-with-shared-secret">
      <name>Example TACACS+ Authentication Configuration with Shared Secret</name>
      <t><xref target="ex9105"/> shows an example where a TACACS+ authentication server instance is configured using shared secret for authentication. This mode is not recommended per <xref target="I-D.ietf-opsawg-tacacs-tls13"/>.</t>
      <figure anchor="ex9105">
        <name>Example with Shared Secret</name>
        <sourcecode type="json"><![CDATA[
{
  "ietf-system:system": {
    "authentication": {
      "user-authentication-order": [
        "ietf-system-tacacs-plus:tacacs-plus",
        "ietf-system:local-users"
      ]
    },
    "ietf-system-tacacs-plus:tacacs-plus": {
      "server": [
        {
          "name": "tac_plus1",
          "server-type": "authentication",
          "address": "192.0.2.2",
          "shared-secret": "QaEfThUkO198010075460923+h3TbE8n",
          "source-ip": "192.0.2.12",
          "timeout": 10
        }
      ]
    }
  }
}
]]></sourcecode>
      </figure>
      <t><xref target="ex9105-vrf"/> provides an example to associate a TACACS+ server with a VRF.</t>
      <figure anchor="ex9105-vrf">
        <name>Example with VRF</name>
        <sourcecode type="json"><![CDATA[
{
  "ietf-network-instance:network-instances": {
    "network-instance": [
      {
        "name": "MANAGEMENT_VRF",
        "description": "Management VRF for TACACS+ traffic isolation"
      }
    ]
  },
  "ietf-system:system": {
    "authentication": {
      "user-authentication-order": [
        "ietf-system-tacacs-plus:tacacs-plus",
        "ietf-system:local-users"
      ]
    },
    "ietf-system-tacacs-plus:tacacs-plus": {
      "server": [
        {
          "name": "tac_plus1",
          "server-type": "authentication",
          "address": "192.0.2.2",
          "shared-secret": "QaEfThUkO198010075460923+h3TbE8n",
          "source-ip": "192.0.2.12",
          "vrf-instance": "MANAGEMENT_VRF",
          "timeout": 10
        }
      ]
    }
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="tacacstls-examples">
      <name>TACACS+TLS Examples</name>
      <t>This section provides examples to illustrate the configuration of TACACS+TLS clients.</t>
      <t>These examples follow the convention used in <xref section="1.5" sectionFormat="of" target="RFC9645"/> for binary data that has been base64 encoded.</t>
      <section anchor="example-tacacs-authentication-configuration-with-explicit-certificate-definitions">
        <name>Example TACACS+ Authentication Configuration with Explicit Certificate Definitions</name>
        <t><xref target="exin"/> shows a configuration example with 'inline-definition' for the client identity and server authentication.</t>
        <figure anchor="exin">
          <name>Example with TACACS+TLS with Inline Certificate Definitions</name>
          <sourcecode type="json"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "ietf-system:system": {
    "authentication": {
      "user-authentication-order": [
        "ietf-system-tacacs-plus:tacacs-plus",
        "ietf-system:local-users"
      ]
    },
    "ietf-system-tacacs-plus:tacacs-plus": {
      "server": [
        {
          "name": "instance-1",
          "server-type": "authentication",
          "domain-name": "tacacs.example.com",
          "sni-enabled": true,
          "address": "2001:db8::1",
          "port": 1234,
          "client-identity": {
            "certificate": {
              "inline-definition": {
                "public-key-format": "ietf-crypto-types:subject-\
                                             public-key-info-format",
                "public-key": "BASE64VALUE=",
                "private-key-format": "ietf-crypto-types:rsa-private\
                                                        -key-format",
                "cleartext-private-key": "BASE64VALUE=",
                "cert-data": "BASE64VALUE="
              }
            }
          },
          "server-authentication": {
            "ca-certs": {
              "inline-definition": {
                "certificate": [
                  {
                    "name": "CA-Certificate-1",
                    "cert-data": "BASE64VALUE="
                  }
                ]
              }
            }
          },
          "hello-params": {
            "tls-versions": {
              "min": "ietf-tls-common:tls13",
              "max": "ietf-tls-common:tls13"
            },
            "cipher-suites": {
              "cipher-suite": [
                "TLS_AES_128_GCM_SHA256"
              ]
            }
          },
          "single-connection": false,
          "timeout": 10
        }
      ]
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="example-tacacs-authentication-configuration-with-certificate-references">
        <name>Example TACACS+ Authentication Configuration with Certificate References</name>
        <t><xref target="ex-ref"/> shows a configuration example with credential references for multiple service instances: four server instances are configured with all using the same credentials. These instances form a redundancy group for both IPv4 and IPv6.</t>
        <figure anchor="ex-ref">
          <name>Example with TACACS+TLS with References</name>
          <sourcecode type="json"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "ietf-system:system": {
    "ietf-system-tacacs-plus:tacacs-plus": {
      "client-credentials": [
        {
          "id": "client-cred-1",
          "certificate": {
            "inline-definition": {
              "public-key-format": "ietf-crypto-types:subject-public\
                                                   -key-info-format",
              "public-key": "BASE64VALUE=",
              "private-key-format": "ietf-crypto-types:rsa-private-\
                                                         key-format",
              "cleartext-private-key": "BASE64VALUE=",
              "cert-data": "BASE64VALUE="
            }
          }
        }
      ],
      "server-credentials": [
        {
          "id": "server-cred-1",
          "ca-certs": {
            "inline-definition": {
              "certificate": [
                {
                  "name": "CA-Certificate-1",
                  "cert-data": "BASE64VALUE="
                }
              ]
            }
          }
        }
      ],
      "server": [
        {
          "name": "primary-v6",
          "server-type": "authentication",
          "domain-name": "tacacs.example.com",
          "sni-enabled": true,
          "address": "2001:db8::1",
          "port": 1234,
          "client-identity": {
            "credentials-reference": "client-cred-1"
          },
          "server-authentication": {
            "credentials-reference": "server-cred-1"
          }
        },
        {
          "name": "backup-v6",
          "server-type": "authentication",
          "domain-name": "tacacs.example.com",
          "sni-enabled": true,
          "address": "2001:db8::2",
          "port": 1234,
          "client-identity": {
            "credentials-reference": "client-cred-1"
          },
          "server-authentication": {
            "credentials-reference": "server-cred-1"
          }
        },
        {
          "name": "primary-v4",
          "server-type": "authentication",
          "domain-name": "tacacs.example.com",
          "sni-enabled": true,
          "address": "192.0.2.1",
          "port": 49,
          "client-identity": {
            "credentials-reference": "client-cred-1"
          },
          "server-authentication": {
            "credentials-reference": "server-cred-1"
          }
        },
        {
          "name": "backup-v4",
          "server-type": "authentication",
          "domain-name": "tacacs.example.com",
          "sni-enabled": true,
          "address": "192.0.2.2",
          "port": 49,
          "client-identity": {
            "credentials-reference": "client-cred-1"
          },
          "server-authentication": {
            "credentials-reference": "server-cred-1"
          }
        }
      ]
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="sec-full">
      <name>Full Tree</name>
      <t>The full tree structure is shown below:</t>
      <artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

module: ietf-system-tacacs-plus

  augment /sys:system:
    +--rw tacacs-plus
       +--rw client-credentials* [id] {credential-reference}?
       |  +--rw id                       string
       |  +--rw (auth-type)?
       |     +--:(certificate)
       |     |  +--rw certificate
       |     |     +--rw (inline-or-keystore)
       |     |        +--:(inline) {inline-definitions-supported}?
       |     |        |  +--rw inline-definition
       |     |        |     +--rw public-key-format?
       |     |        |     |       identityref
       |     |        |     +--rw public-key?
       |     |        |     |       binary
       |     |        |     +--rw private-key-format?
       |     |        |     |       identityref
       |     |        |     +--rw (private-key-type)
       |     |        |     |  +--:(cleartext-private-key)
       |     |        |     |  |        {cleartext-private-keys}?
       |     |        |     |  |  +--rw cleartext-private-key?
       |     |        |     |  |          binary
       |     |        |     |  +--:(hidden-private-key)
       |     |        |     |  |        {hidden-private-keys}?
       |     |        |     |  |  +--rw hidden-private-key?
       |     |        |     |  |          empty
       |     |        |     |  +--:(encrypted-private-key)
       |     |        |     |           {encrypted-private-keys}?
       |     |        |     |     +--rw encrypted-private-key
       |     |        |     |        +--rw encrypted-by
       |     |        |     |        +--rw encrypted-value-format
       |     |        |     |        |       identityref
       |     |        |     |        +--rw encrypted-value
       |     |        |     |                binary
       |     |        |     +--rw cert-data?
       |     |        |     |       end-entity-cert-cms
       |     |        |     +---n certificate-expiration
       |     |        |     |       {certificate-expiration-\
                                                       notification}?
       |     |        |     |  +-- expiration-date
       |     |        |     |          yang:date-and-time
       |     |        |     +---x generate-csr {csr-generation}?
       |     |        |        +---w input
       |     |        |        |  +---w csr-format    identityref
       |     |        |        |  +---w csr-info      csr-info
       |     |        |        +--ro output
       |     |        |           +--ro (csr-type)
       |     |        |              +--:(p10-csr)
       |     |        |                 +--ro p10-csr?   p10-csr
       |     |        +--:(central-keystore)
       |     |                 {central-keystore-supported,\
                                                    asymmetric-keys}?
       |     |           +--rw central-keystore-reference
       |     |              +--rw asymmetric-key?
       |     |              |       ks:central-asymmetric-key-ref
       |     |              |       {central-keystore-supported,\
                                                    asymmetric-keys}?
       |     |              +--rw certificate?      leafref
       |     +--:(raw-public-key) {tlsc:client-ident-raw-public-key}?
       |     |  +--rw raw-private-key
       |     |     +--rw (inline-or-keystore)
       |     |        +--:(inline) {inline-definitions-supported}?
       |     |        |  +--rw inline-definition
       |     |        |     +--rw public-key-format?
       |     |        |     |       identityref
       |     |        |     +--rw public-key?
       |     |        |     |       binary
       |     |        |     +--rw private-key-format?
       |     |        |     |       identityref
       |     |        |     +--rw (private-key-type)
       |     |        |        +--:(cleartext-private-key)
       |     |        |        |        {cleartext-private-keys}?
       |     |        |        |  +--rw cleartext-private-key?
       |     |        |        |          binary
       |     |        |        +--:(hidden-private-key)
       |     |        |        |        {hidden-private-keys}?
       |     |        |        |  +--rw hidden-private-key?
       |     |        |        |          empty
       |     |        |        +--:(encrypted-private-key)
       |     |        |                 {encrypted-private-keys}?
       |     |        |           +--rw encrypted-private-key
       |     |        |              +--rw encrypted-by
       |     |        |              +--rw encrypted-value-format
       |     |        |              |       identityref
       |     |        |              +--rw encrypted-value
       |     |        |                      binary
       |     |        +--:(central-keystore)
       |     |                 {central-keystore-supported,\
                                                    asymmetric-keys}?
       |     |           +--rw central-keystore-reference?
       |     |                   ks:central-asymmetric-key-ref
       |     +--:(tls13-epsk) {tlsc:client-ident-tls13-epsk}?
       |        +--rw tls13-epsk
       |           +--rw (inline-or-keystore)
       |           |  +--:(inline) {inline-definitions-supported}?
       |           |  |  +--rw inline-definition
       |           |  |     +--rw key-format?
       |           |  |     |       identityref
       |           |  |     +--rw (key-type)
       |           |  |        +--:(cleartext-symmetric-key)
       |           |  |        |  +--rw cleartext-symmetric-key?
       |           |  |        |          binary
       |           |  |        |          {cleartext-symmetric-keys}?
       |           |  |        +--:(hidden-symmetric-key)
       |           |  |        |        {hidden-symmetric-keys}?
       |           |  |        |  +--rw hidden-symmetric-key?
       |           |  |        |          empty
       |           |  |        +--:(encrypted-symmetric-key)
       |           |  |                 {encrypted-symmetric-keys}?
       |           |  |           +--rw encrypted-symmetric-key
       |           |  |              +--rw encrypted-by
       |           |  |              +--rw encrypted-value-format
       |           |  |              |       identityref
       |           |  |              +--rw encrypted-value
       |           |  |                      binary
       |           |  +--:(central-keystore)
       |           |           {central-keystore-supported,symmetric\
                                                              -keys}?
       |           |     +--rw central-keystore-reference?
       |           |             ks:central-symmetric-key-ref
       |           +--rw external-identity                   string
       |           +--rw hash?
       |           |       tlscmn:epsk-supported-hash
       |           +--rw context?                            string
       |           +--rw target-protocol?                    uint16
       |           +--rw target-kdf?                         uint16
       +--rw server-credentials* [id] {credential-reference}?
       |  +--rw id                 string
       |  +--rw ca-certs!
       |  |  +--rw (inline-or-truststore)
       |  |     +--:(inline) {inline-definitions-supported}?
       |  |     |  +--rw inline-definition
       |  |     |     +--rw certificate* [name]
       |  |     |        +--rw name                      string
       |  |     |        +--rw cert-data
       |  |     |        |       trust-anchor-cert-cms
       |  |     |        +---n certificate-expiration
       |  |     |                {certificate-expiration-\
                                                       notification}?
       |  |     |           +-- expiration-date    yang:date-and-time
       |  |     +--:(central-truststore)
       |  |              {central-truststore-supported,certificates}?
       |  |        +--rw central-truststore-reference?
       |  |                ts:central-certificate-bag-ref
       |  +--rw ee-certs!
       |  |  +--rw (inline-or-truststore)
       |  |     +--:(inline) {inline-definitions-supported}?
       |  |     |  +--rw inline-definition
       |  |     |     +--rw certificate* [name]
       |  |     |        +--rw name                      string
       |  |     |        +--rw cert-data
       |  |     |        |       trust-anchor-cert-cms
       |  |     |        +---n certificate-expiration
       |  |     |                {certificate-expiration-\
                                                       notification}?
       |  |     |           +-- expiration-date    yang:date-and-time
       |  |     +--:(central-truststore)
       |  |              {central-truststore-supported,certificates}?
       |  |        +--rw central-truststore-reference?
       |  |                ts:central-certificate-bag-ref
       |  +--rw raw-public-keys! {tlsc:server-auth-raw-public-key}?
       |  |  +--rw (inline-or-truststore)
       |  |     +--:(inline) {inline-definitions-supported}?
       |  |     |  +--rw inline-definition
       |  |     |     +--rw public-key* [name]
       |  |     |        +--rw name                 string
       |  |     |        +--rw public-key-format    identityref
       |  |     |        +--rw public-key           binary
       |  |     +--:(central-truststore)
       |  |              {central-truststore-supported,public-keys}?
       |  |        +--rw central-truststore-reference?
       |  |                ts:central-public-key-bag-ref
       |  +--rw tls13-epsks?       empty
       |          {tlsc:server-auth-tls13-epsk}?
       +--rw server* [name]
          +--rw name                           string
          +--rw server-type
          |       tacacs-plus-server-type
          +--rw domain-name?                   inet:domain-name
          +--rw sni-enabled?                   boolean
          +--rw address                        inet:host
          +--rw port?                          inet:port-number
          +--rw (security)
          |  +--:(tls)
          |  |  +--rw client-identity!
          |  |  |  +--rw (ref-or-explicit)?
          |  |  |     +--:(ref)
          |  |  |     |  +--rw credentials-reference?
          |  |  |     |          sys-tcs-plus:client-credentials-ref
          |  |  |     |          {credential-reference}?
          |  |  |     +--:(explicit)
          |  |  |        +--rw (auth-type)?
          |  |  |           +--:(certificate)
          |  |  |           |  +--rw certificate
          |  |  |           |     +--rw (inline-or-keystore)
          |  |  |           |        +--:(inline)
          |  |  |           |        |        {inline-definitions-\
                                                          supported}?
          |  |  |           |        |  +--rw inline-definition
          |  |  |           |        |     +--rw public-key-format?
          |  |  |           |        |     |       identityref
          |  |  |           |        |     +--rw public-key?
          |  |  |           |        |     |       binary
          |  |  |           |        |     +--rw private-key-format?
          |  |  |           |        |     |       identityref
          |  |  |           |        |     +--rw (private-key-type)
          |  |  |           |        |     |  +--:(cleartext-private\
                                                                -key)
          |  |  |           |        |     |  |        {cleartext-\
                                                       private-keys}?
          |  |  |           |        |     |  |  +--rw cleartext-\
                                                         private-key?
          |  |  |           |        |     |  |          binary
          |  |  |           |        |     |  +--:(hidden-private-\
                                                                 key)
          |  |  |           |        |     |  |        {hidden-\
                                                       private-keys}?
          |  |  |           |        |     |  |  +--rw hidden-\
                                                         private-key?
          |  |  |           |        |     |  |          empty
          |  |  |           |        |     |  +--:(encrypted-private\
                                                                -key)
          |  |  |           |        |     |           {encrypted-\
                                                       private-keys}?
          |  |  |           |        |     |     +--rw encrypted-\
                                                          private-key
          |  |  |           |        |     |        +--rw encrypted-\
                                                                   by
          |  |  |           |        |     |        +--rw encrypted-\
                                                         value-format
          |  |  |           |        |     |        |       \
                                                          identityref
          |  |  |           |        |     |        +--rw encrypted-\
                                                                value
          |  |  |           |        |     |                binary
          |  |  |           |        |     +--rw cert-data?
          |  |  |           |        |     |       end-entity-cert-\
                                                                  cms
          |  |  |           |        |     +---n certificate-\
                                                           expiration
          |  |  |           |        |     |       {certificate-\
                                            expiration-notification}?
          |  |  |           |        |     |  +-- expiration-date
          |  |  |           |        |     |          yang:date-and-\
                                                                 time
          |  |  |           |        |     +---x generate-csr
          |  |  |           |        |             {csr-generation}?
          |  |  |           |        |        +---w input
          |  |  |           |        |        |  +---w csr-format
          |  |  |           |        |        |  |       identityref
          |  |  |           |        |        |  +---w csr-info
          |  |  |           |        |        |          csr-info
          |  |  |           |        |        +--ro output
          |  |  |           |        |           +--ro (csr-type)
          |  |  |           |        |              +--:(p10-csr)
          |  |  |           |        |                 +--ro p10-csr?
          |  |  |           |        |                         p10-\
                                                                  csr
          |  |  |           |        +--:(central-keystore)
          |  |  |           |                 {central-keystore-\
                                          supported,asymmetric-keys}?
          |  |  |           |           +--rw central-keystore-\
                                                            reference
          |  |  |           |              +--rw asymmetric-key?
          |  |  |           |              |       ks:central-\
                                                   asymmetric-key-ref
          |  |  |           |              |       {central-keystore\
                                         -supported,asymmetric-keys}?
          |  |  |           |              +--rw certificate?
          |  |  |           |                      leafref
          |  |  |           +--:(raw-public-key)
          |  |  |           |        {tlsc:client-ident-raw-public-\
                                                                key}?
          |  |  |           |  +--rw raw-private-key
          |  |  |           |     +--rw (inline-or-keystore)
          |  |  |           |        +--:(inline)
          |  |  |           |        |        {inline-definitions-\
                                                          supported}?
          |  |  |           |        |  +--rw inline-definition
          |  |  |           |        |     +--rw public-key-format?
          |  |  |           |        |     |       identityref
          |  |  |           |        |     +--rw public-key?
          |  |  |           |        |     |       binary
          |  |  |           |        |     +--rw private-key-format?
          |  |  |           |        |     |       identityref
          |  |  |           |        |     +--rw (private-key-type)
          |  |  |           |        |        +--:(cleartext-private\
                                                                -key)
          |  |  |           |        |        |        {cleartext-\
                                                       private-keys}?
          |  |  |           |        |        |  +--rw cleartext-\
                                                         private-key?
          |  |  |           |        |        |          binary
          |  |  |           |        |        +--:(hidden-private-\
                                                                 key)
          |  |  |           |        |        |        {hidden-\
                                                       private-keys}?
          |  |  |           |        |        |  +--rw hidden-\
                                                         private-key?
          |  |  |           |        |        |          empty
          |  |  |           |        |        +--:(encrypted-private\
                                                                -key)
          |  |  |           |        |                 {encrypted-\
                                                       private-keys}?
          |  |  |           |        |           +--rw encrypted-\
                                                          private-key
          |  |  |           |        |              +--rw encrypted-\
                                                                   by
          |  |  |           |        |              +--rw encrypted-\
                                                         value-format
          |  |  |           |        |              |       \
                                                          identityref
          |  |  |           |        |              +--rw encrypted-\
                                                                value
          |  |  |           |        |                      binary
          |  |  |           |        +--:(central-keystore)
          |  |  |           |                 {central-keystore-\
                                          supported,asymmetric-keys}?
          |  |  |           |           +--rw central-keystore-\
                                                           reference?
          |  |  |           |                   ks:central-\
                                                   asymmetric-key-ref
          |  |  |           +--:(tls13-epsk)
          |  |  |                    {tlsc:client-ident-tls13-epsk}?
          |  |  |              +--rw tls13-epsk
          |  |  |                 +--rw (inline-or-keystore)
          |  |  |                 |  +--:(inline)
          |  |  |                 |  |        {inline-definitions-\
                                                          supported}?
          |  |  |                 |  |  +--rw inline-definition
          |  |  |                 |  |     +--rw key-format?
          |  |  |                 |  |     |       identityref
          |  |  |                 |  |     +--rw (key-type)
          |  |  |                 |  |        +--:(cleartext-\
                                                       symmetric-key)
          |  |  |                 |  |        |  +--rw cleartext-\
                                                       symmetric-key?
          |  |  |                 |  |        |          binary
          |  |  |                 |  |        |          {cleartext-\
                                                     symmetric-keys}?
          |  |  |                 |  |        +--:(hidden-symmetric-\
                                                                 key)
          |  |  |                 |  |        |        {hidden-\
                                                     symmetric-keys}?
          |  |  |                 |  |        |  +--rw hidden-\
                                                       symmetric-key?
          |  |  |                 |  |        |          empty
          |  |  |                 |  |        +--:(encrypted-\
                                                       symmetric-key)
          |  |  |                 |  |                 {encrypted-\
                                                     symmetric-keys}?
          |  |  |                 |  |           +--rw encrypted-\
                                                        symmetric-key
          |  |  |                 |  |              +--rw encrypted-\
                                                                   by
          |  |  |                 |  |              +--rw encrypted-\
                                                         value-format
          |  |  |                 |  |              |       \
                                                          identityref
          |  |  |                 |  |              +--rw encrypted-\
                                                                value
          |  |  |                 |  |                      binary
          |  |  |                 |  +--:(central-keystore)
          |  |  |                 |           {central-keystore-\
                                           supported,symmetric-keys}?
          |  |  |                 |     +--rw central-keystore-\
                                                           reference?
          |  |  |                 |             ks:central-symmetric\
                                                             -key-ref
          |  |  |                 +--rw external-identity
          |  |  |                 |       string
          |  |  |                 +--rw hash?
          |  |  |                 |       tlscmn:epsk-supported-hash
          |  |  |                 +--rw context?
          |  |  |                 |       string
          |  |  |                 +--rw target-protocol?
          |  |  |                 |       uint16
          |  |  |                 +--rw target-kdf?
          |  |  |                         uint16
          |  |  +--rw server-authentication
          |  |  |  +--rw (ref-or-explicit)?
          |  |  |     +--:(ref)
          |  |  |     |  +--rw credentials-reference?
          |  |  |     |          sys-tcs-plus:server-credentials-ref
          |  |  |     |          {credential-reference}?
          |  |  |     +--:(explicit)
          |  |  |        +--rw ca-certs!
          |  |  |        |  +--rw (inline-or-truststore)
          |  |  |        |     +--:(inline)
          |  |  |        |     |        {inline-definitions-\
                                                          supported}?
          |  |  |        |     |  +--rw inline-definition
          |  |  |        |     |     +--rw certificate* [name]
          |  |  |        |     |        +--rw name
          |  |  |        |     |        |       string
          |  |  |        |     |        +--rw cert-data
          |  |  |        |     |        |       trust-anchor-cert-cms
          |  |  |        |     |        +---n certificate-expiration
          |  |  |        |     |                {certificate-\
                                            expiration-notification}?
          |  |  |        |     |           +-- expiration-date
          |  |  |        |     |                   yang:date-and-time
          |  |  |        |     +--:(central-truststore)
          |  |  |        |              {central-truststore-\
                                             supported,certificates}?
          |  |  |        |        +--rw central-truststore-reference?
          |  |  |        |                ts:central-certificate-bag\
                                                                 -ref
          |  |  |        +--rw ee-certs!
          |  |  |        |  +--rw (inline-or-truststore)
          |  |  |        |     +--:(inline)
          |  |  |        |     |        {inline-definitions-\
                                                          supported}?
          |  |  |        |     |  +--rw inline-definition
          |  |  |        |     |     +--rw certificate* [name]
          |  |  |        |     |        +--rw name
          |  |  |        |     |        |       string
          |  |  |        |     |        +--rw cert-data
          |  |  |        |     |        |       trust-anchor-cert-cms
          |  |  |        |     |        +---n certificate-expiration
          |  |  |        |     |                {certificate-\
                                            expiration-notification}?
          |  |  |        |     |           +-- expiration-date
          |  |  |        |     |                   yang:date-and-time
          |  |  |        |     +--:(central-truststore)
          |  |  |        |              {central-truststore-\
                                             supported,certificates}?
          |  |  |        |        +--rw central-truststore-reference?
          |  |  |        |                ts:central-certificate-bag\
                                                                 -ref
          |  |  |        +--rw raw-public-keys!
          |  |  |        |       {tlsc:server-auth-raw-public-key}?
          |  |  |        |  +--rw (inline-or-truststore)
          |  |  |        |     +--:(inline)
          |  |  |        |     |        {inline-definitions-\
                                                          supported}?
          |  |  |        |     |  +--rw inline-definition
          |  |  |        |     |     +--rw public-key* [name]
          |  |  |        |     |        +--rw name
          |  |  |        |     |        |       string
          |  |  |        |     |        +--rw public-key-format
          |  |  |        |     |        |       identityref
          |  |  |        |     |        +--rw public-key
          |  |  |        |     |                binary
          |  |  |        |     +--:(central-truststore)
          |  |  |        |              {central-truststore-\
                                              supported,public-keys}?
          |  |  |        |        +--rw central-truststore-reference?
          |  |  |        |                ts:central-public-key-bag-\
                                                                  ref
          |  |  |        +--rw tls13-epsks?             empty
          |  |  |                {tlsc:server-auth-tls13-epsk}?
          |  |  +--rw hello-params {tlscmn:hello-params}?
          |  |     +--rw tls-versions
          |  |     |  +--rw min?   identityref
          |  |     |  +--rw max?   identityref
          |  |     +--rw cipher-suites
          |  |        +--rw cipher-suite*
          |  |                tlscsa:tls-cipher-suite-algorithm
          |  +--:(obfuscation)
          |     +--rw shared-secret?           string
          +--rw (source-type)?
          |  +--:(source-ip)
          |  |  +--rw source-ip?               inet:ip-address
          |  +--:(source-interface)
          |     +--rw source-interface?        if:interface-ref
          +--rw vrf-instance?
          |       -> /ni:network-instances/network-instance/name
          +--rw single-connection?             boolean
          +--rw timeout?                       uint16
          +--ro statistics
             +--ro discontinuity-time?    yang:date-and-time
             +--ro connection-opens?      yang:counter64
             +--ro connection-closes?     yang:counter64
             +--ro connection-aborts?     yang:counter64
             +--ro connection-failures?   yang:counter64
             +--ro connection-timeouts?   yang:counter64
             +--ro messages-sent?         yang:counter64
             +--ro messages-received?     yang:counter64
             +--ro errors-received?       yang:counter64
             +--ro sessions?              yang:counter64
             +--ro cert-errors?           yang:counter64
             +--ro rpk-errors?            yang:counter64
                     {tlsc:server-auth-raw-public-key}?
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The document leverages data structures defined in <xref target="RFC9645"/>.</t>
      <t>Thanks to Joe Clarke and Tom Petch for the review and comments.</t>
      <t>Thanks to Reshad Rahman for the yangdoctors review, Tina Tsou for
the opsdir review, and Ines Robles for the genart review.</t>
      <t>Thanks Mahesh Jethanandani for the AD review.</t>
      <dl>
        <dt>Authors of RFC 9105:</dt>
        <dd>
          <t>Bo Wu</t>
        </dd>
        <dt/>
        <dd>
          <t>Guangying Zheng</t>
        </dd>
        <dt/>
        <dd>
          <t>Michael Wang</t>
        </dd>
        <dt>Acknowledgments from RFC 9105:</dt>
        <dd>
          <t>The authors wish to thank Alex Campbell, John Heasley, Ebben Aries,
 Alan DeKok, Joe Clarke, Tom Petch, Robert Wilton, and many others for
 their helpful comments and suggestions.</t>
        </dd>
      </dl>
    </section>
  </back>
  <!-- ##markdown-source:
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
AIA21eXTYhxkZyfZCGi6YU/9yut006+9Th8pqXSrLopDvLAorNNL9VwH67fo
KJMdDQJo174LYLhhPToNJaZaOwjrTrnmpltTm57WckRZwO3ERzofRbw3ZNpH
yaxc1Ug0N5cOzNidFfFKGS1/Xofrbu6Fmef6Jp7VHAj4M6PVUc3i5/9kjKLA
sEIUA9HQFbySUm/ZeYqBh1AnKQvoe1lE4s1qbAUMXAwXy2YWVX2D0tgG52p8
3ZZXXQjokeOv5a8WuBY5nq9tgawqvo3QV69DZq3+9uJgH8nZsopqS1R7Ai/E
n02KjHtTfF1r6rn27pZX+s7uZswdW/dV14tXpud+3e32jcjzynZrDW0ZP9+U
fdmmXT2q5zcbwgelGguowk/4e3FWO6BZ25mIQdNddalkAAPeqnPT4ycl/JMS
HqrENlfCzT82U8KZwQ8bKOHmH63GQXZ2XSXc6un6SrjZzXWVcLuPq5Vw2cUN
lHDz2UwJV+1vpITXAlihhNfWa62EM/fnGopNQ9OtqU1PI//+C2oNzUsnPWto
AEQgnbQ/uHLqzy7eCl1dxCvA2i+Y6u/NF0z1d9sF06ygUK1dapzSK/k+CH27
ZolxCjNvibHGcmXlwBLRpE0GAcgnNMkaK1zXNOqxfk2nhbxfu8ei9VD1Fk27
y83G9AosODUd1bJvvb6q57oGQovuMl8AWyDa4bBq2Wlbr37ZqYOw7vRrbro1
xelpnBFtlh3/76ZlR43LLQJj6GlmDbb2+uP/ba0/K5YfZjSJp2qLOdRREfD+
4+27ODAmcTlpRFDc7YIrlaZuhNXqgVJOiLfVkwA+rRGr4uI8RR2dp50IwuK5
flbCeDMa16Niw+D1/HCj22+D1WyAyWCkz4wvfwQUAH0z5Y5dkm28+P9hY9K0
7JuLt+drANrgBvbvNeVVFUqvFnw82gTrK59wfUHFtEitKJ4nEyBdwCPsw2/j
Dq7RH9+fLzio+7qOYHzd6OQ1mMa/99TnLrOf3i2pWt6aV0gHkGaunAxdtRqs
Jp9Ky0iT4MP43JGSQjimnybWp4llP58m1h1MLOcOu8+EAVx/ybmL9Ec/BTXq
t5qB7Saf52rGT2H9fEV9o2lP1343rGmwwbvmTINMdYxp3KQo1b06q9Jn2ZDL
xlQGXU5gq4UvPTYTOEDJp2F8U1I2fKmPB8UIHwwpuO6dOT4WOp4wVF/kGfWq
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
dLk8B0YhW6fX+f/jpmkPmkMBAA==

-->

</rfc>
