<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.24 (Ruby 3.4.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-cddl-modules-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title abbrev="CDDL Module Structure">CDDL Module Structure</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cddl-modules-04"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>Arm Limited</organization>
      <address>
        <email>brendan.moran.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="March" day="03"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR Maintenance and Extensions</workgroup>
    <keyword>Concise Data Definition Language</keyword>
    <abstract>
      <?line 59?>

<t>At the time of writing,
the Concise Data Definition Language (CDDL) is defined by
RFC 8610 and RFC 9682 as well as RFC 9165.
The latter has used the extension point provided in RFC 8610,
the <em>control operator</em>.</t>
      <t>As CDDL is being used in larger projects, the need for
features has become known that cannot be easily
mapped into this single extension point.</t>
      <t>The present document defines a backward- and forward-compatible
way to add a module structure to CDDL.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://cbor-wg.github.io/cddl-modules/draft-ietf-cbor-cddl-modules.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-cddl-modules/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CBOR Maintenance and Extensions Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/cddl-modules"/>.</t>
    </note>
  </front>
  <middle>
    <?line 77?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>At the time of writing,
the Concise Data Definition Language (CDDL) is defined by
RFC 8610 and RFC 9682 as well as RFC 9165.
The latter has used the extension point provided in RFC 8610,
the <em>control operator</em>.</t>
      <t>As CDDL is being used in larger projects, the need for
features has become known that cannot be easily
mapped into this single extension point.</t>
      <t>The present document defines a backward- and forward-compatible
way to add a module structure to CDDL.</t>
      <t>The functionality of the present document is considered a core part of
what has colloquially been called CDDL 2.0, and is intended to be used
with (and orthogonal to) other recent specifications such as a small
set of CDDL grammar updates <xref target="RFC9682"/> and an additional exercise of
the control operator extension point <xref target="I-D.ietf-cbor-cddl-more-control"/> (a follow-up to
<xref target="RFC9165"/>).</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The Terminology from <xref target="RFC8610"/> applies.</t>
        <t>Some examples use CDDL definitions from <xref target="RFC9052"/>.</t>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in <xref target="BCP14"/> (<xref target="RFC2119"/>) (<xref target="RFC8174"/>) when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="module-superstructure">
      <name>Module superstructure</name>
      <dl>
        <dt><em>Compatibility</em>:</dt>
        <dd>
          <t>bidirectional (both backward and forward)</t>
        </dd>
      </dl>
      <t>Originally, CDDL was used for small data models that could be
expressed in a few lines.  As the size of data models that need to be
expressed in CDDL has increased, the need to modularize and re-use
components is increasing.</t>
      <t>CDDL as documented in <xref target="RFC8610"/> (<em>basic CDDL</em>) has been designed with a crude form of composition:
Concatenating a number of CDDL snippets creates a valid CDDL data
model unless there is a name collision (<em>identical</em> redefinition is
allowed to facilitate this approach).
With larger models, managing the overall name space to avoid collisions
becomes more pressing.</t>
      <t>In CDDL's original composition model,
the knowledge which CDDL snippets need to be concatenated in order to
obtain the desired data model lives entirely outside the CDDL snippets.
With the module structure defined in the present document, rule sets are
packaged as modules and referenced from other
modules, providing methods for control of namespace pollution.</t>
      <t>Further work may be expended on
unambiguous referencing into evolving specifications ("versioning")
and selection of alternatives (as was emulated with snippets in
<xref section="11" sectionFormat="of" target="RFC8428"/>.  Note that one approach for expressing
variants is demonstrated in <xref target="useful"/> based on <xref section="4" sectionFormat="of" target="RFC9165"/>).
Potential further work is outlined in Sections <xref target="I-D.bormann-cbor-cddl-2-draft" section="4" sectionFormat="bare"/> and <xref target="I-D.bormann-cbor-cddl-2-draft" section="A.2" sectionFormat="bare"/> of <xref target="I-D.bormann-cbor-cddl-2-draft"/>.</t>
      <section anchor="compatibility">
        <name>Compatibility</name>
        <t>To achieve the module structure in a way that is friendly to
existing environments that operate with CDDL and basic CDDL
implementations, we add a super-syntax (similar to the way pragmas
are often added to a language), by carrying them in <em>directives</em>.
Directives are parsed as comments in basic CDDL, so that each module
source file can at the same time be basic CDDL on its own.
This enables forward compatibility: a single file can be designed to
serve both as valid basic CDDL and as a module with directives that
specify how additional rule definitions are to be imported from other
source files.</t>
        <t>This bidirectional compatibility is useful to allow CDDL model
designers to start using directives before the bulk of the tools that
process CDDL has been updated to implement the present specification.</t>
      </section>
      <section anchor="namespacing">
        <name>Namespacing</name>
        <t>When importing rules from other modules, there is the potential for
name collisions.  This is exacerbated when the modules evolve, which
may lead to the introduction of a name into an imported module that is
also used (likely in a different way) in the importing module.</t>
        <t>To be able to manage names in such a way that collisions can be
avoided, we introduce means to prepend a prefix to the names of rules
being imported: the "as" clause.</t>
      </section>
      <section anchor="directives-the-module">
        <name>"Directives", the "module"</name>
        <t>This specification introduces <em>directives</em> into CDDL.
A single CDDL file becomes a <em>module</em> by processing the (zero or more)
directives in it.</t>
        <t>The semantics of the module are independent of the module(s) using it,
however, importing a module may involve transforming its rule names
into a new namespace (<xref target="namespacing"/>).</t>
        <t>Directives are parsed as comments in basic CDDL, so they do not interfere
with forward compatibility.</t>
        <t>In the CDDL module structure, lines that start with the prefix <tt>;#</tt> are
parsed as directives.</t>
      </section>
      <section anchor="naming-and-finding-modules">
        <name>Naming and Finding Modules</name>
        <t>We assume that module names are filenames taken from one of several
source directories available to the CDDL module structure processor via the
environment.
This avoids the need to nail down brittle pathnames or (partial?) URIs
into the CDDL files.</t>
        <t>The exact way how these source directories and possibly a precedence
between them are established is intentionally not fully defined in
this specification; it is expected that this will be specified in the
context of the models just as the way they are intended to be used
will be.  (A more formal structure may follow later.)</t>
        <t>In the module structure implementation that is part of the CDDL Tool
described in <xref target="cddlc-tool"/>, the set of sources is
determined from an environment variable, <tt>CDDL_INCLUDE_PATH</tt>, which is
modeled after usual command-line search paths.
It is a colon-separated list of pathnames to directories, with one
special feature: an empty element points to the tool's own collection.
This collection contains fragments of extracted CDDL from published
RFCs, using names such as <tt>rfc9052</tt>.</t>
        <t>(Future versions might augment this with Web extractors and/or ways to
extract CDDL modules from sites such as github and from Internet-Drafts; see
<xref section="A.2" sectionFormat="of" target="I-D.bormann-cbor-cddl-2-draft"/> for some design considerations.)</t>
        <t>The default <tt>CDDL_INCLUDE_PATH</tt> is:</t>
        <artwork><![CDATA[
.:
]]></artwork>
        <t>That is: files are found in the current directory (<tt>.</tt>) and, if not
found there, cddlc’s collection.</t>
        <t>In the examples that follow, a cddlc command line will be shown
(starting with an isolated <tt>$</tt> sign as in a shell command) with the
module-structured CDDL input; the
resulting basic CDDL will be shown separately.</t>
      </section>
      <section anchor="directives">
        <name>Basic Set of Directives</name>
        <t>Two groups of directives are defined at this point:</t>
        <ul spacing="normal">
          <li>
            <t><tt>include</tt>, which includes all the rules from a module (which
includes the ones imported/included there, transitively), or
specific explicitly selected rules (clause ending in "from");</t>
          </li>
          <li>
            <t><tt>import</tt>, which is similar to <tt>include</tt> but includes only those
 rules from the module that are
 referenced from the importing module, implicitly or explicitly
 (clause ending in "from"), including the
 rules that are referenced from these rules, transitively.</t>
          </li>
        </ul>
        <t>The <tt>include</tt> function is more useful for composing a single model
from parts controlled by one author, while the <tt>import</tt> function is
more about treating a module as a library:</t>
        <t>The way an <tt>import</tt> works is shown by this simple example:</t>
        <artwork><![CDATA[
$ cddlc -2tcddl -
start = COSE_Key
;# import rfc9052

]]></artwork>
        <t>This results in the following CDDL 1.0 specification:</t>
        <sourcecode type="cddl"><![CDATA[
start = COSE_Key
COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * label => values,
}
label = int / tstr
values = any

]]></sourcecode>
        <t>This is appropriate for using libraries that are well known to the
