rfc9642.original | rfc9642.txt | |||
---|---|---|---|---|
NETCONF Working Group K. Watsen | Internet Engineering Task Force (IETF) K. Watsen | |||
Internet-Draft Watsen Networks | Request for Comments: 9642 Watsen Networks | |||
Intended status: Standards Track 16 March 2024 | Category: Standards Track October 2024 | |||
Expires: 17 September 2024 | ISSN: 2070-1721 | |||
A YANG Data Model for a Keystore and Keystore Operations | A YANG Data Model for a Keystore | |||
draft-ietf-netconf-keystore-35 | ||||
Abstract | Abstract | |||
This document presents a YANG module called "ietf-keystore" that | This document presents a YANG module called "ietf-keystore" that | |||
enables centralized configuration of both symmetric and asymmetric | enables centralized configuration of both symmetric and asymmetric | |||
keys. The secret value for both key types may be encrypted or | keys. The secret value for both key types may be encrypted or | |||
hidden. Asymmetric keys may be associated with certificates. | hidden. Asymmetric keys may be associated with certificates. | |||
Notifications are sent when certificates are about to expire. | Notifications are sent when certificates are about to expire. | |||
Editorial Note (To be removed by RFC Editor) | ||||
This draft contains placeholder values that need to be replaced with | ||||
finalized values at the time of publication. This note summarizes | ||||
all of the substitutions that are needed. No other RFC Editor | ||||
instructions are specified elsewhere in this document. | ||||
Artwork in this document contains shorthand references to drafts in | ||||
progress. Please apply the following replacements: | ||||
* AAAA --> the assigned RFC value for draft-ietf-netconf-crypto- | ||||
types | ||||
* CCCC --> the assigned RFC value for this draft | ||||
Artwork in this document contains placeholder values for the date of | ||||
publication of this draft. Please apply the following replacement: | ||||
* 2024-03-16 --> the publication date of this draft | ||||
The "Relation to other RFCs" section Section 1.1 contains the text | ||||
"one or more YANG modules" and, later, "modules". This text is | ||||
sourced from a file in a context where it is unknown how many modules | ||||
a draft defines. The text is not wrong as is, but it may be improved | ||||
by stating more directly how many modules are defined. | ||||
The "Relation to other RFCs" section Section 1.1 contains a self- | ||||
reference to this draft, along with a corresponding reference in the | ||||
Appendix. Please replace the self-reference in this section with | ||||
"This RFC" (or similar) and remove the self-reference in the | ||||
"Normative/Informative References" section, whichever it is in. | ||||
Tree-diagrams in this draft may use the '\' line-folding mode defined | ||||
in RFC 8792. However, nicer-to-the-eye is when the '\\' line-folding | ||||
mode is used. The AD suggested suggested putting a request here for | ||||
the RFC Editor to help convert "ugly" '\' folded examples to use the | ||||
'\\' folding mode. "Help convert" may be interpreted as, identify | ||||
what looks ugly and ask the authors to make the adjustment. | ||||
The following Appendix section is to be removed prior to publication: | ||||
* Appendix A. Change Log | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 17 September 2024. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9642. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2024 IETF Trust and the persons identified as the | Copyright (c) 2024 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
1.1. Relation to other RFCs . . . . . . . . . . . . . . . . . 5 | 1.1. Relation to Other RFCs | |||
1.2. Specification Language . . . . . . . . . . . . . . . . . 6 | 1.2. Specification Language | |||
1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 | 1.3. Terminology | |||
1.4. Adherence to the NMDA . . . . . . . . . . . . . . . . . . 7 | 1.4. Adherence to the NMDA | |||
1.5. Conventions . . . . . . . . . . . . . . . . . . . . . . . 7 | 1.5. Conventions | |||
2. The "ietf-keystore" Module . . . . . . . . . . . . . . . . . 7 | 2. The "ietf-keystore" Module | |||
2.1. Data Model Overview . . . . . . . . . . . . . . . . . . . 7 | 2.1. Data Model Overview | |||
2.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 16 | 2.2. Example Usage | |||
2.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 27 | 2.3. YANG Module | |||
3. Support for Built-in Keys . . . . . . . . . . . . . . . . . . 36 | 3. Support for Built-In Keys | |||
4. Encrypting Keys in Configuration . . . . . . . . . . . . . . 38 | 4. Encrypting Keys in Configuration | |||
5. Security Considerations . . . . . . . . . . . . . . . . . . . 43 | 5. Security Considerations | |||
5.1. Security of Data at Rest and in Motion . . . . . . . . . 43 | 5.1. Security of Data at Rest and in Motion | |||
5.2. Unconstrained Private Key Usage . . . . . . . . . . . . . 43 | 5.2. Unconstrained Private Key Usage | |||
5.3. Considerations for the "ietf-keystore" YANG Module . . . 43 | 5.3. Security Considerations for the "ietf-keystore" YANG Module | |||
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 45 | 6. IANA Considerations | |||
6.1. The "IETF XML" Registry . . . . . . . . . . . . . . . . . 45 | 6.1. The IETF XML Registry | |||
6.2. The "YANG Module Names" Registry . . . . . . . . . . . . 45 | 6.2. The YANG Module Names Registry | |||
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 45 | 7. References | |||
7.1. Normative References . . . . . . . . . . . . . . . . . . 45 | 7.1. Normative References | |||
7.2. Informative References . . . . . . . . . . . . . . . . . 46 | 7.2. Informative References | |||
Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 48 | Acknowledgements | |||
A.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 48 | Author's Address | |||
A.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 48 | ||||
A.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
A.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
A.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
A.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
A.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
A.8. 07 to 08 . . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
A.9. 08 to 09 . . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
A.10. 09 to 10 . . . . . . . . . . . . . . . . . . . . . . . . 50 | ||||
A.11. 10 to 11 . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
A.12. 11 to 12 . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
A.13. 12 to 13 . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
A.14. 13 to 14 . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
A.15. 14 to 15 . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
A.16. 15 to 16 . . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
A.17. 16 to 17 . . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
A.18. 17 to 18 . . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
A.19. 18 to 19 . . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
A.20. 19 to 20 . . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
A.21. 20 to 21 . . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
A.22. 21 to 22 . . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
A.23. 22 to 23 . . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
A.24. 23 to 24 . . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
A.25. 24 to 25 . . . . . . . . . . . . . . . . . . . . . . . . 54 | ||||
A.26. 25 to 26 . . . . . . . . . . . . . . . . . . . . . . . . 54 | ||||
A.27. 26 to 27 . . . . . . . . . . . . . . . . . . . . . . . . 54 | ||||
A.28. 27 to 28 . . . . . . . . . . . . . . . . . . . . . . . . 54 | ||||
A.29. 28 to 29 . . . . . . . . . . . . . . . . . . . . . . . . 54 | ||||
A.30. 29 to 30 . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
A.31. 30 to 31 . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
A.32. 31 to 33 . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
A.33. 33 to 34 . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
A.34. 34 to 35 . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 55 | ||||
1. Introduction | 1. Introduction | |||
This document presents a YANG 1.1 [RFC7950] module called "ietf- | This document presents a YANG 1.1 [RFC7950] module called "ietf- | |||
keystore" that enables centralized configuration of both symmetric | keystore" that enables centralized configuration of both symmetric | |||
and asymmetric keys. The secret value for both key types may be | and asymmetric keys. The secret value for both key types may be | |||
encrypted or hidden (see [I-D.ietf-netconf-crypto-types]). | encrypted or hidden (see [RFC9640]). Asymmetric keys may be | |||
Asymmetric keys may be associated with certificates. Notifications | associated with certificates. Notifications are sent when | |||
are sent when certificates are about to expire. | certificates are about to expire. | |||
The "ietf-keystore" module defines many "grouping" statements | The "ietf-keystore" module defines many "grouping" statements | |||
intended for use by other modules that may import it. For instance, | intended for use by other modules that may import it. For instance, | |||
there are groupings that define enabling a key to be either | there are groupings that define enabling a key to be configured | |||
configured inline (within the defining data model) or as a reference | either inline (within the defining data model) or as a reference to a | |||
to a key in the central keystore. | key in the central keystore. | |||
Special consideration has been given for servers that have | Special consideration has been given for servers that have | |||
cryptographic hardware, such as a Trusted Platform Module (TPM). | cryptographic hardware, such as a trusted platform module (TPM). | |||
These servers are unique in that the cryptographic hardware hides the | These servers are unique in that the cryptographic hardware hides the | |||
secret key values. Additionally, such hardware is commonly | secret key values. Additionally, such hardware is commonly | |||
initialized when manufactured to protect a "built-in" asymmetric key | initialized when manufactured to protect a "built-in" asymmetric key | |||
for which its public half is conveyed in an identity certificate | for which its public half is conveyed in an identity certificate | |||
(e.g., an IDevID [Std-802.1AR-2018] certificate). Please see | (e.g., an Initial Device Identifier (IDevID) [Std-802.1AR-2018] | |||
Section 3 to see how built-in keys are supported. | certificate). See how built-in keys are supported in Section 3. | |||
This document is intended to reflect existing practices that many | This document is intended to reflect existing practices that many | |||
server implementations support at the time of writing. To simplify | server implementations support at the time of writing. To simplify | |||
implementation, advanced key formats may be selectively implemented. | implementation, advanced key formats may be selectively implemented. | |||
Implementations may utilize operating-system level keystore utilities | Implementations may utilize operating-system level keystore utilities | |||
(e.g., "Keychain Access" on MacOS) and/or cryptographic hardware | (e.g., "Keychain Access" on MacOS) and/or cryptographic hardware | |||
(e.g., TPMs). | (e.g., TPMs). | |||
1.1. Relation to other RFCs | 1.1. Relation to Other RFCs | |||
This document presents one or more YANG modules [RFC7950] that are | This document presents a YANG module [RFC7950] that is part of a | |||
part of a collection of RFCs that work together to, ultimately, | collection of RFCs that work together to ultimately support the | |||
support the configuration of both the clients and servers of both the | configuration of both the clients and servers of the Network | |||
NETCONF [RFC6241] and RESTCONF [RFC8040] protocols. | Configuration Protocol (NETCONF) [RFC6241] and RESTCONF [RFC8040]. | |||
The dependency relationship between the primary YANG groupings | The dependency relationship between the primary YANG groupings | |||
defined in the various RFCs is presented in the below diagram. In | defined in the various RFCs is presented in the diagram below. In | |||
some cases, a draft may define secondary groupings that introduce | some cases, a document may define secondary groupings that introduce | |||
dependencies not illustrated in the diagram. The labels in the | dependencies not illustrated in the diagram. The labels in the | |||
diagram are a shorthand name for the defining RFC. The citation | diagram are shorthand names for the defining RFCs. The citation | |||
reference for shorthand name is provided below the diagram. | references for the shorthand names are provided below the diagram. | |||
Please note that the arrows in the diagram point from referencer to | Please note that the arrows in the diagram point from referencer to | |||
referenced. For example, the "crypto-types" RFC does not have any | referenced. For example, the "crypto-types" RFC does not have any | |||
dependencies, whilst the "keystore" RFC depends on the "crypto-types" | dependencies, whilst the "keystore" RFC depends on the "crypto-types" | |||
RFC. | RFC. | |||
crypto-types | crypto-types | |||
^ ^ | ^ ^ | |||
/ \ | / \ | |||
/ \ | / \ | |||
skipping to change at page 6, line 5 ¶ | skipping to change at line 147 ¶ | |||
| | | | | ^ | | | | | | ^ | |||
| | | +-----+ +---------+ | | | | | +-----+ +---------+ | | |||
| | | | | | | | | | | | | | |||
| +-----------|--------|--------------+ | | | | +-----------|--------|--------------+ | | | |||
| | | | | | | | | | | | | | |||
+-----------+ | | | | | | +-----------+ | | | | | | |||
| | | | | | | | | | | | | | |||
| | | | | | | | | | | | | | |||
netconf-client-server restconf-client-server | netconf-client-server restconf-client-server | |||
+======================+===========================================+ | +========================+==========================+ | |||
|Label in Diagram | Originating RFC | | | Label in Diagram | Originating RFC | | |||
+======================+===========================================+ | +========================+==========================+ | |||
|crypto-types | [I-D.ietf-netconf-crypto-types] | | | crypto-types | [RFC9640] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|truststore | [I-D.ietf-netconf-trust-anchors] | | | truststore | [RFC9641] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|keystore | [I-D.ietf-netconf-keystore] | | | keystore | RFC 9642 | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|tcp-client-server | [I-D.ietf-netconf-tcp-client-server] | | | tcp-client-server | [RFC9643] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|ssh-client-server | [I-D.ietf-netconf-ssh-client-server] | | | ssh-client-server | [RFC9644] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|tls-client-server | [I-D.ietf-netconf-tls-client-server] | | | tls-client-server | [RFC9645] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|http-client-server | [I-D.ietf-netconf-http-client-server] | | | http-client-server | [HTTP-CLIENT-SERVER] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|netconf-client-server | [I-D.ietf-netconf-netconf-client-server] | | | netconf-client-server | [NETCONF-CLIENT-SERVER] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
|restconf-client-server| [I-D.ietf-netconf-restconf-client-server] | | | restconf-client-server | [RESTCONF-CLIENT-SERVER] | | |||
+----------------------+-------------------------------------------+ | +------------------------+--------------------------+ | |||
Table 1: Label in Diagram to RFC Mapping | Table 1: Labels in Diagram to RFC Mapping | |||
1.2. Specification Language | 1.2. Specification Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
1.3. Terminology | 1.3. Terminology | |||
The terms "client" and "server" are defined in [RFC6241] and are not | The terms "client" and "server" are defined in [RFC6241] and are not | |||
redefined here. | redefined here. | |||
The term "keystore" is defined in this document as a mechanism that | The term "keystore" is defined in this document as a mechanism that | |||
intends to safeguard secrets. | intends to safeguard secrets. | |||
The nomenclature "<running>" and "<operational>" are defined in | The nomenclatures "<running>" and "<operational>" are defined in | |||
[RFC8342]. | [RFC8342]. | |||
The sentence fragments "augmented" and "augmented in" are used herein | The sentence fragments "augmented" and "augmented in" are used herein | |||
as the past tense verbified form of the "augment" statement defined | as the past tense verbified form of the "augment" statement defined | |||
in Section 7.17 of [RFC7950]. | in Section 7.17 of [RFC7950]. | |||
The term "key" may be used to mean one of three things in this | The term "key" may be used to mean one of three things in this | |||
document: 1) the YANG-defined "asymmetric-key" or "symmetric-key" | document: 1) the YANG-defined "asymmetric-key" or "symmetric-key" | |||
node defined in this document, 2) the raw key data possessed by the | node defined in this document, 2) the raw key data possessed by the | |||
aforementioned key nodes, and 3) the "key" of a YANG "list" | aforementioned key nodes, or 3) the "key" of a YANG "list" statement. | |||
statement. This document attempts to always qualify types '2' and | This document qualifies types '2' and '3' using "raw key value" and | |||
'3' using, "raw key value" and "YANG list key" where needed. In all | "YANG list key" where needed. In all other cases, an unqualified | |||
other cases, an unqualified "key" refers to a YANG-defined | "key" refers to a YANG-defined "asymmetric-key" or "symmetric-key" | |||
"asymmetric-key" or "symmetric-key" node. | node. | |||
1.4. Adherence to the NMDA | 1.4. Adherence to the NMDA | |||
This document is compliant with Network Management Datastore | This document is compliant with Network Management Datastore | |||
Architecture (NMDA) [RFC8342]. For instance, keys and associated | Architecture (NMDA) [RFC8342]. For instance, keys and associated | |||
certificates installed during manufacturing (e.g., for an IDevID | certificates installed during manufacturing (e.g., for an IDevID | |||
certificate) are expected to appear in <operational> (see Section 3). | certificate) are expected to appear in <operational> (see Section 3). | |||
1.5. Conventions | 1.5. Conventions | |||
Various examples in this document use "BASE64VALUE=" as a placeholder | Various examples in this document use "BASE64VALUE=" as a placeholder | |||
value for binary data that has been base64 encoded (per Section 9.8 | value for binary data that has been base64 encoded (per Section 9.8 | |||
of [RFC7950]). This placeholder value is used because real base64 | of [RFC7950]). This placeholder value is used because real | |||
encoded structures are often many lines long and hence distracting to | base64-encoded structures are often many lines long and hence | |||
the example being presented. | distracting to the example being presented. | |||
Various examples in this document use the XML [W3C.REC-xml-20081126] | ||||
encoding. Other encodings, such as JSON [RFC8259], could | ||||
alternatively be used. | ||||
Various examples in this document contain long lines that may be | ||||
folded, as described in [RFC8792]. | ||||
This document uses the adjective "central" to the word "keystore" to | This document uses the adjective "central" to the word "keystore" to | |||
refer to the top-level instance of the "keystore-grouping", when the | refer to the top-level instance of the "keystore-grouping", when the | |||
"central-keystore-supported" feature is enabled. Please be aware | "central-keystore-supported" feature is enabled. Please be aware | |||
that consuming YANG modules MAY instantiate the "keystore-grouping" | that consuming YANG modules MAY instantiate the "keystore-grouping" | |||
in other locations. All such other instances are not the "central" | in other locations. All such other instances are not the "central" | |||
instance. | instance. | |||
2. The "ietf-keystore" Module | 2. The "ietf-keystore" Module | |||
skipping to change at page 8, line 33 ¶ | skipping to change at line 278 ¶ | |||
The diagram above uses syntax that is similar to but not defined in | The diagram above uses syntax that is similar to but not defined in | |||
[RFC8340]. | [RFC8340]. | |||
Comments: | Comments: | |||
* All the typedefs defined in the "ietf-keystore" module extend the | * All the typedefs defined in the "ietf-keystore" module extend the | |||
base "leafref" type defined in [RFC7950]. | base "leafref" type defined in [RFC7950]. | |||
* The leafrefs refer to symmetric and asymmetric keys in the central | * The leafrefs refer to symmetric and asymmetric keys in the central | |||
keystore, when this module is implemented. | keystore when this module is implemented. | |||
* These typedefs are provided as an aid to consuming modules that | * These typedefs are provided as an aid to consuming modules that | |||
import the "ietf-keystore" module. | import the "ietf-keystore" module. | |||
2.1.3. Groupings | 2.1.3. Groupings | |||
The "ietf-keystore" module defines the following "grouping" | The "ietf-keystore" module defines the following "grouping" | |||
statements: | statements: | |||
* encrypted-by-grouping | * encrypted-by-grouping | |||
skipping to change at page 10, line 24 ¶ | skipping to change at line 364 ¶ | |||
| +---u ct:symmetric-key-grouping | | +---u ct:symmetric-key-grouping | |||
+--:(central-keystore) | +--:(central-keystore) | |||
{central-keystore-supported,symmetric-keys}? | {central-keystore-supported,symmetric-keys}? | |||
+-- central-keystore-reference? | +-- central-keystore-reference? | |||
ks:central-symmetric-key-ref | ks:central-symmetric-key-ref | |||
Comments: | Comments: | |||
* The "inline-or-keystore-symmetric-key-grouping" grouping is | * The "inline-or-keystore-symmetric-key-grouping" grouping is | |||
provided solely as convenience to consuming modules that wish to | provided solely as convenience to consuming modules that wish to | |||
offer an option for whether a symmetric key is defined inline or | offer an option for a symmetric key that is defined either inline | |||
as a reference to a symmetric key in the keystore. | or as a reference to a symmetric key in the keystore. | |||
* A "choice" statement is used to expose the various options. Each | * A "choice" statement is used to expose the various options. Each | |||
option is enabled by a "feature" statement. Additional "case" | option is enabled by a "feature" statement. Additional "case" | |||
statements MAY be augmented in if, e.g., there is a need to | statements MAY be augmented in if, e.g., there is a need to | |||
reference a symmetric key in an alternate location. | reference a symmetric key in an alternate location. | |||
* For the "inline-definition" option, the definition uses the | * For the "inline-definition" option, the definition uses the | |||
"symmetric-key-grouping" grouping discussed in Section 2.1.4.3 of | "symmetric-key-grouping" grouping discussed in Section 2.1.4.3 of | |||
[I-D.ietf-netconf-crypto-types]. | [RFC9640]. | |||
* For the "central-keystore" option, the "central-keystore- | * For the "central-keystore" option, the "central-keystore- | |||
reference" is an instance of the "symmetric-key-ref" discussed in | reference" is an instance of the "symmetric-key-ref" discussed in | |||
Section 2.1.2. | Section 2.1.2. | |||
2.1.3.4. The "inline-or-keystore-asymmetric-key-grouping" Grouping | 2.1.3.4. The "inline-or-keystore-asymmetric-key-grouping" Grouping | |||
The following tree diagram [RFC8340] illustrates the "inline-or- | The following tree diagram [RFC8340] illustrates the "inline-or- | |||
keystore-asymmetric-key-grouping" grouping: | keystore-asymmetric-key-grouping" grouping: | |||
skipping to change at page 11, line 19 ¶ | skipping to change at line 399 ¶ | |||
| +---u ct:asymmetric-key-pair-grouping | | +---u ct:asymmetric-key-pair-grouping | |||
+--:(central-keystore) | +--:(central-keystore) | |||
{central-keystore-supported,asymmetric-keys}? | {central-keystore-supported,asymmetric-keys}? | |||
+-- central-keystore-reference? | +-- central-keystore-reference? | |||
ks:central-asymmetric-key-ref | ks:central-asymmetric-key-ref | |||
Comments: | Comments: | |||
* The "inline-or-keystore-asymmetric-key-grouping" grouping is | * The "inline-or-keystore-asymmetric-key-grouping" grouping is | |||
provided solely as convenience to consuming modules that wish to | provided solely as convenience to consuming modules that wish to | |||
offer an option for whether an asymmetric key is defined inline or | offer an option for an asymmetric key that is defined either | |||
as a reference to an asymmetric key in the keystore. | inline or as a reference to an asymmetric key in the keystore. | |||
* A "choice" statement is used to expose the various options. Each | * A "choice" statement is used to expose the various options. Each | |||
option is enabled by a "feature" statement. Additional "case" | option is enabled by a "feature" statement. Additional "case" | |||
statements MAY be augmented in if, e.g., there is a need to | statements MAY be augmented in if, e.g., there is a need to | |||
reference an asymmetric key in an alternate location. | reference an asymmetric key in an alternate location. | |||
* For the "inline-definition" option, the definition uses the | * For the "inline-definition" option, the definition uses the | |||
"asymmetric-key-pair-grouping" grouping discussed in | "asymmetric-key-pair-grouping" grouping discussed in | |||
Section 2.1.4.6 of [I-D.ietf-netconf-crypto-types]. | Section 2.1.4.6 of [RFC9640]. | |||
* For the "central-keystore" option, the "central-keystore- | * For the "central-keystore" option, the "central-keystore- | |||
reference" is an instance of the "asymmetric-key-ref" typedef | reference" is an instance of the "asymmetric-key-ref" typedef | |||
discussed in Section 2.1.2. | discussed in Section 2.1.2. | |||
2.1.3.5. The "inline-or-keystore-asymmetric-key-with-certs-grouping" | 2.1.3.5. The "inline-or-keystore-asymmetric-key-with-certs-grouping" | |||
Grouping | Grouping | |||
The following tree diagram [RFC8340] illustrates the "inline-or- | The following tree diagram [RFC8340] illustrates the "inline-or- | |||
keystore-asymmetric-key-with-certs-grouping" grouping: | keystore-asymmetric-key-with-certs-grouping" grouping: | |||
skipping to change at page 12, line 7 ¶ | skipping to change at line 435 ¶ | |||
| +---u ct:asymmetric-key-pair-with-certs-grouping | | +---u ct:asymmetric-key-pair-with-certs-grouping | |||
+--:(central-keystore) | +--:(central-keystore) | |||
{central-keystore-supported,asymmetric-keys}? | {central-keystore-supported,asymmetric-keys}? | |||
+-- central-keystore-reference? | +-- central-keystore-reference? | |||
ks:central-asymmetric-key-ref | ks:central-asymmetric-key-ref | |||
Comments: | Comments: | |||
* The "inline-or-keystore-asymmetric-key-with-certs-grouping" | * The "inline-or-keystore-asymmetric-key-with-certs-grouping" | |||
grouping is provided solely as convenience to consuming modules | grouping is provided solely as convenience to consuming modules | |||
that wish to offer an option for whether an asymmetric key is | that wish to offer an option for an asymmetric key that is defined | |||
defined inline or as a reference to an asymmetric key in the | either inline or as a reference to an asymmetric key in the | |||
keystore. | keystore. | |||
* A "choice" statement is used to expose the various options. Each | * A "choice" statement is used to expose the various options. Each | |||
option is enabled by a "feature" statement. Additional "case" | option is enabled by a "feature" statement. Additional "case" | |||
statements MAY be augmented in if, e.g., there is a need to | statements MAY be augmented in if, e.g., there is a need to | |||
reference an asymmetric key in an alternate location. | reference an asymmetric key in an alternate location. | |||
* For the "inline-definition" option, the definition uses the | * For the "inline-definition" option, the definition uses the | |||
"asymmetric-key-pair-with-certs-grouping" grouping discussed in | "asymmetric-key-pair-with-certs-grouping" grouping discussed in | |||
Section 2.1.4.12 of [I-D.ietf-netconf-crypto-types]. | Section 2.1.4.12 of [RFC9640]. | |||
* For the "central-keystore" option, the "central-keystore- | * For the "central-keystore" option, the "central-keystore- | |||
reference" is an instance of the "asymmetric-key-ref" typedef | reference" is an instance of the "asymmetric-key-ref" typedef | |||
discussed in Section 2.1.2. | discussed in Section 2.1.2. | |||
2.1.3.6. The "inline-or-keystore-end-entity-cert-with-key-grouping" | 2.1.3.6. The "inline-or-keystore-end-entity-cert-with-key-grouping" | |||
Grouping | Grouping | |||
The following tree diagram [RFC8340] illustrates the "inline-or- | The following tree diagram [RFC8340] illustrates the "inline-or- | |||
keystore-end-entity-cert-with-key-grouping" grouping: | keystore-end-entity-cert-with-key-grouping" grouping: | |||
skipping to change at page 12, line 44 ¶ | skipping to change at line 472 ¶ | |||
| +---u ct:asymmetric-key-pair-with-cert-grouping | | +---u ct:asymmetric-key-pair-with-cert-grouping | |||
+--:(central-keystore) | +--:(central-keystore) | |||
{central-keystore-supported,asymmetric-keys}? | {central-keystore-supported,asymmetric-keys}? | |||
+-- central-keystore-reference | +-- central-keystore-reference | |||
+---u central-asymmetric-key-certificate-ref-grouping | +---u central-asymmetric-key-certificate-ref-grouping | |||
Comments: | Comments: | |||
* The "inline-or-keystore-end-entity-cert-with-key-grouping" | * The "inline-or-keystore-end-entity-cert-with-key-grouping" | |||
grouping is provided solely as convenience to consuming modules | grouping is provided solely as convenience to consuming modules | |||
that wish to offer an option for whether a symmetric key is | that wish to offer an option for a symmetric key that is defined | |||
defined inline or as a reference to a symmetric key in the | either inline or as a reference to a symmetric key in the | |||
keystore. | keystore. | |||
* A "choice" statement is used to expose the various options. Each | * A "choice" statement is used to expose the various options. Each | |||
option is enabled by a "feature" statement. Additional "case" | option is enabled by a "feature" statement. Additional "case" | |||
statements MAY be augmented in if, e.g., there is a need to | statements MAY be augmented in if, e.g., there is a need to | |||
reference a symmetric key in an alternate location. | reference a symmetric key in an alternate location. | |||
* For the "inline-definition" option, the definition uses the | * For the "inline-definition" option, the definition uses the | |||
"asymmetric-key-pair-with-certs-grouping" grouping discussed in | "asymmetric-key-pair-with-certs-grouping" grouping discussed in | |||
Section 2.1.4.12 of [I-D.ietf-netconf-crypto-types]. | Section 2.1.4.12 of [RFC9640]. | |||
* For the "central-keystore" option, the "central-keystore- | * For the "central-keystore" option, the "central-keystore- | |||
reference" uses the "central-asymmetric-key-certificate-ref- | reference" uses the "central-asymmetric-key-certificate-ref- | |||
grouping" grouping discussed in Section 2.1.3.2. | grouping" grouping discussed in Section 2.1.3.2. | |||
2.1.3.7. The "keystore-grouping" Grouping | 2.1.3.7. The "keystore-grouping" Grouping | |||
The following tree diagram [RFC8340] illustrates the "keystore- | The following tree diagram [RFC8340] illustrates the "keystore- | |||
grouping" grouping: | grouping" grouping: | |||
grouping keystore-grouping: | grouping keystore-grouping: | |||
+-- asymmetric-keys {asymmetric-keys}? | +-- asymmetric-keys {asymmetric-keys}? | |||
| +-- asymmetric-key* [name] | | +-- asymmetric-key* [name] | |||
| +-- name? string | | +-- name string | |||
| +---u ct:asymmetric-key-pair-with-certs-grouping | | +---u ct:asymmetric-key-pair-with-certs-grouping | |||
+-- symmetric-keys {symmetric-keys}? | +-- symmetric-keys {symmetric-keys}? | |||
+-- symmetric-key* [name] | +-- symmetric-key* [name] | |||
+-- name? string | +-- name string | |||
+---u ct:symmetric-key-grouping | +---u ct:symmetric-key-grouping | |||
Comments: | Comments: | |||
* The "keystore-grouping" grouping defines a keystore instance as | * The "keystore-grouping" grouping defines a keystore instance as | |||
being composed of symmetric and asymmetric keys. The structure | being composed of symmetric and asymmetric keys. The structure | |||
for the symmetric and asymmetric keys is essentially the same, | for the symmetric and asymmetric keys is essentially the same: a | |||
being a "list" inside a "container". | "list" inside a "container". | |||
* For asymmetric keys, each "asymmetric-key" uses the "asymmetric- | * For asymmetric keys, each "asymmetric-key" uses the "asymmetric- | |||
key-pair-with-certs-grouping" grouping discussed in | key-pair-with-certs-grouping" grouping discussed in | |||
Section 2.1.4.12 of [I-D.ietf-netconf-crypto-types]. | Section 2.1.4.12 of [RFC9640]. | |||
* For symmetric keys, each "symmetric-key" uses the "symmetric-key- | * For symmetric keys, each "symmetric-key" uses the "symmetric-key- | |||
grouping" grouping discussed in Section 2.1.4.3 of | grouping" grouping discussed in Section 2.1.4.3 of [RFC9640]. | |||
[I-D.ietf-netconf-crypto-types]. | ||||
2.1.4. Protocol-accessible Nodes | 2.1.4. Protocol-Accessible Nodes | |||
The following tree diagram [RFC8340] lists all the protocol- | The following tree diagram [RFC8340] lists all the protocol- | |||
accessible nodes defined in the "ietf-keystore" module, without | accessible nodes defined in the "ietf-keystore" module without | |||
expanding the "grouping" statements: | expanding the "grouping" statements: | |||
module: ietf-keystore | module: ietf-keystore | |||
+--rw keystore {central-keystore-supported}? | +--rw keystore {central-keystore-supported}? | |||
+---u keystore-grouping | +---u keystore-grouping | |||
The following tree diagram [RFC8340] lists all the protocol- | The following tree diagram [RFC8340] lists all the protocol- | |||
accessible nodes defined in the "ietf-keystore" module, with all | accessible nodes defined in the "ietf-keystore" module, with all | |||
"grouping" statements expanded, enabling the keystore's full | "grouping" statements expanded, enabling the keystore's full | |||
structure to be seen: | structure to be seen. | |||
=============== NOTE: '\' line wrapping per RFC 8792 ================ | =============== NOTE: '\' line wrapping per RFC 8792 ================ | |||
module: ietf-keystore | module: ietf-keystore | |||
+--rw keystore {central-keystore-supported}? | +--rw keystore {central-keystore-supported}? | |||
+--rw asymmetric-keys {asymmetric-keys}? | +--rw asymmetric-keys {asymmetric-keys}? | |||
| +--rw asymmetric-key* [name] | | +--rw asymmetric-key* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw public-key-format? identityref | | +--rw public-key-format? identityref | |||
| +--rw public-key? binary | | +--rw public-key? binary | |||
skipping to change at page 16, line 6 ¶ | skipping to change at line 623 ¶ | |||
* The protocol-accessible nodes for the "ietf-keystore" module are | * The protocol-accessible nodes for the "ietf-keystore" module are | |||
instances of the "keystore-grouping" grouping discussed in | instances of the "keystore-grouping" grouping discussed in | |||
Section 2.1.3.7. | Section 2.1.3.7. | |||
* The top-level node "keystore" is additionally constrained by the | * The top-level node "keystore" is additionally constrained by the | |||
feature "central-keystore-supported". | feature "central-keystore-supported". | |||
* The "keystore-grouping" grouping is discussed in Section 2.1.3.7. | * The "keystore-grouping" grouping is discussed in Section 2.1.3.7. | |||
* The reason for why "keystore-grouping" exists separate from the | * The reason for why "keystore-grouping" exists separate from the | |||
protocol-accessible nodes definition is so as to enable instances | protocol-accessible nodes definition is to enable instances of the | |||
of the keystore to be instantiated in other locations, as may be | keystore to be instantiated in other locations, as may be needed | |||
needed or desired by some modules. | or desired by some modules. | |||
2.2. Example Usage | 2.2. Example Usage | |||
The examples in this section are encoded using XML, such as might be | The examples in this section are encoded using XML, such as might be | |||
the case when using the NETCONF protocol. Other encodings MAY be | the case when using the NETCONF protocol. Other encodings MAY be | |||
used, such as JSON when using the RESTCONF protocol. | used, such as JSON when using the RESTCONF protocol. | |||
2.2.1. A Keystore Instance | 2.2.1. A Keystore Instance | |||
The following example illustrates keys in <running>. Please see | The following example illustrates keys in <running>. Please see | |||
skipping to change at page 19, line 28 ¶ | skipping to change at line 783 ¶ | |||
<expiration-date>2018-08-05T14:18:53-05:00</expiration\ | <expiration-date>2018-08-05T14:18:53-05:00</expiration\ | |||
-date> | -date> | |||
</certificate-expiration> | </certificate-expiration> | |||
</certificate> | </certificate> | |||
</certificates> | </certificates> | |||
</asymmetric-key> | </asymmetric-key> | |||
</asymmetric-keys> | </asymmetric-keys> | |||
</keystore> | </keystore> | |||
</notification> | </notification> | |||
2.2.3. The "Local or Keystore" Groupings | 2.2.3. The "Inline or Keystore" Groupings | |||
This section illustrates the various "inline-or-keystore" groupings | This section illustrates the various "inline-or-keystore" groupings | |||
defined in the "ietf-keystore" module, specifically the "inline-or- | defined in the "ietf-keystore" module, specifically the "inline-or- | |||
keystore-symmetric-key-grouping" (Section 2.1.3.3), "inline-or- | keystore-symmetric-key-grouping" (Section 2.1.3.3), "inline-or- | |||
keystore-asymmetric-key-grouping" (Section 2.1.3.4), "inline-or- | keystore-asymmetric-key-grouping" (Section 2.1.3.4), "inline-or- | |||
keystore-asymmetric-key-with-certs-grouping" (Section 2.1.3.5), and | keystore-asymmetric-key-with-certs-grouping" (Section 2.1.3.5), and | |||
"inline-or-keystore-end-entity-cert-with-key-grouping" | "inline-or-keystore-end-entity-cert-with-key-grouping" | |||
(Section 2.1.3.6) groupings. | (Section 2.1.3.6) groupings. | |||
These examples assume the existence of an example module called "ex- | These examples assume the existence of an example module called "ex- | |||
keystore-usage" having the namespace "https://example.com/ns/example- | keystore-usage" that has the namespace "https://example.com/ns/ | |||
keystore-usage". | example-keystore-usage". | |||
The ex-keystore-usage module is first presented using tree diagrams | The ex-keystore-usage module is first presented using tree diagrams | |||
[RFC8340], followed by an instance example illustrating all the | [RFC8340], followed by an instance example illustrating all the | |||
"inline-or-keystore" groupings in use, followed by the YANG module | "inline-or-keystore" groupings in use, followed by the YANG module | |||
itself. | itself. | |||
2.2.3.1. Tree Diagrams for the "ex-keystore-usage" Module | 2.2.3.1. Tree Diagrams for the "ex-keystore-usage" Module | |||
The following tree diagram illustrates "ex-keystore-usage" without | The following tree diagram illustrates "ex-keystore-usage" without | |||
expanding the "grouping" statements: | expanding the "grouping" statements: | |||
skipping to change at page 20, line 25 ¶ | skipping to change at line 827 ¶ | |||
+--rw asymmetric-key-with-certs* [name] | +--rw asymmetric-key-with-certs* [name] | |||
| +--rw name | | +--rw name | |||
| | string | | | string | |||
| +---u ks:inline-or-keystore-asymmetric-key-with-certs-groupi\ | | +---u ks:inline-or-keystore-asymmetric-key-with-certs-groupi\ | |||
ng | ng | |||
+--rw end-entity-cert-with-key* [name] | +--rw end-entity-cert-with-key* [name] | |||
+--rw name | +--rw name | |||
| string | | string | |||
+---u ks:inline-or-keystore-end-entity-cert-with-key-grouping | +---u ks:inline-or-keystore-end-entity-cert-with-key-grouping | |||
The following tree diagram illustrates the "ex-keystore-usage" | The following tree diagram illustrates the "ex-keystore-usage" module | |||
module, with all "grouping" statements expanded, enabling the usage's | with all "grouping" statements expanded, enabling the usage's full | |||
full structure to be seen: | structure to be seen: | |||
=============== NOTE: '\' line wrapping per RFC 8792 ================ | =============== NOTE: '\' line wrapping per RFC 8792 ================ | |||
module: ex-keystore-usage | module: ex-keystore-usage | |||
+--rw keystore-usage | +--rw keystore-usage | |||
+--rw symmetric-key* [name] | +--rw symmetric-key* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw (inline-or-keystore) | | +--rw (inline-or-keystore) | |||
| +--:(inline) {inline-definitions-supported}? | | +--:(inline) {inline-definitions-supported}? | |||
| | +--rw inline-definition | | | +--rw inline-definition | |||
skipping to change at page 23, line 33 ¶ | skipping to change at line 980 ¶ | |||
instances are equivalent, as the inlined instance example contains | instances are equivalent, as the inlined instance example contains | |||
the same values defined by the keystore instance referenced by its | the same values defined by the keystore instance referenced by its | |||
sibling example. | sibling example. | |||
=============== NOTE: '\' line wrapping per RFC 8792 ================ | =============== NOTE: '\' line wrapping per RFC 8792 ================ | |||
<keystore-usage | <keystore-usage | |||
xmlns="https://example.com/ns/example-keystore-usage" | xmlns="https://example.com/ns/example-keystore-usage" | |||
xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-crypto-types"> | xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-crypto-types"> | |||
<!-- The following two equivalent examples illustrate the --> | <!-- The following two equivalent examples illustrate the --> | |||
<!-- "inline-or-keystore-symmetric-key-grouping" grouping: --> | <!-- "inline-or-keystore-symmetric-key-grouping" grouping: --> | |||
<symmetric-key> | <symmetric-key> | |||
<name>example 1a</name> | <name>example 1a</name> | |||
<central-keystore-reference>cleartext-symmetric-key</central-key\ | <central-keystore-reference>cleartext-symmetric-key</central-key\ | |||
store-reference> | store-reference> | |||
</symmetric-key> | </symmetric-key> | |||
<symmetric-key> | <symmetric-key> | |||
<name>example 1b</name> | <name>example 1b</name> | |||
<inline-definition> | <inline-definition> | |||
<key-format>ct:octet-string-key-format</key-format> | <key-format>ct:octet-string-key-format</key-format> | |||
<cleartext-symmetric-key>BASE64VALUE=</cleartext-symmetric-key> | <cleartext-symmetric-key>BASE64VALUE=</cleartext-symmetric-key> | |||
</inline-definition> | </inline-definition> | |||
</symmetric-key> | </symmetric-key> | |||
<!-- The following two equivalent examples illustrate the --> | <!-- The following two equivalent examples illustrate the --> | |||
<!-- "inline-or-keystore-asymmetric-key-grouping" grouping: --> | <!-- "inline-or-keystore-asymmetric-key-grouping" grouping: --> | |||
<asymmetric-key> | <asymmetric-key> | |||
<name>example 2a</name> | <name>example 2a</name> | |||
<central-keystore-reference>rsa-asymmetric-key</central-keystore\ | <central-keystore-reference>rsa-asymmetric-key</central-keystore\ | |||
-reference> | -reference> | |||
</asymmetric-key> | </asymmetric-key> | |||
<asymmetric-key> | <asymmetric-key> | |||
<name>example 2b</name> | <name>example 2b</name> | |||
<inline-definition> | <inline-definition> | |||
<public-key-format>ct:subject-public-key-info-format</public-k\ | <public-key-format>ct:subject-public-key-info-format</public-k\ | |||
ey-format> | ey-format> | |||
<public-key>BASE64VALUE=</public-key> | <public-key>BASE64VALUE=</public-key> | |||
<private-key-format>ct:rsa-private-key-format</private-key-for\ | <private-key-format>ct:rsa-private-key-format</private-key-for\ | |||
mat> | mat> | |||
<cleartext-private-key>BASE64VALUE=</cleartext-private-key> | <cleartext-private-key>BASE64VALUE=</cleartext-private-key> | |||
</inline-definition> | </inline-definition> | |||
</asymmetric-key> | </asymmetric-key> | |||
<!-- the following two equivalent examples illustrate --> | <!-- The following two equivalent examples illustrate the --> | |||
<!-- "inline-or-keystore-asymmetric-key-with-certs-grouping": --> | <!-- "inline-or-keystore-asymmetric-key-with-certs-grouping" --> | |||
<!-- grouping: --> | ||||
<asymmetric-key-with-certs> | <asymmetric-key-with-certs> | |||
<name>example 3a</name> | <name>example 3a</name> | |||
<central-keystore-reference>rsa-asymmetric-key</central-keystore\ | <central-keystore-reference>rsa-asymmetric-key</central-keystore\ | |||
-reference> | -reference> | |||
</asymmetric-key-with-certs> | </asymmetric-key-with-certs> | |||
<asymmetric-key-with-certs> | <asymmetric-key-with-certs> | |||
<name>example 3b</name> | <name>example 3b</name> | |||
<inline-definition> | <inline-definition> | |||
<public-key-format>ct:subject-public-key-info-format</public-k\ | <public-key-format>ct:subject-public-key-info-format</public-k\ | |||
ey-format> | ey-format> | |||
<public-key>BASE64VALUE=</public-key> | <public-key>BASE64VALUE=</public-key> | |||
<private-key-format>ct:rsa-private-key-format</private-key-for\ | <private-key-format>ct:rsa-private-key-format</private-key-for\ | |||
mat> | mat> | |||
<cleartext-private-key>BASE64VALUE=</cleartext-private-key> | <cleartext-private-key>BASE64VALUE=</cleartext-private-key> | |||
<certificates> | <certificates> | |||
<certificate> | <certificate> | |||
<name>a locally-defined cert</name> | <name>a locally defined cert</name> | |||
<cert-data>BASE64VALUE=</cert-data> | <cert-data>BASE64VALUE=</cert-data> | |||
</certificate> | </certificate> | |||
</certificates> | </certificates> | |||
</inline-definition> | </inline-definition> | |||
</asymmetric-key-with-certs> | </asymmetric-key-with-certs> | |||
<!-- The following two equivalent examples illustrate --> | ||||
<!-- "inline-or-keystore-end-entity-cert-with-key-grouping": --> | ||||
<!-- The following two equivalent examples illustrate the --> | ||||
<!-- "inline-or-keystore-end-entity-cert-with-key-grouping" --> | ||||
<!-- grouping: --> | ||||
<end-entity-cert-with-key> | <end-entity-cert-with-key> | |||
<name>example 4a</name> | <name>example 4a</name> | |||
<central-keystore-reference> | <central-keystore-reference> | |||
<asymmetric-key>rsa-asymmetric-key</asymmetric-key> | <asymmetric-key>rsa-asymmetric-key</asymmetric-key> | |||
<certificate>ex-rsa-cert</certificate> | <certificate>ex-rsa-cert</certificate> | |||
</central-keystore-reference> | </central-keystore-reference> | |||
</end-entity-cert-with-key> | </end-entity-cert-with-key> | |||
<end-entity-cert-with-key> | <end-entity-cert-with-key> | |||
<name>example 4b</name> | <name>example 4b</name> | |||
skipping to change at page 25, line 42 ¶ | skipping to change at line 1084 ¶ | |||
Following is the "ex-keystore-usage" module's YANG definition: | Following is the "ex-keystore-usage" module's YANG definition: | |||
module ex-keystore-usage { | module ex-keystore-usage { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "https://example.com/ns/example-keystore-usage"; | namespace "https://example.com/ns/example-keystore-usage"; | |||
prefix ex-keystore-usage; | prefix ex-keystore-usage; | |||
import ietf-keystore { | import ietf-keystore { | |||
prefix ks; | prefix ks; | |||
reference | reference | |||
"RFC CCCC: A YANG Data Model for a Keystore"; | "RFC 9642: A YANG Data Model for a Keystore"; | |||
} | } | |||
organization | organization | |||
"Example Corporation"; | "Example Corporation"; | |||
contact | contact | |||
"Author: YANG Designer <mailto:yang.designer@example.com>"; | "Author: YANG Designer <mailto:yang.designer@example.com>"; | |||
description | description | |||
"This example module illustrates notable groupings defined | "This example module illustrates notable groupings defined | |||
in the 'ietf-keystore' module."; | in the 'ietf-keystore' module."; | |||
revision 2024-03-16 { | revision 2024-03-16 { | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC CCCC: A YANG Data Model for a Keystore"; | "RFC 9642: A YANG Data Model for a Keystore"; | |||
} | } | |||
container keystore-usage { | container keystore-usage { | |||
description | description | |||
"An illustration of the various keystore groupings."; | "An illustration of the various keystore groupings."; | |||
list symmetric-key { | list symmetric-key { | |||
key "name"; | key "name"; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
skipping to change at page 27, line 5 ¶ | skipping to change at line 1143 ¶ | |||
} | } | |||
list asymmetric-key-with-certs { | list asymmetric-key-with-certs { | |||
key "name"; | key "name"; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"An arbitrary name for this key."; | "An arbitrary name for this key."; | |||
} | } | |||
uses ks:inline-or-keystore-asymmetric-key-with-certs-grouping; | uses ks:inline-or-keystore-asymmetric-key-with-certs-grouping; | |||
description | description | |||
"An asymmetric key and its associated certs, that may be | "An asymmetric key and its associated certs that may be | |||
configured locally or be a reference to an asymmetric key | configured locally or be a reference to an asymmetric | |||
(and its associated certs) in the keystore."; | key (and its associated certs) in the keystore."; | |||
} | } | |||
list end-entity-cert-with-key { | list end-entity-cert-with-key { | |||
key "name"; | key "name"; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"An arbitrary name for this key."; | "An arbitrary name for this key."; | |||
} | } | |||
uses ks:inline-or-keystore-end-entity-cert-with-key-grouping; | uses ks:inline-or-keystore-end-entity-cert-with-key-grouping; | |||
description | description | |||
"An end-entity certificate and its associated asymmetric | "An end-entity certificate and its associated asymmetric | |||
key, that may be configured locally or be a reference | key that may be configured locally or be a reference | |||
to another certificate (and its associated asymmetric | to another certificate (and its associated asymmetric | |||
key) in the keystore."; | key) in the keystore."; | |||
} | } | |||
} | } | |||
} | } | |||
2.3. YANG Module | 2.3. YANG Module | |||
This YANG module has normative references to [RFC8341] and | This YANG module has normative references to [RFC8341] and [RFC9640]. | |||
[I-D.ietf-netconf-crypto-types]. | ||||
<CODE BEGINS> file "ietf-keystore@2024-03-16.yang" | <CODE BEGINS> file "ietf-keystore@2024-03-16.yang" | |||
module ietf-keystore { | module ietf-keystore { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-keystore"; | namespace "urn:ietf:params:xml:ns:yang:ietf-keystore"; | |||
prefix ks; | prefix ks; | |||
import ietf-netconf-acm { | import ietf-netconf-acm { | |||
prefix nacm; | prefix nacm; | |||
reference | reference | |||
"RFC 8341: Network Configuration Access Control Model"; | "RFC 8341: Network Configuration Access Control Model"; | |||
} | } | |||
import ietf-crypto-types { | import ietf-crypto-types { | |||
prefix ct; | prefix ct; | |||
reference | reference | |||
"RFC AAAA: YANG Data Types and Groupings for Cryptography"; | "RFC 9640: YANG Data Types and Groupings for Cryptography"; | |||
} | } | |||
organization | organization | |||
"IETF NETCONF (Network Configuration) Working Group"; | "IETF NETCONF (Network Configuration) Working Group"; | |||
contact | contact | |||
"WG Web: https://datatracker.ietf.org/wg/netconf | "WG Web: https://datatracker.ietf.org/wg/netconf | |||
WG List: NETCONF WG list <mailto:netconf@ietf.org> | WG List: NETCONF WG list <mailto:netconf@ietf.org> | |||
Author: Kent Watsen <mailto:kent+ietf@watsen.net>"; | Author: Kent Watsen <mailto:kent+ietf@watsen.net>"; | |||
description | description | |||
"This module defines a 'keystore' to centralize management | "This module defines a 'keystore' to centralize management | |||
of security credentials. | of security credentials. | |||
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) 2024 IETF Trust and the persons identified | Copyright (c) 2024 IETF Trust and the persons identified | |||
as authors of the code. All rights reserved. | as authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with | Redistribution and use in source and binary forms, with | |||
or without modification, is permitted pursuant to, and | or without modification, is permitted pursuant to, and | |||
subject to the license terms contained in, the Revised | subject to the license terms contained in, the Revised | |||
BSD License set forth in Section 4.c of the IETF Trust's | BSD License set forth in Section 4.c of the IETF Trust's | |||
Legal Provisions Relating to IETF Documents | Legal Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info). | (https://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC CCCC | This version of this YANG module is part of RFC 9642 | |||
(https://www.rfc-editor.org/info/rfcCCCC); see the RFC | (https://www.rfc-editor.org/info/rfc9642); see the RFC | |||
itself for full legal notices. | 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 2024-03-16 { | revision 2024-03-16 { | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC CCCC: A YANG Data Model for a Keystore"; | "RFC 9642: A YANG Data Model for a Keystore"; | |||
} | } | |||
/****************/ | /****************/ | |||
/* Features */ | /* Features */ | |||
/****************/ | /****************/ | |||
feature central-keystore-supported { | feature central-keystore-supported { | |||
description | description | |||
"The 'central-keystore-supported' feature indicates that | "The 'central-keystore-supported' feature indicates that | |||
the server supports the central keystore (i.e., fully | the server supports the central keystore (i.e., fully | |||
skipping to change at page 29, line 4 ¶ | skipping to change at line 1236 ¶ | |||
/****************/ | /****************/ | |||
/* Features */ | /* Features */ | |||
/****************/ | /****************/ | |||
feature central-keystore-supported { | feature central-keystore-supported { | |||
description | description | |||
"The 'central-keystore-supported' feature indicates that | "The 'central-keystore-supported' feature indicates that | |||
the server supports the central keystore (i.e., fully | the server supports the central keystore (i.e., fully | |||
implements the 'ietf-keystore' module)."; | implements the 'ietf-keystore' module)."; | |||
} | } | |||
feature inline-definitions-supported { | feature inline-definitions-supported { | |||
description | description | |||
"The 'inline-definitions-supported' feature indicates that | "The 'inline-definitions-supported' feature indicates that | |||
the server supports locally-defined keys."; | the server supports locally defined keys."; | |||
} | } | |||
feature asymmetric-keys { | feature asymmetric-keys { | |||
description | description | |||
"The 'asymmetric-keys' feature indicates that the server | "The 'asymmetric-keys' feature indicates that the server | |||
implements the /keystore/asymmetric-keys subtree."; | implements the /keystore/asymmetric-keys subtree."; | |||
} | } | |||
feature symmetric-keys { | feature symmetric-keys { | |||
skipping to change at page 30, line 8 ¶ | skipping to change at line 1289 ¶ | |||
/*****************/ | /*****************/ | |||
/* Groupings */ | /* Groupings */ | |||
/*****************/ | /*****************/ | |||
grouping encrypted-by-grouping { | grouping encrypted-by-grouping { | |||
description | description | |||
"A grouping that defines a 'choice' statement that can be | "A grouping that defines a 'choice' statement that can be | |||
augmented into the 'encrypted-by' node, present in the | augmented into the 'encrypted-by' node, present in the | |||
'symmetric-key-grouping' and 'asymmetric-key-pair-grouping' | 'symmetric-key-grouping' and 'asymmetric-key-pair-grouping' | |||
groupings defined in RFC AAAA, enabling references to keys | groupings defined in RFC 9640, enabling references to keys | |||
in the central keystore."; | in the central keystore."; | |||
choice encrypted-by { | choice encrypted-by { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A choice amongst other symmetric or asymmetric keys."; | "A choice amongst other symmetric or asymmetric keys."; | |||
case central-symmetric-key-ref { | case central-symmetric-key-ref { | |||
if-feature "central-keystore-supported"; | if-feature "central-keystore-supported"; | |||
if-feature "symmetric-keys"; | if-feature "symmetric-keys"; | |||
leaf symmetric-key-ref { | leaf symmetric-key-ref { | |||
skipping to change at page 30, line 42 ¶ | skipping to change at line 1323 ¶ | |||
encrypted the associated key."; | encrypted the associated key."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
// *-ref groupings | // *-ref groupings | |||
grouping central-asymmetric-key-certificate-ref-grouping { | grouping central-asymmetric-key-certificate-ref-grouping { | |||
description | description | |||
"Grouping for the reference to a certificate associated | "A grouping for the reference to a certificate associated | |||
with an asymmetric key stored in the central keystore."; | with an asymmetric key stored in the central keystore."; | |||
leaf asymmetric-key { | leaf asymmetric-key { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
if-feature "central-keystore-supported"; | if-feature "central-keystore-supported"; | |||
if-feature "asymmetric-keys"; | if-feature "asymmetric-keys"; | |||
type ks:central-asymmetric-key-ref; | type ks:central-asymmetric-key-ref; | |||
must '../certificate'; | must '../certificate'; | |||
description | description | |||
"A reference to an asymmetric key in the keystore."; | "A reference to an asymmetric key in the keystore."; | |||
} | } | |||
leaf certificate { | leaf certificate { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
type leafref { | type leafref { | |||
path "/ks:keystore/ks:asymmetric-keys/ks:asymmetric-key" | path "/ks:keystore/ks:asymmetric-keys/ks:asymmetric-key" | |||
+ "[ks:name = current()/../asymmetric-key]/" | + "[ks:name = current()/../asymmetric-key]/" | |||
+ "ks:certificates/ks:certificate/ks:name"; | + "ks:certificates/ks:certificate/ks:name"; | |||
} | } | |||
must '../asymmetric-key'; | must '../asymmetric-key'; | |||
description | description | |||
skipping to change at page 31, line 41 ¶ | skipping to change at line 1369 ¶ | |||
choice inline-or-keystore { | choice inline-or-keystore { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A choice between an inlined definition and a definition | "A choice between an inlined definition and a definition | |||
that exists in the keystore."; | that exists in the keystore."; | |||
case inline { | case inline { | |||
if-feature "inline-definitions-supported"; | if-feature "inline-definitions-supported"; | |||
container inline-definition { | container inline-definition { | |||
description | description | |||
"Container to hold the local key definition."; | "A container to hold the local key definition."; | |||
uses ct:symmetric-key-grouping; | uses ct:symmetric-key-grouping; | |||
} | } | |||
} | } | |||
case central-keystore { | case central-keystore { | |||
if-feature "central-keystore-supported"; | if-feature "central-keystore-supported"; | |||
if-feature "symmetric-keys"; | if-feature "symmetric-keys"; | |||
leaf central-keystore-reference { | leaf central-keystore-reference { | |||
type ks:central-symmetric-key-ref; | type ks:central-symmetric-key-ref; | |||
description | description | |||
"A reference to an symmetric key that exists in | "A reference to a symmetric key that exists in | |||
the central keystore."; | the central keystore."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
grouping inline-or-keystore-asymmetric-key-grouping { | grouping inline-or-keystore-asymmetric-key-grouping { | |||
description | description | |||
"A grouping for the configuration of an asymmetric key. The | "A grouping for the configuration of an asymmetric key. The | |||
asymmetric key may be defined inline or as a reference to | asymmetric key may be defined inline or as a reference to | |||
an asymmetric key stored in the central keystore. | an asymmetric key stored in the central keystore. | |||
Servers that wish to define alternate keystore locations | Servers that wish to define alternate keystore locations | |||
SHOULD augment in custom 'case' statements enabling | SHOULD augment in custom 'case' statements enabling | |||
references to those alternate keystore locations."; | references to those alternate keystore locations."; | |||
choice inline-or-keystore { | choice inline-or-keystore { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A choice between an inlined definition and a definition | "A choice between an inlined definition and a definition | |||
that exists in the keystore."; | that exists in the keystore."; | |||
case inline { | case inline { | |||
if-feature "inline-definitions-supported"; | if-feature "inline-definitions-supported"; | |||
container inline-definition { | container inline-definition { | |||
description | description | |||
"Container to hold the local key definition."; | "A container to hold the local key definition."; | |||
uses ct:asymmetric-key-pair-grouping; | uses ct:asymmetric-key-pair-grouping; | |||
} | } | |||
} | } | |||
case central-keystore { | case central-keystore { | |||
if-feature "central-keystore-supported"; | if-feature "central-keystore-supported"; | |||
if-feature "asymmetric-keys"; | if-feature "asymmetric-keys"; | |||
leaf central-keystore-reference { | leaf central-keystore-reference { | |||
type ks:central-asymmetric-key-ref; | type ks:central-asymmetric-key-ref; | |||
description | description | |||
"A reference to an asymmetric key that exists in | "A reference to an asymmetric key that exists in | |||
skipping to change at page 33, line 20 ¶ | skipping to change at line 1445 ¶ | |||
choice inline-or-keystore { | choice inline-or-keystore { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A choice between an inlined definition and a definition | "A choice between an inlined definition and a definition | |||
that exists in the keystore."; | that exists in the keystore."; | |||
case inline { | case inline { | |||
if-feature "inline-definitions-supported"; | if-feature "inline-definitions-supported"; | |||
container inline-definition { | container inline-definition { | |||
description | description | |||
"Container to hold the local key definition."; | "A container to hold the local key definition."; | |||
uses ct:asymmetric-key-pair-with-certs-grouping; | uses ct:asymmetric-key-pair-with-certs-grouping; | |||
} | } | |||
} | } | |||
case central-keystore { | case central-keystore { | |||
if-feature "central-keystore-supported"; | if-feature "central-keystore-supported"; | |||
if-feature "asymmetric-keys"; | if-feature "asymmetric-keys"; | |||
leaf central-keystore-reference { | leaf central-keystore-reference { | |||
type ks:central-asymmetric-key-ref; | type ks:central-asymmetric-key-ref; | |||
description | description | |||
"A reference to an asymmetric-key (and all of its | "A reference to an asymmetric key (and all of its | |||
associated certificates) in the keystore, when | associated certificates) in the keystore, when | |||
this module is implemented."; | this module is implemented."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
grouping inline-or-keystore-end-entity-cert-with-key-grouping { | grouping inline-or-keystore-end-entity-cert-with-key-grouping { | |||
description | description | |||
"A grouping for the configuration of an asymmetric key and | "A grouping for the configuration of an asymmetric key and | |||
skipping to change at page 34, line 11 ¶ | skipping to change at line 1484 ¶ | |||
choice inline-or-keystore { | choice inline-or-keystore { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A choice between an inlined definition and a definition | "A choice between an inlined definition and a definition | |||
that exists in the keystore."; | that exists in the keystore."; | |||
case inline { | case inline { | |||
if-feature "inline-definitions-supported"; | if-feature "inline-definitions-supported"; | |||
container inline-definition { | container inline-definition { | |||
description | description | |||
"Container to hold the local key definition."; | "A container to hold the local key definition."; | |||
uses ct:asymmetric-key-pair-with-cert-grouping; | uses ct:asymmetric-key-pair-with-cert-grouping; | |||
} | } | |||
} | } | |||
case central-keystore { | case central-keystore { | |||
if-feature "central-keystore-supported"; | if-feature "central-keystore-supported"; | |||
if-feature "asymmetric-keys"; | if-feature "asymmetric-keys"; | |||
container central-keystore-reference { | container central-keystore-reference { | |||
uses central-asymmetric-key-certificate-ref-grouping; | uses central-asymmetric-key-certificate-ref-grouping; | |||
description | description | |||
"A reference to a specific certificate associated with | "A reference to a specific certificate associated with | |||
an asymmetric key stored in the central keystore."; | an asymmetric key stored in the central keystore."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
// the keystore grouping | // the keystore grouping | |||
grouping keystore-grouping { | grouping keystore-grouping { | |||
description | description | |||
"Grouping definition enables use in other contexts. If ever | "A grouping definition enables use in other contexts. If ever | |||
done, implementations MUST augment new 'case' statements | done, implementations MUST augment new 'case' statements | |||
into the various inline-or-keystore 'choice' statements to | into the various inline-or-keystore 'choice' statements to | |||
supply leafrefs to the model-specific location(s)."; | supply leafrefs to the model-specific location(s)."; | |||
container asymmetric-keys { | container asymmetric-keys { | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
if-feature "asymmetric-keys"; | if-feature "asymmetric-keys"; | |||
description | description | |||
"A list of asymmetric keys."; | "A list of asymmetric keys."; | |||
list asymmetric-key { | list asymmetric-key { | |||
key "name"; | key "name"; | |||
skipping to change at page 35, line 30 ¶ | skipping to change at line 1550 ¶ | |||
uses ct:symmetric-key-grouping; | uses ct:symmetric-key-grouping; | |||
} | } | |||
} | } | |||
} | } | |||
/*********************************/ | /*********************************/ | |||
/* Protocol accessible nodes */ | /* Protocol accessible nodes */ | |||
/*********************************/ | /*********************************/ | |||
container keystore { | container keystore { | |||
if-feature central-keystore-supported; | if-feature "central-keystore-supported"; | |||
description | description | |||
"A central keystore containing a list of symmetric keys and | "A central keystore containing a list of symmetric keys and | |||
a list of asymmetric keys."; | a list of asymmetric keys."; | |||
nacm:default-deny-write; | nacm:default-deny-write; | |||
uses keystore-grouping { | uses keystore-grouping { | |||
augment "symmetric-keys/symmetric-key/key-type/encrypted-" | augment "symmetric-keys/symmetric-key/key-type/encrypted-" | |||
+ "symmetric-key/encrypted-symmetric-key/encrypted-by" { | + "symmetric-key/encrypted-symmetric-key/encrypted-by" { | |||
description | description | |||
"Augments in a choice statement enabling the encrypting | "Augments in a choice statement enabling the encrypting | |||
key to be any other symmetric or asymmetric key in the | key to be any other symmetric or asymmetric key in the | |||
skipping to change at page 36, line 4 ¶ | skipping to change at line 1573 ¶ | |||
} | } | |||
augment "asymmetric-keys/asymmetric-key/private-key-type/" | augment "asymmetric-keys/asymmetric-key/private-key-type/" | |||
+ "encrypted-private-key/encrypted-private-key/" | + "encrypted-private-key/encrypted-private-key/" | |||
+ "encrypted-by" { | + "encrypted-by" { | |||
description | description | |||
"Augments in a choice statement enabling the encrypting | "Augments in a choice statement enabling the encrypting | |||
key to be any other symmetric or asymmetric key in the | key to be any other symmetric or asymmetric key in the | |||
central keystore."; | central keystore."; | |||
uses encrypted-by-grouping; | uses encrypted-by-grouping; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
3. Support for Built-in Keys | 3. Support for Built-In Keys | |||
In some implementations, a server may support keys built into the | In some implementations, a server may support keys built into the | |||
server. Built-in keys MAY be set during the manufacturing process or | server. Built-in keys MAY be set during the manufacturing process or | |||
be dynamically generated the first time the server is booted or a | be dynamically generated the first time the server is booted or a | |||
particular service (e.g., SSH) is enabled. | particular service (e.g., Secure Shell (SSH)) is enabled. | |||
Built-in keys are "hidden" keys expected to be set by a vendor- | Built-in keys are "hidden" keys expected to be set by a vendor- | |||
specific process. Any ability for operators to set and/or modify | specific process. Any ability for operators to set and/or modify | |||
built-in keys is outside the scope of this document. | built-in keys is outside the scope of this document. | |||
The primary characteristic of the built-in keys is that they are | The primary characteristic of the built-in keys is that they are | |||
provided by the server, as opposed to configuration. As such, they | provided by the server, as opposed to being configured. As such, | |||
are present in <operational> (Section 5.3 of [RFC8342]), and <system> | they are present in <operational> (Section 5.3 of [RFC8342]) and | |||
[I-D.ietf-netmod-system-config], if implemented. | <system> [NETMOD-SYSTEM-CONFIG], if implemented. | |||
The example below illustrates what the keystore in <operational> | The example below illustrates what the keystore in <operational> | |||
might look like for a server in its factory default state. Note that | might look like for a server in its factory default state. Note that | |||
the built-in keys have the "or:origin" annotation value "or:system". | the built-in keys have the "or:origin" annotation value "or:system". | |||
=============== NOTE: '\' line wrapping per RFC 8792 ================ | =============== NOTE: '\' line wrapping per RFC 8792 ================ | |||
<keystore xmlns="urn:ietf:params:xml:ns:yang:ietf-keystore" | <keystore xmlns="urn:ietf:params:xml:ns:yang:ietf-keystore" | |||
xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-crypto-types" | xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-crypto-types" | |||
xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin" | xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin" | |||
skipping to change at page 38, line 35 ¶ | skipping to change at line 1683 ¶ | |||
<cert-data>BASE64VALUE=</cert-data> | <cert-data>BASE64VALUE=</cert-data> | |||
</certificate> | </certificate> | |||
</certificates> | </certificates> | |||
</asymmetric-key> | </asymmetric-key> | |||
</asymmetric-keys> | </asymmetric-keys> | |||
</keystore> | </keystore> | |||
4. Encrypting Keys in Configuration | 4. Encrypting Keys in Configuration | |||
This section describes an approach that enables both the symmetric | This section describes an approach that enables both the symmetric | |||
and asymmetric keys on a server to be encrypted, such that | and asymmetric keys on a server to be encrypted, such that backup/ | |||
traditional backup/restore procedures can be used without concern for | restore procedures can be used without concern for raw key data being | |||
raw key data being compromised when in transit. | compromised when in transit. | |||
The approach presented in this section is not normative. This | The approach presented in this section is not normative. This | |||
section answers how a configuration containing secrets that are | section answers how a configuration containing secrets that are | |||
encrypted by a built-in key (Section 3) can be backup'ed from one | encrypted by a built-in key (Section 3) can be backed up from one | |||
server and restored on a different server, when each server has | server and restored on a different server when each server has unique | |||
unique master keys. The API defined by the "ietf-keystore" YANG | primary keys. The API defined by the "ietf-keystore" YANG module | |||
module presented in this document is sufficient to support the | presented in this document is sufficient to support the workflow | |||
workflow described in this section. | described in this section. | |||
4.1. Key Encryption Key | 4.1. Key Encryption Key | |||
The ability to encrypt configured keys is predicated on the existence | The ability to encrypt configured keys is predicated on the existence | |||
of a "key encryption key" (KEK). There may be any number of KEKs in | of a key encryption key (KEK). There may be any number of KEKs in a | |||
a server. A KEK, by its namesake, is a key that is used to encrypt | server. A KEK, by its namesake, is a key that is used to encrypt | |||
other keys. A KEK MAY be either a symmetric key or an asymmetric | other keys. A KEK MAY be either a symmetric key or an asymmetric | |||
key. | key. | |||
If a KEK is a symmetric key, then the server MUST provide an API for | If a KEK is a symmetric key, then the server MUST provide an API for | |||
administrators to encrypt other keys without needing to know the | administrators to encrypt other keys without needing to know the | |||
symmetric key's value. If the KEK is an asymmetric key, then the | symmetric key's value. If the KEK is an asymmetric key, then the | |||
server SHOULD provide an API enabling the encryption of other keys | server SHOULD provide an API enabling the encryption of other keys | |||
or, alternatively, assume the administrators can do so themselves | or, alternatively, assume the administrators can do so themselves | |||
using the asymmetric key's public half. | using the asymmetric key's public half. | |||
A server MUST possess access to the KEK, or an API using the KEK, so | A server MUST possess access to the KEK, or an API using the KEK, so | |||
that it can decrypt the other keys in the configuration at runtime. | that it can decrypt the other keys in the configuration at runtime. | |||
4.2. Configuring Encrypted Keys | 4.2. Configuring Encrypted Keys | |||
Each time a new key is configured, it SHOULD be encrypted by a KEK. | Each time a new key is configured, it SHOULD be encrypted by a KEK. | |||
In "ietf-crypto-types" [I-D.ietf-netconf-crypto-types], the format | In the "ietf-crypto-types" module [RFC9640], the format for encrypted | |||
for encrypted values is described by identity statements derived from | values is described by identity statements derived from the | |||
the "symmetrically-encrypted-value-format" and "asymmetrically- | "symmetrically-encrypted-value-format" and "asymmetrically-encrypted- | |||
encrypted-value-format" identity statements. | value-format" identity statements. | |||
Implementations of servers implementing the "ietf-keystore" module | Implementations of servers implementing the "ietf-keystore" module | |||
SHOULD provide an API that simultaneously generates a key and | SHOULD provide an API that simultaneously generates a key and | |||
encrypts the generated key using a KEK. Thus the cleartext value of | encrypts the generated key using a KEK. Thus, the cleartext value of | |||
the newly generated key may never be known to the administrators | the newly generated key may never be known to the administrators | |||
generating the keys. Such API is defined in the "ietf-ssh-common" | generating the keys. Such an API is defined in the "ietf-ssh-common" | |||
and the "ietf-tls-common" YANG modules defined in | and "ietf-tls-common" YANG modules defined in [RFC9644] and | |||
[I-D.ietf-netconf-ssh-client-server], and | [RFC9645], respectively. | |||
[I-D.ietf-netconf-tls-client-server], respectively. | ||||
In case the server implementation does not provide such an API, then | In case the server implementation does not provide such an API, then | |||
the generating and encrypting steps MAY be performed outside the | the generating and encrypting steps MAY be performed outside the | |||
server, e.g., by an administrator with special access control rights | server, e.g., by an administrator with special access control rights | |||
(e.g., an organization's crypto officer). | (such as an organization's crypto officer). | |||
In either case, the encrypted key can be configured into the keystore | In either case, the encrypted key can be configured into the keystore | |||
using either the "encrypted-symmetric-key" (for symmetric keys) or | using either the "encrypted-symmetric-key" (for symmetric keys) or | |||
the "encrypted-private-key" (for asymmetric keys) nodes. These two | the "encrypted-private-key" (for asymmetric keys) nodes. These two | |||
nodes contain both the encrypted raw key value as well as a reference | nodes contain both the encrypted raw key value as well as a reference | |||
to the KEK that encrypted the key. | to the KEK that encrypted the key. | |||
4.3. Migrating Configuration to Another Server | 4.3. Migrating Configuration to Another Server | |||
When a KEK is used to encrypt other keys, migrating the configuration | When a KEK is used to encrypt other keys, migrating the configuration | |||
to another server is only possible if the second server has the same | to another server is only possible if the second server has the same | |||
KEK. How the second server comes to have the same KEK is discussed | KEK. How the second server comes to have the same KEK is discussed | |||
in this section. | in this section. | |||
In some deployments, mechanisms outside the scope of this document | In some deployments, mechanisms outside the scope of this document | |||
may be used to migrate a KEK from one server to another. That said, | may be used to migrate a KEK from one server to another. That said, | |||
beware that the ability to do so typically entails having access to | beware that the ability to do so typically entails having access to | |||
the first server but, in some scenarios, the first server may no | the first server; however, in some scenarios, the first server may no | |||
longer be operational. | longer be operational. | |||
In other deployments, an organization's crypto officer, possessing a | In other deployments, an organization's crypto officer, possessing a | |||
KEK's cleartext value, configures the same KEK on the second server, | KEK's cleartext value, configures the same KEK on the second server, | |||
presumably as a hidden key or a key protected by access-control, so | presumably as a hidden key or a key protected by access control, so | |||
that the cleartext value is not disclosed to regular administrators. | that the cleartext value is not disclosed to regular administrators. | |||
However, this approach creates high-coupling to and dependency on the | However, this approach creates high coupling to and dependency on the | |||
crypto officers that does not scale in production environments. | crypto officers that does not scale in production environments. | |||
In order to decouple the crypto officers from the regular | In order to decouple the crypto officers from the regular | |||
administrators, a special KEK, called the "master key" (MK), may be | administrators, a special KEK, called the "primary key" (PK), may be | |||
used. | used. | |||
A MK is commonly a globally-unique built-in (see Section 3) | A PK is commonly a globally unique built-in (see Section 3) | |||
asymmetric key. The private raw key value, due to its long lifetime, | asymmetric key. The private raw key value, due to its long lifetime, | |||
is hidden (i.e., "hidden-private-key" in Section 2.1.4.5. of | is hidden (i.e., "hidden-private-key"; see Section 2.1.4.5. of | |||
[I-D.ietf-netconf-crypto-types]). The raw public key value is often | [RFC9640]). The raw public key value is often contained in an | |||
contained in an identity certificate (e.g., IDevID). How to | identity certificate (e.g., IDevID). How to configure a PK during | |||
configure a MK during the manufacturing process is outside the scope | the manufacturing process is outside the scope of this document. | |||
of this document. | ||||
Assuming the server has a MK, the MK can be used to encrypt a "shared | Assuming the server has a PK, the PK can be used to encrypt a "shared | |||
KEK", which is then used to encrypt the keys configured by regular | KEK", which is then used to encrypt the keys configured by regular | |||
administrators. | administrators. | |||
With this extra level of indirection, it is possible for a crypto | With this extra level of indirection, it is possible for a crypto | |||
officer to encrypt the same KEK for a multiplicity of servers offline | officer to encrypt the same KEK for a multiplicity of servers offline | |||
using the public key contained in their identity certificates. The | using the public key contained in their identity certificates. The | |||
crypto officer can then safely handoff the encrypted KEKs to regular | crypto officer can then safely hand off the encrypted KEKs to regular | |||
administrators responsible for server installations, including | administrators responsible for server installations, including | |||
migrations. | migrations. | |||
In order to migrate the configuration from a first server, an | In order to migrate the configuration from a first server, an | |||
administrator would need to make just a single modification to the | administrator would need to make just a single modification to the | |||
configuration before loading it onto a second server, which is to | configuration before loading it onto a second server, which is to | |||
replace the encrypted KEK keystore entry from the first server with | replace the encrypted KEK keystore entry from the first server with | |||
the encrypted KEK for the second server. Upon doing this, the | the encrypted KEK for the second server. Upon doing this, the | |||
configuration (containing many encrypted keys) can be loaded into the | configuration (containing many encrypted keys) can be loaded into the | |||
second server while enabling the second server to decrypt all the | second server while enabling the second server to decrypt all the | |||
encrypted keys in the configuration. | encrypted keys in the configuration. | |||
The following diagram illustrates this idea: | The following diagram illustrates this idea: | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
| shared KEK | | shared KEK | | | shared KEK | | shared KEK | | |||
|(unencrypted)|-------------------------------> | (encrypted) | | |(unencrypted)|-------------------------------> | (encrypted) | | |||
+-------------+ encrypts offline using +-------------+ | +-------------+ encrypts offline using +-------------+ | |||
^ each server's MK | | ^ each server's PK | | |||
| | | | | | |||
| | | | | | |||
| possesses \o | | | possesses \o | | |||
+-------------- |\ | | +-------------- |\ | | |||
/ \ shares with | | / \ shares with | | |||
crypto +--------------------+ | crypto +--------------------+ | |||
officer | | officer | | |||
| | | | |||
| | | | |||
+----------------------+ | +----------------------+ | +----------------------+ | +----------------------+ | |||
| server-1 | | | server-2 | | | server-1 | | | server-2 | | |||
| configuration | | | configuration | | | configuration | | | configuration | | |||
| | | | | | | | | | | | |||
| | | | | | | | | | | | |||
| +----------------+ | | | +----------------+ | | | +----------------+ | | | +----------------+ | | |||
| | MK-1 | | | | | MK-2 | | | | | PK-1 | | | | | PK-2 | | | |||
| | (hidden) | | | | | (hidden) | | | | | (hidden) | | | | | (hidden) | | | |||
| +----------------+ | | | +----------------+ | | | +----------------+ | | | +----------------+ | | |||
| ^ | | | ^ | | | ^ | | | ^ | | |||
| | | | | | | | | | | | | | | | |||
| | | | | | | | | | | | | | | | |||
| | encrypted | | | | encrypted | | | | encrypted | | | | encrypted | | |||
| | by | | | | by | | | | by | | | | by | | |||
| | | | | | | | | | | | | | | | |||
| | | | | | | | | | | | | | | | |||
| +----------------+ | | | +----------------+ | | | +----------------+ | | | +----------------+ | | |||
skipping to change at page 43, line 13 ¶ | skipping to change at line 1850 ¶ | |||
+----------------------+ +----------------------+ | +----------------------+ +----------------------+ | |||
5. Security Considerations | 5. Security Considerations | |||
5.1. Security of Data at Rest and in Motion | 5.1. Security of Data at Rest and in Motion | |||
The YANG module defined in this document defines a mechanism called a | The YANG module defined in this document defines a mechanism called a | |||
"keystore" that intends to protect its contents from unauthorized | "keystore" that intends to protect its contents from unauthorized | |||
disclosure and modification. | disclosure and modification. | |||
In order to satisfy the expectations of a "keystore", it is | In order to satisfy the expectations of a keystore, it is RECOMMENDED | |||
RECOMMENDED that server implementations ensure that the keystore | that server implementations ensure that the keystore contents are | |||
contents are encrypted when persisted to non-volatile memory, and | encrypted when persisted to non-volatile memory and that the keystore | |||
ensure that the keystore contents that have been decrypted in | contents that have been decrypted in volatile memory are zeroized | |||
volatile memory are zeroized when not in use. | when not in use. | |||
The keystore contents may be encrypted either by encrypting the | The keystore contents may be encrypted by either encrypting the | |||
contents individually (e.g., using the "encrypted" value formats) or, | contents individually (e.g., using the "encrypted" value formats) or | |||
in case cleartext values are used (which is NOT RECOMMENDED per | using persistence-layer-level encryption. If storing cleartext | |||
Section 3.5 of [I-D.ietf-netconf-crypto-types]), then, e.g., disk- | values (which is NOT RECOMMENDED per Section 3.5 of [RFC9640]), then | |||
level encryption may be used. | persistence-layer-level encryption SHOULD be used to protect the data | |||
at rest. | ||||
If the keystore contents are not encrypted when persisted, then | If the keystore contents are not encrypted when persisted, then | |||
server implementations MUST ensure the persisted storage is | server implementations MUST ensure the persisted storage is | |||
inaccessible. | inaccessible. | |||
5.2. Unconstrained Private Key Usage | 5.2. Unconstrained Private Key Usage | |||
This module enables the configuration of private keys without | This module enables the configuration of private keys without | |||
constraints on their usage, e.g., what operations the key is allowed | constraints on their usage, e.g., what operations the key is allowed | |||
to be used for (e.g., signature, decryption, both). | to be used for (such as signature, decryption, or both). | |||
This module also does not constrain the usage of the associated | This module also does not constrain the usage of the associated | |||
public keys, other than in the context of a configured certificate | public keys other than in the context of a configured certificate | |||
(e.g., an identity certificate), in which case the key usage is | (e.g., an identity certificate), in which case the key usage is | |||
constrained by the certificate. | constrained by the certificate. | |||
5.3. Considerations for the "ietf-keystore" YANG Module | 5.3. Security Considerations for the "ietf-keystore" YANG Module | |||
This section follows the template defined in Section 3.7.1 of | This section is modeled after the template defined in Section 3.7.1 | |||
[RFC8407]. | of [RFC8407]. | |||
The YANG module defined in this document is designed to be accessed | The ietf-keystore YANG module defines a data model that is designed | |||
via YANG based management protocols, such as NETCONF [RFC6241] and | to be accessed via YANG-based management protocols, such as NETCONF | |||
RESTCONF [RFC8040]. Both of these protocols have mandatory-to- | [RFC6241] and RESTCONF [RFC8040]. These protocols have mandatory-to- | |||
implement secure transport layers (e.g., SSH, TLS) with mutual | implement secure transport layers (e.g., SSH [RFC4252], TLS | |||
[RFC8446], and QUIC [RFC9000]) and mandatory-to-implement mutual | ||||
authentication. | authentication. | |||
The Network Access Control Model (NACM) [RFC8341] provides the means | The Network Configuration Access Control Model (NACM) [RFC8341] | |||
to restrict access for particular users to a pre-configured subset of | provides the means to restrict access for particular users to a | |||
all available protocol operations and content. | preconfigured subset of all available protocol operations and | |||
content. | ||||
Please be aware that this YANG module uses groupings from other YANG | Please be aware that this YANG module uses groupings from other YANG | |||
modules that define nodes that may be considered sensitive or | modules that define nodes that may be considered sensitive or | |||
vulnerable in network environments. Please review the Security | vulnerable in network environments. Please review the Security | |||
Considerations for dependent YANG modules for information as to which | Considerations for dependent YANG modules for information as to which | |||
nodes may be considered sensitive or vulnerable in network | nodes may be considered sensitive or vulnerable in network | |||
environments. | environments. | |||
Some of the readable data nodes defined in this YANG module may be | Some of the readable data nodes in this YANG module may be considered | |||
considered sensitive or vulnerable in some network environments. It | sensitive or vulnerable in some network environments. It is thus | |||
is thus important to control read access (e.g., via get, get-config, | important to control read access (e.g., via get, get-config, or | |||
or notification) to these data nodes. The following subtrees and | notification) to these data nodes. These are the subtrees and data | |||
data nodes have particular sensitivity/vulnerability: | nodes and their sensitivity/vulnerability: | |||
* The "cleartext-symmetric-key" node: | ||||
The "cleartext-symmetric-key" node, imported from the | ||||
"symmetric-key-grouping" grouping defined in | ||||
[I-D.ietf-netconf-crypto-types] is additionally sensitive to | ||||
read operations such that, in normal use cases, it should never | ||||
be returned to a client. For this reason, the NACM extension | ||||
"default-deny-all" was applied to it in | ||||
[I-D.ietf-netconf-crypto-types]. | ||||
* The "cleartext-private-key" node: | The "cleartext-symmetric-key" node: | |||
This node, imported from the "symmetric-key-grouping" grouping | ||||
defined in [RFC9640], is additionally sensitive to read operations | ||||
such that, in normal use cases, it should never be returned to a | ||||
client. For this reason, the NACM extension "default-deny-all" | ||||
was applied to it in [RFC9640]. | ||||
The "cleartext-private-key" node defined in the "asymmetric- | The "cleartext-private-key" node: | |||
key-pair-grouping" grouping defined in | This node, defined in the "asymmetric-key-pair-grouping" grouping | |||
[I-D.ietf-netconf-crypto-types] is additionally sensitive to | in [RFC9640], is additionally sensitive to read operations such | |||
read operations such that, in normal use cases, it should never | that, in normal use cases, it should never be returned to a | |||
be returned to a client. For this reason, the NACM extension | client. For this reason, the NACM extension "default-deny-all" is | |||
"default-deny-all" is applied to it in | applied to it in [RFC9640]. | |||
[I-D.ietf-netconf-crypto-types]. | ||||
All the writable data nodes defined by this module, both in the | All the writable data nodes defined by this YANG module, both in the | |||
"grouping" statements as well as the protocol-accessible "keystore" | "grouping" statements as well as the protocol-accessible "keystore" | |||
instance, may be considered sensitive or vulnerable in some network | instance, may be considered sensitive or vulnerable in some network | |||
environments. For instance, any modification to a key or reference | environments. For instance, any modification to a key or reference | |||
to a key may dramatically alter the implemented security policy. For | to a key may dramatically alter the implemented security policy. For | |||
this reason, the NACM extension "default-deny-write" has been set for | this reason, the NACM extension "default-deny-write" has been set for | |||
all data nodes defined in this module. | all data nodes defined in this module. | |||
This module does not define any "rpc" or "action" statements, and | This YANG module does not define any "rpc" or "action" statements, | |||
thus the security considerations for such is not provided here. | and thus the security considerations for such is not provided here. | |||
Built-in key types SHOULD be either hidden and/or encrypted (not | Built-in key types SHOULD be hidden and/or encrypted (not cleartext). | |||
cleartext). If this is not possible, access control mechanisms like | If this is not possible, access control mechanisms like NACM SHOULD | |||
NACM SHOULD be used to limit access to the key's secret data to only | be used to limit access to the key's secret data to only the most | |||
the most trusted authorized clients (e.g., belonging to an | trusted authorized clients (e.g., belonging to an organization's | |||
organization’s crypto officer). | crypto officer). | |||
6. IANA Considerations | 6. IANA Considerations | |||
6.1. The "IETF XML" Registry | 6.1. The IETF XML Registry | |||
This document registers one URI in the "ns" subregistry of the IETF | IANA has registered the following URI in the "ns" registry of the | |||
XML Registry [RFC3688]. Following the format in [RFC3688], the | "IETF XML Registry" [RFC3688]. | |||
following registration is requested: | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-keystore | URI: urn:ietf:params:xml:ns:yang:ietf-keystore | |||
Registrant Contact: The IESG | Registrant Contact: The IESG | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A; the requested URI is an XML namespace. | |||
6.2. The "YANG Module Names" Registry | 6.2. The YANG Module Names Registry | |||
This document registers one YANG module in the YANG Module Names | IANA has registered the following YANG module in the "YANG Module | |||
registry [RFC6020]. Following the format in [RFC6020], the following | Names" registry defined in [RFC6020]. | |||
registration is requested: | ||||
name: ietf-keystore | Name: ietf-keystore | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-keystore | Maintained by IANA: N | |||
prefix: ks | Namespace: urn:ietf:params:xml:ns:yang:ietf-keystore | |||
reference: RFC CCCC | Prefix: ks | |||
Reference: RFC 9642 | ||||
7. References | 7. References | |||
7.1. Normative References | 7.1. Normative References | |||
[I-D.ietf-netconf-crypto-types] | ||||
Watsen, K., "YANG Data Types and Groupings for | ||||
Cryptography", Work in Progress, Internet-Draft, draft- | ||||
ietf-netconf-crypto-types-33, 1 March 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | ||||
crypto-types-33>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC4252] Ylonen, T. and C. Lonvick, Ed., "The Secure Shell (SSH) | ||||
Authentication Protocol", RFC 4252, DOI 10.17487/RFC4252, | ||||
January 2006, <https://www.rfc-editor.org/info/rfc4252>. | ||||
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | |||
the Network Configuration Protocol (NETCONF)", RFC 6020, | the Network Configuration Protocol (NETCONF)", RFC 6020, | |||
DOI 10.17487/RFC6020, October 2010, | DOI 10.17487/RFC6020, October 2010, | |||
<https://www.rfc-editor.org/info/rfc6020>. | <https://www.rfc-editor.org/info/rfc6020>. | |||
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | ||||
and A. Bierman, Ed., "Network Configuration Protocol | ||||
(NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | ||||
<https://www.rfc-editor.org/info/rfc6241>. | ||||
[RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | |||
RFC 7950, DOI 10.17487/RFC7950, August 2016, | RFC 7950, DOI 10.17487/RFC7950, August 2016, | |||
<https://www.rfc-editor.org/info/rfc7950>. | <https://www.rfc-editor.org/info/rfc7950>. | |||
[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF | ||||
Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, | ||||
<https://www.rfc-editor.org/info/rfc8040>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration | [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration | |||
Access Control Model", STD 91, RFC 8341, | Access Control Model", STD 91, RFC 8341, | |||
DOI 10.17487/RFC8341, March 2018, | DOI 10.17487/RFC8341, March 2018, | |||
<https://www.rfc-editor.org/info/rfc8341>. | <https://www.rfc-editor.org/info/rfc8341>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | ||||
<https://www.rfc-editor.org/info/rfc8446>. | ||||
[RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | ||||
Multiplexed and Secure Transport", RFC 9000, | ||||
DOI 10.17487/RFC9000, May 2021, | ||||
<https://www.rfc-editor.org/info/rfc9000>. | ||||
[RFC9640] Watsen, K., "YANG Data Types and Groupings for | ||||
Cryptography", RFC 9640, DOI 10.17487/RFC9640, October | ||||
2024, <https://www.rfc-editor.org/info/rfc9640>. | ||||
7.2. Informative References | 7.2. Informative References | |||
[I-D.ietf-netconf-http-client-server] | [HTTP-CLIENT-SERVER] | |||
Watsen, K., "YANG Groupings for HTTP Clients and HTTP | Watsen, K., "YANG Groupings for HTTP Clients and HTTP | |||
Servers", Work in Progress, Internet-Draft, draft-ietf- | Servers", Work in Progress, Internet-Draft, draft-ietf- | |||
netconf-http-client-server-19, 1 March 2024, | netconf-http-client-server-23, 15 August 2024, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | ||||
http-client-server-19>. | ||||
[I-D.ietf-netconf-keystore] | ||||
Watsen, K., "A YANG Data Model for a Keystore and Keystore | ||||
Operations", Work in Progress, Internet-Draft, draft-ietf- | ||||
netconf-keystore-34, 1 March 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | <https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | |||
keystore-34>. | http-client-server-23>. | |||
[I-D.ietf-netconf-netconf-client-server] | [NETCONF-CLIENT-SERVER] | |||
Watsen, K., "NETCONF Client and Server Models", Work in | Watsen, K., "NETCONF Client and Server Models", Work in | |||
Progress, Internet-Draft, draft-ietf-netconf-netconf- | Progress, Internet-Draft, draft-ietf-netconf-netconf- | |||
client-server-35, 1 March 2024, | client-server-37, 14 August 2024, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | <https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | |||
netconf-client-server-35>. | netconf-client-server-37>. | |||
[I-D.ietf-netconf-restconf-client-server] | [NETMOD-SYSTEM-CONFIG] | |||
Ma, Q., Ed., Wu, Q., and C. Feng, "System-defined | ||||
Configuration", Work in Progress, Internet-Draft, draft- | ||||
ietf-netmod-system-config-09, 29 September 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netmod- | ||||
system-config-09>. | ||||
[RESTCONF-CLIENT-SERVER] | ||||
Watsen, K., "RESTCONF Client and Server Models", Work in | Watsen, K., "RESTCONF Client and Server Models", Work in | |||
Progress, Internet-Draft, draft-ietf-netconf-restconf- | Progress, Internet-Draft, draft-ietf-netconf-restconf- | |||
client-server-35, 1 March 2024, | client-server-38, 14 August 2024, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | ||||
restconf-client-server-35>. | ||||
[I-D.ietf-netconf-ssh-client-server] | ||||
Watsen, K., "YANG Groupings for SSH Clients and SSH | ||||
Servers", Work in Progress, Internet-Draft, draft-ietf- | ||||
netconf-ssh-client-server-39, 1 March 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | ||||
ssh-client-server-39>. | ||||
[I-D.ietf-netconf-tcp-client-server] | ||||
Watsen, K. and M. Scharf, "YANG Groupings for TCP Clients | ||||
and TCP Servers", Work in Progress, Internet-Draft, draft- | ||||
ietf-netconf-tcp-client-server-23, 1 March 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | ||||
tcp-client-server-23>. | ||||
[I-D.ietf-netconf-tls-client-server] | ||||
Watsen, K., "YANG Groupings for TLS Clients and TLS | ||||
Servers", Work in Progress, Internet-Draft, draft-ietf- | ||||
netconf-tls-client-server-40, 1 March 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | ||||
tls-client-server-40>. | ||||
[I-D.ietf-netconf-trust-anchors] | ||||
Watsen, K., "A YANG Data Model for a Truststore", Work in | ||||
Progress, Internet-Draft, draft-ietf-netconf-trust- | ||||
anchors-27, 1 March 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | <https://datatracker.ietf.org/doc/html/draft-ietf-netconf- | |||
trust-anchors-27>. | restconf-client-server-38>. | |||
[I-D.ietf-netmod-system-config] | ||||
Ma, Q., Wu, Q., and C. Feng, "System-defined | ||||
Configuration", Work in Progress, Internet-Draft, draft- | ||||
ietf-netmod-system-config-05, 21 February 2024, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-netmod- | ||||
system-config-05>. | ||||
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | |||
DOI 10.17487/RFC3688, January 2004, | DOI 10.17487/RFC3688, January 2004, | |||
<https://www.rfc-editor.org/info/rfc3688>. | <https://www.rfc-editor.org/info/rfc3688>. | |||
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
and A. Bierman, Ed., "Network Configuration Protocol | Interchange Format", STD 90, RFC 8259, | |||
(NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | DOI 10.17487/RFC8259, December 2017, | |||
<https://www.rfc-editor.org/info/rfc6241>. | <https://www.rfc-editor.org/info/rfc8259>. | |||
[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF | ||||
Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, | ||||
<https://www.rfc-editor.org/info/rfc8040>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", | [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", | |||
BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, | BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, | |||
<https://www.rfc-editor.org/info/rfc8340>. | <https://www.rfc-editor.org/info/rfc8340>. | |||
[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., | [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., | |||
and R. Wilton, "Network Management Datastore Architecture | and R. Wilton, "Network Management Datastore Architecture | |||
(NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, | (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, | |||
<https://www.rfc-editor.org/info/rfc8342>. | <https://www.rfc-editor.org/info/rfc8342>. | |||
[RFC8407] Bierman, A., "Guidelines for Authors and Reviewers of | [RFC8407] Bierman, A., "Guidelines for Authors and Reviewers of | |||
Documents Containing YANG Data Models", BCP 216, RFC 8407, | Documents Containing YANG Data Models", BCP 216, RFC 8407, | |||
DOI 10.17487/RFC8407, October 2018, | DOI 10.17487/RFC8407, October 2018, | |||
<https://www.rfc-editor.org/info/rfc8407>. | <https://www.rfc-editor.org/info/rfc8407>. | |||
[Std-802.1AR-2018] | [RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, | |||
IEEE SA-Standards Board, "IEEE Standard for Local and | "Handling Long Lines in Content of Internet-Drafts and | |||
metropolitan area networks - Secure Device Identity", | RFCs", RFC 8792, DOI 10.17487/RFC8792, June 2020, | |||
August 2018, | <https://www.rfc-editor.org/info/rfc8792>. | |||
<https://standards.ieee.org/standard/802_1AR-2018.html>. | ||||
Appendix A. Change Log | ||||
A.1. 00 to 01 | ||||
* Replaced the 'certificate-chain' structures with PKCS#7 | ||||
structures. (Issue #1) | ||||
* Added 'private-key' as a configurable data node, and removed the | ||||
'generate-private-key' and 'load-private-key' actions. (Issue #2) | ||||
* Moved 'user-auth-credentials' to the ietf-ssh-client module. | ||||
(Issues #4 and #5) | ||||
A.2. 01 to 02 | ||||
* Added back 'generate-private-key' action. | ||||
* Removed 'RESTRICTED' enum from the 'private-key' leaf type. | ||||
* Fixed up a few description statements. | ||||
A.3. 02 to 03 | ||||
* Changed draft's title. | ||||
* Added missing references. | ||||
* Collapsed sections and levels. | ||||
* Added RFC 8174 to Requirements Language Section. | ||||
* Renamed 'trusted-certificates' to 'pinned-certificates'. | ||||
* Changed 'public-key' from config false to config true. | ||||
* Switched 'host-key' from OneAsymmetricKey to definition from RFC | ||||
4253. | ||||
A.4. 03 to 04 | ||||
* Added typedefs around leafrefs to common keystore paths | ||||
* Now tree diagrams reference ietf-netmod-yang-tree-diagrams | ||||
* Removed Design Considerations section | ||||
* Moved key and certificate definitions from data tree to groupings | ||||
A.5. 04 to 05 | ||||
* Removed trust anchors (now in their own draft) | ||||
* Added back global keystore structure | ||||
* Added groupings enabling keys to either be locally defined or a | ||||
reference to the keystore. | ||||
A.6. 05 to 06 | ||||
* Added feature "local-keys-supported" | ||||
* Added nacm:default-deny-all and nacm:default-deny-write | ||||
* Renamed generate-asymmetric-key to generate-hidden-key | ||||
* Added an install-hidden-key action | ||||
* Moved actions inside fo the "asymmetric-key" container | ||||
* Moved some groupings to draft-ietf-netconf-crypto-types | ||||
A.7. 06 to 07 | ||||
* Removed a "require-instance false" | ||||
* Clarified some description statements | ||||
* Improved the keystore-usage examples | ||||
A.8. 07 to 08 | ||||
* Added "inline-definition" containers to avoid posibility of the | ||||
action/notification statements being under a "case" statement. | ||||
* Updated copyright date, boilerplate template, affiliation, folding | ||||
algorithm, and reformatted the YANG module. | ||||
A.9. 08 to 09 | ||||
* Added a 'description' statement to the 'must' in the /keystore/ | ||||
asymmetric-key node explaining that the descendant values may | ||||
exist in <operational> only, and that implementation MUST assert | ||||
that the values are either configured or that they exist in | ||||
<operational>. | ||||
* Copied above 'must' statement (and description) into the inline- | ||||
or-keystore-asymmetric-key-grouping, inline-or-keystore- | ||||
asymmetric-key-with-certs-grouping, and inline-or-keystore-end- | ||||
entity-cert-with-key-grouping statements. | ||||
A.10. 09 to 10 | ||||
* Updated draft title to match new truststore draft title | ||||
* Moved everything under a top-level 'grouping' to enable use in | ||||
other contexts. | ||||
* Renamed feature from 'local-keys-supported' to 'inline- | ||||
definitions-supported' (same name used in truststore) | ||||
* Removed the either-all-or-none 'must' expressions for the key's | ||||
3-tuple values (since the values are now 'mandatory true' in | ||||
crypto-types) | ||||
* Example updated to reflect 'mandatory true' change in crypto-types | ||||
draft | ||||
A.11. 10 to 11 | ||||
* Replaced typedef asymmetric-key-certificate-ref with grouping | ||||
asymmetric-key-certificate-ref-grouping. | ||||
* Added feature feature 'key-generation'. | ||||
* Cloned groupings symmetric-key-grouping, asymmetric-key-pair- | ||||
grouping, asymmetric-key-pair-with-cert-grouping, and asymmetric- | ||||
key-pair-with-certs-grouping from crypto-keys, augmenting into | ||||
each new case statements for values that have been encrypted by | ||||
other keys in the keystore. Refactored keystore model to use | ||||
these groupings. | ||||
* Added new 'symmetric-keys' lists, as a sibling to the existing | ||||
'asymmetric-keys' list. | ||||
* Added RPCs (not actions) 'generate-symmetric-key' and 'generate- | ||||
asymmetric-key' to *return* a (potentially encrypted) key. | ||||
A.12. 11 to 12 | ||||
* Updated to reflect crypto-type's draft using enumerations over | ||||
identities. | ||||
* Added examples for the 'generate-symmetric-key' and 'generate- | ||||
asymmetric-key' RPCs. | ||||
* Updated the Introduction section. | ||||
A.13. 12 to 13 | ||||
* Updated examples to incorporate new "key-format" identities. | ||||
* Made the two "generate-*-key" RPCs be "action" statements instead. | ||||
A.14. 13 to 14 | ||||
* Updated YANG module and examples to incorporate the new | ||||
iana-*-algorithm modules in the crypto-types draft. | ||||
A.15. 14 to 15 | ||||
* Added new "Support for Built-in Keys" section. | ||||
* Added 'must' expressions asserting that the 'key-format' leaf | ||||
whenever an encrypted key is specified. | ||||
* Added inline-or-keystore-symmetric-key-grouping for PSK support. | ||||
A.16. 15 to 16 | ||||
* Moved the generate key actions to ietf-crypt-types as RPCs, which | ||||
are augmented by ietf-keystore to support encrypted keys. | ||||
Examples updated accordingly. | ||||
* Added a SSH certificate-based key (RFC 6187) and a raw private key | ||||
to the example instance document (partly so they could be | ||||
referenced by examples in the SSH and TLS client/server drafts. | ||||
A.17. 16 to 17 | ||||
* Removed augments to the "generate-symmetric-key" and "generate- | ||||
asymmetric-key" groupings. | ||||
* Removed "generate-symmetric-key" and "generate-asymmetric-key" | ||||
examples. | ||||
* Removed the "algorithm" nodes from remaining examples. | ||||
* Updated the "Support for Built-in Keys" section. | ||||
* Added new section "Encrypting Keys in Configuration". | ||||
* Added a "Note to Reviewers" note to first page. | ||||
A.18. 17 to 18 | ||||
* Removed dangling/unnecessary ref to RFC 8342. | ||||
* r/MUST/SHOULD/ wrt strength of keys being configured over | ||||
transports. | ||||
* Added an example for the "certificate-expiration" notification. | ||||
* Clarified that OS MAY have a multiplicity of underlying keystores | ||||
and/or TPMs. | ||||
* Clarified expected behavior for "built-in" keys in <operational> | ||||
* Clarified the "Migrating Configuration to Another Server" section. | ||||
* Expanded "Data Model Overview section(s) [remove "wall" of tree | ||||
diagrams]. | ||||
* Updated the Security Considerations section. | ||||
A.19. 18 to 19 | ||||
* Updated examples to reflect new "cleartext-" prefix in the crypto- | ||||
types draft. | ||||
A.20. 19 to 20 | ||||
* Addressed SecDir comments from Magnus Nystroem and Sandra Murphy. | ||||
A.21. 20 to 21 | ||||
* Added a "Unconstrained Private Key Usage" Security Consideration | ||||
to address concern raised by SecDir. | ||||
* (Editorial) Removed the output of "grouping" statements in the | ||||
tree diagrams for the "ietf-keystore" and "ex-keystore-usage" | ||||
modules. | ||||
* Addressed comments raised by YANG Doctor. | ||||
A.22. 21 to 22 | ||||
* Added prefixes to 'path' statements per trust-anchors/issues/1 | ||||
* Renamed feature "keystore-supported" to "central-keystore- | ||||
supported". | ||||
* Associated with above, generally moved text to refer to a | ||||
"central" keystore. | ||||
* Aligned modules with `pyang -f` formatting. | ||||
* Fixed nits found by YANG Doctor reviews. | ||||
A.23. 22 to 23 | ||||
* Updated 802.1AR ref to latest version | ||||
* Replaced "base64encodedvalue==" with "BASE64VALUE=" in examples. | ||||
* Minor editorial nits | ||||
A.24. 23 to 24 | ||||
* Added features "asymmetric-keys" and "symmetric-keys" | ||||
* fixup the 'WG Web' and 'WG List' lines in YANG module(s) | ||||
* fixup copyright (i.e., s/Simplified/Revised/) in YANG module(s) | ||||
* Added Informative reference to ma-netmod-with-system | ||||
A.25. 24 to 25 | ||||
* Added a "term" for "key" (IEEE liaison). | ||||
* Clarified draft text to ensure proper use of the "key" term. | ||||
(IEEE liaison) | ||||
* Added statement that built-in keys SHOULD NOT be cleartext. (IEEE | ||||
liaison) | ||||
* Added "if-feature central-keystore-supported" to top-level | ||||
"keystore" container. | ||||
A.26. 25 to 26 | ||||
* Updated per Shepherd reviews impacting the suite of drafts. | ||||
A.27. 26 to 27 | ||||
* Updated per Shepherd reviews impacting the suite of drafts. | ||||
A.28. 27 to 28 | ||||
* Updated per Tom Petch review. | ||||
* s/local/inline/ in feature names, grouping names, and node names. | ||||
* Removed special handling text for built-in keys | ||||
* Updated section on built-in keys to read almost the same as the | ||||
section in the trust-anchors draft. | ||||
A.29. 28 to 29 | ||||
* Addresses AD review comments. | ||||
* Added note to Editor to fix line foldings. | ||||
* Renamed "keystore" to "central keystore" throughout. | ||||
* Renamed "encrypted-by-choice-grouping" to "encrypted-by-grouping". | ||||
* Removed "public-key-format" and "public-key" nodes from examples. | ||||
A.30. 29 to 30 | ||||
* Addresses Gen-ART review by Reese Enghardt. | ||||
* Addresses review by Tom Petch. | ||||
A.31. 30 to 31 | ||||
* Addresses 1st-round of IESG reviews. | ||||
A.32. 31 to 33 | ||||
* Addresses issues found in OpsDir review of the ssh-client-server | ||||
draft. | ||||
* Renamed Security Considerations section s/Template for/ | ||||
Considerations for/ | ||||
* s/defines/presents/ in a few places. | [RFC9641] Watsen, K., "A YANG Data Model for a Truststore", | |||
RFC 9641, DOI 10.17487/RFC9641, October 2024, | ||||
<https://www.rfc-editor.org/info/rfc9641>. | ||||
* Add refs to where the 'operational' and 'system' datastores are | [RFC9643] Watsen, K. and M. Scharf, "YANG Groupings for TCP Clients | |||
defined. | and TCP Servers", RFC 9643, DOI 10.17487/RFC9643, October | |||
2024, <https://www.rfc-editor.org/info/rfc9643>. | ||||
A.33. 33 to 34 | [RFC9644] Watsen, K., "YANG Groupings for SSH Clients and SSH | |||
Servers", RFC 9644, DOI 10.17487/RFC9644, October 2024, | ||||
<https://www.rfc-editor.org/info/rfc9644>. | ||||
* Nothing changed. Only bumped for automation... | [RFC9645] Watsen, K., "YANG Groupings for TLS Clients and TLS | |||
Servers", RFC 9645, DOI 10.17487/RFC9645, October 2024, | ||||
<https://www.rfc-editor.org/info/rfc9645>. | ||||
A.34. 34 to 35 | [Std-802.1AR-2018] | |||
IEEE, "IEEE Standard for Local and Metropolitan Area | ||||
Networks - Secure Device Identity", IEEE Std 802.1AR-2018, | ||||
DOI 10.1109/IEEESTD.2018.8423794, August 2018, | ||||
<https://standards.ieee.org/standard/802_1AR-2018.html>. | ||||
* Address Roman Danyliw's comments. | [W3C.REC-xml-20081126] | |||
Bray, T., Paoli, J., Sperberg-McQueen, C. M., Maler, E., | ||||
and F. Yergeau, "Extensible Markup Language (XML) 1.0 | ||||
(Fifth Edition)", W3C Recommendation REC-xml-20081126, | ||||
November 2008, <https://www.w3.org/TR/xml/>. | ||||
Acknowledgements | Acknowledgements | |||
The authors would like to thank the following for lively discussions | The authors would like to thank the following for lively discussions | |||
on list and in the halls (ordered by first name): Alan Luchuk, Andy | on list and in the halls (ordered by first name): Alan Luchuk, Andy | |||
Bierman, Benoit Claise, Bert Wijnen, Balázs Kovács, David Lamparter, | Bierman, Balázs Kovács, Benoit Claise, Bert Wijnen, David Lamparter, | |||
Eric Voit, Éric Vyncke, Francesca Palombini, Ladislav Lhotka, Liang | Eric Voit, Éric Vyncke, Francesca Palombini, Jürgen Schönwälder, | |||
Xia, Jürgen Schönwälder, Mahesh Jethanandani, Magnus Nyström, Martin | Ladislav Lhotka, Liang Xia, Magnus Nyström, Mahesh Jethanandani, | |||
Björklund, Mehmet Ersue, Murray Kucherawy, Paul Wouters, Phil Shafer, | Martin Björklund, Mehmet Ersue, Murray Kucherawy, Paul Wouters, Phil | |||
Qin Wu, Radek Krejci, Ramkumar Dhanapal, Reese Enghardt, Reshad | Shafer, Qin Wu, Radek Krejci, Ramkumar Dhanapal, Reese Enghardt, | |||
Rahman, Rob Wilton, Roman Danyliw, Sandra Murphy, Sean Turner, Tom | Reshad Rahman, Rob Wilton, Roman Danyliw, Sandra Murphy, Sean Turner, | |||
Petch, Warren Kumari, and Zaheduzzaman Sarker. | Tom Petch, Warren Kumari, and Zaheduzzaman Sarker. | |||
Author's Address | Author's Address | |||
Kent Watsen | Kent Watsen | |||
Watsen Networks | Watsen Networks | |||
Email: kent+ietf@watsen.net | Email: kent+ietf@watsen.net | |||
End of changes. 139 change blocks. | ||||
776 lines changed or deleted | 360 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |