module ietf-truststore { yang-version 1.1; namespace "urn:ietf:params:xml:ns:yang:ietf-truststore"; prefix ts; import ietf-netconf-acm { prefix nacm; reference "RFC 8341: Network Configuration Access Control Model"; } import ietf-crypto-types { prefix ct; reference "RFC YYYY: Common YANG Data Types for Cryptography"; } organization "IETF NETCONF (Network Configuration) Working Group"; contact "WG Web: WG List: Author: Kent Watsen "; description "This module defines a truststore to centralize management of trust anchors including both X.509 certificates and SSH host keys. Copyright (c) 2019 IETF Trust and the persons identified as authors of the code. All rights reserved. Redistribution and use in source and binary forms, with or without modification, is permitted pursuant to, and subject to the license terms contained in, the Simplified BSD License set forth in Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info). This version of this YANG module is part of RFC XXXX (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself for full legal notices.; The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document are to be interpreted as described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, they appear in all capitals, as shown here."; revision 2019-07-02 { description "Initial version"; reference "RFC XXXX: A YANG Data Model for a Truststore"; } feature truststore-supported { description "The 'truststore-supported' feature indicates that the server supports the truststore."; } feature local-definitions-supported { description "The 'local-definitions-supported' feature indicates that the server supports locally-defined trust anchors."; } feature x509-certificates { description "The 'x509-certificates' feature indicates that the server implements the /truststore/certificates subtree."; } feature ssh-host-keys { description "The 'ssh-host-keys' feature indicates that the server implements the /truststore/host-keys subtree."; } typedef certificates-ref { type leafref { path "/ts:truststore/ts:certificates/ts:name"; } description "This typedef enables modules to easily define a reference to a set of certificates defined in the truststore."; } typedef host-keys-ref { type leafref { path "/ts:truststore/ts:host-keys/ts:name"; } description "This typedef enables modules to easily define a reference to a set of host keys defined in the truststore."; } grouping local-or-truststore-certs-grouping { description "A grouping that expands to allow trust anchors to be either stored locally, within the using data model, or be a reference to trust anchors stored in the truststore."; choice local-or-truststore { mandatory true; description "A choice between an inlined definition and a definition that exists in the truststore."; case local { if-feature "local-definitions-supported"; container local-definition { description "Container to hold the local trust anchor definitions. A list is defined so as to be symmetric with the truststore definition."; uses ct:trust-anchor-certs-grouping; } } case truststore { if-feature "truststore-supported"; if-feature "x509-certificates"; leaf truststore-reference { type ts:certificates-ref; description "A reference to a set of trust anchors that exists in the truststore."; } } } } grouping local-or-truststore-host-keys-grouping { description "A grouping that expands to allow trust anchors to be either stored locally, within the using data model, or be a reference to trust anchors stored in the truststore."; choice local-or-truststore { mandatory true; description "A choice between an inlined definition and a definition that exists in the truststore."; case local { if-feature "local-definitions-supported"; container local-definition { description "Container to hold the local trust anchor definitions. A list is defined so as to be symmetric with the truststore definition."; leaf-list host-key { nacm:default-deny-write; type ct:ssh-host-key; description "The binary data for this host key."; reference "RFC YYYY: Common YANG Data Types for Cryptography"; } uses ct:trust-anchor-certs-grouping; } } case truststore { if-feature "truststore-supported"; if-feature "ssh-host-keys"; leaf truststore-reference { type ts:host-keys-ref; description "A reference to a set of trust anchors that exists in the truststore."; } } } } grouping truststore-grouping { description "Grouping definition enables use in other contexts. If ever done, implementations SHOULD augment new 'case' statements into local-or-keystore 'choice' statements to supply leafrefs to the new location."; list certificates { if-feature "x509-certificates"; key "name"; description "A list of certificates. These certificates can be used by a server to authenticate clients, or by a client to authenticate servers. Each list of certificates SHOULD be specific to a purpose, as the list as a whole may be referenced by other modules. For instance, a RESTCONF server's configuration might use a specific list of certificates for when authenticating RESTCONF client connections."; leaf name { type string; description "An arbitrary name for this list of certificates."; } leaf description { type string; description "An arbitrary description for this list of certificates."; } list certificate { key "name"; description "A certificate."; leaf name { type string; description "An arbitrary name for this certificate. The name must be unique across all lists of certificates (not just this list) so that leafrefs from another module can resolve to unique values."; } uses ct:trust-anchor-cert-grouping { refine "cert" { mandatory true; } } } } list host-keys { if-feature "ssh-host-keys"; key "name"; description "A list of host keys. These host-keys can be used by clients to authenticate SSH servers. Each list of host keys SHOULD be specific to a purpose, so the list as a whole may be referenced by other modules. For instance, a NETCONF client's configuration might point to a specific list of host keys for when authenticating specific SSH servers."; leaf name { type string; description "An arbitrary name for this list of SSH host keys."; } leaf description { type string; description "An arbitrary description for this list of SSH host keys."; } list host-key { key "name"; description "A host key."; leaf name { type string; description "An arbitrary name for this host-key. Must be unique across all lists of host-keys (not just this list) so that a leafref to it from another module can resolve to unique values."; } leaf host-key { type ct:ssh-host-key; mandatory true; description "The binary public key data for this host key."; reference "RFC YYYY: Common YANG Data Types for Cryptography"; } } } } container truststore { nacm:default-deny-write; description "The truststore contains sets of X.509 certificates and SSH host keys."; uses truststore-grouping; } }