importing specification.
However, if it is not acceptable that the library can pollute the
namespace of the importing module, the import directive can specify a
namespace prefix ("as" clause):</t>
        <artwork><![CDATA[
$ cddlc -2tcddl -
start = cose.COSE_Key
;# import rfc9052 as cose

]]></artwork>
        <t>This results in the following CDDL 1.0 specification:</t>
        <sourcecode type="cddl"><![CDATA[
start = cose.COSE_Key
cose.COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * cose.label => cose.values,
}
cose.label = int / tstr
cose.values = any

]]></sourcecode>
        <t>Note how the imported names are prefixed with <tt>cose.</tt> as specified in
the import directive, but CDDL prelude (<xref section="D" sectionFormat="of" target="RFC8610"/>) names
such as <tt>tstr</tt> and <tt>any</tt> are not.</t>
      </section>
      <section anchor="explicit-selection-of-names">
        <name>Explicit selection of names</name>
        <t>Both <tt>import</tt> and <tt>include</tt> directives can be augmented by an explicit
mentioning of rule names (clause ending in "from") or a wild-card
"<tt>*</tt>" for all rules.</t>
        <section numbered="false" anchor="include">
          <name><tt>include</tt></name>
          <t>Starting with <tt>include</tt>:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {* label => values}
;# include label, values from rfc9052

]]></artwork>
          <t>With <tt>include</tt>,
only exactly the rules mentioned are included:</t>
          <sourcecode type="cddl"><![CDATA[
mydata = {* label => values}
label = int / tstr
values = any

]]></sourcecode>
          <t>The module from which rules are explicitly imported can be namespaced:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {* label => values}
;# include cose.label, cose.values from rfc9052 as cose

]]></artwork>
          <t>Again, only exactly the rules mentioned are included:</t>
          <sourcecode type="cddl"><![CDATA[
mydata = {* label => values}
cose.label = int / tstr
cose.values = any

]]></sourcecode>
        </section>
        <section numbered="false" anchor="import">
          <name><tt>import</tt></name>
          <t>Both examples would work exactly the same with <tt>import</tt>, as the
included rules do not reference anything else from the included
module.</t>
          <t>An import however also draws in the transitive closure of the rules
referenced:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {Fritz: cose.empty_or_serialized_map}
;# import cose.empty_or_serialized_map from rfc9052 as cose

]]></artwork>
          <t>The transitive closure of the rules mentioned is included:</t>
          <sourcecode type="cddl"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

mydata = {Fritz: cose.empty_or_serialized_map}
cose.empty_or_serialized_map = bstr .cbor cose.header_map / bstr .\
                                                               size 0
cose.header_map = {
  cose.Generic_Headers,
  * cose.label => cose.values,
}
cose.Generic_Headers = (
  ? 1 => int / tstr,
  ? 2 => [+ cose.label],
  ? 3 => tstr / int,
  ? 4 => bstr,
  ? (5 => bstr // 6 => bstr),
  )
cose.label = int / tstr
cose.values = any
]]></sourcecode>
          <t>The <tt>import</tt> statement can also request an alias for an imported name:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {Fritz: cose.empty_or_serialized_map}
;# import empty_or_serialized_map from rfc9052 as cose

]]></artwork>
          <t>Note how an additional rule provides an alias for
<tt>empty_or_serialized_map</tt> that does not have the namespace prefix:</t>
          <sourcecode type="cddl"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

mydata = {Fritz: cose.empty_or_serialized_map}
empty_or_serialized_map = cose.empty_or_serialized_map
cose.empty_or_serialized_map = bstr .cbor cose.header_map / bstr .\
                                                               size 0
cose.header_map = {
  cose.Generic_Headers,
  * cose.label => cose.values,
}
cose.Generic_Headers = (
  ? 1 => int / tstr,
  ? 2 => [+ cose.label],
  ? 3 => tstr / int,
  ? 4 => bstr,
  ? (5 => bstr // 6 => bstr),
  )
cose.label = int / tstr
cose.values = any
]]></sourcecode>
        </section>
      </section>
      <section anchor="tool-support-for-command-line-control">
        <name>Tool Support for Command-Line Control</name>
        <t>Tools may provide a convenient way to initiate the processing of
directives from the command line.</t>
        <t>A tool may provide a way to specify a root for the module tree from the command line:</t>
        <artwork><![CDATA[
$ cddlc -2tcddl -icose=rfc9052 -scose.COSE_Key
]]></artwork>
        <t>The command line argument <tt>-icose=rfc9052</tt> is a shortcut for</t>
        <artwork><![CDATA[
;# import rfc9052 as cose
]]></artwork>
        <t>Together with the start (root) rule name, <tt>cose.COSE_Key</tt>, supplied by
<tt>-scose.COSE_Key</tt>, this results in the following CDDL 1.0
specification:</t>
        <sourcecode type="cddl"><![CDATA[
$.start.$ = cose.COSE_Key
cose.COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * cose.label => cose.values,
}
cose.label = int / tstr
cose.values = any

]]></sourcecode>
        <t>In other words, the module synthesized from the command line had an
empty CDDL file, which therefore was not provided (no <tt>–</tt> was given on
the command line).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The module structure specified in this document is not believed to
create additional security considerations beyond the general security
considerations in <xref section="5" sectionFormat="of" target="RFC8610"/>.</t>
      <t>Implementations that employ the module structure defined in this
document need to ascertain the provenance of the modules they combine
into the CDDL models they employ operationally.
This specification does not define how the source directories accessed
via the CDDL_INCLUDE_PATH are populated; this process needs to undergo
the same care and scrutiny as any other introduction of source code
into a build environment; the possibility of supply-chain attacks on
the modules imported needs to be considered.</t>
      <t>Specifically, implementations that rely on model-based input
validation for enforcing certain properties of the data structure
ingested (which, if not validated, could lead to malfunctions such as
crashes and remote code execution) need to be particularly careful
about the data models they apply, including their provenance and
potential changes of these properties that upgrades to the referenced
modules may (inadvertently or as part of an attack) cause.
More generally speaking, implementations should strive to be robust
against limitations of the model-based input validation mechanisms and
their implementations that they employ.</t>
      <t>In applications that dynamically acquire models and dereference module
references in these, the security considerations of dereferenceable
identifiers apply (see <xref target="I-D.bormann-t2trg-deref-id"/> for a more extensive discussion of
dereferenceable identifiers).</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:.plus,.cat, and.det for the construction of constants;.abnf/.abnfb for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and.feature for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <referencegroup anchor="STD68" target="https://www.rfc-editor.org/info/std68">
          <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234">
            <front>
              <title>Augmented BNF for Syntax Specifications: ABNF</title>
              <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
              <author fullname="P. Overell" initials="P." surname="Overell"/>
              <date month="January" year="2008"/>
              <abstract>
                <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="68"/>
            <seriesInfo name="RFC" value="5234"/>
            <seriesInfo name="DOI" value="10.17487/RFC5234"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC7405">
          <front>
            <title>Case-Sensitive String Support in ABNF</title>
            <author fullname="P. Kyzivat" initials="P." surname="Kyzivat"/>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document extends the base definition of ABNF (Augmented Backus-Naur Form) to include a way to specify US-ASCII string literals that are matched in a case-sensitive manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7405"/>
          <seriesInfo name="DOI" value="10.17487/RFC7405"/>
        </reference>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <date month="March" year="1997"/>
              <abstract>
                <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
          </reference>
          <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <date month="May" year="2017"/>
              <abstract>
                <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
          </reference>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9682">
          <front>
            <title>Updates to the Concise Data Definition Language (CDDL) Grammar</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="November" year="2024"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), as defined in RFCs 8610 and 9165, provides an easy and unambiguous way to express structures for protocol messages and data formats that are represented in Concise Binary Object Representation (CBOR) or JSON.</t>
              <t>This document updates RFC 8610 by addressing related errata reports and making other small fixes for the ABNF grammar defined for CDDL.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9682"/>
          <seriesInfo name="DOI" value="10.17487/RFC9682"/>
        </reference>
        <reference anchor="I-D.ietf-cbor-cddl-more-control">
          <front>
            <title>Concise Data Definition Language (CDDL): Additional Control Operators for the Conversion and Processing of Text</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="9" month="January" year="2025"/>
            <abstract>
              <t>   The Concise Data Definition Language (CDDL), standardized in RFC
   8610, provides "control operators" as its main language extension
   point.  RFCs have added to this extension point both in an
   application-specific and a more general way.

   The present document defines a number of additional generally
   applicable control operators for text conversion (Bytes, Integers,
   JSON, Printf-style formatting) and for an operation on text.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cddl-more-control-08"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-cddl-2-draft">
          <front>
            <title>CDDL 2.0 and beyond -- a draft plan</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="28" month="February" year="2025"/>
            <abstract>
              <t>   The Concise Data Definition Language (CDDL) today is defined by
   RFC 8610, RFC 9165, RFC 9682, and draft-ietf-cbor-cddl-more-control
   (RFC-to-be 9741).  RFC 9165 and the latter (as well as some more
   application specific specifications such as RFC 9090) have used the
   extension point provided in RFC 8610, the control operator.

   As CDDL is used in larger projects, feature requirements become known
   that cannot be easily mapped into this single extension point.
   Hence, there is a need for evolution of the base CDDL specification
   itself.

   The present document provides a roadmap towards a "CDDL 2.0"; it is
   intended to serve as a basis for implementations that evolve with the
   concept of CDDL 2.0.  It is based on draft-bormann-cbor-cddl-freezer,
   but is more selective in what potential features it takes up and more
   detailed in their discussion.  This document is intended to evolve
   over time; it might spawn specific documents and then retire, or it
   might eventually be published as a roadmap document.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-cddl-2-draft-06"/>
        </reference>
        <reference anchor="I-D.bormann-t2trg-deref-id">
          <front>
            <title>The "dereferenceable identifier" pattern</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <date day="3" month="March" year="2025"/>
            <abstract>
              <t>   In a protocol or an application environment, it is often important to
   be able to create unambiguous identifiers for some meaning (concept
   or some entity).

   Due to the simplicity of creating URIs, these have become popular for
   this purpose.  Beyond the purpose of identifiers to be uniquely
   associated with a meaning, some of these URIs are in principle
   _dereferenceable_, so something can be placed that can be retrieved
   when encountering such a URI.


   // The present revision -04 includes a few clarifications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-t2trg-deref-id-05"/>
        </reference>
        <reference anchor="useful" target="https://github.com/cbor-wg/cddl/wiki/Useful-CDDL">
          <front>
            <title>Useful CDDL</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="cddlc" target="https://github.com/cabo/cddlc">
          <front>
            <title>CDDL conversion utilities</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="J. Arkko" initials="J." surname="Arkko"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML). Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model. A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8428"/>
          <seriesInfo name="DOI" value="10.17487/RFC8428"/>
        </reference>
      </references>
    </references>
    <?line 522?>

<section anchor="abnf-specification">
      <name>ABNF Specification</name>
      <t>This section specifies the grammar employed by the module structure
directives using the ABNF language defined in <xref target="STD68"/> and
<xref target="RFC7405"/>.</t>
      <sourcecode type="abnf"><![CDATA[
directive = ";#" RS (%s"import" / %s"include") RS [from-clause]
                    filename [as-clause] CRLF
from-clause = 1*(id-or-all [","] RS) %s"from" RS
as-clause = RS %s"as" RS id
filename = 1*("-" / "." / %x30-39 / %x41-5a / "_" / %x61-7a)
id = ("$" / %x40-5a / "_" / %x61-7a)
     *("$" / %x30-39 / %x40-5a / "_" / %x61-7a)
id-or-all = id / "*"
RS = 1*WS
WS = SP
SP = %x20
CRLF = %x0A / %x0D.0A
]]></sourcecode>
    </section>
    <section anchor="cddlc-tool">
      <name>A CDDL Tool that Implements CDDL Module Structure</name>
      <t>This appendix is for information only.</t>
      <t>A CDDL conversion tool is available <xref target="cddlc"/> that can process
module-structured CDDL models into basic CDDL models; the latter can
then be processed by other CDDL tools such as the one described in
<xref section="F" sectionFormat="of" target="RFC8610"/>.</t>
      <t>A typical command line involving both tools mentioned might be:</t>
      <artwork><![CDATA[
cddlc -2 -tcddl mytestfile.cddl | cddl - gp 10
]]></artwork>
      <t>The CDDL conversion tool can be installed on a system with a modern
Ruby (Ruby version ≥ 3.0) via:</t>
      <artwork><![CDATA[
gem install cddlc
]]></artwork>
      <t>The present document assumes the use of <tt>cddlc</tt> of at least version 0.2.5.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
GY0YvS0rbRNEeQUtI5vuJ5uliB44Zumphq5HBBw+RXMWjEWI5UqN90I0DNkT
ZhHJqtXadT1vQVHeVzB1oH7Wb8iwwghSpShh7dLwY4mjiFIGOgEFZrcSXUIY
dNnw/kivktpYJKf984AWeegk1VRP4TyP9E+y/41QKXFdFTmtu7K+RP2idgIn
l2VI5VVp9HBr5EOkkr6a/wPGAGYT1O8puEy/JQtybbfKsABhOFcsvGF5akRL
iQWkEfKUmw+wa0GMhPMQZzm8LfFUaECkSkMvDNyhN65b91oqFdToIjLUTzVc
tPc7bGiulbckmBwsR2o7zqI8j0lS+dybVqa7VMkBZn3f029en3jxV0TUsM9V
h5CRgj0KujhQt2E34CSibheNATNs0Yg+KQSF/eaXVuBuwfyyENkYUDG3dWFI
nAqGkorAjeBXHQur/IbdPoT+CqjiLcP/nJ01Xl1GyCbGtuxfRdN0YJPbj01L
ouzwD4XLST3KkIR1VYxvU8GK5waqdw8lFeEiedyQFxmcVIX4nCQb9CplvhmS
tSKnKjDzVbZaHmdwgusVEa4QB+Qer68F9HwhTIRDLgdDcq4ulb4dsNxQHs2R
LhSwr0ecjZ68OHr25vjJ+avDsx9H3hfRNMwpMqIplXELV4j7B25NAq4kOGsy
dCUNg9qc5JJMwiGkSeAstsNODyJnAmtFBGcbOtQXK4blSBBDHlVKtEOmfLFE
oGG9h+d6nCtNh9jwa47E2A1JkOKNo37BKQ4yOHLqiDsZrEAPdILq6WXRkjm1
LLyGKsTzoEzAVqguC5CjbBpScX4ES+k+LViiPplBOhbN5tCrYubjEVZM7O6t
HZcLphmbzQ7MEYrnJAznliYU+AgE+WxjaTkukNoKtZ4QqCY2D44pV3APIRGL
XOhwSd4DcLg5o5CaC5UWJUCrCr4SyJPmnnGuOzVFnG9SEgh6qNTPP/+sBkP+
gwGsw0PBEMHHtEiqlDYsMg49SrmvdHc0GPVoK/BfU7J/JQM4yOrLycovf/w3
15JsaVJVTZRtR+yuT7pHo0olZXdR4wIV/FSX/QYJVeotVNJIJakcfTPSzA6u
ClHUPqezDT9Zr/I1PqEOKnv2ChQlyyJ/yD0QgoJztEojjG8Rokv7iMnrPeZe
p2LIDU97tVV7r+t1D9WKcC5TOQJmzZ60fXWJqCVSsg1Bftt6FCVhXExsbfXy
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
Ymc5o355/BIwWn0uMVD/A0HJsyOPPwAA

-->

</rfc>
