<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-nichols-iotops-defined-trust-transport-06" submissionType="IETF" category="info" xml:lang="en" indexInclude="true">
  <front>
    <title abbrev="Defined-Trust Transport (DeftT)">Defined-Trust Transport (DeftT) Protocol for Limited Domains</title>
    <seriesInfo value="draft-nichols-iotops-defined-trust-transport-06" stream="IETF" status="informational" name="Internet-Draft"/>
    <author initials="K." surname="Nichols" fullname="Kathleen Nichols">
      <organization>Pollere LLC</organization>
      <address>
        <postal>
          <street/>
        </postal>
        <email>nichols@pollere.net</email>
      </address>
    </author>
    <author initials="V." surname="Jacobson" fullname="Van Jacobson">
      <organization>UCLA</organization>
      <address>
        <postal>
          <street/>
        </postal>
        <email>vanj@cs.ucla.edu</email>
      </address>
    </author>
    <author initials="R." surname="King" fullname="Randy King">
      <organization>Operant Networks Inc.</organization>
      <address>
        <postal>
          <street/>
        </postal>
        <email>randy.king@operantnetworks.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a broadcast-oriented, many-to-many Defined-trust Transport (DeftT) framework that makes it simple
to express and enforce application and deployment specific integrity, authentication, access control and behavior
constraints directly in the protocol stack.
DeftT enables secure and completely self-contained (e.g., no external identity servers or certificate authorities)
overlay networks where credentialed members can join and leave at any time.
DeftT is part of a Defined-trust Communications approach with a specific example implementation available.
Combined with IPv6 multicast and modern hardware-based methods for securing keys and code, it provides an easy to use foundation
for secure and efficient communications in Limited Domains (RFC8799), in particular for Operational Technology (OT) networks.</t>
      <t>Conventional IP transports create optionally secured one-to-one sessions.
Where member identities exist, they must either be validated via external servers or
all member identities must be be preconfigured in each member during enrollment.
Synchronization of data across a domain is
carried out through multiple two-party transport sessions.
In contrast, DeftT is a multi-party transport that synchronizes collections of secured
information across all enrolled members of a domain.
Security in DeftT is not optional and members are preconfigured only with their own
identities and the secured rules to authenticate other member identities.</t>
      <t>This document describes an architecture that is not a standard and does not enjoy IETF consensus. (The community is
invited to consider standardizing its concepts and the specification.)</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Decades of success in providing IP connectivity over any physical media ("IP over everything") has commoditized IP-based communications.
This makes IP an attractive option for Internet of Things (IoT), Industrial Control Systems (ICS) and Operational Technologies (OT) applications
like building automation, embedded systems and transportation control,
that previously required proprietary or analog connectivity.
For the energy sector in particular, the growing use of Distributed Energy Resources (DER) like
residential solar has created interest in low cost commodity networked devices with added features for security, robustness and low-power operation <xref target="MODOT"/><xref target="OPR"/><xref target="CIDS"/>.
Other emerging uses include connecting controls and sensors in nuclear power plants <xref target="DIGN"/> and carbon capture monitoring
<xref target="IIOT"/>.</t>
      <t>While use of an IP network layer is a major advance for OT, current Internet transport options are a poor match to its needs
in both the communications and security models.
TCP generalized the Arpanet transport notion of a packet "phone call" between two endpoints into a generic, reliable, bi-directional bytestream working over IP's stateless unidirectional best-effort delivery model.  Just as the voice phone call model spawned a global voice communications infrastructure in the 1900s, TCP/IP's two-party packet sessions are the foundation of today's global data communication infrastructure.</t>
      <t>Yet "good for global communication" isn't the same as "good for everything".
A signficant number of OT uses can be characterized as Limited Domains <xref target="RFC8799"/> under a single administrative authority
with a primary function of coordination and control and communication patterns that are many-to-many.
Implementing many-to-many applications over two-party transport sessions changes the configuration burden and traffic scaling
from the native media's O(<em>n</em>) to O(<em>n</em><sup>2</sup>) (see <xref target="transporting-information"/>). Further, as OT devices have specific,
highly proscribed roles with strict constraints on who can say what to which,
the opacity of modern encrypted two-party sessions can make it impossible to enforce or audit these constraints.</t>
      <t>This memo describes Defined-trust Transport (DeftT) whose
intended use is for communications in the constrained environments that can be characterized as Limited Domains <xref target="RFC8799"/>.
As in <xref target="RFC8366"/> we define a domain as "The set of entities or infrastructure under common
administrative control.
Following [RFC8799] we use the term Limited Domain to refer to a region where network and end system requirements,
behaviors, and semantics are applied only within a single domain where membership is assumed to be cryptographically secured.
The region of a Limited Domain’s applicability could be a physical locality, e.g., within the same building,
campus or immediate proximity,
or could be distributed across geographies, as an overlay on the Internet or as a network parallel to the Internet.
The definition of <em>limited</em> used here is "restricted" or "characterized by enforceable limitations."
(<eref target="https://www.merriam-webster.com/dictionary/limited">https://www.merriam-webster.com/dictionary/limited</eref>)
<em>Trust domain</em> denotes a Limited Domain where all network communications are via DeftT.
Though the Limited Domain properties and general functional requirements enumerated in <xref target="RFC8799"/> are necessary,
we do not claim they are sufficient.</t>
      <t>In contrast to conventional two-party session-based IP transports with optional session security,
DeftT is a multi-party transport that synchronizes collections of secured information
across all enrolled members of a domain using broadcast when available.
This feature keeps domain communications synchronized without the need to construct
multiple two-party transport sessions, either between members or with a server or broker.
Like conventional transports in limited domains, DeftT relies on the concept of secure,
dynamic membership but the membership configuration is the <em>only</em> information needed to
validate the authenticity and capabilities of other senders obviating the need to
validate other members' identities via external servers or preconfiguration with
those identities.
Thus new members can be created and join a trust domain at any time.</t>
      <t>The secure, dynamic <em>membership</em> of <xref target="RFC8799"/> is critical in DeftT and its use and enforcement
is described in subsequent sections.
Members use preconfigured identities and secured communications rules to validate other members' identities,
to validate received communications both structurally and cryptographically
and to construct compliant outbound communications.
All communications in within the domain; no external servers (e.g. certificate authorities, identity servers) are used
at any time.</t>
      <t>In DeftT Domains, multipoint communications are enabled through use of a named collection abstraction
and secured by an integrated trust management engine.
DeftT employs IPv6 link-local multicast <xref target="RFC4291"/>, a distributed set reconciliation communications model,
flexible pub/sub APIs, chain-of-trust membership identities, and secured rules that define the local context
and communication constraints of a deployment in a declarative language.
The set reconciliation protocol provides reliable communications (see <xref target="syncps-a-set-reconciliation-protocol"/>).
The rules are used by DeftT's runtime trust management engine to enforce adherence to the constraints;
together with a shared trust anchor, a member can validate every other member's identity at runtime.
There is no need for members to have apriori knowledge of one another.
The resulting system is efficient, secure and scalable:
communication, signing and validation costs are constant per-publication,
independent of the richness and complexity of the
deployment's constraints or the number of entites deployed.</t>
      <t>Like QUIC, DeftT is a user-space transport protocol that sits between an application and a system-provided transport
like UDP or UDP multicast (see <xref target="fig0"/>).
No UDP or TCP port assignment is required.
DeftT's membership model means that an application is configured with its credentials before it starts communications.
This includes the domain rules ("schema") distributed as a certificate signed by the domain trust anchor.
Members use the SHA256 "thumbprint" <xref target="terms"/> of the schema cert as a compact, unique identifier for the domain
and portions of this identifier are used to generate addresses in accordance with the Dynamic Ports of <xref target="RFC6335"/>
to determine both the IPv6 link-local multicast address and UDP destination port.
(more in <xref target="discovery"/>).
(Note that UDP multicast requires different ports for send and receive, so this use doesn't conflict with the normal use of
this range for emphemeral client src ports.) Unicast protocols require more configuration and
the protocol, role ("listen" or "connect"), address and port information goes into the identity chains of the
two parties.</t>
      <figure anchor="fig0">
        <name>DeftT in an IP stack
</name>
        <artwork type="svg" originalSrc="./figs/defttlayer-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="80%" viewBox="220.000000 240.000000 460.000000 260.000000" version="1.1">
            <desc>defttlayer-rfc</desc>
            <defs/>
            <rect x="220.000000" y="240.000000" width="460.000000" height="260.000000" fill="white"/>
            <g>
              <rect x="239.999756" y="260.000031" width="400.000000" height="40.000019" fill="none" stroke="black" stroke-width="2.000000" rx="8.000000" ry="8.000000"/>
              <g>
                <text xml:space="preserve" x="387.999756" y="287.500031" font-size="20" font-family="sans-serif" fill="black">Application</text>
              </g>
            </g>
            <g>
              <rect x="239.999435" y="300.000000" width="400.000031" height="40.000008" fill="none" stroke="black" stroke-width="2.000000" rx="8.000006" ry="8.000006"/>
              <g>
                <text xml:space="preserve" x="414.499451" y="327.500000" font-size="20" font-family="sans-serif" fill="black">DeftT</text>
              </g>
            </g>
            <g>
              <rect x="239.999939" y="339.999969" width="240.000015" height="39.999977" fill="none" stroke="black" stroke-width="2.000000" rx="8.000000" ry="8.000000"/>
              <g>
                <text xml:space="preserve" x="297.499939" y="367.499969" font-size="20" font-family="sans-serif" fill="black">UDPmulticast</text>
              </g>
            </g>
            <g>
              <rect x="479.999756" y="340.000031" width="159.999969" height="40.000011" fill="none" stroke="black" stroke-width="2.000000" rx="8.000000" ry="8.000000"/>
              <g>
                <text xml:space="preserve" x="506.999756" y="367.500031" font-size="20" font-family="sans-serif" fill="black">TCP/UDP/…</text>
              </g>
            </g>
            <g>
              <rect x="480.000031" y="380.000000" width="160.001892" height="40.000031" fill="none" stroke="black" stroke-width="2.000000" rx="8.000006" ry="8.000006"/>
              <g>
                <text xml:space="preserve" x="487.500092" y="407.500000" font-size="20" font-family="sans-serif" fill="black">IPv4/6 (unicast)</text>
              </g>
            </g>
            <g>
              <rect x="240.000000" y="380.000031" width="239.999985" height="39.999985" fill="none" stroke="black" stroke-width="2.000000" rx="8.000006" ry="8.000006"/>
              <g>
                <text xml:space="preserve" x="252.000000" y="407.500031" font-size="20" font-family="sans-serif" fill="black">IPv6 link local multicast</text>
              </g>
            </g>
            <g>
              <polygon points="280.000000,420.000000 439.999939,420.000000 439.999939,460.000000 280.000000,460.000000 " fill="none"/>
              <g>
                <text xml:space="preserve" x="287.000000" y="447.500000" font-size="20" font-family="sans-serif" fill="black">self-configuring</text>
              </g>
            </g>
            <g>
              <polygon points="479.999969,420.000000 660.001099,420.000000 660.001099,480.000000 479.999969,480.000000 " fill="none"/>
              <g>
                <text xml:space="preserve" x="507.500427" y="445.500000" font-size="20" font-family="sans-serif" fill="black">configured as</text>
                <text xml:space="preserve" x="488.999878" y="469.500000" font-size="20" font-family="sans-serif" fill="black">identity attributes</text>
              </g>
            </g>
          </svg>
        </artwork>
      </figure>
      <t>DeftT's trust domains are self-contained communications networks layered on IP via multicast UDP or unicast
protocols (e.g., TCP and UDP) and do not directly interact with IP routing protocols.
DeftT operates on IP networks without interfering with conventional IP protocols.
In contrast with IETF standards track protocols like the client-server COAP <xref target="RFC7252"/>, DeftT is intended to serve the
communication needs of a closed community with common objectives, a zero-trust Limited Domain (<em>trust domain</em>). Foremost among those needs is the ability to enforce community-specific policy constraints ("who can say what to which"). ABAC (Attribute-Based Access Control) <xref target="NIST"/> provides a model sufficient to express and enforce these constraints but a fundamental architectural choice remains to either:</t>
      <ol type="a">
<li>
          <t>Start with Internet-based communication protocols then  "harden them" by layering an ABAC framework on top, or</t>
        </li>
        <li>
          <t>Start with an ABAC framework that verifiably enforces the policy constraints then augment it with the minimum necessary communication primitives needed to function in a community's deployment environment.</t>
        </li>
      </ol>
      <t>Existing IETF protocols use approach (a) and, given how few enforceable security policies are possible on the open Internet,
it's a reasonable choice.
For LDs, approach (a) imports all the (otherwise unneeded) Internet abstraction maintenance machinery
(DHCP, DNS, CAs, PDPs/PIPs, routing, address plans, etc.).
When communication is expressed in terms of Internet abstractions (e.g., a TLS connection between two IP endpoints), there needs to be a translation layer to map between these abstractions and the community's entities, requirements and objectives.
All this machinery is configuration intensive and recent history has demonstrated that it's all prime attack surface.
DeftT has been created as a self-contained ABAC framework where the PEP and PDP are in the transport's narrow pub/sub waist.
DeftT embeds the PIP function in certificate signing chains so it's self-authenticating and self-distributing.</t>
      <t>Like COAP/OSCORE nodes, DeftT trust domain members start with a pre-existing identity obtained out-of-band,
which means that existing and evolving bootstrap and enrollment protocols and methodologies can be used.
DeftT identities are more than a single key pair signed by a trust anchor;
instead, the identities are in the form of certificate chains that contain all the attributes or roles
the identity is granted.
Entities are configured with a chain of public certificates terminating at the trust anchor,
along with a private key corresponding to the unique identity cert at the chain's leaf.
An identity only conveys membership in a <em>specific</em> trust domain that is
using a <em>particular</em> set of rules and a <em>particular</em> trust anchor.</t>
      <t>As with MUD, trust domain members have specific capabilities and permitted communications that are explicitly specified.
Unlike MUD, each member gets the rules for the domain distributed in binary form in a certificate
(a <em>communication schema</em>) signed by the same trust anchor that is at the root of the member identity.
This compact and secured <em>schema</em> specifies the format for identity chains as well as the format of all permitted communications
and the attributes required by identities that issue them.
Each DeftT node has an integrated trust management engine that applies the schema at run-time.
DeftT enrollment consists of configuring a device with <em>identity bundles</em> that
contain the trust anchor certificate, the communication schema, and a membership identity which comprises all the certs
in its signing chain terminated at the trust anchor.
The private key corresponding to the leaf certificate of the member's identity should be securely configured
(i.e., not exposed to any third party) while the security of the identity bundle can be deployment-specific
(i.e., the public certificates it contains may optionally be protected from third parties).</t>
      <t>In a Trust Domain, all members' identities and the schema share a common trust anchor,
so the bundle suffices for a member to authenticate and authorize communication from peers and vice-versa.
The identity bundle, DeftT's trust management engine, and a trust domain's certificate collection
(where members publish their signing chains) allow new members to join and communicate with no specific knowledge of other members,
thus obviating labor intensive and error-prone device-to-device association configuration.
The signing key pairs used for communications are made <em>locally</em> at each entity on whatever rotation schedule
chosen for the application.
Private identity keys are not used for signing DeftT packets,
only to sign the public signing certificate that becomes the leaf certificate of a signing chain.
The identity key can remain within protected hardware like a TPM for signing while the signing key is used in the
communications path as a tradeoff between the possibility of more exposure vs the need for speed.
(More on certificates and identities in DeftT in <xref target="distributors"/> and <xref target="certificates-and-identity-bundles"/>.)</t>
      <t>Along with bootstrapped identity bundles, DeftT makes use of both its synchronized collections and
its integrated trust management engine to securely join a particular Trust Domain.
In synchronized collections, members communicate about their local version of the collection state and send additions to the
collection the other members are missing.</t>
      <t>DeftT's collections hold Publications that have lifetimes set as appropriate to their use.
For example, Publications that carry application communications are normally ephemeral, like a UDP or TCP packet,
while Publications that carry certificates have longer lifetimes, on the order of hours or even months.
Collections are synchronized; members compare their local versions of the collection state and update the collection
with Publications they have that others are missing.
On a broadcast subnet (e.g., using IPv6 link local multicast) updates are sent to multiple members at once.
On a unicast subnet (e.g., UDP) updates are sent to the other member of the subnet.</t>
      <t>To understand how a DeftT joins a Trust Domain, we now describe the certificate distributor model
from the point of view of a newly joining member DeftT.
A state diagram of the joining process is <xref target="figCertSD"/>.
The joining member creates its first signing pair, then constructs a certificate holding the public signing key
and signs it with the member's private identity key.
The joining member adds its signing chain to its local copy of the cert collection
and starts the process of joining the Trust Domain
by publishing its cert collection state and subscribing to the domain certificate collection.
The local collection state is compared to the received collection state and any certs that are not already
in that received state will be sent on the network to be added to the domain collection.
Note that a new member will always need to add its identity and signing certs,
but other certificates of the chain may already have been added to the collection by previously joining members.
A DeftT does not consider itself joined (or "connected to the domain")
 until it receives a collection state from the network that contains all of its certs,
indicating that at least one other member will be able to receive its signed packets.
Whether fully joined or not, the cert distributor receives all certs published on the network,
adding them to its local collection when an entire validated signing chain is received and updating its local collection state.</t>
      <figure anchor="figCertSD">
        <name>DeftT certificate distributor enables joining Trust Domain
</name>
        <artwork type="svg" originalSrc="./figs/certSD-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="60%" height="60%" viewBox="0 0 592 747" version="1.1">
            <desc>certSD-rfc</desc>
            <defs/>
            <g>
              <g>
                <rect fill="#FFFFFF" height="78.2031" rx="12.5" ry="12.5" width="335" x="70.5" y="186" stroke="black" stroke-width="1.0"/>
                <line x1="70.5" x2="405.5" y1="212.2969" y2="212.2969" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="154" y="203.9951">Make a new signing key</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="75.5" y="228.4355">-make a key pair for signing</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="75.5" y="242.4043">-securely store its secret signing key</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="75.5" y="256.373">-make public key cert &amp; sign with secret idenity key</text>
              </g>
              <g>
                <rect fill="#FFFFFF" height="106.1406" rx="12.5" ry="12.5" width="373" x="51.5" y="325" stroke="black" stroke-width="1.0"/>
                <line x1="51.5" x2="424.5" y1="351.2969" y2="351.2969" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="104" y="342.9951">Start process of joining Trust Domain</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="56.5" y="367.4355">subscribe to Domain's cert collection and receive its state</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="56.5" y="381.4043">publish my signing cert chain</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="88.5" y="395.373">certs added to local copy of cert collection</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="88.5" y="409.3418">compare local collection state to Domain state</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="88.5" y="423.3105">send any certs not already in Domain collection</text>
              </g>
              <g>
                <rect fill="#FFFFFF" height="64.2344" rx="12.5" ry="12.5" width="186" x="12" y="508" stroke="black" stroke-width="1.0"/>
                <line x1="12" x2="198" y1="534.2969" y2="534.2969" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="33" y="525.9951">Trust Domain joined</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="17" y="550.4355">participate in key and</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="49" y="564.4043">application collections</text>
              </g>
              <ellipse cx="238" cy="21" fill="#000000" rx="10" ry="10" stroke-width="1.0"/>
              <g>
                <rect fill="#FFFFFF" height="92.1719" rx="12.5" ry="12.5" width="280" x="144" y="649" stroke="black" stroke-width="1.0"/>
                <line x1="144" x2="424" y1="675.2969" y2="675.2969" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="240.5" y="666.9951">ProcessCert</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="149" y="691.4355">if completes a signing chain</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="181" y="705.4043">trust engine validates using schema</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="181" y="719.373">add valid chain to local cert collection</text>
                <text fill="#000000" font-family="sans-serif" font-size="12" x="149" y="733.3418">else hold valid cert until chain complete</text>
              </g>
              <!--link *start* to Initial-->
    <g>
                <path d="M238,31.204 C238,58.064 238,131.478 238,179.597 " fill="none" stroke="black" stroke-width="1.0"/>
                <polygon fill="#000000" points="238,185.597,242,176.597,238,180.597,234,176.597,238,185.597" stroke="black" stroke-width="1.0"/>
                <path d="M243,66 L243,151 L550,151 L550,76 L540,66 L243,66 " fill="#FFFFFF" stroke="black" stroke-width="1.0"/>
                <path d="M540,66 L540,76 L550,76 L540,66 " fill="#FFFFFF" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="249" y="83.0669">out-of-band configuration:</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="249" y="98.1997">-schema in cert form signed by Domain TA</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="249" y="113.3325">-identity cert chain terminates at Domain TA</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="249" y="128.4653">-secret identity key (corresponding to leaf</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="281" y="143.5981">cert) stored securely</text>
              </g>
              <!--link Initial to Start-->
    <g>
                <path d="M238,264.104 C238,282.538 238,298.952 238,318.935 " fill="none" stroke="black" stroke-width="1.0"/>
                <polygon fill="#000000" points="238,324.935,242,315.935,238,319.935,234,315.935,238,324.935" stroke="black" stroke-width="1.0"/>
              </g>
              <!--link Start to ProcessCert-->
    <g>
                <path d="M354.676,431.114 C364.674,439.746 373.453,449.659 380,461 C415.108,521.816 410.784,555.885 380,619 C374.622,630.025 371.0608,635.7275 362.1058,644.4138 " fill="none" stroke="black" stroke-width="1.0"/>
                <polygon fill="#000000" points="357.799,648.5913,367.0442,645.1962,361.388,645.11,361.4741,639.4538,357.799,648.5913" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="405" y="544.5669">receive a cert from network</text>
              </g>
              <!--link Start to JoiningComplete-->
    <g>
                <path d="M97.672,431.272 C87.2668,439.78 78.0881,449.623 71,461 C61.8606,475.669 64.9132,488.1874 74.4668,502.9244 " fill="none" stroke="black" stroke-width="1.0"/>
                <polygon fill="#000000" points="77.7306,507.959,76.1913,498.2312,75.0108,503.7635,69.4785,502.5829,77.7306,507.959" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="72" y="474.0669">receive a collection state with my signing chain</text>
              </g>
              <!--link JoiningComplete to ProcessCert-->
    <g>
                <path d="M140.814,572.238 C157.274,586.544 177.081,603.686 195,619 C206.367,628.714 214.0135,635.2095 225.6605,645.0377 " fill="none" stroke="black" stroke-width="1.0"/>
                <polygon fill="#000000" points="230.246,648.9072,225.9473,640.046,226.4247,645.6826,220.788,646.16,230.246,648.9072" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="196" y="615.0669">receive a cert from network</text>
              </g>
              <!--SRC=[bLJBZjim3BphAzWS-WBy0paKABQN5YXGe7jhUb1a9bOZYu94R-2_Boa_rabwwIssX-JCS9Wtt66Fa8BrqPIBZybcsqDFaLoNIJvn7j1qlaN0Fl48BHQNVM9FqPZ2bX6-Hi_U1h05Tj_j1S52n2iKVuu-dk62usv6_cIRkUAcNocJmrA0Jl27V4K_vw4mVA5U62rbtwPlJzIdWFAi3RQuMepjpfXV7tz3qtnQA1aJIV0K8VXuCJHmGwVcQ6CBZkB9duTiLSdUDCM94nQacKDXTgBSLmNOmd5SvZn_DerO4TcB4nNdEdtFc7iVXMe1orjmGPUHOQqHB-2zevon98gj2cQ2WFPa3gmDFq1XoZ9KAeUCOJGeP5M5COlFAh3wjxxPGzDFnkk0P7rM0Si6jh2bxJG6F1UOEMxMzT0t3SVWNMrULR-jQBXwxc0ZSLPeZ9dMkuSo73KkHrIPao_lokmSXO1EtGVTHqQ7_cLcf5jVUzJXfOD-N3c-Mh-Y9ll4_xOLzzHKSgB0KHerNdSZjsMIAYjMBFYLrPIzbVSTgmCNtOoDaoL5TmGsPBJjg2cQYnv6wl9-JB5_mjffKMxdvCdPoVtmbVB5c5ke5o7p4OZILpkg4xVG0tEz48ndkGruiS6tDQ13qP8fxWyruju4NOAz-dZdtsqXXeBGKLYBzVKWaGzpduMrsRXmVzKtJjoleKPjcu0g-Rx5_vdxI422mDxvf1E5jUPTilaFe3YLafn4_VVOi2r_0G00]-->
  </g>
          </svg>
        </artwork>
      </figure>
      <section anchor="environment-and-use">
        <name>Environment and use</name>
        <t>Due to physical deployment constraints and the high cost of wiring, many OT networks preferentially use radio as their communication medium. Use of wires is impossible in many installations (untethered Things, adding connected devices to home and infrastructure networks, vehicular uses, etc.). Wiring costs far exceed the cost of current System-on-Chip Wi-Fi IoT devices and the cost differential is increasing <xref target="WSEN"/><xref target="COST"/>. For example, the popular ESP32 is a 32bit/320KB SRAM RISC with 60 analog and digital I/O channels plus complete 802.11b/g/n and bluetooth radios on a 5mm die that consumes 70uW in normal operation. It currently costs <tt>$</tt>0.13 in small quantities while the estimated cost of pulling cable to retrofit nuclear power plants is presently <tt>$</tt>2000/ft <xref target="NPPI"/>.</t>
        <t>Many OT networks are Limited Domains having a defined membership and communications that are often local, have a many-to-many pattern, and use application-specific identifiers ("topics") for rendezvous. This fits the generic Publish/Subscribe communications model ("pub/sub") and, as table 1 in <xref target="PRAG"/> shows, nine of the eleven most widely used IoT protocols use a topic-based pub/sub transport.
Pub/sub protocols communicate by using the same topic but need no knowledge of one another.
Today, these protocols are typically <em>implemented</em> as an application layer protocol over a two-party Internet transports like TCP or TLS which require in-advance configuration of peer addresses and credentials at each endpoint and incur unnecessary communications overhead <xref target="transporting-information"/>.
For example MQTT, an open standard developed in 1999 to monitor oil pipelines over satellite <xref target="MQTT"/><xref target="MHST"/>, is now likely the
most widely used application communication protocol in IoT (<eref target="https://mqtt.org/use-cases/">https://mqtt.org/use-cases/</eref>).
Microsoft Azure, Amazon AWS,
Google Cloud, and Cloudflare all offer hosted MQTT brokers for collecting and connecting sensor and control data in addition to providing local pub/sub in buildings, factories and homes.</t>
      </section>
      <section anchor="transporting-information">
        <name>Transporting information</name>
        <t><xref target="fig1"/> shows a smart lighting example with a topic-based pub/sub application layer protocol in a wireless broadcast subnet.
Each switch is set up to do triple-duty: one click of its on/off paddle controls some particular light(s),
two clicks control all the lights in the room, and three clicks control all available lights (five kitchen plus the four den ceiling).
Thus a switch button push may require a message to as many as nine light devices.
On a broadcast transmission medium each packet sent by the switch is heard by all nine devices.
IPv6 link-level multicast provides a network layer that can take advantage of this but current IP transport protocols cannot.
Instead, each light switch needs to establish nine bilateral transport associations in order to send the published message for all lights to turn on.
Communicating devices must be configured with each other's IP address and enrolled identity so, for <em>n</em> devices, both the configuration burden and traffic scale as O(<em>n<sup>2</sup></em>).
For example, when an "<em>all</em>" event is triggered, every light's radio will receive nine messages but discard the eight determined to be "not mine."
If a device sleeps, is out-of-range, or has partial connectivity, additional application-level mechanisms have to be implemented to accommodate it.</t>
        <figure anchor="fig1">
          <name>Smart lighting use of Pub/Sub
</name>
          <artwork type="svg" originalSrc="./figs/iotDeftt-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" width="80%" height="80%" viewBox="0 0 967 692">
              <desc>iotDeftt-rfc</desc>
              <title>iotDeftt</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <g transform="translate(8.000000, 6.000000)" fill="#000000">
                  <g transform="translate(377.000000, -0.000000)">
                    <g fill-rule="nonzero">
                      <g>
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 0.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(0.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                    </g>
                    <g transform="translate(226.000000, 46.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="12.6879883" y="17">kitchen ceiling</tspan>
                      </text>
                      <g transform="translate(27.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="0.113769531" y="33">kitchen ceiling</tspan>
                          <tspan x="24.5932617" y="50">kitchen</tspan>
                          <tspan x="41.5874023" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="6" y="12">subscriptions</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(377.000000, 514.000000)">
                    <g fill-rule="nonzero">
                      <g>
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 0.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(0.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                    </g>
                    <g transform="translate(221.000000, 45.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="29.6948242" y="17">den ceiling</tspan>
                      </text>
                      <g transform="translate(38.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="6.37060547" y="33">den ceiling</tspan>
                          <tspan x="30.8500977" y="50">den</tspan>
                          <tspan x="35.5874023" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="0" y="12">subscriptions</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(729.000000, 160.000000)">
                    <path d="M35,34 C54.3299662,34 70,49.6700338 70,69 C70,80.9 64.05,91.35 55,97.7 L55,109 C55,111.761424 52.7614237,114 50,114 L20,114 C17.2385763,114 15,111.761424 15,109 L15,97.7 C5.95,91.35 0,80.9 0,69 C0,49.6700338 15.6700338,34 35,34 M20,129 L20,124 L50,124 L50,129 C50,131.761424 47.7614237,134 45,134 L25,134 C22.2385763,134 20,131.761424 20,129 M35,44 C21.1928813,44 10,55.1928813 10,69 C10,79.25 16.15,88.05 25,91.9 L25,104 L45,104 L45,91.9 C53.85,88.05 60,79.25 60,69 C60,55.1928813 48.8071187,44 35,44 L35,44 Z" fill-rule="nonzero"/>
                    <path d="M35,30 L41,22 C39.3333333,20.75 37.25,20 35,20 C32.75,20 30.6666667,20.75 29,22 L35,30 M35,0 C28.25,0 22.0166667,2.23333333 17,6 L20,10 C24.1666667,6.86666667 29.3666667,5 35,5 C40.6333333,5 45.8333333,6.86666667 50,10 L53,6 C47.9833333,2.23333333 41.75,0 35,0 M35,10 C30.5,10 26.35,11.4833333 23,14 L26,18 C28.5,16.1166667 31.6166667,15 35,15 C38.3833333,15 41.5,16.1166667 44,18 L47,14 C43.65,11.4833333 39.5,10 35,10 Z" fill-rule="nonzero"/>
                    <g transform="translate(72.000000, 34.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="6.0078125" y="17">kitchen counter</tspan>
                      </text>
                      <g transform="translate(22.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="0.422363281" y="33">kitchen counter</tspan>
                          <tspan x="28.5932617" y="50">kitchen</tspan>
                          <tspan x="45.5874023" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="10" y="12">subscriptions</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(15.000000, 394.000000)">
                    <path d="M212,36.7272727 C210.181818,34.9090909 207.909091,34 205.636364,34 L151.090909,34 C148.818182,34 146.545455,34.9090909 144.727273,36.7272727 C142.909091,38.5454545 142,40.8181818 142,43.0909091 L142,124.909091 C142,127.181818 142.909091,129.454545 144.727273,131.272727 C146.545455,133.090909 148.818182,134 151.090909,134 L205.636364,134 C207.909091,134 210.181818,133.090909 212,131.272727 C213.818182,129.454545 214.727273,127.181818 214.727273,124.909091 L214.727273,43.0909091 C214.727273,40.8181818 213.818182,38.5454545 212,36.7272727 M205.636364,124.909091 L151.090909,124.909091 L151.090909,43.0909091 L205.636364,43.0909091 L205.636364,124.909091 M160.181818,56.7272727 L160.181818,111.272727 L196.545455,111.272727 L196.545455,56.7272727 L160.181818,56.7272727 M192,106.727273 L164.727273,106.727273 L164.727273,61.2727273 L192,61.2727273 L192,106.727273 M169.272727,93.0909091 L187.454545,93.0909091 L187.454545,102.181818 L169.272727,102.181818 L169.272727,93.0909091 Z" fill-rule="nonzero"/>
                    <path d="M178,30 L184,22 C182.333333,20.75 180.25,20 178,20 C175.75,20 173.666667,20.75 172,22 L178,30 M178,0 C171.25,0 165.016667,2.23333333 160,6 L163,10 C167.166667,6.86666667 172.366667,5 178,5 C183.633333,5 188.833333,6.86666667 193,10 L196,6 C190.983333,2.23333333 184.75,0 178,0 M178,10 C173.5,10 169.35,11.4833333 166,14 L169,18 C171.5,16.1166667 174.616667,15 178,15 C181.383333,15 184.5,16.1166667 187,18 L190,14 C186.65,11.4833333 182.5,10 178,10 Z" fill-rule="nonzero"/>
                    <g transform="translate(0.000000, 36.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="10.7573242" y="17">den switch</tspan>
                      </text>
                      <g transform="translate(6.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="43" y="33">den ceiling</tspan>
                          <tspan x="43" y="50">den</tspan>
                          <tspan x="43" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="14" y="33">1:</tspan>
                          <tspan x="14" y="50">2:</tspan>
                          <tspan x="14" y="67">3:</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="0" y="12">clicks</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="53" y="12">pub topic</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(0.000000, 157.000000)">
                    <path d="M227,36.7272727 C225.181818,34.9090909 222.909091,34 220.636364,34 L166.090909,34 C163.818182,34 161.545455,34.9090909 159.727273,36.7272727 C157.909091,38.5454545 157,40.8181818 157,43.0909091 L157,124.909091 C157,127.181818 157.909091,129.454545 159.727273,131.272727 C161.545455,133.090909 163.818182,134 166.090909,134 L220.636364,134 C222.909091,134 225.181818,133.090909 227,131.272727 C228.818182,129.454545 229.727273,127.181818 229.727273,124.909091 L229.727273,43.0909091 C229.727273,40.8181818 228.818182,38.5454545 227,36.7272727 M220.636364,124.909091 L166.090909,124.909091 L166.090909,43.0909091 L220.636364,43.0909091 L220.636364,124.909091 M175.181818,56.7272727 L175.181818,111.272727 L211.545455,111.272727 L211.545455,56.7272727 L175.181818,56.7272727 M207,106.727273 L179.727273,106.727273 L179.727273,61.2727273 L207,61.2727273 L207,106.727273 M184.272727,93.0909091 L202.454545,93.0909091 L202.454545,102.181818 L184.272727,102.181818 L184.272727,93.0909091 Z" fill-rule="nonzero"/>
                    <path d="M193,30 L199,22 C197.333333,20.75 195.25,20 193,20 C190.75,20 188.666667,20.75 187,22 L193,30 M193,0 C186.25,0 180.016667,2.23333333 175,6 L178,10 C182.166667,6.86666667 187.366667,5 193,5 C198.633333,5 203.833333,6.86666667 208,10 L211,6 C205.983333,2.23333333 199.75,0 193,0 M193,10 C188.5,10 184.35,11.4833333 181,14 L184,18 C186.5,16.1166667 189.616667,15 193,15 C196.383333,15 199.5,16.1166667 202,18 L205,14 C201.65,11.4833333 197.5,10 193,10 Z" fill-rule="nonzero"/>
                    <g transform="translate(0.000000, 39.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="5.75048828" y="17">kitchen switch</tspan>
                      </text>
                      <g transform="translate(0.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="43" y="33">kitchen counter</tspan>
                          <tspan x="43" y="50">kitchen</tspan>
                          <tspan x="43" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="14" y="33">1:</tspan>
                          <tspan x="14" y="50">2:</tspan>
                          <tspan x="14" y="67">3:</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="0" y="12">clicks</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="53" y="12">pub topic</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                </g>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>MQTT and other broker-based pub/sub approaches mitigate this by adding a <em>broker</em> (<xref target="fig2"/>).
Each entity makes a single TCP transport connection with the broker and tells the broker to subscribe it to topics.
Then the kitchen switch uses its single transport session to publish commands to topic <tt>kitchen/counter</tt>, topic <tt>kitchen</tt> or <tt>all</tt>.
The kitchen counter light uses its broker session to subscribe to those same three topics.
The kitchen ceiling lights subscribe to topics <tt>kitchen ceiling</tt>, <tt>kitchen</tt> and <tt>all</tt> while den ceiling lights subscribe to topics <tt>den ceiling</tt>, <tt>den</tt> and <tt>all</tt>.
Use of a broker reduces the configuration burden from O(<em>n</em><sup>2</sup>) to O(<em>n</em>): 18 transport sessions to 11 for this simple example but for realistic deployments the reduction is often greater.</t>
        <t>There are other advantages: besides their own IP addresses and identities, devices only need to be configured with those of the broker.
Further, the broker can store messages for temporarily unavailable devices and use the transport session to confirm the reception of messages.
This approach is popular because the pub/sub application layer protocol provides an easy-to-use API and the broker reduces configuration burden while maintaining secure, reliable delivery and providing short-term in-network storage of messages.
Still the broker implementation doubles the per-device configuration burden by adding an entity that exists only to implement transport and traffic still scales as O(<em>n<sup>2</sup></em>), e.g., any switch publishing to <tt>all</tt> lights results in ten (unicast) message transfers over the wifi network. Further, the broker introduces a single point of failure into a network that is richly connected physically.</t>
        <figure anchor="fig2">
          <name>Brokers enable Pub/Sub over connection/session protocols
</name>
          <artwork type="svg" originalSrc="./figs/iotMQTT-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" width="80%" height="80%" viewBox="0 0 967 692">
              <desc>iotMQTT-rfc</desc>
              <title>iotMQTT</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <g transform="translate(8.000000, 6.000000)">
                  <g transform="translate(238.500000, 76.000000)" stroke="black" stroke-linecap="round" stroke-width="3">
                    <line x1="286" y1="253.5" x2="493" y2="187.5" stroke-opacity="0.599928636"/>
                    <line x1="0" y1="350.5" x2="207" y2="284.5" stroke-opacity="0.599928636"/>
                    <line x1="0" y1="253.5" x2="207" y2="187.5" stroke-opacity="0.599928636" transform="translate(103.500000, 220.500000) scale(1, -1) translate(-103.500000, -220.500000) "/>
                    <line x1="238" y1="219.5" x2="212" y2="0.5" stroke-opacity="0.6"/>
                    <line x1="257" y1="220.5" x2="289" y2="0.5" stroke-opacity="0.6"/>
                    <line x1="223" y1="226.5" x2="181" y2="95.5" stroke-opacity="0.596717248"/>
                    <line x1="269" y1="226.5" x2="314" y2="95.5" stroke-opacity="0.6"/>
                  </g>
                  <g transform="translate(417.500000, 391.500000)" stroke="black" stroke-linecap="round" stroke-width="3">
                    <line x1="50" y1="3" x2="34" y2="247" stroke-opacity="0.599928636"/>
                    <line x1="100" y1="0" x2="140" y2="119" stroke-opacity="0.6"/>
                    <line x1="37" y1="0" x2="0" y2="119" stroke-opacity="0.596717248"/>
                    <line x1="84" y1="3" x2="110" y2="247" stroke-opacity="0.6"/>
                  </g>
                  <g transform="translate(414.000000, 308.000000)" fill="#000000">
                    <path d="M95.7777778,8.05555556 L98,5.83333333 C94.1111111,1.94444444 89.1111111,0 84.1111111,0 C79.1111111,0 74.1111111,1.94444444 70.2222222,5.83333333 L72.4444444,8.05555556 C75.7777778,5 79.9444444,3.33333333 84.1111111,3.33333333 C88.2777778,3.33333333 92.4444444,5 95.7777778,8.05555556 M93.2777778,10.2777778 C90.7777778,7.77777778 87.4444444,6.38888889 84.1111111,6.38888889 C80.7777778,6.38888889 77.4444444,7.77777778 74.9444444,10.2777778 L77.1666667,12.5 C79.1111111,10.5555556 81.6111111,9.72222222 84.1111111,9.72222222 C86.6111111,9.72222222 89.1111111,10.5555556 91.0555556,12.5 L93.2777778,10.2777778 M92.4444444,27.7777778 L86.8888889,27.7777778 L86.8888889,16.6666667 L81.3333333,16.6666667 L81.3333333,27.7777778 L53.5555556,27.7777778 C50.4873069,27.7777778 48,30.2650847 48,33.3333333 L48,44.4444444 C48,47.5126931 50.4873069,50 53.5555556,50 L92.4444444,50 C95.5126931,50 98,47.5126931 98,44.4444444 L98,33.3333333 C98,30.2650847 95.5126931,27.7777778 92.4444444,27.7777778 M61.8888889,41.6666667 L56.3333333,41.6666667 L56.3333333,36.1111111 L61.8888889,36.1111111 L61.8888889,41.6666667 M71.6111111,41.6666667 L66.0555556,41.6666667 L66.0555556,36.1111111 L71.6111111,36.1111111 L71.6111111,41.6666667 M81.3333333,41.6666667 L75.7777778,41.6666667 L75.7777778,36.1111111 L81.3333333,36.1111111 L81.3333333,41.6666667 Z" fill-rule="nonzero"/>
                    <text font-family="sans-serif" font-size="18" font-weight="bold">
                      <tspan x="10.6689453" y="77">MQTT broker</tspan>
                    </text>
                  </g>
                  <g transform="translate(377.000000, -0.000000)" fill="#000000">
                    <g fill-rule="nonzero">
                      <g>
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 0.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(0.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                    </g>
                    <g transform="translate(226.000000, 46.000000)" font-family="sans-serif" font-size="18" font-weight="bold">
                      <text>
                        <tspan x="12.6879883" y="17">kitchen ceiling</tspan>
                      </text>
                    </g>
                  </g>
                  <g transform="translate(377.000000, 514.000000)" fill="#000000">
                    <g fill-rule="nonzero">
                      <g>
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 0.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(0.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                      <g transform="translate(141.000000, 87.000000)">
                        <path d="M40,34 C18,34 0,43.84 0,56 C0,68.16 18,78 40,78 C62,78 80,68.16 80,56 C80,43.84 62,34 40,34 M58,46 C58,47.6 51.6,52.16 40,52.16 C28.4,52.16 22,47.6 22,46 C22,45.64 22.6,44.96 23.6,44.2 C28.24,42.84 33.76,42 40,42 C46.24,42 51.76,42.84 56.4,44.2 C57.4,44.96 58,45.64 58,46 M40,70 C20.48,70 8,61.72 8,56 C8,53.24 10.92,50 16.12,47.16 C17.2,53.32 27.48,58.16 40,58.16 C52.52,58.16 62.8,53.32 63.88,47.16 C69.08,50 72,53.24 72,56 C72,61.72 59.52,70 40,70 Z"/>
                        <path d="M40,30 L46,22 C44.3333333,20.75 42.25,20 40,20 C37.75,20 35.6666667,20.75 34,22 L40,30 M40,0 C33.25,0 27.0166667,2.23333333 22,6 L25,10 C29.1666667,6.86666667 34.3666667,5 40,5 C45.6333333,5 50.8333333,6.86666667 55,10 L58,6 C52.9833333,2.23333333 46.75,0 40,0 M40,10 C35.5,10 31.35,11.4833333 28,14 L31,18 C33.5,16.1166667 36.6166667,15 40,15 C43.3833333,15 46.5,16.1166667 49,18 L52,14 C48.65,11.4833333 44.5,10 40,10 Z"/>
                      </g>
                    </g>
                    <g transform="translate(221.000000, 45.000000)" font-family="sans-serif" font-size="18" font-weight="bold">
                      <text>
                        <tspan x="29.6948242" y="17">den ceiling</tspan>
                      </text>
                    </g>
                  </g>
                  <g transform="translate(729.000000, 160.000000)" fill="#000000">
                    <path d="M35,34 C54.3299662,34 70,49.6700338 70,69 C70,80.9 64.05,91.35 55,97.7 L55,109 C55,111.761424 52.7614237,114 50,114 L20,114 C17.2385763,114 15,111.761424 15,109 L15,97.7 C5.95,91.35 0,80.9 0,69 C0,49.6700338 15.6700338,34 35,34 M20,129 L20,124 L50,124 L50,129 C50,131.761424 47.7614237,134 45,134 L25,134 C22.2385763,134 20,131.761424 20,129 M35,44 C21.1928813,44 10,55.1928813 10,69 C10,79.25 16.15,88.05 25,91.9 L25,104 L45,104 L45,91.9 C53.85,88.05 60,79.25 60,69 C60,55.1928813 48.8071187,44 35,44 L35,44 Z" fill-rule="nonzero"/>
                    <path d="M35,30 L41,22 C39.3333333,20.75 37.25,20 35,20 C32.75,20 30.6666667,20.75 29,22 L35,30 M35,0 C28.25,0 22.0166667,2.23333333 17,6 L20,10 C24.1666667,6.86666667 29.3666667,5 35,5 C40.6333333,5 45.8333333,6.86666667 50,10 L53,6 C47.9833333,2.23333333 41.75,0 35,0 M35,10 C30.5,10 26.35,11.4833333 23,14 L26,18 C28.5,16.1166667 31.6166667,15 35,15 C38.3833333,15 41.5,16.1166667 44,18 L47,14 C43.65,11.4833333 39.5,10 35,10 Z" fill-rule="nonzero"/>
                    <g transform="translate(72.000000, 34.000000)" font-family="sans-serif" font-size="18" font-weight="bold">
                      <text>
                        <tspan x="6.0078125" y="17">kitchen counter</tspan>
                      </text>
                    </g>
                  </g>
                  <g transform="translate(15.000000, 394.000000)" fill="#000000">
                    <path d="M212,36.7272727 C210.181818,34.9090909 207.909091,34 205.636364,34 L151.090909,34 C148.818182,34 146.545455,34.9090909 144.727273,36.7272727 C142.909091,38.5454545 142,40.8181818 142,43.0909091 L142,124.909091 C142,127.181818 142.909091,129.454545 144.727273,131.272727 C146.545455,133.090909 148.818182,134 151.090909,134 L205.636364,134 C207.909091,134 210.181818,133.090909 212,131.272727 C213.818182,129.454545 214.727273,127.181818 214.727273,124.909091 L214.727273,43.0909091 C214.727273,40.8181818 213.818182,38.5454545 212,36.7272727 M205.636364,124.909091 L151.090909,124.909091 L151.090909,43.0909091 L205.636364,43.0909091 L205.636364,124.909091 M160.181818,56.7272727 L160.181818,111.272727 L196.545455,111.272727 L196.545455,56.7272727 L160.181818,56.7272727 M192,106.727273 L164.727273,106.727273 L164.727273,61.2727273 L192,61.2727273 L192,106.727273 M169.272727,93.0909091 L187.454545,93.0909091 L187.454545,102.181818 L169.272727,102.181818 L169.272727,93.0909091 Z" fill-rule="nonzero"/>
                    <path d="M178,30 L184,22 C182.333333,20.75 180.25,20 178,20 C175.75,20 173.666667,20.75 172,22 L178,30 M178,0 C171.25,0 165.016667,2.23333333 160,6 L163,10 C167.166667,6.86666667 172.366667,5 178,5 C183.633333,5 188.833333,6.86666667 193,10 L196,6 C190.983333,2.23333333 184.75,0 178,0 M178,10 C173.5,10 169.35,11.4833333 166,14 L169,18 C171.5,16.1166667 174.616667,15 178,15 C181.383333,15 184.5,16.1166667 187,18 L190,14 C186.65,11.4833333 182.5,10 178,10 Z" fill-rule="nonzero"/>
                    <g transform="translate(0.000000, 36.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="10.7573242" y="17">den switch</tspan>
                      </text>
                      <g transform="translate(6.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="43" y="33">den ceiling</tspan>
                          <tspan x="43" y="50">den</tspan>
                          <tspan x="43" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="14" y="33">1:</tspan>
                          <tspan x="14" y="50">2:</tspan>
                          <tspan x="14" y="67">3:</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="0" y="12">clicks</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="53" y="12">pub topic</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(0.000000, 157.000000)" fill="#000000">
                    <path d="M227,36.7272727 C225.181818,34.9090909 222.909091,34 220.636364,34 L166.090909,34 C163.818182,34 161.545455,34.9090909 159.727273,36.7272727 C157.909091,38.5454545 157,40.8181818 157,43.0909091 L157,124.909091 C157,127.181818 157.909091,129.454545 159.727273,131.272727 C161.545455,133.090909 163.818182,134 166.090909,134 L220.636364,134 C222.909091,134 225.181818,133.090909 227,131.272727 C228.818182,129.454545 229.727273,127.181818 229.727273,124.909091 L229.727273,43.0909091 C229.727273,40.8181818 228.818182,38.5454545 227,36.7272727 M220.636364,124.909091 L166.090909,124.909091 L166.090909,43.0909091 L220.636364,43.0909091 L220.636364,124.909091 M175.181818,56.7272727 L175.181818,111.272727 L211.545455,111.272727 L211.545455,56.7272727 L175.181818,56.7272727 M207,106.727273 L179.727273,106.727273 L179.727273,61.2727273 L207,61.2727273 L207,106.727273 M184.272727,93.0909091 L202.454545,93.0909091 L202.454545,102.181818 L184.272727,102.181818 L184.272727,93.0909091 Z" fill-rule="nonzero"/>
                    <path d="M193,30 L199,22 C197.333333,20.75 195.25,20 193,20 C190.75,20 188.666667,20.75 187,22 L193,30 M193,0 C186.25,0 180.016667,2.23333333 175,6 L178,10 C182.166667,6.86666667 187.366667,5 193,5 C198.633333,5 203.833333,6.86666667 208,10 L211,6 C205.983333,2.23333333 199.75,0 193,0 M193,10 C188.5,10 184.35,11.4833333 181,14 L184,18 C186.5,16.1166667 189.616667,15 193,15 C196.383333,15 199.5,16.1166667 202,18 L205,14 C201.65,11.4833333 197.5,10 193,10 Z" fill-rule="nonzero"/>
                    <g transform="translate(0.000000, 39.000000)">
                      <text font-family="sans-serif" font-size="18" font-weight="bold">
                        <tspan x="5.75048828" y="17">kitchen switch</tspan>
                      </text>
                      <g transform="translate(0.000000, 28.000000)">
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="43" y="33">kitchen counter</tspan>
                          <tspan x="43" y="50">kitchen</tspan>
                          <tspan x="43" y="67">all</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="14" font-weight="normal">
                          <tspan x="14" y="33">1:</tspan>
                          <tspan x="14" y="50">2:</tspan>
                          <tspan x="14" y="67">3:</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="0" y="12">clicks</tspan>
                        </text>
                        <text font-family="sans-serif" font-size="12" font-weight="bold">
                          <tspan x="53" y="12">pub topic</tspan>
                        </text>
                      </g>
                    </g>
                  </g>
                </g>
                <text transform="translate(495.493721, 522.401608) rotate(90.000000) translate(-495.493721, -522.401608) " font-family="sans-serif" font-size="14" font-weight="bold" fill="#000000">
                  <tspan x="409.645088" y="527.901608">←sub</tspan>
                  <tspan x="450.031807" y="527.901608" font-family="sans-serif" font-weight="normal">: den ceiling, den, all       </tspan>
                </text>
                <text transform="translate(494.493721, 151.401608) rotate(-90.000000) translate(-494.493721, -151.401608) " font-family="sans-serif" font-size="14" font-weight="bold" fill="#000000">
                  <tspan x="384.617744" y="156.901608">←sub</tspan>
                  <tspan x="425.004463" y="156.901608" font-family="sans-serif" font-weight="normal">: kitchen ceiling, kitchen, all       </tspan>
                </text>
                <text transform="translate(639.777761, 324.322469) rotate(-18.000000) translate(-639.777761, -324.322469) " font-family="sans-serif" font-size="14" font-weight="bold" fill="#000000">
                  <tspan x="553.277761" y="321.322469">←sub</tspan>
                  <tspan x="593.664479" y="321.322469" font-family="sans-serif" font-weight="normal">: kitchen counter,</tspan>
                  <tspan x="553.277761" y="338.322469" font-family="sans-serif" font-weight="normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kitchen, all       </tspan>
                </text>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>Clearly, a transport protocol able to exploit a physical network's broadcast capabilities would better suit this problem.
(Since unicast is just multicast restricted to peer sets of size 2, a multicast transport handles all unicast
use cases but the converse is not true.)</t>
        <t>More general solutions for this communications paradigm are possible by moving the view of the problem from
message exchange to the concept of coordinating shared objectives.
In the distributed systems literature, communication associated with coordinating shared objectives has
long been modeled as <em>distributed set reconciliation</em> <xref target="WegmanC81"/><xref target="Demers87"/>.
In this approach, each domain of discourse is a named set, e.g., <em>myhouse.iot</em>.
Each event or action, e.g., a switch button press, is added as a new element
to the instance of <em>myhouse.iot</em> at its point of origin then
the reconciliation process ensures that every instance of <em>myhouse.iot</em> has this element.
In 2000, <xref target="MINSKY03"/> developed a broadcast-capable set reconciliation algorithm whose
communication cost equaled the set instance <em>differences</em> (which is optimal)
but its polynomial computational cost impeded adoption.
In 2011, <xref target="DIFF"/> used Invertible Bloom Lookup Tables (IBLTs) <xref target="IBLT"/><xref target="MPSR"/>
to create a simple distributed set reconciliation algorithm
providing optimal in both communication and computational cost.
DeftT uses this algorithm
(see <xref target="syncps-a-set-reconciliation-protocol"/>) and takes advantage of IPv6's
self-configuring link local multicast to avoid all manual configuration and external dependencies.
This restores the system design to <xref target="fig1"/> where each device has a single, auto-configured transport that makes use
of the broadcast radio medium without need for a broker or multiple transport associations.
Each button push is broadcast exactly once to be added to the distributed set.
(See <xref target="synchronizing-a-collection"/> to see how members fill in missing elements.)</t>
      </section>
      <section anchor="securing-information">
        <name>Securing information</name>
        <t>When pub/sub is implemented using conventional session-based transports multiple publications with independent topics and
purposes are combined under a single session key, providing privacy by encrypting the sessions between endpoints.
Credentials of Internet endpoints (e.g., a website) are usually attested by a third party certificate authority (CA)
and bound to a DNS name.
Endpoint credentials may also be bound to a device by using BRSKI <xref target="RFC8995"/> to obtain the (local) domain's root certificate
then using a TLS connection to obtain the end-entity (EE) certificate.
Each secure transport association requires the exchange of these credentials which allows for secure exchange of a nonce symmetric key.
For example, in <xref target="fig2"/> each transport session is a separate security association where each device validates the broker's credential and the broker has to validate each device's.
Secured transport associations are between two enrolled devices (protecting against outsider and some MITM attacks) but, once the transport session has been established there are no constraints whatsoever on what devices can say.
Clearly, this does not protect against the insider attacks that currently plague OT, e.g., <xref target="CHPT"/> description of a lightbulb taking over a network.
For example, the basic function of a light switch requires that it be allowed to tell a light to turn on or off but it almost certainly shouldn't be allowed to tell the light to overwrite its firmware (fwupd), even though "on/off" and "fwupd" are both standard capabilities of most smart light APIs. Once a TLS session is established, the transport handles "fwupd" publications <em>the same way</em> as "on/off" publications. Such attacks can be prevented using trust management that operates per-publication, using rules that enable the "fwupd" from the light switch to be rejected. Combining per-publication trust decisions with many-to-many communications over broadcast infrastructure requires per-publication signing rather than session-based signing.
More on how DeftT addresses past and current threats is in <xref target="design-rationale"/> and <xref target="security-considerations"/>.</t>
        <t>Securing each publication rather than the session it arrives on deals with a wider spectrum of threats while avoiding the quadratic session state and traffic burden.
In OT, valid messages conform to rigid standards on syntax and semantics <xref target="IEC61850"/><xref target="ISO9506MMS"/><xref target="ONE"/><xref target="MATR"/><xref target="OSCAL"/><xref target="NMUD"/><xref target="ST"/><xref target="ZCL"/> that can be combined with site-specific requirements on identities and capabilities to create a system's communication rules.
These rules can be employed to secure publications in a trust management system such as <xref target="DLOG"/> where each publisher is responsible for supplying all of the "who/what/where/when" information needed for each subscriber to <em>prove</em> the publication complies with system policies.</t>
        <t>Instead of vulnerable third-party CAs <xref target="W509"/>, domains employ a <strong>local</strong> root of trust
and <em>locally</em> created certificates.
Communication rules are expressed in a <em>declarative</em> language that can be validated
for consistency and completeness then converted to a compact runtime form which is authorized and secured via signing with the system trust anchor.
This <em>communication schema</em> is distributed as a certificate that can be validated using
on-device trusted enclaves <xref target="TPM"/><xref target="HSE"/><xref target="ATZ"/> as part of the device enrollment process.
See <xref target="certificates-and-identity-bundles"/> and <xref target="security-considerations"/>.</t>
        <t><xref target="stubschema"/> shows a simplified version of a communication schema for <xref target="fig1"/>.
These member identities are simple two-level signing chains, the domain trust anchor signs the identities (device certs).
The notation "&lt;=" should be read as "is signed by" and the "&amp; {}" notation indicates particular constraints.
We give switches and lights different attributes in their identities ("switch" or "light") and then require
that publications that send commands to turn on or off must be signed by switch identities.
We limit light identities to signing publications that indicate their on or off status.
When a light constructs a publication, the "room" and "loc" fields will be set to its
identity's "_myroom" and "_myloc" attributes.
When validating a light publication, "room" and "loc" must equal the pub signer's "_myroom" and "_myloc" and
the "arg" must equal either "on" or "off".
These rules specify that all certificates have three final components, the first of which is always "KEY";
the other two follow requirements within the trust engine (DeftT's approach is detailed in <xref target="deftt-formats"/>).</t>
        <figure anchor="stubschema">
          <name>Example communication schema for <xref target="fig1"/>'s lighting system
</name>
          <artwork><![CDATA[_domain: "myLights"              // trust domain name
domainCert: _domain/_certSuffix  // domain trust anchor

// publication format
#lsPub: _domain/room/loc/arg/_ts & {_ts: timestamp()}
   
// what switches and lights can say
rooms:  "kitchen"|"den"
switch: #lsPub & {room: rooms|"all", arg: "turnOn"|"turnOff"} <= switchCert
light:  #lsPub & {room: _myroom, loc: _myloc, arg: "on"|"off"} <= lightCert

// device certificate formats
deviceCert: _domain/_type/_myroom/_myloc/_certSuffix <= domainCert
switchCert: deviceCert & {_type: "switch"}
lightCert:  deviceCert & {_type: "light"}

// fields added to all cert names by cert builder
_certSuffix: "KEY"/_/_
]]>
</artwork>
        </figure>
        <t>The administrator of the "myLights" domain compiles the text version of the schema into binary and makes a schema cert,
then makes a trust anchor, kitchen and den switch identities, four kitchen ceiling light
identities, one kitchen counter light identity, and four den ceiling light identities.
(Utilities for this are provided at <xref target="DCT"/>.)
The trust anchor private key is used to sign all of these and each device is preconfigured with the trust anchor cert,
the schema cert, and its device cert (along with the device cert private key).</t>
        <t>In DeftT's publication-based transport, the schema is used to both construct and validate publications, guaranteeing that <em>all</em> parts of the system <em>always</em> conform to and enforce the same rules, even as those rules evolve to meet new threats (more in <xref target="communication-schemas"/>). DeftT embeds the trust management mechanism described above directly in the publish and subscribe data paths as shown below:</t>
        <figure anchor="figte">
          <name>Trust management elements of DeftT
</name>
          <artwork type="svg" originalSrc="./figs/trustElements-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 386 278" version="1.1">
              <desc>trustElements-rfc</desc>
              <title>trustElements-rfc</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <g>
                  <g transform="translate(17, 144)">
                    <rect stroke="black" stroke-width="2" fill="white" x="0" y="0" width="92" height="111" rx="8"/>
                    <text font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                      <tspan x="15.73" y="44">Device- and </tspan>
                      <tspan x="15.075" y="56">app-specific </tspan>
                      <tspan x="16.89" y="68">commands </tspan>
                      <tspan x="34.06" y="80">and </tspan>
                      <tspan x="14" y="92">notifications</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="4" y="13">Application</tspan>
                    </text>
                  </g>
                  <g transform="translate(89.9969, 119)">
                    <path d="M35.0030914,0 L221.003091,0 C225.421369,-8.11624501e-16 229.003091,3.581722 229.003091,8 L229.003091,134 C229.003091,138.418278 225.421369,142 221.003091,142 L35.0030914,142 C30.5848134,142 27.0030914,138.418278 27.0030914,134 L27.0030914,8 C27.0030914,3.581722 30.5848134,5.41083001e-16 35.0030914,0 Z" stroke="black" stroke-dasharray="1"/>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="32.1730914" y="13">DeftT</tspan>
                    </text>
                    <g transform="translate(93.0031, 6)">
                      <g transform="translate(24.5, 27)" fill="black" fill-rule="nonzero">
                        <path d="M82,0 L82,25.591 L85.5642122,19.2548694 L86.4357878,19.7451306 L81.9357878,27.7451306 L81.5,28.5198644 L81.0642122,27.7451306 L76.5642122,19.7451306 L77.4357878,19.2548694 L81,25.591 L81,0 L82,0 Z"/>
                        <path d="M1,0 L1,64.591 L4.56421223,58.2548694 L5.43578777,58.7451306 L0.935787769,66.7451306 L0.5,67.5198644 L0.0642122314,66.7451306 L-4.43578777,58.7451306 L-3.56421223,58.2548694 L0,64.591 L0,0 L1,0 Z"/>
                      </g>
                      <rect stroke="black" fill="white" x="0" y="0" width="129" height="33"/>
                      <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                        <tspan x="13" y="15">Communication </tspan>
                        <tspan x="39.439" y="30">Schema</tspan>
                      </text>
                    </g>
                    <g transform="translate(0, 75)">
                      <path d="M8.25796073,9.06421223 L8.74822197,9.93578777 L2.411,13.5 L46.0030914,13.5 L46.0030914,14.5 L2.411,14.5 L8.74822197,18.0642122 L8.25796073,18.9357878 L0.257960734,14.4357878 L-0.516773076,14 L0.257960734,13.5642122 L8.25796073,9.06421223 Z" fill="black" fill-rule="nonzero"/>
                      <path d="M7.17353208,33.2612185 L7.67892974,34.124105 L1.406,37.798 L7.47998729,37.6923328 L36.9915475,37.1772068 L37.0089999,38.1770545 L7.49743969,38.6921805 L1.423,38.798 L7.82079025,42.2512915 L7.34581476,43.1312905 L-0.731502599,38.7715951 L-1.51372396,38.3493947 L-0.746713684,37.9001523 L7.17353208,33.2612185 Z" transform="translate(18.5031, 38) scale(-1, 1) rotate(1) translate(-18.5031, -38)" fill="black" fill-rule="nonzero"/>
                      <path d="M87.2433526,38.3784245 L99.2433526,45.1284245 L100.79282,46 L99.2433526,46.8715755 L87.2433526,53.6215755 L86.2628301,51.8784245 L94.935,47 L46.0030914,47 L46.0030914,45 L94.935,45 L86.2628301,40.1215755 L87.2433526,38.3784245 Z" fill="black" fill-rule="nonzero"/>
                      <rect stroke="black" fill="white" x="39.0030914" y="0" width="11" height="52" rx="5.5"/>
                      <text transform="translate(45.0031, 26) rotate(90) translate(-45.0031, -26)" font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                        <tspan x="33.2030914" y="30">Shim</tspan>
                      </text>
                    </g>
                    <g transform="translate(51.0031, 69)">
                      <path d="M196.688664,43.9517946 L208.734304,50.6200077 L210.289664,51.4810227 L208.746161,52.3631184 L196.792356,59.194593 L195.799999,57.4581523 L204.439,52.52 L196.266869,52.576439 L134.006803,52.9999769 L133.993197,51.0000231 L196.253264,50.5764853 L204.427,50.521 L195.720022,45.7015754 L196.688664,43.9517946 Z" fill="black" fill-rule="nonzero"/>
                      <path d="M12.7597388,5.37842446 L13.7402612,7.12157554 L5.065,12 L152,12 L152,14 L5.068,14 L13.7402612,18.8784245 L12.7597388,20.6215755 L0.75973876,13.8715755 L-0.789728861,13 L0.75973876,12.1284245 L12.7597388,5.37842446 Z" fill="black" fill-rule="nonzero"/>
                      <path d="M184.759739,5.37842446 L185.740261,7.12157554 L177.065,12 L208,12 L208,14 L177.068,14 L185.740261,18.8784245 L184.759739,20.6215755 L172.759739,13.8715755 L171.210271,13 L172.759739,12.1284245 L184.759739,5.37842446 Z" fill="black" fill-rule="nonzero"/>
                      <text font-family="sans-serif" font-size="9" font-weight="bold" fill="black">
                        <tspan x="19.2425" y="10">Subscribe</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="9" font-weight="bold" fill="black">
                        <tspan x="0.431" y="61">Publish</tspan>
                      </text>
                    </g>
                    <g transform="translate(126.0031, 64)">
                      <rect stroke="black" fill="white" x="0" y="0" width="96" height="33" rx="8"/>
                      <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                        <tspan x="16" y="14">Publication </tspan>
                        <tspan x="22.15" y="28">Validator</tspan>
                      </text>
                    </g>
                    <g transform="translate(101.0031, 103)">
                      <rect stroke="black" fill="white" x="0" y="0" width="96" height="33" rx="8"/>
                      <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                        <tspan x="16" y="14">Publication </tspan>
                        <tspan x="27.166" y="28">Builder</tspan>
                      </text>
                    </g>
                  </g>
                  <g transform="translate(348, 164)">
                    <g stroke="black">
                      <path d="M3,0 C6.42663109,6.75 6.42663109,8.25 3,15 C-0.426631091,21.75 -0.807367879,23.25 3,30 C6.80736788,36.75 6.80736788,37.5 3,45 C-0.807367879,52.5 -1.18810467,52.5 3,60 C7.18810467,67.5 6.80736788,68.25 3,75 C-0.807367879,81.75 -0.807367879,82.5 3,90 C6.80736788,97.5 7.18810467,97.5 3,105"/>
                      <path d="M6,0 C9.42663109,6.75 9.42663109,8.25 6,15 C2.57336891,21.75 2.19263212,23.25 6,30 C9.80736788,36.75 9.80736788,37.5 6,45 C2.19263212,52.5 1.81189533,52.5 6,60 C10.1881047,67.5 9.80736788,68.25 6,75 C2.19263212,81.75 2.19263212,82.5 6,90 C9.80736788,97.5 10.1881047,97.5 6,105"/>
                      <path d="M9,0 C12.4266311,6.75 12.4266311,8.25 9,15 C5.57336891,21.75 5.19263212,23.25 9,30 C12.8073679,36.75 12.8073679,37.5 9,45 C5.19263212,52.5 4.81189533,52.5 9,60 C13.1881047,67.5 12.8073679,68.25 9,75 C5.19263212,81.75 5.19263212,82.5 9,90 C12.8073679,97.5 13.1881047,97.5 9,105"/>
                      <path d="M12,0 C15.4266311,6.75 15.4266311,8.25 12,15 C8.57336891,21.75 8.19263212,23.25 12,30 C15.8073679,36.75 15.8073679,37.5 12,45 C8.19263212,52.5 7.81189533,52.5 12,60 C16.1881047,67.5 15.8073679,68.25 12,75 C8.19263212,81.75 8.19263212,82.5 12,90 C15.8073679,97.5 16.1881047,97.5 12,105"/>
                    </g>
                    <text transform="translate(28, 54.5) rotate(90) translate(-28, -54.5)" font-family="sans-serif" font-size="14" font-weight="bold" fill="black">
                      <tspan x="-2.709" y="60">Network</tspan>
                    </text>
                  </g>
                  <path d="M206.431594,27.7475583 L218.147722,47.7783584 L221.22,53.031 L221.09779,45.7625463 L222.097648,45.7456898 L222.252371,54.9231655 L222.267354,55.8119281 L221.500037,55.3632095 L213.576627,50.7296836 L214.081435,49.8664522 L220.356,53.535 L217.284535,48.2832418 L205.568406,28.2524417 L206.431594,27.7475583 Z" fill="black" fill-rule="nonzero"/>
                  <path d="M270.431594,27.7475583 L282.147722,47.7783584 L285.22,53.031 L285.09779,45.7625463 L286.097648,45.7456898 L286.252371,54.9231655 L286.267354,55.8119281 L285.500037,55.3632095 L277.576627,50.7296836 L278.081435,49.8664522 L284.356,53.535 L281.284535,48.2832418 L269.568406,28.2524417 L270.431594,27.7475583 Z" transform="translate(277.5, 41.5) scale(-1, 1) translate(-277.5, -41.5)" fill="black" fill-rule="nonzero"/>
                  <path d="M243.05541,114.193267 L247.008,121.48 L251.182873,114.318305 L252.046804,114.821915 L247.424274,122.751746 L246.97662,123.519685 L246.552802,122.738339 L242.176396,114.670063 L243.05541,114.193267 Z M246.569341,117.488996 L247.569223,117.504378 L247.538457,119.504142 L246.538575,119.488759 L246.569341,117.488996 Z M246.630872,113.489469 L247.630754,113.504852 L247.615092,114.522851 L247.599988,115.504615 L246.600106,115.489232 L246.615211,114.507469 L246.630872,113.489469 Z M246.692403,109.489942 L247.692285,109.505325 L247.661519,111.505088 L246.661638,111.489706 L246.692403,109.489942 Z M246.753934,105.490415 L247.753816,105.505798 L247.723051,107.505562 L246.723169,107.490179 L246.753934,105.490415 Z M246.815466,101.490889 L247.815347,101.506272 L247.784582,103.506035 L246.7847,103.490652 L246.815466,101.490889 Z M246.876997,97.491362 L247.876878,97.5067448 L247.846113,99.5065082 L246.846231,99.4911254 L246.876997,97.491362 Z M246.938528,93.4918353 L247.93841,93.5072181 L247.907644,95.5069815 L246.907762,95.4915987 L246.938528,93.4918353 Z M247.000059,89.4923086 L247.999941,89.5076914 L247.969175,91.5074548 L246.969294,91.492072 L247.000059,89.4923086 Z" fill="black" fill-rule="nonzero"/>
                  <g transform="translate(198, 57)">
                    <rect stroke="black" fill="white" x="0" y="0" width="99" height="35" rx="8"/>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="26.438" y="15">Schema </tspan>
                      <tspan x="23" y="29">Compiler</tspan>
                    </text>
                  </g>
                  <g transform="translate(169, 5)">
                    <ellipse stroke="black" fill="white" cx="37.5" cy="18" rx="37.5" ry="18"/>
                    <text font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                      <tspan x="14.36" y="23.2173913">Site Policy</tspan>
                    </text>
                  </g>
                  <g transform="translate(250, 5)">
                    <ellipse stroke="black" fill="white" cx="37.5" cy="18" rx="37.5" ry="18"/>
                    <text font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                      <tspan x="14.115" y="17">Standards </tspan>
                      <tspan x="6" y="28">Conformance </tspan>
                    </text>
                  </g>
                  <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                    <tspan x="65.974" y="27">Requirements:</tspan>
                  </text>
                  <path d="M13,110 L322,110 C326.418278,110 330,113.581722 330,118 L330,261 C330,265.418278 326.418278,269 322,269 L13,269 C8.581722,269 5,265.418278 5,261 L5,118 C5,113.581722 8.581722,110 13,110 Z" stroke="black" stroke-dasharray="3"/>
                  <text font-family="sans-serif" font-size="14" font-weight="bold" fill="black">
                    <tspan x="10.045" y="125">On-Device</tspan>
                  </text>
                  <g transform="translate(302, 146)" fill="black" fill-rule="nonzero">
                    <path d="M4,8 C3.445,8 3,7.55 3,7 C3,6.445 3.445,6 4,6 C4.55228475,6 5,6.44771525 5,7 C5,7.55228475 4.55228475,8 4,8 M7,9.5 L7,4.5 L1,4.5 L1,9.5 L7,9.5 M7,3.5 C7.55228475,3.5 8,3.94771525 8,4.5 L8,9.5 C8,10.0522847 7.55228475,10.5 7,10.5 L1,10.5 C0.445,10.5 0,10.05 0,9.5 L0,4.5 C0,3.945 0.445,3.5 1,3.5 L1.5,3.5 L1.5,2.5 C1.5,1.11928813 2.61928813,0 4,0 C4.66304122,0 5.29892601,0.263392101 5.76776695,0.732233047 C6.2366079,1.20107399 6.5,1.83695878 6.5,2.5 L6.5,3.5 L7,3.5 M4,1 C3.17157288,1 2.5,1.67157288 2.5,2.5 L2.5,3.5 L5.5,3.5 L5.5,2.5 C5.5,1.67157288 4.82842712,1 4,1 Z"/>
                  </g>
                </g>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>This approach extends LangSec's <xref target="LANGSEC"/> "be definite in what you accept" principle by using the authenticated common rules of the schema for belt-and-suspenders enforcement at both publication and subscription functions of the transport.
If an application asks the Publication Builder to publish something and the schema shows it lacks credentials, an error is thrown and nothing is published.
Independently, the Publication Validator ignores publications that:</t>
        <ul spacing="compact">
          <li>don't have a locally validated,
complete signing chain for the credential that signed it</li>
          <li>the schema shows its signing chain isn't appropriate for this publication</li>
          <li>have a publication signature that doesn't validate</li>
        </ul>
        <t>Since an application's subscriptions determine which publications it wants, only
certificates from chains that can sign publications matching the subscriptions need to be validated or retained.
Thus a device's communication state burden and computation costs are a function of how many different things
are allowed to talk to it but <em>not</em> how many things it talks to or the total number of devices in the system.
In particular, event driven, publish-only devices like sensors will spend no time or space on validation.
Unlike most 'secure' systems, adding additional constraints to schemas to reduce attack surface results in devices doing <em>less</em> work.</t>
      </section>
      <section anchor="defined-trust-communications-domains">
        <name>Defined-trust Communications Domains</name>
        <t>A Defined-trust Communications Limited Domain (or simply, <em>trust domain</em>) is a Limited Domain where communications are
via DeftT (<xref target="figtd"/>) and all members are configured with the same trust anchor and schema
(or some subset of the domain schema)
as well as an individual schema-conformant DeftT identity cert chain that terminates at the trust anchor
and the private key corresponding to the identity chain's leaf cert.
The particular rules for any deployment are application-specific (e.g., Is it home IoT or a nuclear power plant?) and site-specific (specific form of credential and idiosyncrasies in rules) which DeftT accommodates by being invoked with a ruleset (schema) particular to a deployment.
We anticipate that efforts to create common data models (e.g., <xref target="ONE"/>) for specific sectors will lead to easier and more
forms-based configuration of DeftT deployments.</t>
        <t>A trust domain is perimeterless and may operate over one or more subnets, sharing physical media with non-members.
Domain members use DeftT to publish and subscribe using Publication Builders and Validators as shown in <xref target="figte"/>.
Publications become the elements of a set, or named collection, that is synchronized across
each subnet of a trust domain that is using the same schema or schema subset.
DeftT uses a distributed set reconciliation protocol on <em>each</em> collection and <em>each</em> subnet independently.
A DeftT's set reconciliation protocol operates in a <em>sync zone</em> which is defined on a
single subnet where members use the same communication schema or communication schema subset.
Every DeftT maintains at least two collections: <strong>msgs</strong> for Publications constructed from
application messages and <strong>cert</strong> where member signing chains are published.</t>
        <figure anchor="figtd">
          <name>Trust domain
</name>
          <artwork type="svg" originalSrc="./figs/trustdomain-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 979 468" version="1.1">
              <desc>trustdomain-rfc</desc>
              <title>trustdomain</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <path d="M267,55 C290,-1 559,-28 611,55 C720,-21 1094,98 890,209 C1061,228 963,426 720,414 C670,474 441,490 378,414 C164,486 -125,372 95,260 C-97,208 31,21 267,55 Z" stroke="black" stroke-width="3"/>
                <g transform="translate(212.000000, 78.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(107.000000, 102.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(58.000000, 176.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(93.000000, 305.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(672.000000, 78.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(824.000000, 127.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(869.000000, 272.000000)">
                  <rect stroke="black" fill="white" x="0" y="3" width="43" height="43" rx="5"/>
                  <text font-family="sans-serif" font-size="36" font-weight="normal" fill="black">
                    <tspan x="6.124" y="38">M</tspan>
                  </text>
                </g>
                <g transform="translate(350.000000, 200.000000)">
                  <path d="M22,0 L413,0 C425.150264,-2.23196738e-15 435,9.8497355 435,22 L435,171 C435,183.150264 425.150264,193 413,193 L22,193 C9.8497355,193 1.5698833e-14,183.150264 0,171 L0,22 C-1.48797825e-15,9.8497355 9.8497355,9.33739474e-15 22,0 Z" stroke="black" stroke-width="3" fill="white" stroke-dasharray="11"/>
                  <text font-family="sans-serif" font-size="30" font-weight="bold" fill="black">
                    <tspan x="16" y="37">subnet set reconciliation</tspan>
                  </text>
                  <g transform="translate(58.000000, 58.000000)">
                    <rect stroke="black" fill="white" x="0" y="0" width="299" height="62" rx="31"/>
                    <text font-family="sans-serif" font-size="30" font-weight="normal" fill="black">
                      <tspan x="27.2862109" y="40"> </tspan>
                      <tspan x="35.0862109" y="40" font-family="monospace">/msgs </tspan>
                      <tspan x="143.103789" y="40">collection</tspan>
                    </text>
                  </g>
                  <g transform="translate(113.000000, 111.000000)">
                    <rect stroke="black" fill="white" x="0" y="0" width="299" height="62" rx="31"/>
                    <text font-family="monospace" font-size="30" font-weight="normal" fill="black">
                      <tspan x="28.6862109" y="43">/cert </tspan>
                      <tspan x="136.703789" y="43" font-family="sans-serif">collection</tspan>
                    </text>
                  </g>
                </g>
                <g transform="translate(147.000000, 275.108005)" fill="black">
                  <g transform="translate(0.000000, 0.000000)">
                    <text transform="translate(92.000000, 20.891995) rotate(-8.000000) translate(-92.000000, -20.891995) " font-family="sans-serif" font-size="21" font-weight="bold">
                      <tspan x="41.7995" y="28.8919946">subscribe</tspan>
                    </text>
                    <path d="M193.857539,18.767438 L194.124557,20.7495332 L193.133509,20.8830422 L14.008,45.014 L14.8092294,50.9602017 L0,45.8919946 L12.9401034,37.0855353 L13.741,43.032 L192.866491,18.900947 L193.857539,18.767438 Z" fill-rule="nonzero"/>
                  </g>
                  <g transform="translate(0.000000, 37.891995)">
                    <text transform="translate(98.000000, 23.000000) rotate(-8.000000) translate(-98.000000, -23.000000) " font-family="sans-serif" font-size="21" font-weight="bold">
                      <tspan x="59.2865" y="31">publish</tspan>
                    </text>
                    <path d="M178.190771,-5.06820716 L193,0 L180.059897,8.80645925 L179.258,2.859 L0.133509003,26.9910476 L-0.857538597,27.1245566 L-1.1245566,25.1424614 L-0.133509003,25.0089524 L178.991,0.877 L178.190771,-5.06820716 Z" fill-rule="nonzero"/>
                  </g>
                </g>
                <text font-family="sans-serif" font-size="36" font-weight="bold" fill="black">
                  <tspan x="324.816" y="78">Trust Domain</tspan>
                </text>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>Trust domains are extended across physically separated subnets, subnets using different media
and/or groups of members using distinct subsets of the domain schema by <strong>relays</strong>.
(see <xref target="schema-based-information-movement"/>)
Relays have a DeftT in each sync zone and pass Publications between them as long as the
Publications are valid at both the receiving and sending DeftTs.
Since set reconciliation does not accept duplicates, relays are powerful elements in
creating efficient configuration-free meshes.
In <xref target="figrtd"/>, different sync zones are denoted by shape and could represent different
colocated media (e.g. bluetooth, wifi, ethernet) or physically distant sync zones.
The shaded triangles represent DeftTs in a sync zone with only relay members,
as for a unicast link between two relays.
The set reconciliation protocol ensures that items only transit a sync zone once;
an item must be specifically requested in order to be transmitted.</t>
        <t>Any part of a verifiable defined-trust identity can be used in the delineation of sync zones,
e.g. specific component(s) of identity names allowed to sign Publications can be constrained
to be identical so that Publications are effectively only relayed to a particular "group"
as identified by those components.
This is enforced via the secured schema, i.e., non-"group" Publications will not validate.
Relay identities have a relay <em>capability</em> (an attribute with a special meaning within DeftT)
in their signing chain so that they can use specialized certificate and Publication movement
while being prohibted from obtaining Publication encryption/decryption keys.
There are four subnets in <xref target="figrtd"/>, represented as different shapes.
The subnets could be using different media, different group addresses, or be physically remote.
A relay has a DeftT in two or more subnets of the Domain, e.g. one of these covers subnets 1, 3, and 4.
Conceptually, relay DeftTs maintain a collection in their subnet, e.g. subnet1,
on behalf of the members in its other subnets, e.g., subnets 3 and 4.
Relay internals copy Publications to the other DeftTs but only after validating them
using the (sub)schema in use on the destination DeftT.
Relay discussion is in <xref target="schema-based-information-movement"/> and <xref target="use-cases"/>.</t>
        <figure anchor="figrtd">
          <name>Relayed trust domain
</name>
          <artwork type="svg" originalSrc="./figs/relayedtrustdomain-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 999 449" version="1.1">
              <desc>relayedtrustdomain-rfc</desc>
              <title>relayedtrustdomain</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <path d="M86.0248,249.0289 C-68.9688,224 -7.1612,13.2981 240.0882,49.25 C263.0275,-20.83174 550.5453,-9.45668 548.6656,49.25 C728.948,-25.83658 959.338,123.8846 804.805,198.9711 C990.237,235.3751 802.465,431.5145 650.2812,398.75 C638.1019,453.3605 366.0432,472.4712 342.1641,398.75 C188.1104,477.4807 -133.1163,356.4279 86.0248,249.0289 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <path d="M188,293 L280,293 C284.9706,293 289,296.365857 289,300.517922 L289,352.482078 C289,356.634118 284.9706,360 280,360 L188,360 C183.0294,360 179,356.634118 179,352.482078 L179,300.517922 C179,296.365857 183.0294,293 188,293 Z" stroke="black" fill="none"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="214.152" y="347.240307">Relay</tspan>
                </text>
                <polygon stroke="black" fill="#FFFFFF" points="574 102 589 117 574 132 559 117"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="567.05" y="122.836107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="259 155 279 155 279 135 259 135"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="262.032" y="150.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="203 177 223 177 223 157 203 157"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="206.032" y="172.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="179 117 199 117 199 97 179 97"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="182.032" y="112.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="234 242 254 242 254 222 234 222"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="237.032" y="237.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="118.5 144 138.5 144 138.5 124 118.5 124"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="121.532" y="139.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="138 231 158 231 158 211 138 211"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="141.032" y="226.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="white" points="54 313 74 313 74 293 54 293"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="57.032" y="308.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="#FFFFFF" points="722 206 737 221 722 236 707 221"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="715.05" y="226.836107">M</tspan>
                </text>
                <polygon stroke="black" fill="#FFFFFF" points="531 275 546 290 531 305 516 290"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="524.05" y="295.836107">M</tspan>
                </text>
                <polygon stroke="black" fill="#FFFFFF" points="615 320 630 335 615 350 600 335"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="608.05" y="340.836107">M</tspan>
                </text>
                <polygon stroke="black" fill="#FFFFFF" points="671 263 686 278 671 293 656 278"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="664.05" y="283.836107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="522 200 530 200 536 206 536 214 530 220 522 220 516 214 516 206"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="519.032" y="215.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="446 264 454 264 460 270 460 278 454 284 446 284 440 278 440 270"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="443.032" y="279.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="417 320 425 320 431 326 431 334 425 340 417 340 411 334 411 326"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="414.032" y="335.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="360 372 368 372 374 378 374 386 368 392 360 392 354 386 354 378"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="357.032" y="387.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="522 372 530 372 536 378 536 386 530 392 522 392 516 386 516 378"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="519.032" y="387.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="477 159 485 159 491 165 491 173 485 179 477 179 471 173 471 165"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="474.032" y="174.136107">M</tspan>
                </text>
                <polygon stroke="black" fill="none" points="193 324 213 324 213 304 193 304"/>
                <polygon stroke="black" fill="none" points="230 304 238 304 244 310 244 318 238 324 230 324 224 318 224 310"/>
                <polygon stroke="black" fill="#000000" points="253 324 265.5 299 278 324"/>
                <polygon stroke="black" fill="none" points="903 195 923 195 923 175 903 175"/>
                <polygon stroke="black" fill="#FFFFFF" points="909 214 917 214 923 220 923 228 917 234 909 234 903 228 903 220"/>
                <polygon stroke="black" fill="#000000" points="900.5 271 913 246 925.5 271"/>
                <path d="M647,86 L739,86 C743.9706,86 748,89.3658586 748,93.5179252 L748,145.482075 C748,149.634141 743.9706,153 739,153 L647,153 C642.0294,153 638,149.634141 638,145.482075 L638,93.5179252 C638,89.3658586 642.0294,86 647,86 Z" stroke="black" fill="none"/>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="673.152" y="141.240307">Relay</tspan>
                </text>
                <polygon stroke="black" fill="none" points="689 100 697 100 703 106 703 114 697 120 689 120 683 114 683 106"/>
                <polygon stroke="black" fill="black" points="712 120 724.5 95 737 120"/>
                <polygon stroke="black" fill="#FFFFFF" points="913 130 928 145 913 160 898 145"/>
                <polygon stroke="black" fill="#FFFFFF" points="660 95 675 110 660 125 645 110"/>
                <text font-family="sans-serif" font-size="18" font-weight="bold" fill="#000000">
                  <tspan x="344" y="40.0301208">Trust Domain</tspan>
                </text>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="936.456" y="147.912107">subnet 1</tspan>
                </text>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="936.456" y="187.636107">subnet 2</tspan>
                </text>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="936.456" y="227.360107">subnet 3</tspan>
                </text>
                <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                  <tspan x="936.456" y="267.084107">subnet 4</tspan>
                </text>
              </g>
            </svg>
          </artwork>
        </figure>
      </section>
      <section anchor="discovery">
        <name>Discovery</name>
        <t>Conventional IP services are discovered via well-known IP ports that are registered with
IANA <xref target="RFC6335"/>.
DeftT is not a service, so it doesn't require a port allocation.
Instead, DeftT does peer discovery using shared security information.
In particular, each DeftT
is a member of a trust domain and communicates within a single sync zone
where all members use the same schema cert, which is signed by the common trust anchor
(see <xref target="defined-trust-communications-domains"/>).
The SHA256 thumbprint <xref target="terms"/> of the schema cert for a sync zone is a compact, unique identifier.</t>
        <section anchor="multicast">
          <name>Multicast</name>
          <t>The first 8 bytes of the schema cert thumbprint are used as the first component in all DeftT PDUs (see <xref target="cstate-pdus"/>)
and the lower 14 bytes are used for DeftT's link-local IPv6 addresses.</t>
          <t>IPv6 mutlicast addresses have format <xref target="RFC4292"/>:</t>
          <artwork><![CDATA[ 8|  4  |  4  |  112   |
--+-----+-----+--------+
FF|flags|scope|group ID|
--+-----+-----+--------+
]]>
</artwork>
          <t>and DeftT sets these as:</t>
          <artwork><![CDATA[FF|01|02|<lower 112 bits of schema cert thumbprint>
]]>
</artwork>
          <t>where flags=01 indicates a dynamically assigned address and scope=02 indicates
link-local scope.
The UDP dest port is set using the upper byte of the id to pick a random value in the
<xref target="RFC6335"/> Dynamic Ports range 49152-65535.
As UDP multicast requires different ports for send and receive,
this use doesn't conflict at all with the normal use of this range for emphemeral client
source ports.</t>
        </section>
        <section anchor="unicast">
          <name>Unicast</name>
          <t>Unicast protocols require more configuration than multicast,
partly because they're inherently asymetric so
each end has to know in advance whether to 'listen' or 'connect',
partly because there are firewall and NAT implications,
and partly due to DeftT wanting good peer authentication and privacy.
Since unicast is between particular DeftT peers, the protocol, role, address and port
information goes into the identity chains (<xref target="identity-bundles"/>) of those peers as an attribute.
This allows them to connect, zero-RTT mutually authenticate,
and establish a TLS-1.3-like EC Diffie-Hellman secure tunnel as needed.</t>
        </section>
      </section>
      <section anchor="design-rationale">
        <name>Design rationale</name>
        <t>DeftT's Publication, PDU and serialization formats were strongly influenced by the LangSec observation that
most security issues are due to improper input handling.
For example, <xref target="LangSecErr"/> (section II) found that this class of errors accounted for
75% of the 47 OpenSSL security vulnerabilities reported in the 18 months following 2015-1-1.
Also, as of 2023-7-5, <em>all</em> 25 of the protobuf CVEs listed in
the <eref target="https://nvd.nist.gov/">NIST National Vulnerability Database</eref> are of this class.</t>
        <t><xref target="LangSecErr"/> suggests these vulnerabilities could have been avoided by designing
the protocol following three rules:</t>
        <blockquote>
          <t>The acceptable input to a program should be:</t>
          <ol spacing="compact">
<li>
              <em>well-defined</em> (i.e., via a grammar)</li>
            <li>
              <em>as simple as possible</em> (on the Chomsky scale of syntactic complexity)</li>
            <li>
              <em>fully validated before use</em> (no "shotgun parsing")</li>
          </ol>
        </blockquote>
        <section anchor="making-deftt-well-defined">
          <name>Making DeftT "well-defined"</name>
          <t>A DeftT domain's "acceptable inputs" are specified using its
<em>communication rules</em> declarative language (<xref target="communication-schemas"/>)
then compiled by an LALR parser into a compact binary "schema" that avoids
any need for runtime parsing. Given the schema, the DeftT runtime can construct or
validate any conformant domain input in constant time. The compiler will fail to
construct a schema if the domain communication rules are ambiguous, incomplete
or inconsistent.</t>
          <t>After successful compilation the schema is authorized, authenticated and
integrity protected by cryptographic signing using the domain's trust anchor.
This signed schema is supplied to every member as part of their identity bundle (<xref target="identity-bundles"/>)
and the SHA-256 thumbprint (see <xref target="certificates"/>) of the schema is the first component
of every PDU's topic name. This ensures not only that the rules are well defined but
also that all publishers and subscribers are playing by the <em>same</em> rules.</t>
        </section>
        <section anchor="making-deftt-as-simple-as-possible">
          <name>Making DeftT "as simple as possible"</name>
          <t>All DeftT Information is represented using TLV (Type, Length, Value) tuples for
the reasons noted by Dan Berstein <xref target="netstrings"/><xref target="tnetstrings"/>:</t>
          <ul spacing="compact">
            <li>Unlike delimitter-based approaches like XML or JSON, TLVs are resistant to buffer overflow and false pairing attacks.</li>
            <li>TLVs are self-describing and trivial to parse or validate.</li>
            <li>They can be used recursively -- containers can contain other containers.</li>
            <li>TLVs are fast, cache friendly and not resource intensive.</li>
            <li>TLVs make no assumptions about contents and can store binary data without escaping or encoding.</li>
            <li>TLVs are transport agnostic.</li>
          </ul>
          <t>Attackers regard the 'seams' between protocol layers as prime attack surface since
a lower layer can pass up partial information that it later finds to be inconsistent
or invalid (an anti-pattern known as <em>shotgun parsing</em> <xref target="LangSecErr"/>). DeftT deliberately
reuses a small set of formatting conventions to construct its TLV containers in contrast to
the Internet convention of constructing its PDUs
in separate layers with rules chosen by different committees.
For example, DeftT PDUs,
Publications and Certs have essentially the same format (<xref target="deftt-formats"/>) so they can <em>all</em> be structurally validated
(e.g., the contents of a container are the type expected in the order expected and
exactly fill their container) by <em>one</em> simple, generic, recursive descent validation
pass over each arriving PDU performed at the point where it arrives.</t>
          <t>As described in <xref target="securing-information"/>, DeftT validates every Publication and PDU
both cryptographically and syntactically using the domain's <em>communication rules</em>
to enforce who-can-say-what-to-which-where-when.
DeftT does both serialization and validation using rules bound at runtime (<xref target="figte"/>) not compile time.
It can do this at rates competitive with protobufs by taking advantage of the "definiteness" of local-domain communication:</t>
          <ul>
            <li>
              <t>Since the same rules are used both to produce and validate Publications/PDUs, encoding order
is fixed and known in advance. Thus every top-level object can be validated by a single sequential pass
through it.</t>
            </li>
            <li>
              <t>Every party to the communication is guaranteed to be using the same rules
so there are no options and no negotiation
thus no combinatorial explosion of variants to check.</t>
            </li>
            <li>
              <t>Communication rules can be extended and amended at any time and the resultant binary schema
published to members with no changes to their code. Thus the current ruleset should always be the
<em>minimum</em> necessary to support existing applications and policies, not the open-ended
monster needed to support any possible future.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="current-status">
        <name>Current status</name>
        <t>An open-source Defined-trust Communications Toolkit <xref target="DCT"/> with an example implementation
of DeftT is maintained by the corresponding author's company.
<xref target="DCT"/> currently has examples of using DeftT to implement secure brokerless message-based
pub/sub using multicast UDP/IPv6 and unicast {UDP/TCP}/IPv6 and includes extending
a trust domain via a unicast connection or between two broadcast network segments.</t>
        <t>Massive build out of the renewable energy sector is driving connectivity needs for both monitoring and control. Author King's company, Operant, is currently developing extensions of DeftT in a  mix of open-source and proprietary software tailored for commercial deployment in support of distributed energy resources (DER). Current small scale use cases have performed well and expanded usage is underway. Pollere is also working on home IoT uses. The development philosophy for DeftT is to start from solving useful problems with a well-defined scope and extend from there.
As the needs of our use cases expand, the Defined-trust communications framework will evolve with increased efficiencies.  DeftT's code is open source, as befits any communications protocol, but even more critical for one attempting to offer security. DCT itself makes use of the open source cryptographic library libsodium <xref target="SOD"/> and the project is open to feedback on potential security issues as well as hearing from potential collaborators.</t>
        <section anchor="performance-considerations">
          <name>Performance considerations</name>
          <t>The well-known issues with 802.11 multicast <xref target="RFC9119"/> can make DeftT less efficient than it should be. Target OT deployments
primarily use smaller packet sizes and DeftT's set reconciliation provides robust delivery that currently mitigates these concerns.
DeftT use may become another force for improved multicast on 802.11, joining the critical network infrastructure
applications of neighbor discovery, address resolution, DHCP, etc.</t>
          <t>Cryptographic signing takes most of the application-to-network time in DeftT.
Though not prohibitively costly (e.g., under 20 microseconds on a Mac Studio), increased use
of signing in transports may incentivize creation of more efficient signing algorithms.</t>
          <t>DeftT is intended for the kinds of devices available today.
The minimum expected capability is that of an ESP32
as noted in <xref target="environment-and-use"/>.
Experience thus far on a number of platforms has not shown DeftT to be unduly burdensome.
<xref target="performance"/> reports measurement results for time to process application messages as
well as memory burden.</t>
          <t>Note that DeftT incurs some memory overhead that may not be immediately apparent.
It keeps a copy of the current identity information for all members that can produce
Publications to which it can subscribe (as per schema). This requires ~300 bytes per
certificate. Collections hold Publications for their lifetime plus a skew time in order
to prevent replay attacks.</t>
        </section>
        <section anchor="relationship-to-other-approaches">
          <name>Relationship to other approaches</name>
          <t>OSCORE <xref target="RFC8613"/> adds object security to COAP specifically to get around the vulnerability
of using only DTLS/TLS with proxies.
OSCORE uses pre-shared keys, acquired out-of-band or via a key establishment protocol,
to encrypt/sign COAP messages which are carried as payload in a COAP message with
the OSCORE option.
Its Security Context is between two endpoints and specific to sender ID and recipient ID where
sender IDs may be established out-of-band.
As Internet compatible protocols, COAP/OSCORE/ACE<xref target="RFC9200"/> use 1) cleartext options in their headers and 2) trusted third parties or resource servers, both of which can be exploited.</t>
          <t>A DeftT PDU uses a hash of its compiled rules cert to identify its trust domain (<xref target="terms"/>) and uses <strong>no</strong> header options.
In the Internet, PDU headers tell nodes how the packet should be handled; in a DeftT trust domain, the trust domain identifier
indicates the packet is part of the domain whose rules will be enforced by any receiver.
These are very different architectures both for communicating and for securing communications and are expected to serve different roles although the application spaces may overlap.
Further, DeftT and Defined-trust Communications are early-stage work compared to COAP/OSCORE and other IETF work,
but deployments are underway by Operant and Pollere.</t>
          <t>Out-of-band configuration techniques developed for COAP and OSCORE should be adaptable for configuration of DeftT members.</t>
        </section>
      </section>
    </section>
    <section anchor="terms">
      <name>Terms</name>
      <ul spacing="compact">
        <li>capability certificate: certificates with a specially formated name that has special meaning to DeftT modules. Capability certificates are a way to add attributes to a signing chain that have special meaning to DeftT (e.g., to designate relays and key makers).</li>
        <li>collection: a set of elements denoted by a structured name that includes the sync zone identifier.</li>
        <li>communication schema: (in context, just schema) defined set of rules that cover the communications for a particular trust domain.
Where it is necessary to distinguish between the human readable version and the compiled binary
version, the modifiers "text" or "binary" will be used.
The binary version is placed in a certificate signed by the domain trust anchor.</li>
        <li>DCT: Defined-trust Communications Toolkit. Running code, examples and documentation for defined-trust communications tools, a schema language and compiler, a DeftT implementation, and illustrative examples.</li>
        <li>face: maintains tables of DeftT's cState PDUs to manage efficient communications with the system transport in use (UDP multicast, TCP, etc.).</li>
        <li>Limited Domain: as introduced in [RFC8799],
refers to a region where network and end system requirements,
behaviors, and semantics are applied only within a single region where membership is assumed to be cryptographically secured.
The region might be physically local or it could be distributed across geographies, e.g., as an overlay on the Internet.
Limited in this context can be understood as its dictionary (<eref target="https://www.merriam-webster.com">https://www.merriam-webster.com</eref>)
definition of <em>restricted</em> or <em>characterized by enforceable limitations</em>.</li>
        <li>identity: a certificate signing chain with a particular domain's trust anchor at its root and a unique member certificate as the leaf.
The public certificates in the chain contain attributes and capabilities for the leaf cert.
Configured identities will include the private key associated with the public key of the member cert.</li>
        <li>identity bundle - entities in a trust domain are commissioned with an identity bundle containing domain trust anchor,
communication schema cert, and the signing chain associated with a particular identity.
Identity private keys may be part of the bundle if securely configured.</li>
        <li>identity cert: the leaf certificate of an identity.
The holder of the corresponding private key is considered to have that identity.</li>
        <li>Publication: a named information object used by DeftT whose name structure and signing
requirements are specified by the schema.
Publications are the elements of the sets that are reconciled by DeftT's sync protocol.
(Capitalization is used to distinguish this specific use from both the action and more generic use of the term.)</li>
        <li>protocol data unit (PDU): a single unit of information composed of protocol-specific control
information and user data.
DeftT uses two types: cState: (from "collection state") and cAdd: (from "collection additions").</li>
        <li>signing cert - the certificate holding the public key corresponding to the private key a member uses to sign Publications it originates.
The signing cert is a leaf cert that has its identity in its chain-of-trust.
Normally directly signed by an identity cert's private key.</li>
        <li>subschema - a shorthand way of referring to a subset of a domain schema that is itself a
complete schema, i.e., it can be packaged in a schema cert and used by a DeftT to communicate.
A (sub)schema cert in use in a trust domain must be signed by the domain trust anchor.</li>
        <li>sync protocol: a synchronization protocol that implements set reconciliation of Publications
between members in a sync zone making use of cState and cAdd PDUs.</li>
        <li>sync zone: a single subnet where members use the same communication schema or communication
schema subset.
PDUs never leave a sync zone, the Publications they carry may be relayed.</li>
        <li>sync zone identifier: the thumbprint of the communication (sub)schema used for a
particular sync zone.
It will be the same as the trust domain identifier if the communication schema in use is
the domain communication schema.</li>
        <li>Things: as per <xref target="RFC8520"/>, networked digital devices specifically not intended to be used for general purpose computing.</li>
        <li>thumbprint: the 32 byte SHA256 digest of an <em>entire</em> certificate including its signature ensuring that
each thumbprint resolves to one and only one cert and signing chain.</li>
        <li>trust anchor: NIST SP 800-57 Part 1 Rev. 5 definition "An authoritative entity for which trust is assumed. In a PKI, a trust anchor is a certification authority, which is represented by a certificate that is used to verify the signature on a certificate issued by that trust-anchor. The security of the validation process depends upon the authenticity and integrity of the trust anchor's certificate. Trust anchor certificates are often distributed as self-signed certificates." In defined-trust communications, a trust anchor is a self-signed certificate which is the ultimate signer of all certificates in use in a trust domain, including the communication schema. From <xref target="RFC4949"/>: trust anchor definition: An established point of trust (usually based on the authority of some person, office, or organization) which allows the validation of a certification chain.</li>
        <li>trust domain: (or just domain, in context) denotes a Limited Domain where all network
communication are via DeftT,
a zero trust domain governed by a single trust anchor and communication schema which is
enforced at run-time by a library (e.g., DCT) using a signed binary copy of the schema
at each member.
Nothing is accepted without validation; non-conforming communications are silently discarded.</li>
        <li>trust domain identifier: (or just domain id) the thumbprint of the trust domain's
communication schema certificate.
As the schema cert is signed by the trust anchor, a trust domain is uniquely identified by
its communication schema cert's thumbprint.</li>
        <li>trust-based relay: (or just relay) a special-purpose entity that connects a trust domain
between two or more sync zones.
A relay has two or more DeftT instances and moves Publications between the instances according
to the schema in use at each DeftT but does not orginate any application Publications and is
not given Publication decryption keys when they are in use.
The DeftT instances may be using different physical subnets and/or different subsets of the domain's communication schema.
Relays can extend a trust domain across physical subnets and geographic distance.</li>
      </ul>
    </section>
    <section anchor="deftt-and-defined-trust-communications">
      <name>DeftT and Defined-trust Communications</name>
      <t>DeftT synchronizes and secures communications between its enrolled members.
DeftT's multi-party synchronized collections of named, schema-conformant Publications
contrast with the bilateral session of TCP or QUIC where a source and a destination
coordinate with one another to transport undifferentiated streams of information.
At any specific time, the DeftTs in a trust domain may hold different subsets of a collection
(e.g., immediately after entities add elements to the collection) but the synchronization
protocol ensures all converge to the complete set of elements
within a few round-trip-times following the changes.</t>
      <t>Applications use DeftT to add to and access from a collection of Publications. DeftT enforces "who can say what to which" as well as providing required integrity, authenticity and confidentiality.
Transparently to applications, a DeftT both constructs and validates all Publications against its schema's formal, validated rules.
The compiled binary communication schema is distributed as a trust-root-signed certificate
and that certificate's thumbprint (see <xref target="certificates"/> and <xref target="terms"/>) <em>uniquely</em> identifies
each trust domain.
Each DeftT is configured with the trust anchor used in the domain, the schema cert, and its own credentials for membership in the domain.
DeftTs must be in the same domain to communicate.
Identity credentials comprise a unique private identity key along with a public certificate chain rooted at the domain's trust anchor.
Identity chain certificate specifications are in the schema and some of these certs contain the attributes granted to
the identity.
Thus, attributes are stored in the identity <strong>not</strong> on an external server.</t>
      <t>As illustrated in <xref target="figCertSD"/>, each member publishes its credentials to the certificate collection in order to join the domain. DeftT validates credentials as a certificate chain against the schema and does not accept Publications without a fully validated signer. This unique approach enables fully distributed policy enforcement without a secured-perimeter physical network and/or extensive per-device configuration. DeftT can share an IP network with non-DeftT traffic as well as DeftT traffic of a different Domain.
Privacy via AEAD (Authenticated Encryption with Associated Data) is automatically handled within DeftT if selected in the schema.</t>
      <figure anchor="fig4">
        <name>DeftT's interaction in a network stack
</name>
        <artwork type="svg" originalSrc="./figs/transportBD0v2-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 408 140" version="1.1">
            <desc>transportBD0v2-rfc</desc>
            <title>transportBD0v2</title>
            <g stroke-width="1" fill="none" fill-rule="evenodd">
              <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="1 46.5 76.556 46.5 76.556 90 1 90"/>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="8.664" y="69.1020806">Application</tspan>
              </text>
              <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="308.708 21.3403 406.708 21.3403 406.708 115.8318 308.708 115.8318"/>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="336.144" y="55.1020806">system-</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="334.146" y="69.4380806">p</tspan>
                <tspan x="341.526" y="69.4380806">r</tspan>
                <tspan x="346.026" y="69.4380806">ovided</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="333.372" y="83.7740806">transport</tspan>
              </text>
              <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="149.296 18 226.424 18 226.424 114.549 149.296 114.549"/>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="173.304" y="67.1265806">DeftT</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="81" y="88.8970806">information</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="85.002" y="101.233081">to convey</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="81" y="40.0200806">information</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="86.558" y="52.3560806">of inte</tspan>
                <tspan x="122.678" y="52.3560806">r</tspan>
                <tspan x="127.178" y="52.3560806">est</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="238.112" y="16.0200806">local adds </tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="232.892" y="28.3560806">to collection</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="238.264" y="114.454581">others’ adds</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="239.05" y="126.790581">to collection</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="247.866" y="63.9873806">state of</tspan>
              </text>
              <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                <tspan x="242.202" y="78.3232806">collection</tspan>
              </text>
              <path d="M136.309343,69.8190816 L136.745131,70.0642122 L144.745131,74.5642122 L145.519864,75 L144.745131,75.4357878 L136.745131,79.9357878 L136.309343,80.1809184 L135.819082,79.3093429 L136.254869,79.0642122 L142.591,75.5 L78.5,75.5 L78.5,74.5 L142.591,74.5 L136.254869,70.9357878 L135.819082,70.6906571 L136.309343,69.8190816 Z" fill="#000000" fill-rule="nonzero"/>
              <path d="M297.309343,27.8190816 L297.745131,28.0642122 L305.745131,32.5642122 L306.519864,33 L305.745131,33.4357878 L297.745131,37.9357878 L297.309343,38.1809184 L296.819082,37.3093429 L297.254869,37.0642122 L303.591,33.5 L227.5,33.5 L227.5,32.5 L303.591,32.5 L297.254869,28.9357878 L296.819082,28.6906571 L297.309343,27.8190816 Z" fill="#000000" fill-rule="nonzero"/>
              <path d="M297.309343,62.8190816 L297.745131,63.0642122 L305.745131,67.5642122 L306.519864,68 L305.745131,68.4357878 L297.745131,72.9357878 L297.309343,73.1809184 L296.819082,72.3093429 L297.254869,72.0642122 L303.591,68.5 L231.41,68.5 L237.745131,72.0642122 L238.180918,72.3093429 L237.690657,73.1809184 L237.254869,72.9357878 L229.254869,68.4357878 L228.480136,68 L229.254869,67.5642122 L237.254869,63.0642122 L237.690657,62.8190816 L238.180918,63.6906571 L237.745131,63.9357878 L231.406,67.5 L303.591,67.5 L297.254869,63.9357878 L296.819082,63.6906571 L297.309343,62.8190816 Z" fill="#000000" fill-rule="nonzero"/>
              <path d="M237.690657,98.8190816 L238.180918,99.6906571 L237.745131,99.9357878 L231.406,103.5 L307.5,103.5 L307.5,104.5 L231.41,104.5 L237.745131,108.064212 L238.180918,108.309343 L237.690657,109.180918 L237.254869,108.935788 L229.254869,104.435788 L228.480136,104 L229.254869,103.564212 L237.254869,99.0642122 L237.690657,98.8190816 Z" fill="#000000" fill-rule="nonzero"/>
              <path d="M87.1906571,52.3190816 L87.6809184,53.1906571 L87.2451306,53.4357878 L80.908,57 L146,57 L146,58 L80.908,58 L87.2451306,61.5642122 L87.6809184,61.8093429 L87.1906571,62.6809184 L86.7548694,62.4357878 L78.7548694,57.9357878 L77.9801356,57.5 L78.7548694,57.0642122 L86.7548694,52.5642122 L87.1906571,52.3190816 Z" fill="#000000" fill-rule="nonzero"/>
            </g>
          </svg>
        </artwork>
      </figure>
      <t><xref target="fig4"/> shows the data flow in and out of a DeftT. DeftT uses its schema to package application information into Publications that are added to its local view of the collection. Application information is packaged in Publications which are carried in collection addition (cAdd) PDUs that are used along with collection state (cState) PDUs to communicate about and synchronize Collections. cStates report the state of the local collection; cAdds carry Publications to other members that need them. These PDUs are broadcast on their subnet (e.g., UDP multicast).</t>
      <section anchor="inside-deftt">
        <name>Inside DeftT</name>
        <t>DeftT's example implementation <xref target="DCT"/> is organized in functional library modules that interact to prepare application-level information for transport and to extract application-level information from packets, see <xref target="fig13"/>. Extensions and alternate module implementations are possible but the functionality and interfaces must be preserved. Internals of DeftT are completely transparent to an application and the example implementation is efficient in both lines of code and performance (see <xref target="performance"/>).
The schema determines which modules are used (<xref target="sigmgrschema"/>). A DeftT participates in two required collections and <em>may</em> participate in others if required by the schema-designated cryptographic methods (see #distributors)..
One of the required collections, <strong>msgs</strong>, contains Publications constructed from application messages. The other required collection, <strong>cert</strong>, contains the certificates of the trust domain.
Specific cryptographic methods <em>may</em> require group key distribution in descriptively named collection <strong>keys</strong>.</t>
        <figure anchor="fig13">
          <name>Run-time library modules
</name>
          <artwork type="svg" originalSrc="./figs/DeftTmodules-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 565 342" version="1.1">
              <desc>DeftTmodules</desc>
              <title>DeftTmodules</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <g transform="translate(-4.000000, -2.000000)">
                  <g transform="translate(4.500000, 4.000000)">
                    <path d="M0,26 L563.5,26 L563.5,313 L0,313 L0,26 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4,4"/>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="130.5 143 250.5 143 250.5 198 130.5 198"/>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="427.5 189 547.5 189 547.5 244 427.5 244"/>
                    <g transform="translate(135.500000, 146.000000)" fill="black" font-family="sans-serif" font-size="12" font-weight="bold">
                      <g>
                        <text>
                          <tspan x="32.886" y="13">syncps</tspan>
                          <tspan x="73.41" y="13.0239868" font-family="sans-serif" font-weight="normal">:</tspan>
                          <tspan x="0" y="28.0239868" font-family="sans-serif" font-weight="normal">set synchronization </tspan>
                          <tspan x="6.012" y="43.0239868" font-family="sans-serif" font-weight="normal">pub/sub protocol</tspan>
                        </text>
                        <text>
                          <tspan x="329.886" y="59">syncps</tspan>
                          <tspan x="370.41" y="59.0239868" font-family="sans-serif" font-weight="normal">:</tspan>
                          <tspan x="297" y="74.0239868" font-family="sans-serif" font-weight="normal">set synchronization </tspan>
                          <tspan x="303.012" y="89.0239868" font-family="sans-serif" font-weight="normal">pub/sub protocol</tspan>
                        </text>
                      </g>
                    </g>
                    <path d="M191,-1.01986443 L191.435788,-0.24513062 L195.935788,7.75486938 L196.180918,8.19065715 L195.309343,8.68091839 L195.064212,8.24513062 L191.5,1.908 L191.5,37.091 L195.064212,30.7548694 L195.309343,30.3190816 L196.180918,30.8093429 L195.935788,31.2451306 L191.435788,39.2451306 L191,40.0198644 L190.564212,39.2451306 L186.064212,31.2451306 L185.819082,30.8093429 L186.690657,30.3190816 L186.935788,30.7548694 L190.5,37.091 L190.5,1.908 L186.935788,8.24513062 L186.690657,8.68091839 L185.819082,8.19065715 L186.064212,7.75486938 L190.564212,-0.24513062 L191,-1.01986443 Z" fill="black" fill-rule="nonzero"/>
                    <path d="M191,297.980136 L191.435788,298.754869 L195.935788,306.754869 L196.180918,307.190657 L195.309343,307.680918 L195.064212,307.245131 L191.5,300.908 L191.5,336.091 L195.064212,329.754869 L195.309343,329.319082 L196.180918,329.809343 L195.935788,330.245131 L191.435788,338.245131 L191,339.019864 L190.564212,338.245131 L186.064212,330.245131 L185.819082,329.809343 L186.690657,329.319082 L186.935788,329.754869 L190.5,336.091 L190.5,300.908 L186.935788,307.245131 L186.690657,307.680918 L185.819082,307.190657 L186.064212,306.754869 L190.564212,298.754869 L191,297.980136 Z" fill="black" fill-rule="nonzero"/>
                    <path d="M191,198.980136 L191.435788,199.754869 L195.935788,207.754869 L196.180918,208.190657 L195.309343,208.680918 L195.064212,208.245131 L191.5,201.908 L191.5,234.091 L195.064212,227.754869 L195.309343,227.319082 L196.180918,227.809343 L195.935788,228.245131 L191.435788,236.245131 L191,237.019864 L190.564212,236.245131 L186.064212,228.245131 L185.819082,227.809343 L186.690657,227.319082 L186.935788,227.754869 L190.5,234.091 L190.5,201.908 L186.935788,208.245131 L186.690657,208.680918 L185.819082,208.190657 L186.064212,207.754869 L190.564212,199.754869 L191,198.980136 Z" fill="black" fill-rule="nonzero"/>
                    <path d="M191,106.980136 L191.435788,107.754869 L195.935788,115.754869 L196.180918,116.190657 L195.309343,116.680918 L195.064212,116.245131 L191.5,109.908 L191.5,139.091 L195.064212,132.754869 L195.309343,132.319082 L196.180918,132.809343 L195.935788,133.245131 L191.435788,141.245131 L191,142.019864 L190.564212,141.245131 L186.064212,133.245131 L185.819082,132.809343 L186.690657,132.319082 L186.935788,132.754869 L190.5,139.091 L190.5,109.908 L186.935788,116.245131 L186.690657,116.680918 L185.819082,116.190657 L186.064212,115.754869 L190.564212,107.754869 L191,106.980136 Z" fill="black" fill-rule="nonzero"/>
                    <path d="M488,165.980136 L488.435788,166.754869 L492.935788,174.754869 L493.180918,175.190657 L492.309343,175.680918 L492.064212,175.245131 L488.5,168.908 L488.5,185.091 L492.064212,178.754869 L492.309343,178.319082 L493.180918,178.809343 L492.935788,179.245131 L488.435788,187.245131 L488,188.019864 L487.564212,187.245131 L483.064212,179.245131 L482.819082,178.809343 L483.690657,178.319082 L483.935788,178.754869 L487.5,185.091 L487.5,168.908 L483.935788,175.245131 L483.690657,175.680918 L482.819082,175.190657 L483.064212,174.754869 L487.564212,166.754869 L488,165.980136 Z" fill="black" fill-rule="nonzero"/>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="13.5 85.5 115 85.5 115 165.5 13.5 165.5"/>
                    <text font-family="sans-serif" font-size="12" font-weight="bold" fill="black">
                      <tspan x="26.734" y="99.8050806">schemaLib</tspan>
                      <tspan x="91.03" y="99.8290674" font-family="sans-serif" font-weight="normal">: </tspan>
                      <tspan x="17.236" y="114.829067" font-family="sans-serif" font-weight="normal">run-time use of </tspan>
                      <tspan x="24.652" y="129.829067" font-family="sans-serif" font-weight="normal">schema cert, </tspan>
                      <tspan x="23.938" y="144.829067" font-family="sans-serif" font-weight="normal">identity certs </tspan>
                      <tspan x="21.346" y="159.829067" font-family="sans-serif" font-weight="normal">and cert store</tspan>
                    </text>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="127 41.5 254 41.5 254 106.5 127 106.5"/>
                    <text font-family="sans-serif" font-size="12" font-weight="bold" fill="black">
                      <tspan x="139.596" y="53.3480806">shim</tspan>
                      <tspan x="168.888" y="53.3480806" font-family="sans-serif" font-weight="normal">: application-</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="138.162" y="67.6840806">speciﬁcs: up calls, </tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="131.154" y="82.0200806">timing, lifetimes, API, </tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="149.274" y="96.3560806">QoS, seg/reas</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="3" y="46.0200806">DeftT</tspan>
                    </text>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="89 238 295 238 295 297 89 297"/>
                    <text font-family="sans-serif" font-size="12" font-weight="bold" fill="black">
                      <tspan x="176.5" y="256">face</tspan>
                      <tspan x="201.652" y="256" font-family="sans-serif" font-weight="normal">:</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="116.5" y="270">manage PDU transport via</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="95.5" y="285">multicast UDP, unicast UDP or TCP</tspan>
                    </text>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="426.5 100.666 550.5 100.666 550.5 165.666 426.5 165.666"/>
                    <text font-family="sans-serif" font-size="12" font-weight="bold" fill="black">
                      <tspan x="454.496" y="115.514081">distributors</tspan>
                      <tspan x="525.56" y="115.514081" font-family="sans-serif" font-weight="normal">:</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="438.158" y="129.850081">handle all aspects </tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="434.606" y="144.186081">of distributing certs </tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="449.714" y="158.522081">and group keys</tspan>
                    </text>
                    <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="272.5 100.666 405.5 100.666 405.5 165.666 272.5 165.666"/>
                    <text font-family="sans-serif" font-size="12" font-weight="bold" fill="black">
                      <tspan x="315.882" y="121.514081">sigmgrs</tspan>
                      <tspan x="363.894" y="121.514081" font-family="sans-serif" font-weight="normal">:</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="298.168" y="135.850081">sign or validate</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="275.04" y="150.19">PDUs and publications</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="198.75" y="326.356081">cState &amp; cAdd packets</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="198.75" y="224.356081">cState &amp; cAdd PDUs</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="345.75" y="264.356081">cState &amp; cAdd PDUs</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="197.5" y="128">publications</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="495.5" y="180">certs, keys</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="198.25" y="20.0160806">application calls and callbacks</tspan>
                    </text>
                    <path d="M489,247 L489,268.5 L300.908,268.5 L307.245131,272.064212 L306.754869,272.935788 L298.754869,268.435788 L297.980136,268 L298.754869,267.564212 L306.754869,263.064212 L307.245131,263.935788 L300.908,267.5 L488,267.5 L488,247 L489,247 Z" fill="black" fill-rule="nonzero"/>
                  </g>
                </g>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>A <em>shim</em> serves as the translator between application semantics and the named information objects (Publications) whose format is defined by the schema. The <strong>syncps</strong> module is the set reconciliation protocol used by DeftT (see <xref target="syncps-a-set-reconciliation-protocol"/>). New signature managers, distributors, and face modules may be added to the library to extend features. More detail on each module can be found at <xref target="DCT"/> in both code files and documents.</t>
        <t>The signing/validation modules (<em>signature managers</em>) are used for both Publications and cAdds.
<xref target="sigmgrschema"/> shows validator specifications for the two required Publication collections,
one for Publications carrying application messages and one for Publications carrying certificates.
The "#pduValidator" specifies AEAD, which requires a symmetric key, an example of a sigmgr that requires another distributor
module (see #(group-key-distributors)) that is automatically instantiated at run-time.
Changing a pduValidator from "EdDSA" to "AEAD" in a domain's communication schema is all that needs to be done to
change from signed, cleartext PDUs to PDUs encrypted with a periodically regenerated shared key where only the minimal
information of trust domain identifier and collection type is exposed.</t>
        <figure anchor="sigmgrschema">
          <name>Schema portion specifying the sigmgr to be used for signing and validation
</name>
          <artwork><![CDATA[#msgsValidator: "EdDSA"
#certValidator: "EdDSA"
#pduValidator:  "AEAD"  //for cAdds
]]>
</artwork>
        </figure>
        <t>Following good security practice, DeftT's Publications are constructed and signed <em>early</em> in their creation,
then are validated (or discarded) early in the reception process.The <em>schemaLib</em> module provides certificate store access throughout DeftT along with access to <em>distributors</em> of group keys, Publication building and structural validation, and other functions of the trust management engine.</t>
      </section>
      <section anchor="syncps-a-set-reconciliation-protocol">
        <name>syncps: a set reconciliation protocol</name>
        <t>DeftT requires a method or protocol that keeps collections of Publications synchronized.
Required functionality for such a protocol can be understood through the example of the <strong>syncps</strong> protocol
included in the example implementation.
The <strong>syncps</strong> protocol uses IBLTs to solve the multi-party set-difference problem efficiently without the use of
prior context and with communication proportional to the size of the difference between the sets being compared.
The state of a local collection is  encoded in an IBLT.
IBLTs have been used for set reconciliation in blockchain systems, specifically in Bitcoin Cash,
contributing optimizations available as open-source code <xref target="Graphene19"/> that syncps can utilize.</t>
        <t>A syncps announces its local <em>collection state</em> (set of currently known Publications) by sending a cState (<xref target="cstate-pdus"/>)
that also serves as a query for additional data not reflected in its local state.
Receipt of a cState performs three simultaneous functions: (1) announces new Publications, (2) notifies of
Publications that member(s) are missing and (3) acknowledges Publication receipt.
The first may prompt the recipient to share its cState to get the new Publication(s).
The second results in the recipient sending a cAdd (<xref target="cadd-pdus"/>) containing all the locally available missing
Publications that fit.
The third is used optionally and may result
in a progress notification sent to other local modules so anything waiting for delivery confirmation can proceed.</t>
        <t>On broadcast media, syncps uses any cStates it hears to reduce (suppress) sending excess cStates and listens for cAdds that may add to its collection.
This means that one-to-many Publications cause sending a single cState and a single cAdd independently of
the number of members desiring the Publication (the theoretical minimum possible for reliable delivery).
The digest size of a cState can be controlled by Publication lifetime, dynamically constructing the digest to
maximize communication progress and,
if necessary for a large network, dynamically adapting topic specificity.</t>
        <t>A cAdd with new Publication(s) responds to a particular cState as per (<xref target="cadd-pdus"/> item 1). Any DeftT that is missing a Publication (due to being out-of-range, asleep, channel errors, etc.) can receive it from any other DeftT. A syncps will continue to send cAdds as long as cStates are received that are missing any of its active Publications. This results in reliability that is subscriber-oriented, not publisher-oriented, kept efficient with protocol features that prevent multiple redundant broadcasts. The example implementation of syncps prevents redundant broadcasts by having originating publishers send their responding Publications immediately while others delay before supplying missing Publications, canceling if a responding cAdd is overheard. Other approaches are possible.</t>
        <t>The collection synchronization work of a syncps module is shown as a state diagram in <xref target="figSD"/>. When a new syncps is started, it always sends its local cState (starts unsuppressed) on the network and sets an expiration timer for the cState. If this timer expires, the "new local cState" actions are repeated and the cState may be suppressed (thus not sent). For most collections, the initial cState will show an empty collection (certificate collections will have the local identity chain). The events that can move the collection forward are (1) the arrival of a cState from the network, (2) the arrival of a cAdd from the network whose csID matches a hash value stored from a previously received or sent cState, or (3) arrival of a new Publication from its shim. For an arriving cAdd, each Publication is extracted, validated, and passed to any registered subscriber callback(s). Non-validating packets are silently discarded (may optionally set alerts or count discards). Reception of new Pub(s) may cause an application process to create and add new Publications to the local collection. Sending of new Pubs is deferred until the entire cAdd has been processed. If there are no new Pubs to send, syncps moves to its "set sendCStateTimer" state where a cancelable sendCState timer is set to the estimated dispersion delay of this local subnet. (Dispersion should be &lt;&lt; cState lifetime. More on dispersion delay in <xref target="synchronizing-a-collection"/>.)</t>
        <figure anchor="figSD">
          <name>State diagram of a syncps module
</name>
          <artwork type="svg" originalSrc="./figs/syncpsSD-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 981 996" version="1.1">
              <desc>syncpsSD-rfc</desc>
              <defs/>
              <g>
                <g>
                  <rect fill="#FFFFFF" height="78.2031" rx="12.5" ry="12.5" width="258" x="506" y="92" stroke="black" stroke-width="1.0"/>
                  <line x1="506" x2="764" y1="118.2969" y2="118.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="576" y="109.9951">new local cState</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="511" y="134.4355">entry/ make local cState from local IBLT</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="511" y="148.4043">do/ (if not suppressed) send</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="511" y="162.373">exit/ cStateLifeTimer=cStateLifeTime</text>
                </g>
                <g>
                  <rect fill="#FFFFFF" height="78.2031" rx="12.5" ry="12.5" width="336" x="294" y="674" stroke="black" stroke-width="1.0"/>
                  <line x1="294" x2="630" y1="700.2969" y2="700.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="386" y="691.9951">process Pubs to send</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="299" y="716.4355">entry/ cancel sendCStateTimer</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="299" y="730.4043">do/ for(eligible haves)</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="299" y="744.373">if (PubsToSend &lt; cAdd size) PubsToSend.add(have)</text>
                </g>
                <g>
                  <rect fill="#FFFFFF" height="78.2031" rx="12.5" ry="12.5" width="228" x="12" y="519" stroke="black" stroke-width="1.0"/>
                  <line x1="12" x2="240" y1="545.2969" y2="545.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="78" y="536.9951">process cAdd</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="17" y="561.4355">entry/ newPubs=false</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="17" y="575.4043">do/ extract, validate &amp; pass to any</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="17" y="589.373">subscriber(s)  all Pubs in cAdd</text>
                </g>
                <g>
                  <rect fill="#FFFFFF" height="50.2656" rx="12.5" ry="12.5" width="273" x="248.5" y="829" stroke="black" stroke-width="1.0"/>
                  <line x1="248.5" x2="521.5" y1="855.2969" y2="855.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="337" y="846.9951">sending cAdd</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="253.5" y="871.4355">do/ send cAdd(hash(cState),PubsToSend)</text>
                </g>
                <rect fill="#FFFFFF" height="40" rx="12.5" ry="12.5" width="111" x="579.5" y="247" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="584.5" y="271.8467">wait for event</text>
                <g>
                  <rect fill="#FFFFFF" height="78.2031" rx="12.5" ry="12.5" width="267" x="297.5" y="364" stroke="black" stroke-width="1.0"/>
                  <line x1="297.5" x2="564.5" y1="390.2969" y2="390.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="377" y="381.9951">process cState</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="302.5" y="406.4355">entry/ find record or add to cState store</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="302.5" y="420.4043">do/ update this cState record</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="302.5" y="434.373">exit/ local = (this cState == local cState)</text>
                </g>
                <g>
                  <rect fill="#FFFFFF" height="50.2656" rx="12.5" ry="12.5" width="226" x="417" y="940" stroke="black" stroke-width="1.0"/>
                  <line x1="417" x2="643" y1="966.2969" y2="966.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="454.5" y="957.9951">set sendCstateTimer</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="422" y="982.4355">(re)set cStateTimer=f(dispersion)</text>
                </g>
                <rect fill="#FFFFFF" height="40" rx="12.5" ry="12.5" width="138" x="783" y="383" stroke="black" stroke-width="1.0"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="788" y="407.8467">get stored cState</text>
                <g>
                  <rect fill="#FFFFFF" height="64.2344" rx="12.5" ry="12.5" width="260" x="505" y="526" stroke="black" stroke-width="1.0"/>
                  <line x1="505" x2="765" y1="552.2969" y2="552.2969" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="14" x="577.5" y="543.9951">peel IBLT values</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="510" y="568.4355">entry/ extract iblt from cState</text>
                  <text fill="#000000" font-family="sans-serif" font-size="12" x="510" y="582.4043">do/ peel with local for haves and needs</text>
                </g>
                <ellipse cx="635" cy="21" fill="#000000" rx="10" ry="10" stroke-width="1.0"/>
                <!--link *start* to newst-->
    <g>
                  <path d="M635,31.208 C635,43.529 635,66.21 635,86.735 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="635,91.9,639,82.9,635,86.9,631,82.9,635,91.9" stroke="black" stroke-width="1.0"/>
                </g>
                <!--link newst to wait-->
    <g>
                  <path d="M606.062,170.408 C598.588,184.818 593.907,201.467 599,217 C601.997,226.14 607.422,234.982 613.166,242.58 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="616.377,246.667,613.9625,237.1187,613.2881,242.7352,607.6716,242.0609,616.377,246.667" stroke="black" stroke-width="1.0"/>
                </g>
                <!--link wait to newst-->
    <g>
                  <path d="M633.561,246.931 C632.947,237.869 632.302,226.882 632,217 C631.586,203.449 631.854,188.685 632.369,175.321 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="632.587,170.079,628.2176,178.9056,632.3799,175.0747,636.2107,179.237,632.587,170.079" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="633" y="213.0669">sendcState timer expires</text>
                </g>
                <!--link wait to newst-->
    <g>
                  <path d="M690.594,265.447 C727.763,261.807 774.236,250.244 799,217 C817.276,192.466 799.157,174.413 769.231,161.419 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="764.33,159.376,771.0978,166.5312,768.945,161.3,774.1762,159.1472,764.33,159.376" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="807" y="213.0669">cStateLifeTimer expires</text>
                </g>
                <!--link wait to biblt-->
    <g>
                  <path d="M690.726,279.813 C718.543,287.455 751.763,299.346 778,317 C802.297,333.349 823.48,359.638 836.883,378.654 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="839.789,382.837,837.9383,373.1636,836.9359,378.7309,831.3686,377.7286,839.789,382.837" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="799" y="330.0669">Pub from shim</text>
                </g>
                <!--link biblt to wait-->
    <g>
                  <path d="M802.014,382.997 C773.102,370.94 736.684,353.885 707,334 C688.456,321.578 669.948,304.482 656.34,290.802 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="652.636,287.041,656.1027,296.2596,656.145,290.6029,661.8017,290.6452,652.636,287.041" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="708" y="330.0669">no cState</text>
                </g>
                <!--link wait to getst-->
    <g>
                  <path d="M605.772,287.199 C576.658,306.323 531.04,336.287 493.71,360.808 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="489.2,363.771,498.9181,362.1716,493.3786,361.0253,494.5249,355.4858,489.2,363.771" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="559" y="330.0669">cState</text>
                </g>
                <!--link getst to wait-->
    <g>
                  <path d="M455.622,363.751 C467.667,347.509 483.371,329.485 501,317 C522.888,301.498 550.234,290.344 574.504,282.632 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="579.315,281.136,569.5329,279.9909,574.5408,282.6217,571.91,287.6296,579.315,281.136" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="502" y="330.0669">local</text>
                </g>
                <!--link wait to cadd-->
    <g>
                  <path d="M579.451,270.503 C462.426,277.026 196.552,298.834 139,364 C103.2183,404.515 107.2922,470.379 115.249,513.7 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="116.236,518.868,118.4756,509.2772,115.2975,513.9569,110.6178,510.7788,116.236,518.868" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="140" y="407.5669">cAdd with stored csID</text>
                </g>
                <!--link shrtm to wait-->
    <g>
                  <path d="M643.189,958.4589 C774.735,948.85 974,923.0616 974,855 C974,402 974,402 974,402 C974,352.491 944.848,341.804 902,317 C838.158,280.042 752.569,269.96 695.693,267.705 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="690.624,267.522,699.4729,271.846,695.6207,267.7035,699.7632,263.8513,690.624,267.522" stroke="black" stroke-width="1.0"/>
                </g>
                <!--link getst to peel-->
    <g>
                  <path d="M481.689,442.017 C514.665,466.749 557.316,498.737 589.257,522.693 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="593.493,525.87,588.693,517.27,589.493,522.87,583.893,523.67,593.493,525.87" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="541" y="485.0669">!local</text>
                </g>
                <!--link biblt to peel-->
    <g>
                  <path d="M824.956,423.068 C789.625,447.979 727.139,492.036 683.517,522.792 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="679.356,525.726,689.0163,523.8078,683.4421,522.8443,684.4056,517.2701,679.356,525.726" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="752" y="485.0669">best cState</text>
                </g>
                <!--link peel to build-->
    <g>
                  <path d="M599.573,590.331 C573.367,613.507 537.417,645.301 508.839,670.576 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="505.036,673.939,514.4276,670.9727,508.7813,670.6265,509.1276,664.9803,505.036,673.939" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="555" y="640.0669">haves&gt;0 || needs&gt;0 / csID=hash(cState)</text>
                </g>
                <!--link peel to wait-->
    <g>
                  <path d="M635,525.862 C635,468.002 635,345.038 635,292.563 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="635,287.411,631,296.411,635,292.411,639,296.411,635,287.411" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="636" y="407.5669">no haves | needs</text>
                </g>
                <!--link build to sending-->
    <g>
                  <path d="M440.756,752.35 C428.175,775.061 412.494,803.368 400.969,824.172 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="398.429,828.758,406.2903,822.8251,400.8527,824.3847,399.2931,818.9471,398.429,828.758" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="425" y="795.0669">PubsToSend &gt; 0</text>
                </g>
                <!--link build to shrtm-->
    <g>
                  <path d="M517.521,752.269 C526.244,760.965 534.014,770.945 539,782 C561.53,831.955 549.449,897.6356 539.281,934.8882 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="537.927,939.73,544.2045,932.141,539.2745,934.915,536.5005,929.985,537.927,939.73" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="553" y="858.5669">!PubsToSend</text>
                </g>
                <!--link cadd to cadd-->
    <g>
                  <path d="M240.005,544.559 C260.591,546.283 275,550.764 275,558 C275,564.614 262.961,568.926 245.171,570.935 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="240.005,571.441,249.3519,574.545,244.9812,570.9538,248.5724,566.5831,240.005,571.441" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="281" y="562.5669">Pub from shim / newPubs=true</text>
                </g>
                <!--link cadd to shrtm-->
    <g>
                  <path d="M127.4,597.022 C131.954,663.777 151.098,802.238 231,879 C279.168,925.275 350.651,946.6729 411.646,956.432 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="416.764,957.2278,408.4843,951.8943,411.8232,956.4606,407.2568,959.7996,416.764,957.2278" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="176" y="795.0669">!newPubs</text>
                </g>
                <!--link cadd to build-->
    <g>
                  <path d="M209.488,597.017 C259.484,619.783 322.981,648.697 373.794,671.835 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="378.359,673.914,371.8253,666.5444,373.8084,671.8423,368.5105,673.8254,378.359,673.914" stroke="black" stroke-width="1.0"/>
                  <text fill="#000000" font-family="sans-serif" font-size="13" x="306" y="640.0669">newPubs / csID=cAdd.csID</text>
                </g>
                <!--link sending to shrtm-->
    <g>
                  <path d="M417.18,879.191 C439.895,896.266 470.353,919.1616 493.896,936.8597 " fill="none" stroke="black" stroke-width="1.0"/>
                  <polygon fill="#000000" points="497.91,939.877,493.1213,931.2707,493.9139,936.8718,488.3129,937.6644,497.91,939.877" stroke="black" stroke-width="1.0"/>
                </g>
                <!--SRC=[PLHDRzim3BthLx0v3FRGDZqRIu1zN0hqCA2z3Jie5XqBjML3Kj9sw8-VI7tOQNsInSUdnqTALxx74M4Uf3R2FMipIoj762SpjRsTGiZR4ufUAmGSP_y62brhzUprP8HmNde4Wo_EWtIm2IiOfbOEq3vIQ9CGXvCU52DcExNe7Fm-7Hpu2HmQbL6jL9UWzhigGG9gS-HuNg_ZBr973Rpe9WjuHkDp-8W-QIpa5mfTR_sOo3qVzfC3Jtf4MyhGXo6I70da9ulg0y-CECHZQ77_u-49pd8ueTi8yUVhNxYvsKU_H7IjWI3IlcrXbCzuuHrqmV-qGpmbGKrRg7G7PWeQJlDiGpMeQXQziBvglqrC3xgBTUmk_nEO995fGh1rHM5W8SganXD1e9rrEEypyiD9du7HkuOQ7ojplHwNSEnFvbdsUIOQxZIyQDyNrztzhp1_tBK6AeirzIrcnrgxIcatetLXKkk4N4hDvoNtEsqKM6mdgo2C3XqQXZELpaUM3BB_D2lsfDTvZbBomil-n-xje5eZTxkBFjSf9siBoHnURVCiDN0LzqMqSXKueCkrhuA9pEGwX4ZmL3E-UYjR3vp0BKcu1AD2USc-HybqhtfvHWSo66OGbOjmRZ7VyYO2zdVm_XuHORdbXkrwwVegbrto5g6HEgM5GXDX4jnAquOKlfnBemkAz0Pz5Gxw66h2o5QNE7tXsbJqz3nDZu45liN1SleVrh3ituR-LvHTPmqaCxywpGe9UxXRGz8yNYq88MY4ImtXlb1iryd1eKZJJSfJDwxfkT0yNLzWbeuVIMdUCZH-Bb24L_Y0jd8rW1o6-A1gmmL5yEhwN5mwM5Jmurx0HNqABv5iOGhaTj9Pj-ac5dEe6FfZ9TMwuzUBAtL9A0V_1m00]-->
  </g>
            </svg>
          </artwork>
        </figure>
        <t>Since new Publications are always eligible to send, if any were created while in "process cAdd", the next state is "process Pubs to send" with csID set to the csID field of the cAdd on entry to "process cAdd". In "process Pubs to send" any pending sendCState will be canceled and eligible Pubs are packaged as content for a new cAdd. Packaged Publications are subject to a hold time (during which they are ineligible to send) of twice the dispersion delay to avoid responding to cStates sent before reception of a cAdd containing the Pub. If there are Pubs to send, a cAdd with that content and the passed in csID is sent, then the set sendCStateTimer state is entered; when there are no Pubs to send, the action moves there directly.</t>
        <t>Another path to exit the "wait for event" state is reception of a cState which moves to "process cState" where incoming cStates are recorded, If this cState matches the local cState, the syncps returns to the wait state. Otherwise, the IBLT is extracted from the cState, an IBLT is computed on the local Pub collection, and they are peeled to find the ones the received cState has that are not in the local collection ("needs") and the ones that are in the local collection and not in the received cState ("haves"). Syncps enters the "process Pubs to send" state with csID set to the hash of the cState's name. Eligible Pubs are "haves" that do not have a hold time set and locally generated Publications are sent preferentially. Publications obtained from others are not immediately eligible to send; members delay to give the originator time to respond, sending these when further cStates indicate a member continues to need them.</t>
        <t>A syncps also exits the wait state when the attached shim has a Publication to send. Since a new Pub will not appear in any previously issued cState, any one can be used, including one issued locally. In "get stored cState", the best one (the most recent cState from the network if available) is retrieved and passed to the "peel IBLT values" state where its cState.csID is used for the csID value. There will always be at least the one new Publication to send in this case.</t>
        <t>This state diagram is intended to capture the major functionality of a syncps module while excluding excessive detail. In particular, <xref target="figSD"/> does not show "housekeeping" tasks on the collection, e.g., removal of expired Publications.</t>
      </section>
      <section anchor="deftt-formats">
        <name>DeftT formats</name>
        <t>All DeftT Information is represented using TLV (Type, Length, Value) tuples.
Types can either be containers (they contain a concatenated sequence of TLVs)
or leaves (they contain a single non-TLV value with well-defined semantics
and serialization). All TLVs have a boolean 'valid()' method that returns 'true'
if and only if their content satisfies all the constraints associated with the
TLV's type. For container types this means, at minimum, that the sum of all the
enclosed TLV Lengths and header sizes exactly equals the Length of the container
and that the valid() method of each of the enclosed TLVs returns true. Most
container types have additional constraints on the type, ordering and value of the
enclosed TLVs that are described below.</t>
        <section anchor="top-level-container-tlvs">
          <name>Top level container TLVs</name>
          <t>As shown in <xref target="fig13"/> there are two kinds of top level containers: PDUs which are exchanged
with the system-provided network transport and carry Pubs, the other top level container,
which are the elements of the set synchronization protocol.
PDUS and Pubs have similar structure and share most of their code but are designed to be
unambiguously distinguishable.
As indicated in <xref target="fig4"/> and <xref target="fig13"/>, syncps uses a pub/sub model for both its shim facing and network facing interfaces.
Thus the first TLV in any top level container is a <tt>Name</tt> container
comprising the topic name used to mediate the pub/sub rendezvous.
The other TLVs in the top level container depend on the kind of container.</t>
          <t>There are two kinds of PDU containers: <tt>cState</tt> and <tt>cAdd</tt> and two kinds of
of Publications, <tt>publications</tt> and <tt>certs</tt>. All four are described in the following
section.</t>
          <section anchor="cstate-pdus">
            <name>cState PDUs</name>
            <t>A <tt>cState</tt> PDU (TLV type 5) announces the items a member
holds in a specific collection of a specific trust domain subnet.
It must contain the following three TLVs and they must be in this order:</t>
            <ol>
<li>
                <t><tt>Name</tt> TLV containing exactly three type <tt>Generic</tt> (aka, byte array or binary blob) components:</t>
                <ol spacing="compact" type="C%d:">
<li>Sync zone id consisting of the first 8 bytes of the SHA-256 thumbprint of the communication schema cert in use for this domain (may be the same as the trust domain id).</li>
                  <li>Collection name</li>
                  <li>Run-length compressed IBLT of the items in the publisher's instance of the collection (see <xref target="syncps-a-set-reconciliation-protocol"/> for more information on IBLTs).</li>
                </ol>
              </li>
              <li>
                <t><tt>Nonce</tt> (TLV type 10, leaf) whose value must be 4 random bytes
chosen by the publisher at the time the cState is built.
Duplicate cStates can arise from multiple members announcing the same <tt>Name</tt> because
they hold the same items or because the network doesn't handle multicast well and
lets PDUs loop. The nonce allows these two cases to be distinguished so looping
cStates can be dropped.</t>
              </li>
              <li>
                <t><tt>Lifetime</tt> (TLV type 12, leaf) whose value is the lifetime (measured
in milliseconds since this PDU's arrival) serialized as an unsigned big-endian integer with all
leading zero bytes suppressed. A member receiving the <tt>cState</tt> and
capable of publishing into the collection can hold onto the <tt>cState</tt> for this lifetime. If the member
has an item to publish before the end of the <tt>cState</tt>'s lifetime, the Publication can be sent immediately
in a responding <tt>cAdd</tt>.</t>
              </li>
            </ol>
            <t>For example, the initial PDU sent by the home IoT "gate controller" sample app
(in examples/hmIot of <xref target="DCT"/>) will be a cState in the <strong>cert</strong> collection and looks like:</t>
            <artwork><![CDATA[5 (cState) size 128:
| 7 (Name) size 116:
| | 8 (Generic) size 8:  55d5 7f99 7d8d ba91
| | 8 (Generic) size 4:  cert
| | 8 (Generic) size 98:  8201 dd76 eb0f 46ed  89a8 8101 dd76 eb0f  46..
| |                       beb5 9922 fdd6 7401  cbbe 5bc1 5b57 1c63  84..
| |                       79aa ca17 8501 cbbe  5bc1 5b57 1c63 8801  ce..
| |                       92f8
| 10 (Nonce) size 4:  8b9f 8134
| 12 (Lifetime) size 2:  4789
]]>
</artwork>
            <t>Note that the format inspections of this section are produced by using the <tt>dctwatch</tt> tool from <xref target="DCT"/> with the <tt>-f</tt> option.</t>
          </section>
          <section anchor="cadd-pdus">
            <name>cAdd PDUs</name>
            <t>Note: <tt>cAdds</tt>, <tt>Publications</tt> and <tt>Certificates</tt> all share the same <tt>Data</tt> (TLV type 6) container
format but are distinguished by its <tt>Metainfo</tt> TLV. They all contain the same five
TLVs in the same order but each has different constraints on the value of those TLVs.</t>
            <t>A <tt>cAdd</tt> PDU (TLV type 6) supplies one or more Pubs in response to some <tt>cState</tt>.
It must contain the following five TLVs and they must be in this order:</t>
            <ol>
<li>
                <t><tt>Name</tt> TLV derived from the cState's <tt>Name</tt>: the first two components,
sync zone id and collection name, are the same but the IBLT component is replaced
by a <tt>csID</tt> (TLV type 35, leaf) whose value must be the 32 bit big-endian
Murmurhash of the cState's entire <tt>Name</tt> TLV. (This is done because "Repeat
the question and append the answer" is the common strategy for matching responses
to requests in multicast protocols but an IBLT can be hundreds of bytes which
would drastically reduce the cAdd's payload space so "the
question" is replaced with a compact hash proxy.)</t>
              </li>
              <li>
                <t><tt>Metainfo</tt> (TLV type 20) saying the PDU's <tt>ContentType</tt> is cAdd (42),
i.e., contains one or more Pubs and nothing else so it must be 'structurally
validated' on arrival.</t>
              </li>
              <li>
                <t><tt>Content</tt> container (TLV type 21) which must contain one or more complete, valid Pubs.
The Pubs must NOT already be in the cState's IBLT. I.e., the Pubs must be newly created
on the cAdd publisher or in the 'need' set when the difference between the publisher's
IBLT and the cState's IBLT is 'peeled' (see  <xref target="DIFF"/> and the DeftT example implementation's
<eref target="https://github.com/pollere/DCT/blob/main/include/dct/syncps/syncps.hpp#L460">handleCState code</eref>
for details).</t>
              </li>
              <li>
                <t><tt>SigInfo</tt> container (TLV type 22) which must contain a <tt>SigType</tt> (TLV 27, leaf)
containing a valid keyed or unkeyed signature type from the types listed in <xref target="leaf-tlvs"/>.
If and only if the signature type is keyed (i.e., validation requires the public key cert of
a public/private keypair), the <tt>SigInfo</tt> must contain <tt>KeyLocator</tt> (TLV 28) containing
a <tt>KeyDigest</tt> (TLV 29, leaf) of length 32 bytes containing the thumbprint of the cert
needed for validation. The SigType must match the type of the PDU signature validator
associated with the collection.</t>
              </li>
              <li>
                <t><tt>SigValue</tt> (TLV type 23, leaf) containing the result of signing the cAdd PDU with
using the algorithm and key, if any, specified by the <tt>SigInfo</tt>. The Length of the TLV
must match the length used by the signature type as per <xref target="leaf-tlvs"/>. The PDU signature
validator must successfully validate the signature.</t>
              </li>
            </ol>
            <t>For example, the following is the frontdoor's cAdd responding to the cState, shown above,
for the <strong>cert</strong> collection.
The <strong>cert</strong> collection is synced by the certificate distributor which can't use any
signature types that depend on keys since it's responsible for obtaining the
certificates containing the keys that would be needed to validate a PDU's signature.
Thus, it is the <em>only</em> collection allowed to use an unkeyed <xref target="RFC7693"/> BLAKE2 MAC to
integrity check its PDUs
(this is why <xref target="sigmgrschema"/> does not specify a separate validator for cert PDUs).
Since the content is self-authenticating public key certs, this doesn't cause security issues.</t>
            <artwork><![CDATA[6 (Data) size 561:
| 7 (Name) size 22:
| | 8 (Generic) size 8:  55d5 7f99 7d8d ba91
| | 8 (Generic) size 4:  cert
| | 35 (csID) size 4:  f6d7 3d84
| 20 (MetaInfo) size 3:
| | 24 (ContentType) size 1:  42 (CAdd)
| 21 (Content) size 489:
         ... (489 bytes of Content elided)
| 22 (SigInfo) size 3:
| | 27 (SigType) size 1:  9 (RFC7693)
| 23 (SigValue) size 32:  af8e 1412 e659 103f  5237 f1e1 0e7b 0af8  9c..
]]>
</artwork>
            <t>Except for this collection, PDU and Publication signature types are specified in the schema.
PDUs typically use AEAD with a locally elected cover key distributor to protect the
content privacy. Publications typically use EdDSA to provide provenance and ABAC attributes via the signing chain
or a combined AEAD and EdDSA signature type (AEADSGN) to constrain content disclosure to some limited group.
All encrypted content must remain encrypted, in motion or at rest,
from point of origin to point(s) of use.
The <tt>syncps</tt> <tt>subscribe</tt> upcall may decrypt a piece of content for <em>ephemeral</em> use but
the callee must NOT
retain the plaintext form.</t>
          </section>
          <section anchor="publications">
            <name>Publications</name>
            <t>As noted above, a <tt>Publication</tt> must be in a <tt>Data</tt> TLV containing the same five TLVs in the same order as
cAdds and Certificates.
<tt>Publications</tt> are distinguished by having a <tt>Metainfo</tt> <tt>ContentType</tt> of <tt>Blob</tt> (0).</t>
            <t>DeftT communicates via Publications which are currently organized into collections of <em>msgs</em> and <em>keys</em>.</t>
            <t>A <tt>Publication</tt> (TLV type 6) must contain the following five TLVs and they must be in this order:</t>
            <ol>
<li>
                <t><tt>Name</tt> TLV which must contain at least three components and the first component's length must be non-zero.
The schema specifies the format of the <tt>Name</tt> including number and type of components,
allowed values, allowed signers, etc.
Implementations must construct and sign Pubs so that they are consistent with the schema.
(The example implementation's applications show that this can be done automatically
with minimal application involvement, e.g., see the
<eref target="https://github.com/pollere/DCT/blob/main/examples/office/phone.cpp">phone app</eref> in the office
control example.)
Implementations must fully validate Publications both cryptographically and against the schema
before adding them to the collection.
Implementations must NOT add a Publication to a collection that already contains it.</t>
              </li>
              <li>
                <t><tt>Metainfo</tt> (TLV type 20) saying the Publication's <tt>ContentType</tt> is Blob (0),
i.e., contains arbitrary bytes that can't be 'structurally' validated (but
are always cryptographically validated for integrity and authorization by
the signature check)..</t>
              </li>
              <li>
                <t><tt>Content</tt> container (TLV type 21) containing <em>Length</em> bytes. <em>Length</em> may be zero.</t>
              </li>
              <li>
                <t><tt>SigInfo</tt> container (TLV type 22) which must contain exactly two TLVs:
a <tt>SigType</tt> (TLV type 27, leaf) containing a valid keyed signature type from the types listed in <xref target="leaf-tlvs"/>
followed by a <tt>KeyLocator</tt> (TLV type 28) containing
a <tt>KeyDigest</tt> (TLV type 29, leaf) of length 32 bytes containing the thumbprint of the cert
needed to validate the signature. The SigType in the Publication must match the collection's
Publication validator which must match the <tt>#pubValidator</tt> specified in the schema.</t>
              </li>
              <li>
                <t><tt>SigValue</tt> (TLV type 23, leaf) containing the result of signing the Publication
using the algorithm and key specified by the <tt>SigInfo</tt>. The Length of the TLV
must match the length used by the signature type as per <xref target="leaf-tlvs"/>.
The collection's publication signature validator must successfully validate the signature.</t>
              </li>
            </ol>
            <t>For example, what follows are two consecutive Publications made to the <tt>msgs</tt> collection.
First, operator alice publishes a command for all lock devices to lock themselves
(similar to the multiple subscriptions per-light shown in <xref target="fig1"/>, the schema requires that all
lockable devices subscribe to the <tt>iot1/lock/command/all</tt> prefix in <tt>msgs</tt>):</t>
            <artwork><![CDATA[6 (Data) size 216:
| 7 (Name) size 68:
| | 8 (Generic) size 4:  iot1
| | 8 (Generic) size 4:  lock
| | 8 (Generic) size 7:  command
| | 8 (Generic) size 3:  all
| | 8 (Generic) size 4:  lock
| | 8 (Generic) size 17:  p38863@aphone.local
| | 37 (SequenceNum) size 4:  b4a1 ea2a
| | 37 (SequenceNum) size 0:
| | 36 (Timestamp) size 7:  23-09-18@19:40:45.591793
| 20 (MetaInfo) size 3:
| | 24 (ContentType) size 1:  0 (Blob)
| 21 (Content) size 32:  Msg #3 from operator:alice-38863
| 22 (SigInfo) size 39:
| | 27 (SigType) size 1:  8 (EdDSA)
| | 28 (KeyLocator) size 34:
| | | 29 (KeyDigest) size 32:  7096 5de9 6848 7543  d2c8 e459 24fb 7b0..
| 23 (SigValue) size 64:  61b3 fc3c 03df 2c89  7a0c ddae 27a2 f883  dd..
|                         2699 899f 1c91 46c1  3127 9da8 8948 e783  68..
]]>
</artwork>
            <t>Three milliseconds later, the gate publishes that it has locked itself:</t>
            <artwork><![CDATA[6 (Data) size 214:
| 7 (Name) size 69:
| | 8 (Generic) size 4:  iot1
| | 8 (Generic) size 4:  lock
| | 8 (Generic) size 5:  event
| | 8 (Generic) size 4:  gate
| | 8 (Generic) size 6:  locked
| | 8 (Generic) size 17:  p59280@rpi2.local
| | 37 (SequenceNum) size 4:  e131 5a4b
| | 37 (SequenceNum) size 0:
| | 36 (Timestamp) size 7:  23-09-18@19:40:45.594867
| 20 (MetaInfo) size 3:
| | 24 (ContentType) size 1:  0 (Blob)
| 21 (Content) size 29:  Msg #3 from device:gate-59280
| 22 (SigInfo) size 39:
| | 27 (SigType) size 1:  8 (EdDSA)
| | 28 (KeyLocator) size 34:
| | | 29 (KeyDigest) size 32:  3dde 0f21 beae 2c20  3ea3 5c2e 77ca 9d4..
| 23 (SigValue) size 64:  3913 011d 7e74 807c  94b5 e725 a8e7 5b2f  09..
|                         bc99 9c8b fa9f f929  4722 f23a 1fbe cd84  b6..

]]>
</artwork>
            <t>As described in <xref target="security-considerations"/>, the schema is
designed for spoofing and replay protection of Publications.
<xref target="syncps-a-set-reconciliation-protocol"/> notes that the per-publication EdDSA signature prevents spoofing or modification.
Since all collections ignore duplicates of an existing publication, replays of
anything in the collection will be ignored.
Publications have a collection-dependent lifetime that is generally ephemeral.
To keep collections from growing without bound, Publications are removed once their
arrival time plus lifetime exceeds the node's local time.
Arriving Publications are ignored if their timestamp (name component 9) plus a
collection-dependent "expiry time" is after the node's local time.
"lifetime" is substantially larger then "expiry time"
to account for clock skew so the combination of these two mechanisms prevents all replay.</t>
          </section>
          <section anchor="certificates">
            <name>Certificates</name>
            <t>As noted above, a <tt>Certificate</tt> must be in a <tt>Data</tt> TLV containing the same five TLVs in the same order as
<tt>cAdds</tt> and <tt>Publications</tt>.
<tt>Certificates</tt> are distinguished by having a <tt>Metainfo</tt> <tt>ContentType</tt> of <tt>Key</tt> (2) and by having a <tt>Validity
Period</tt> specified according to a more rigorous subset of the rules in <xref target="RFC1422"/> section 3.3.6
as described in item 5 below.</t>
            <t>A <tt>Certificate</tt> (TLV type 6) must contain the following five TLVs and they must be in this order:</t>
            <ol>
<li>
                <t><tt>Name</tt> TLV which must contain at least five components and the first component's length must be non-zero.
The schema specifies the format of the <tt>Name</tt> including number and type of components, allowed values, allowed
signers, etc. Implementations must construct and sign certs so that they are consistent with the schema.
(Tools to do this are supplied with the example implementation.)
Implementations must fully validate certs both cryptographically and against the schema
before adding accepting them. "Fully validating" requires that the cert's signer has been
accepted thus a cert cannot be accepted until its entire signing chain has been
accepted.</t>
              </li>
              <li>
                <t><tt>Metainfo</tt> (TLV type 20) saying the Cert's <tt>ContentType</tt> is Key (2),
This means the container has no TLV structure to validate.</t>
              </li>
              <li>
                <t><tt>Content</tt> container (TLV type 21) containing <em>Length</em> bytes. <em>Length</em> must equal
the size of the public key associated with the cert's <tt>SigInfo SigType</tt></t>
              </li>
              <li>
                <t><tt>SigInfo</tt> container (TLV type 22) which must contain exactly two TLVs:
a <tt>SigType</tt> (TLV type 27, leaf) containing a valid keyed signature type from the types listed in <xref target="leaf-tlvs"/>
followed by a <tt>KeyLocator</tt> (TLV type 28) containing
a <tt>KeyDigest</tt> (TLV type 29, leaf) of length 32 bytes containing the thumbprint of the cert
needed to validate the signature.
The <tt>KeyDigest</tt> must be followed by a <tt>Validity Period</tt> (TLV 253) containing
a <tt>NotBefore</tt> (TLV 254, leaf) containing a valid 15 character ISO 8601-1:2019 format GMT timepoint
followed by
a <tt>NotAfter</tt> (TLV 255, leaf) containing a valid 15 character ISO 8601-1:2019 format GMT timepoint.
The cert must be ignored if the <tt>NotBefore</tt> value is &gt;= the <tt>NotAfter</tt> value, if the <tt>NotAfter</tt>
value is &lt; the current time or if the validity period is not completely contained within
its signing cert's validity period.
The SigType in the Cert must match the <tt>#certValidator</tt> type specified in the schema.</t>
              </li>
              <li>
                <t><tt>SigValue</tt> (TLV type 23, leaf) containing the result of signing the Cert
using the algorithm and key specified by the <tt>SigInfo</tt>. The Length of the TLV
must match the length used by the signature type as per <xref target="leaf-tlvs"/>.</t>
              </li>
            </ol>
            <t>For example, what follows is the frontdoor's identity cert used in the home IoT example which gets added
to the "cert" collection:</t>
            <artwork><![CDATA[6 (Data) size 240:
| 7 (Name) size 50:
| | 8 (Generic) size 4:  iot2
| | 8 (Generic) size 6:  device
| | 8 (Generic) size 9:  frontdoor
| | 8 (Generic) size 3:  KEY
| | 8 (Generic) size 4:  0eaf f793
| | 8 (Generic) size 3:  dct
| | 36 (Timestamp) size 7:  23-02-18@18:17:46.088971
| 20 (MetaInfo) size 3:
| | 24 (ContentType) size 1:  2 (Key)
| 21 (Content) size 32:  de19 4605 7f77 a7bd  1317 de41 002c fe15  1bc..
| 22 (SigInfo) size 81:
| | 27 (SigType) size 1:  8 (EdDSA)
| | 28 (KeyLocator) size 34:
| | | 29 (KeyDigest) size 32:  8c7f 1de9 ebc9 17b6  a8e9 dce9 056a 74c..
| | 253 (Validity) size 38:
| | | 254 (NotBefore) size 15:  20230219T021746
| | | 255 (NotAfter) size 15:  20240219T021746
| 23 (SigValue) size 64:  c8b9 5883 4b9a 8aac  9ad0 e5e4 5eef 0a18  4b..
|                         1b3a 1574 58d4 0528  1740 883e d90c 836f  ed..
]]>
</artwork>
          </section>
        </section>
        <section anchor="leaf-tlvs">
          <name>Leaf TLVs</name>
          <t>Most of DeftT's leaf TLVs were described above but there are two important
enumeration types, name components and signature types, with particular
constraints and implications.</t>
          <t>There are four types of components allowed in a <tt>Name</tt> (TLV 7):</t>
          <table anchor="namecomponents">
            <name>Name Component Types</name>
            <thead>
              <tr>
                <th>Type</th>
                <th>TLV</th>
                <th>Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>
                  <tt>Generic</tt></td>
                <td>8</td>
                <td>Arbitrary blob of bytes</td>
              </tr>
              <tr>
                <td>
                  <tt>csID</tt></td>
                <td>35</td>
                <td>32-bit murmurhash of cState name (number)</td>
              </tr>
              <tr>
                <td>
                  <tt>Timestamp</tt></td>
                <td>36</td>
                <td>GMT time point in microseconds (number)</td>
              </tr>
              <tr>
                <td>
                  <tt>SequenceNum</tt></td>
                <td>37</td>
                <td>unsigned 64-bit integer (number)</td>
              </tr>
            </tbody>
          </table>
          <t>"Number" types are encoded in big-endian order (MSB first) with all leading zero bytes
suppressed. Thus their length can be zero to eight bytes. For example, a <tt>SequenceNum</tt> of 0
would be <tt>[37, 0]</tt>, 100 would be <tt>[37, 1, 100]</tt> and 1,000,000 would be <tt>[37, 3, 15, 66, 64]</tt>.</t>
          <t>There are five types of signature allowed in a <tt>SigType</tt> (TLV 27) and each requires
the <tt>SigValue</tt> (TLV 23) in a <tt>Data</tt> with that <tt>SigType</tt> have a particular size:</t>
          <table anchor="sigtypes">
            <name>Signature Types</name>
            <thead>
              <tr>
                <th>Type</th>
                <th>Value</th>
                <th>SigValue length</th>
                <th>Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>stSHA256</td>
                <td>0</td>
                <td>32</td>
                <td>SHA256 data integrity</td>
              </tr>
              <tr>
                <td>stAEAD</td>
                <td>7</td>
                <td>40</td>
                <td>
                  <xref target="RFC8103"/> content privacy plus full data integrity</td>
              </tr>
              <tr>
                <td>stEdDSA</td>
                <td>8</td>
                <td>64</td>
                <td>Ed25519 provenance and full data integrity</td>
              </tr>
              <tr>
                <td>stRFC7693</td>
                <td>9</td>
                <td>64</td>
                <td>
                  <xref target="RFC7693"/> full data integrity</td>
              </tr>
              <tr>
                <td>stAEADSGN</td>
                <td>13</td>
                <td>104</td>
                <td>
                  <xref target="RFC8103"/> content privacy with Ed25519 provenance and data integrity</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="tlv-header-details">
          <name>TLV header details</name>
          <t>All TLV headers use the same format. They occupy either 2 or 4 bytes, depending
on the value of <em>L</em>.
<em>L</em> specifies the length in bytes of <em>V</em>.
Lengths in the range 0 to 252 occupy one byte.
A length of zero is allowed and indicates there are no <em>V</em> bytes.
Lengths in the range 253 to 65535 occupy three bytes: a 'flag byte' of 253 followed by
the two bytes of the 16 bit length in big endian order.
Lengths greater than 65535 (deliberately) can not be represented so a DeftT object can be
no larger than 65535+4 = 65539 bytes. (Objects of arbitrary size can be handled by
a segmentation/reassembly layer above DeftT such as <tt>dct/shims/mbps.hpp</tt> in the
example implementation.)</t>
          <t><em>L</em> must use the minimum description length coding. For example, a length of 0 must be encoded as the
single byte [0], not as the 3 bytes [253, 0, 0], 252 is encoded as [252], 253 as [253, 0, 253],
256 as [253, 1, 0] and 65535 as [253, 255, 255].</t>
          <t><em>T</em> specifies the type of data in the container.
It occupies one byte, must be an element of the valid types set defined below, and must conform to
that element's rules.</t>
        </section>
      </section>
      <section anchor="application-and-network-interface">
        <name>Application and network interface</name>
        <t><xref target="fig4"/> and <xref target="fig13"/> show the blocks and modules application information passes through in DeftT
and may be useful references for this subsection.
In a trust domain, applications pass information to be communicated to their DeftT,
which packages it into Publication(s) that are added to the local collection copy.
These Publications are also sent in a PDU via the system network interface to be received
by other members of the domain which add the Publications to their local collections.
If a received Publication matches a subscription,
the information it contains is passed to the application.
(For more detail, see the library at <xref target="DCT"/>.)
DeftT is organized into modules that perform its tasks.
A DeftT <strong>shim</strong> exchanges information with applications.
The example implementation <xref target="DCT"/> provides a message-based publish/subscribe (<em>mbps</em>) API that exchanges messages
with the application and Publications with the sync protocol.
(Other APIs are possible.)
DeftT startup begins when a shim object is instantiated by the application and given its identity bundle.
Startup includes creating a certificate distributor and, optionally, group key distributors, depending on schema-specified signing.
After startup, the <strong>msgs</strong> syncps of each member will maintain a cState containing the IBLT of its view of the collection.
(In the stable, synchronized state, all members of a collection will have the same IBLT.)</t>
        <t>Applications subscribe to all messages, or to a subset by topic,
by passing a callback function to the mbps <em>subscribe</em> method.
Application subscriptions are turned into syncps subscriptions via mbps.
An application with new information to communicate passes the formatted
topic items as parameters and the other content in a message via a <em>publish</em> call.
Only the topic components and the message, if any,
are passed between the application and mbps.
Mbps adds mbps-specific components to the parameter list and invokes a
<strong>schemaLib</strong> method that builds a valid (according to the schema) Publication
and can be passed to <strong>syncps</strong> to publish.
Messages that exceed the content size limits of a single Publication are segmented by
mbps and carried in multiple Publications.
If a member's identity chain lacks the attributes required for a specific Publication,
no Publication is built.
The Publication is signed using the <em>sign</em> method of the appropriate <strong>sigmgr</strong> and passed to <strong>syncps</strong>.</t>
        <t><strong>syncps</strong> adds this Publication to its collection and updates its IBLT to contain the new Publication.
Since its application just created it, the Publication is a new addition and thus is always a response to the current cState.
The Publication is packaged into a cAdd and signed using the <em>sign</em> method of the designated <strong>sigmgr</strong>  and passed to the face.
The updated IBLT is packaged into a new cState that is handed to the face.</t>
        <t>Trust domain members only process cAdds that share their trust domain identifier (<xref target="cstate-pdus"/> and <xref target="cadd-pdus"/>).
When a new cAdd is received at a member, the face ensures it matches an outstanding cState and,
if so, passes it on to its matching syncps(es).
Syncps validates (both structurally and cryptographically) the cAdd using the appropriate sigmgr's <em>validate</em> and continues, removing Publications, if valid. Each Publication is structurally validated via a sigmgr and valid Publications are added to the local collection and IBLT. syncps passes this updated cState to the local face.
If this Publication matches a subscription it is passed to mbps,
invoking the sigmgr's decrypt if the Publication is encrypted.
(Publication decryption is <em>not</em> available at relays.)
<strong>mbps</strong> receives the Publication and passes any topic components of interest to the application along with the content (if any)
via the callback registered when it subscribed. (If the original content was spread across Publications, mbps will wait until all of the content is received. The <em>sCnt</em> component of a mbps Publication Name is used for this.)</t>
      </section>
      <section anchor="synchronizing-a-collection">
        <name>Synchronizing a collection</name>
        <t>DeftT works on unicast (as a special case of multicast) links,
but is designed to take full advantage of a multicast subnet (e.g., link-level IPv6 multicast on broadcast media)
with syncps orchestrating collection-based communications.
Members' syncps modules interact on a multicast subnet to keep their collections synchronized.
The following example illustrates member actions and communications to synchronize a collection
(see also the sequence diagram in <xref target="figSeq"/>).</t>
        <t>Starting with all members <em>connected</em> to the collection (having confirmed publication of their identity credentials)
and with an empty <strong>msgs</strong> collection (i.e., no applications have active Publications),
member2's application passes content to its DeftT via an mbps.publish().
The content is packaged into a Publication (p1) and passed to syncps which creates and sends a cAdd PDU.
The cAdd uses a hash of the shared (empty) cState  as its cState identifier
(third component of the <tt>Name</tt> -- see <xref target="cadd-pdus"/> item 1)
to indicate the Publication(s) it carries are additions to the collection in that state.
Member2's new local cState (containing p1) is scheduled to be sent at a delay of the subnet's
dispersion time (<em>d)</em> plus a small random value (<em>r</em>).
Dispersion time is an estimate of the expected time for a cAdd to reach every member's collection.
It may be a fixed or adaptive estimate and syncps is robust to inaccuracies: an overestimate may lead to longer delays
and an underestimate may lead to more cState traffic on the channel.
Members receive and validate the cAdd, then extract and validate p1, passing it to subscriptions.
Each member schedules a sendCState after a small random delay <em>r</em>.
(Scheduling a new sendCState cancels any pending sendCState.)
When the sendCState timer expires, a new local cState is created with the IBLT of the collection
(which will contain p1).
This cState's expiration time is scheduled (value significantly longer than <em>d</em>) and the member sends the cState
unless it is <em>suppressed</em>.
DeftT suppresses cStates that are identical to one that has already been heard twice.
If member2 is waiting to confirm p1, it can do so with the first of these cStates it receives.
In <xref target="figSeq"/>, member6 did not receive the cAdd but reception of one of the new cStates shows the presence of
p1 so member6 immediately sends its own local cState (which has an empty collection, lacking member2's Publication).
In this example, all members receive member6's cState, but member2, as p1's originator,
responds preferentially and sends p1 in a new cAdd immediately.
All other members set a timer (to <em>d+r</em>) to send p1.
That timer is cancelled if the member receives a cAdd responding to member6's cState that contains p1.
Meanwhile, member6 receives the new cAdd, adds p1 to its collection and schedules a new cState for delay <em>r</em>.
That cState will be suppressed as it matches those already sent by the other members.
Now the distributed collection is synchronized with a state of one Publication (p1).
If no other application content is created, cStates will be sent at ~cStateLifetime.
On the channel, we will see one cState per ~cStateLifetime since each overlaps enough to suppress others.
When p1 expires, it will be removed at each local collection and the subsequent cState will show an empty collection.</t>
        <figure anchor="figSeq">
          <name>Seven members using DeftT on a multicast subnet
</name>
          <artwork type="svg" originalSrc="./figs/syncseq-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="80%" version="1.1" viewBox="0 0 1024 1218" width="80%">
              <desc>syncseq-rfc</desc>
              <defs/>
              <g>
                <text fill="black" font-family="sans-serif" font-size="22" font-weight="bold" x="292.5" y="35.4209">Simple Collection Synchronization</text>
                <line x1="79" x2="79" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="79" x2="79" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="247" x2="247" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="414" x2="414" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="563.5" x2="563.5" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="712" x2="712" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="827" x2="827" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="82.9063" y2="247.7031" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="247.7031" y2="288.5078" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="288.5078" y2="608.3672" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="608.3672" y2="649.1719" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="649.1719" y2="725.4375" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="725.4375" y2="766.2422" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="766.2422" y2="944.1719" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="944.1719" y2="984.9766" stroke="black" stroke-width="1.0"/>
                <line x1="942" x2="942" y1="984.9766" y2="1182.9063" stroke="black" stroke-width="1.0"/>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="37" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="44" y="71.6045">member1</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="37" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="44" y="1201.9014">member1</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="84" x="205" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="212" y="71.6045">member2</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="84" x="205" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="212" y="1201.9014">member2</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="372" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="379" y="71.6045">member3</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="372" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="379" y="1201.9014">member3</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="84" x="521.5" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="528.5" y="71.6045">member4</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="84" x="521.5" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="528.5" y="1201.9014">member4</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="670" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="677" y="71.6045">member5</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="670" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="677" y="1201.9014">member5</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="785" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="792" y="71.6045">member6</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="785" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="792" y="1201.9014">member6</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="900" y="51.6094" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="907" y="71.6045">member7</text>
                <rect fill="white" height="30.2969" rx="2.5" ry="2.5" width="85" x="900" y="1181.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="14" x="907" y="1201.9014">member7</text>
                <rect fill="white" height="3" width="1012" x="5" y="113.4727" stroke="#FFFFFF" stroke-width="1.0"/>
                <line x1="5" x2="1017" y1="113.4727" y2="113.4727" stroke="black" stroke-width="0.5"/>
                <line x1="5" x2="1017" y1="116.4727" y2="116.4727" stroke="black" stroke-width="0.5"/>
                <rect fill="white" height="23.1328" width="404" x="309" y="102.9063" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" font-weight="bold" x="315" y="118.9731">synchronized empty collection (no Pubs) cState(0)</text>
                <rect fill="white" height="38" width="142" x="176" y="141.0391" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="180" y="157.106">send cAdd(0,p1)</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="180" y="172.2388">(re)sched cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="290" y="172.2388">d+r</text>
                <rect fill="white" height="53" width="139" x="10" y="189.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="14" y="205.3716">rcv cAdd &amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="14" y="220.5044">extract p1&amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="14" y="235.6372">(re)sched cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="124" y="235.6372">r</text>
                <rect fill="white" height="53" width="139" x="345" y="189.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="349" y="205.3716">rcv cAdd &amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="349" y="220.5044">extract p1&amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="349" y="235.6372">(re)sched cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="459" y="235.6372">r</text>
                <rect fill="white" height="53" width="139" x="873" y="189.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="877" y="205.3716">rcv cAdd &amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="877" y="220.5044">extract p1&amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="877" y="235.6372">(re)sched cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="987" y="235.6372">r</text>
                <rect fill="white" height="53" width="139" x="643" y="189.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="647" y="205.3716">rcv cAdd &amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="647" y="220.5044">extract p1&amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="647" y="235.6372">(re)sched cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="757" y="235.6372">r</text>
                <rect fill="white" height="53" width="139" x="494" y="189.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="498" y="205.3716">rcv cAdd &amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="498" y="220.5044">extract p1&amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="498" y="235.6372">(re)sched cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="608" y="235.6372">r</text>
                <text fill="black" font-family="sans-serif" font-size="11" x="414.5" y="271.9136">the smallest random</text>
                <text fill="black" font-family="sans-serif" font-size="11" font-style="italic" x="536.5" y="271.9136">r</text>
                <text fill="black" font-family="sans-serif" font-size="11" x="545.5" y="271.9136">value later</text>
                <rect fill="white" height="38" width="135" x="12" y="293.5078" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="16" y="309.5747">send cState(p1)</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="16" y="324.7075">sched cState expiry</text>
                <rect fill="white" height="38" width="135" x="496" y="341.7734" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="500" y="357.8403">send cState(p1)</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="500" y="372.9731">sched cState expiry</text>
                <rect fill="white" height="38" width="963" x="29" y="390.0391" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="267.5" y="406.106">members receiving two identical cStates suppress sending identical cStates</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="267.5" y="421.2388">schedule received cState expiry</text>
                <rect fill="white" height="38" width="133" x="761" y="438.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="765" y="454.3716">rcv cState(p1)</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="765" y="469.5044">send own cState(0)</text>
                <rect fill="white" height="53" width="176" x="159" y="486.5703" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="163" y="502.6372">send cAdd(0,p1) response</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="163" y="517.77">as p1 is a "have" Pub</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="163" y="532.9028">originated locally</text>
                <rect fill="white" height="53" width="139" x="10" y="486.5703" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="14" y="502.6372">set timer to respond</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="14" y="517.77">other's response</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="14" y="532.9028">will cancel</text>
                <rect fill="white" height="53" width="139" x="345" y="486.5703" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="349" y="502.6372">set timer to respond</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="349" y="517.77">other's response</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="349" y="532.9028">will cancel</text>
                <rect fill="white" height="53" width="139" x="494" y="486.5703" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="498" y="502.6372">set timer to respond</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="498" y="517.77">other's response</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="498" y="532.9028">will cancel</text>
                <rect fill="white" height="53" width="139" x="643" y="486.5703" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="647" y="502.6372">set timer to respond</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="647" y="517.77">other's response</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="647" y="532.9028">will cancel</text>
                <rect fill="white" height="53" width="139" x="873" y="486.5703" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="877" y="502.6372">set timer to respond</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="877" y="517.77">other's response</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="877" y="532.9028">will cancel</text>
                <rect fill="white" height="53" width="139" x="758" y="549.9688" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="762" y="566.0356">rcv cAdd &amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="762" y="581.1685">extract p1&amp; validate</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="762" y="596.3013">schedule cState</text>
                <text fill="black" font-family="sans-serif" font-size="13" font-style="italic" x="868" y="596.3013">r</text>
                <text fill="black" font-family="sans-serif" font-size="11" x="459" y="632.5776">member6's</text>
                <text fill="black" font-family="sans-serif" font-size="11" font-style="italic" x="528" y="632.5776">r</text>
                <text fill="black" font-family="sans-serif" font-size="11" x="537" y="632.5776">later</text>
                <rect fill="white" height="23" width="188" x="733" y="654.1719" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="737" y="670.2388">send cState(p1) suppressed</text>
                <rect fill="white" height="3" width="1012" x="5" y="702.8711" stroke="#FFFFFF" stroke-width="1.0"/>
                <line x1="5" x2="1017" y1="702.8711" y2="702.8711" stroke="black" stroke-width="0.5"/>
                <line x1="5" x2="1017" y1="705.8711" y2="705.8711" stroke="black" stroke-width="0.5"/>
                <rect fill="white" height="23.1328" width="282" x="370" y="692.3047" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" font-weight="bold" x="376" y="708.3716">synchronized collection cState(p1)</text>
                <text fill="black" font-family="sans-serif" font-size="11" x="457.5" y="749.6479">cState expiry later</text>
                <rect fill="white" height="38" width="135" x="496" y="771.2422" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="500" y="787.3091">send cState(p1) &amp;</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="500" y="802.4419">sched cState expiry</text>
                <rect fill="white" height="38" width="135" x="875" y="819.5078" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="879" y="835.5747">send cState(p1) &amp;</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="879" y="850.7075">sched cState expiry</text>
                <rect fill="white" height="38" width="963" x="29" y="867.7734" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="181.5" y="883.8403">at cState lifetime timeout, members receiving two identical cStates suppress sending identical cStates</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="181.5" y="898.9731">sched cState expiry</text>
                <rect fill="white" height="23" width="963" x="29" y="916.0391" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="436" y="932.106">p1 lifetime is exceeded</text>
                <text fill="black" font-family="sans-serif" font-size="11" x="390.5" y="968.3823">cState lifetime plus randomization passes</text>
                <rect fill="white" height="38" width="135" x="12" y="989.9766" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="16" y="1006.0435">send cState(0) &amp;</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="16" y="1021.1763">sched cState expiry</text>
                <rect fill="white" height="38" width="135" x="645" y="1038.2422" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="649" y="1054.3091">send cState(0) &amp;</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="649" y="1069.4419">sched cState expiry</text>
                <rect fill="white" height="38" width="963" x="29" y="1086.5078" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" x="181.5" y="1102.5747">at cState lifetime timeout, members receiving two identical cStates suppress sending identical cStates</text>
                <text fill="black" font-family="sans-serif" font-size="13" x="181.5" y="1117.7075">sched cState expiry</text>
                <rect fill="white" height="3" width="1012" x="5" y="1150.3398" stroke="#FFFFFF" stroke-width="1.0"/>
                <line x1="5" x2="1017" y1="1150.3398" y2="1150.3398" stroke="black" stroke-width="0.5"/>
                <line x1="5" x2="1017" y1="1153.3398" y2="1153.3398" stroke="black" stroke-width="0.5"/>
                <rect fill="white" height="23.1328" width="274" x="374" y="1139.7734" stroke="black" stroke-width="1.0"/>
                <text fill="black" font-family="sans-serif" font-size="13" font-weight="bold" x="380" y="1155.8403">synchronized collection cState(0)</text>
                <!--SRC=[pLPDZzem4BtxLqpti0LrHQ3BXrI9GzK_K8ah5wyzNQmwjcKxVFJNTq92De3PXIf8FKKP-xrvcPatogUumXp1QQuCO-6tCk1jGCQYYXfXeN97ZnzMQnHHMGEBdH4hRutwmyjtnXptKGdbk8cGO_w2VfI8VKt4dXEnSI8sISIcYTYCiVaSGYCG9M3kuWx4c_oUiV2pU0bz48l88_Q6VPZF6VF6HWIxHdyG3DyWe94WlalP6pwvKNzfUXxxGQo8k493bialFiiI-17XlLZluV08QwwL9CJIu3PwBYAuKJkQO2vvCpWZVhuNyUnUn9Dx4Oyx8HuC1cG223cdAGaHF3VIvjLXYIuGDDtsT2_TvcfCgd7QZybH4jmwvNSiAVu691Vaoq2O2Xt0eq2rLkOLuiQ2acZ83bpNu02XSCuZGSeavRMpAtMwWWnUaNqiUdgeU5jp-H5sOzuSTPMRA6Tmbj1BmmDr2bG03WyhliQ7qg9BOxrwLOOe9MXBklKkDGHL1o94bLCisffN4fxQwZ-7LgADqlJrt0ZKbwpL4TMuEwf9TrIpVwHwPn2kirupQAVEgzaeS-MtoqwRdlkbcN6KPvk_jVDR05hrH7uqvE-aB9jublFnId_FRWOt5kVnSAxLBooRjU-OBU9Jz_O_aNAgXOpPY227ubOWIgftguxDkTD5gDTd_Ni0ZbDtmiNLULIWuVN5dToA_Izg-_6Cxlz6_W80]-->
  </g>
            </svg>
          </artwork>
        </figure>
        <t>Although <xref target="figSeq"/> shows one Publication at a time for clarity, the logic applies if multiple
members are publishing simultaneously or at close intervals
(less than <em>d</em> or the cStateLifeTime).
Distributed collections are always <em>moving</em> toward synchronization but during periods of
intense interaction, times when all members are synchronized may be infrequent;
this is not problematic.</t>
      </section>
      <section anchor="distributors">
        <name>Distributors</name>
        <t>Distributors implement services a Deft requires for its operation.
Distributors optional to general operation are specified in the communication schema.</t>
        <section anchor="certificate-distributor">
          <name>Certificate distributor</name>
          <t>DeftT's certificate distributor is a required module.
It implements a collection of all the signing chain certificates in the Domain.
When a new DeftT is instantiated, it must publish all the certificates from its identity bundle as well as its locally created signing certificate.
This joining process was shown in <xref target="figCertSD"/>.
Since many certificates in a member's chain are shared, that will be reflected in each cState and those certs will not be sent on the subnet. A member DeftT must receive a cState showing its signing chain in another member's local collection before a DeftT can be considered "connected" to the trust domain. This ensures there is at least one other member that can receive the PDUs it sends.</t>
        </section>
        <section anchor="group-key-distributors">
          <name>Group key distributors</name>
          <t>Group key distributors are optional in DeftT but required, and automatically supplied, if encryption is specified in the schema. When present, they are instantiated after their local certificate distributor has "connected." The example implementation contains two types of group key distributors. A group key distributor handles creation and distribution of a single symmetric key to all members of the Domain to use to encrypt either Publications or PDUs (if both are encrypted, there is a group key distribuor for each). A subscriber group key distributor distinguishes subscribers that can decrypt PDUs and/or Publication and publishers that encrypt PDUs and/or Publications (a member can be both subscriber and publisher). The group key distributor is briefly described here.</t>
          <t>A trust domain using group key encryption must have at least one member with the attribute or capability of "keymaker" in its identity chain. Keymaker-capable members of a Domain elect a keymaker that makes a new symmetric encryption key upon winning the election. The non-keymakers publish key requests that the keymaker uses to create a list of current members. Requests and the symmetric key both have limited lifetimes. The keymaker uses each member's signing cert to encrypt a copy of the current key and creates and publishes as many Publications as needed to carry all the encrypted keys.
In these Publications, entries are indexed by the thumbprint of the associated signing cert
and the range of thumbprints is used in the Publication name.
Members only accept such Publications from keymaker-capable signers and, in case of conflict, use the key sent by a member whose signing cert thumbprint is the smallest.</t>
          <t>If the keymaker receives a new key request in between making new keys, a copy of the key will be encrypted for it and published. There is no explicit revocation but a blacklist can be implemented and either published or passed from an application and a new group key can be made and distributed to non-blacklisted members ahead of the normal schedule.</t>
        </section>
        <section anchor="other-distributors">
          <name>Other distributors</name>
          <t>Distributors may be used for other types of key distribution and for distributing other types of information, e.g. blacklisted members or domain statistics.</t>
        </section>
      </section>
      <section anchor="schema-based-information-movement">
        <name>Schema-based information movement</name>
        <t>Although the Internet's transport and routing protocols emphasize universal reachability with
packet forwarding based on destination, a significant number of applications neither need nor
desire to transit the Internet (e.g., see <xref target="RFC8799"/>).
This is true for a wide class of OT applications.
Further, liberal acceptance of packets while depending on the good sending practices of others leaves critical applications open to misconfiguration and attacks.
Internet protocols use header information to tell them how to forward packets;
A DeftT PDU's header only contains a sync zone id and a collection name.
Each DeftT has a trust management engine with a copy of rules (a schema or subschema).
DeftT <strong>only</strong> creates and moves its Publications in accordance with the fully specified
communication schemas and never moves a PDU between sync zones.
This approach differs in both intent and execution from Internet forwarding.
It may not be appropriate for all use cases but offers new opportunities to address the
specific security requirements of many Limited Domain use cases.</t>
        <t>DeftT PDUs on the same subnet may be in different sync zones or trust domains and
DeftT sync zones in the same trust domain may be on different subnets.
In some cases, it is useful to define sync zones whose DeftTs have a compatible, but more
limited, version of the trust domain's communication schema which is itself complete as
a communication schema.
This subschema concept was introduced in <xref target="securing-information"/> and further discussed in <xref target="schemas-for-the-defined-trust-management-engine"/>.
"Compatible" means there is at least one Publication type and associated signer specification
in common or one schema may be a subset of the other.
Different subschemas may be deployed for sync zones on the same subnet or on different subnets.
A subschema cert will have a different thumbprint from that of the full trust domain and
different sync zones can be identified by the thumbprint of the (sub)schema in use.</t>
        <t>For example, a unicast link may be used to connect two remotely located
subnets of the same trust domain and only certain types of Publications should pass
through the unicast link.
Relays can be used where the DeftTs on the unicast link have a restricted subschema
(e.g. <xref target="fig5"/>-right).
Further, different sync zones on the same subnet might be used where certain members have more
limited access, either due to the technology of their devices or to restrict their access
(e.g., guests of a network).
Relays could limit Publications simply by filtering Publications or subscribing to subsets of
Publications but use of a subschema in different sync zones provides
<em>enforcement</em> of Publication movement.</t>
        <t>Both cStates and cAdds contain their sync zone id and are not moved between subnets while
Publications are defined in the trust domain's communication schema and can move to any
DeftT that can validate them.
In the case of DeftTs on the same subnet but in with different (sub)schema certs,
the cState and cAdd PDUs are differentiated by the sync zone id (thumbprint of the (sub)schema
certificate as in <xref target="cstate-pdus"/> item C1).
The sync zone id is used at the face module to determine
whether or not to process a PDU.
A DeftT's <strong>syncps</strong> manages a particular collection on a single subnet.
<em>Relays</em> move Publications between separate sync zones of the same trust domain
by moving Publications between the relay's multiple DeftT instances.</t>
        <t>A <em>relay</em> is implemented <xref target="DCT"/> as an application running on a device with a DeftT interface
in each sync zone (two or more) <xref target="fig5"/>.
Each DeftT participates using a communication identity valid for the schema used by the DeftT.
Only Publications (including certs) are relayed between DeftTs and the Publication must
validate (to the extent possible) against the schema of each DeftT.
Consequently cAdd encryption is unique per sync zone while Publication encryption holds
across the domain.</t>
        <t>Since relay applications merely pass Publications in the msgs collection,
their DeftT API module (a "shim", see <xref target="inside-deftt"/>) performs <em>pass-through</em> of valid Publications.
As a consequence and a further security measure for boundary devices, relays have no need for
Publication encryption keys; this is enforced by use of a capability cert in relay identity
chains.
(The group symmetric key is <strong>never</strong> given to an identity with the relay capability in its
chain.)
For example, if we added a relay definition to the example of <xref target="stubschema"/>:</t>
        <artwork><![CDATA[rlyCert: _domain/"relay"/_myid/_certFormat <= rlyCap
capCert: _domain/"CAP"/capId/capArg/_certFormat
rlyCap:  capCert & {capId: "RLY", capArg: _} <= domainCert
]]>
</artwork>
        <t>The relay of <xref target="fig5"/>-left is on three separate wireless subnets. If all three DeftTs are using an identical schema, a new validated cert added to the cert store of an incoming DeftT is then passed to the other two, which each validate the cert before adding to their own cert stores (superfluous in this case, but not a lot of overhead for additional security). When a valid Publication is received at one DeftT, it is passed to the other two DeftTs to validate against their schemas and published if it passes.</t>
        <figure anchor="fig5">
          <name>Relays connect subnets
</name>
          <artwork type="svg" originalSrc="./figs/relayextend-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" width="90%" height="90%" viewBox="0 0 922 175">
              <desc>relayextend</desc>
              <title>relayextend</title>
              <defs>
                <polygon points="0 0 128.124185 0 128.124185 78.2304466 0 78.2304466"/>
                <polygon points="0 0 128.124193 0 128.124193 78.2304466 0 78.2304466"/>
                <polygon points="0 0 128.124193 0 128.124193 78.2304466 0 78.2304466"/>
                <polygon points="0 0 98.0130812 0 98.0130812 63.8716934 0 63.8716934"/>
                <polygon points="0 0 98.0130812 0 98.0130812 63.8716934 0 63.8716934"/>
              </defs>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <g transform="translate(171.500000, 0.500000)">
                  <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="0 0 118.5 0 118.5 37 0 37"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="39.402" y="20.6361074">Relay</tspan>
                  </text>
                </g>
                <g transform="translate(0.809515, 95.998234)">
                  <g/>
                  <path d="M44.4480741,9.04925909 C21.8938581,4.31748922 9.99024413,16.4555076 11.8697621,26.947693 L12.0216898,27.5204429 C-5.55493599,30.6639839 -0.946984364,52.4581045 7.48422013,52.4581045 L8.31434058,52.4317711 C6.19048524,62.6721441 26.7304845,73.0952045 38.1830141,67.8877888 L38.9191587,67.0401848 C43.0024115,76.2519121 57.5107242,77.790766 71.8577116,78.1742451 C84.2922895,78.5083492 91.5472289,77.4747661 96.8803613,71.7472672 L97.7010841,72.0023713 C117.603613,73.6827668 126.667589,59.2389364 122.316505,48.8668969 L123.38783,48.5492511 C130.17289,46.6647723 130.956023,30.2064423 119.315541,27.7706095 L119.539517,27.1336721 C124.592288,16.4275284 112.674578,6.33034298 96.1348191,8.22634259 L94.9898794,7.59763439 C83.1504823,-3.66644666 49.0748209,-1.82969704 45.1293994,9.31094654 L44.4480741,9.04925909 Z" stroke="black" stroke-width="0.4"/>
                </g>
                <g transform="translate(27.852000, 112.912107)" fill="#000000" font-family="sans-serif" font-size="16" font-weight="normal">
                  <text>
                    <tspan x="1.64" y="15">b</tspan>
                    <tspan x="11.128" y="15">r</tspan>
                    <tspan x="15.88" y="15">oadcast</tspan>
                  </text>
                  <text>
                    <tspan x="0" y="33.448">segment 0</tspan>
                  </text>
                </g>
                <g transform="translate(316.309507, 95.998234)">
                  <g/>
                  <path d="M44.4480815,9.04925909 C21.8938655,4.31748922 9.9902515,16.4555076 11.8697695,26.947693 L12.0216972,27.5204429 C-5.55492863,30.6639839 -0.946976995,52.4581045 7.4842275,52.4581045 L8.31434795,52.4317711 C6.19049261,62.6721441 26.7304918,73.0952045 38.1830215,67.8877888 L38.919166,67.0401848 C43.0024189,76.2519121 57.5107316,77.790766 71.857719,78.1742451 C84.2922968,78.5083492 91.5472363,77.4747661 96.8803686,71.7472672 L97.7010915,72.0023713 C117.603621,73.6827668 126.667596,59.2389364 122.316512,48.8668969 L123.387837,48.5492511 C130.172897,46.6647723 130.95603,30.2064423 119.315548,27.7706095 L119.539524,27.1336721 C124.592295,16.4275284 112.674585,6.33034298 96.1348265,8.22634259 L94.9898868,7.59763439 C83.1504896,-3.66644666 49.0748283,-1.82969704 45.1294068,9.31094654 L44.4480815,9.04925909 Z" stroke="black" stroke-width="0.4"/>
                </g>
                <g transform="translate(343.352000, 112.912107)" fill="#000000" font-family="sans-serif" font-size="16" font-weight="normal">
                  <text>
                    <tspan x="1.64" y="15">b</tspan>
                    <tspan x="11.128" y="15">r</tspan>
                    <tspan x="15.88" y="15">oadcast</tspan>
                  </text>
                  <text>
                    <tspan x="0" y="33.448">segment 2</tspan>
                  </text>
                </g>
                <g transform="translate(154.545507, 95.998234)">
                  <g/>
                  <path d="M44.4480815,9.04925909 C21.8938655,4.31748922 9.9902515,16.4555076 11.8697695,26.947693 L12.0216972,27.5204429 C-5.55492863,30.6639839 -0.946976995,52.4581045 7.4842275,52.4581045 L8.31434795,52.4317711 C6.19049261,62.6721441 26.7304918,73.0952045 38.1830215,67.8877888 L38.919166,67.0401848 C43.0024189,76.2519121 57.5107316,77.790766 71.857719,78.1742451 C84.2922968,78.5083492 91.5472363,77.4747661 96.8803686,71.7472672 L97.7010915,72.0023713 C117.603621,73.6827668 126.667596,59.2389364 122.316512,48.8668969 L123.387837,48.5492511 C130.172897,46.6647723 130.95603,30.2064423 119.315548,27.7706095 L119.539524,27.1336721 C124.592295,16.4275284 112.674585,6.33034298 96.1348265,8.22634259 L94.9898868,7.59763439 C83.1504896,-3.66644666 49.0748283,-1.82969704 45.1294068,9.31094654 L44.4480815,9.04925909 Z" stroke="black" stroke-width="0.4"/>
                </g>
                <g transform="translate(171.500000, 37.500000)">
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="11.728" y="90.4121074">b</tspan>
                    <tspan x="21.216" y="90.4121074">r</tspan>
                    <tspan x="25.968" y="90.4121074">oadcast</tspan>
                  </text>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="10.088" y="108.860107">segment 1</tspan>
                  </text>
                  <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="0 0 39.5 0 39.5 27.5 0 27.5"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="6.558" y="15.8861074">ch0</tspan>
                  </text>
                  <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="39.5 0 79 0 79 27.5 39.5 27.5"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="46.058" y="15.8861074">ch1</tspan>
                  </text>
                  <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="79 0 118.5 0 118.5 27.5 79 27.5"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="85.558" y="15.8861074">ch2</tspan>
                  </text>
                </g>
                <g transform="translate(474.512749, 27.906786)">
                  <g/>
                  <path d="M34.0021285,7.38830735 C16.7484949,3.5250261 7.64241053,13.4351824 9.08021333,22.0015886 L9.19643572,22.4692136 C-4.2494168,25.0357761 -0.724403598,42.8297136 5.72534013,42.8297136 L6.3603697,42.8082136 C4.73565254,51.1690261 20.4484408,59.6789949 29.2094525,55.4273699 L29.772592,54.7353386 C32.8962185,62.2563074 43.994858,63.5127136 54.970086,63.8258074 C64.4823497,64.0985886 70.0322685,63.2547136 74.112034,58.5784636 L74.7398745,58.7867449 C89.965008,60.1587136 96.898812,48.3659636 93.5702985,39.8976511 L94.3898461,39.6383074 C99.5803142,38.0997136 100.179399,24.6622136 91.2746067,22.6734636 L91.4459449,22.1534324 C95.3112381,13.4123386 86.1943702,5.16843235 73.5417055,6.71643235 L72.665844,6.20311985 C63.6088845,-2.99350515 37.5415198,-1.49388015 34.523332,7.6019636 L34.0021285,7.38830735 Z" stroke="black" stroke-width="0.4"/>
                </g>
                <g transform="translate(456.132000, 12.000000)">
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="47.356" y="39.9121074">local</tspan>
                  </text>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="28.684" y="58.3601074">network 1</tspan>
                  </text>
                  <line x1="1.5" y1="0" x2="1.368" y2="147.5" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                </g>
                <g transform="translate(821.972749, 27.156786)">
                  <g/>
                  <path d="M34.0021285,7.38830735 C16.7484949,3.5250261 7.64241053,13.4351824 9.08021333,22.0015886 L9.19643572,22.4692136 C-4.2494168,25.0357761 -0.724403598,42.8297136 5.72534013,42.8297136 L6.3603697,42.8082136 C4.73565254,51.1690261 20.4484408,59.6789949 29.2094525,55.4273699 L29.772592,54.7353386 C32.8962185,62.2563074 43.994858,63.5127136 54.970086,63.8258074 C64.4823497,64.0985886 70.0322685,63.2547136 74.112034,58.5784636 L74.7398745,58.7867449 C89.965008,60.1587136 96.898812,48.3659636 93.5702985,39.8976511 L94.3898461,39.6383074 C99.5803142,38.0997136 100.179399,24.6622136 91.2746067,22.6734636 L91.4459449,22.1534324 C95.3112381,13.4123386 86.1943702,5.16843235 73.5417055,6.71643235 L72.665844,6.20311985 C63.6088845,-2.99350515 37.5415198,-1.49388015 34.523332,7.6019636 L34.0021285,7.38830735 Z" stroke="black" stroke-width="0.4"/>
                </g>
                <g transform="translate(567.000000, 36.162107)">
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="283.948" y="15">local</tspan>
                  </text>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="265.276" y="33.448">network 2</tspan>
                  </text>
                  <polygon stroke="black" fill="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" points="0 5.08789258 66.236 5.08789258 66.236 42.0878926 0 42.0878926"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="13.27" y="25.724">Relay</tspan>
                  </text>
                  <polygon stroke="black" fill="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" points="193.236 4.33789258 259.472 4.33789258 259.472 41.3378926 193.236 41.3378926"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="206.506" y="24.974">Relay</tspan>
                  </text>
                  <line x1="76.5" y1="22.3378926" x2="183.336" y2="22.3378926" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                  <polygon stroke="black" points="191.336 22.3378926 183.336 19.3378926 183.336 25.3378926"/>
                  <polygon stroke="black" points="68.136 22.3378926 76.136 25.3378926 76.136 19.3378926"/>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="75.932" y="40.198">cell connection,</tspan>
                  </text>
                  <text font-family="sans-serif" font-size="16" font-weight="normal" fill="#000000">
                    <tspan x="78.732" y="58.646">tcp tunnel, etc.</tspan>
                  </text>
                </g>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>A relay may have different identities and schemas for each DeftT,
but its DeftTs <em>must</em> have the same trust anchor and schemas that are identical copies,
proper subsets or overlapping subsets of the domain schema.
Publications that are undefined for a particular DeftT are silently discarded if they do
not validate upon relay, just as they are when received from a face.
This means the relay application of <xref target="fig5"/>-left can remain the same but Publications will
only be published to a different subnet if its DeftT has that specification in its schema.
In addition, relays may filter Publications at the application level or restrict subscriptions
on some of their DeftT interfaces.
<xref target="fig5"/>-right shows extending a trust domain geographically by using a unicast connection
(e.g., over a cell line or tunnel over the Internet) between two relays which also interface
to local broadcast subnets.
Everything on each local subnet shows up on the other.
A communication schema subset could be used here to limit the types of Publications
sent on the remote link, e.g., logs or alerts.
Using this approach in <xref target="fig5"/>-right, local communication for subnet 1 can be kept local
while subnet 2 might send commands and/or collect log files from subnet 1.</t>
        <t>More generally, relays can form a mesh of broadcast subnets with no additional configuration (i.e., relays on a broadcast network do not need to be configured with others' identities
and can join at any time).
The mesh is efficient: Publications are only added to an individual DeftT's collection once
regardless of how it is received.
Relays with overlapping broadcast physical media will only add a Publication to any of its
DeftTs <strong>once</strong>; syncps ensures there are no duplicates.
More on the applicability of DeftT meshes is in <xref target="use-cases"/>.</t>
      </section>
      <section anchor="performance">
        <name>Performance</name>
        <t>Measurements and profiling have been performed using examples from the open source <xref target="DCT"/>
proof-of-concept
codebase (v11.2) running on an Apple M1-max and an x86 linux-based machine.
On both machines the code was compiled with clang-16 at optimization level -O3 but no additional
or platform-dependent flags.
An application examples/hmIoT/app2.cpp <xref target="DCT"/> with an operator role issue commands to app2.cpp's with
device roles which are expected to perform the operation (e.g., lock the door) and report their subsequent status
(e.g., locked).
The schema used calls for EdDSA signing of Publications and AEAD encryption of cAdds.
Measuring the time from the appearance of the cAdd carrying the command publication
until the appearance of the cAdd carrying the status publication captures the time to receive
a cAdd, process its Publication, convert the resulting application message into a Publication and
then add the Publication to its local collection and package it and send it in a cAdd.
On ethernet with negligible transmission delay, the Apple platform takes ~200us and the linux x86 ~300us.</t>
        <t>Memory use is dominated by the certificate store (the cert collection) and the msgs collection of
Publications carrying application content. In the former case, each certificate is ~300 bytes
and a member only stores its own signing chain as well as those of members that create Publications
the communication schema says they can accept. Measurement has shown memory use to be consistently
less than 2 Mbytes.</t>
        <t>The home IoT example was profiled on an M1-max using Apple's <em>instruments</em> tool.
The time spent was classified both by the DeftT action it was invoked in and
the codebase it was part of (DeftT, the libsodium cryptographic library, or
the Boost async I/O library interface the to system's UDP/IP networking and scheduling).
For each action, times were normalized by the total time spent on the action.
The numbers in the table below are percentages of the total time taken for the action
in the first column.
For each codebase, the number given is the percentage time taken by its busiest function.
The name of the action's largest item, irrespective of codebase, shown in the final column.</t>
        <table anchor="profileresults">
          <name>Profiling Results from an Apple M1-max</name>
          <thead>
            <tr>
              <th>action</th>
              <th align="right">DeftT%</th>
              <th align="right">crypto%</th>
              <th align="right">system%</th>
              <th>largest item</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>make msg-to-Pub</td>
              <td align="right">32</td>
              <td align="right">
                <strong>68</strong></td>
              <td align="right">0</td>
              <td>EdDSA signing</td>
            </tr>
            <tr>
              <td>send cAdd</td>
              <td align="right">3</td>
              <td align="right">4</td>
              <td align="right">
                <strong>84</strong></td>
              <td>sendTo syscall</td>
            </tr>
            <tr>
              <td>send cState</td>
              <td align="right">10</td>
              <td align="right">0</td>
              <td align="right">
                <strong>80</strong></td>
              <td>sendTo syscall</td>
            </tr>
            <tr>
              <td>handle cAdd</td>
              <td align="right">1</td>
              <td align="right">6</td>
              <td align="right">
                <strong>81</strong></td>
              <td>recvFrom syscall</td>
            </tr>
            <tr>
              <td>handle Pub-to-msg</td>
              <td align="right">4</td>
              <td align="right">
                <strong>94</strong></td>
              <td align="right">0</td>
              <td>EdDSA validation</td>
            </tr>
            <tr>
              <td>handle cState</td>
              <td align="right">3</td>
              <td align="right">0</td>
              <td align="right">
                <strong>73</strong></td>
              <td>recvFrom syscall</td>
            </tr>
          </tbody>
        </table>
        <t>Note that none of the absolute times are large. For example, the EdDSA validation that accounts for 94%
of incoming Pub-to-msg handling takes 22 microseconds and the corresponding signature that's 68% of
make msg-to-Pub takes 16 microseconds.
In general, send and receive syscall handling dominates and these delays are experienced by
any transport protocol.
Roughly half of this appears to be due to Boost's lock-heavy "executor" model which might be fixed by switching
to c++20 co-routines.
A real-time OS like Zephyr would be expected to remove much of the remaining system cost.</t>
        <t>Thanks to the availability of hardware AES accelaration on both Arm and Intel platforms,
the time to perform the cAdd AEGIS crypto is quite small: 300ns to simultaneously validate and
decrypt on either platform.
These measurements convince us that
users and industries promoting the use of signing in networking would do
well to focus on accelerating asymmetric key functions.</t>
        <t><xref target="sigmgrtimes"/> shows the fixed and per-byte signing and validation costs for the current
reference implementation <xref target="DCT"/> as measured by its <tt>time_signing.cpp</tt> tool.
Hardware accelerated AEGIS-128L and AEGIS-256, were added in Sep 13, 2023 libsodium 1.0.19 release.
AEAD-AEGIS is 4.5x faster than AEAD-IETF on the Intel platform and 7.8x faster on the Arm platform.
Given the rapid evolution of high quality crypto algorithms and implementations, it's important
that infrastructure and application code that relies on crypto be able to keep up.
It took less than a day to add an AEGIS sigmgr to <xref target="DCT"/> and a one line change
to the home IoT schema to switch the home IoT apps to use it. Since the sigmgr API is
generic, <em>no</em> app or DeftT code changed.</t>
        <table anchor="sigmgrtimes">
          <name>Measured Sigmgr per-operation times</name>
          <thead>
            <tr>
              <th>operation</th>
              <th align="right">Intel</th>
              <th align="right">Arm M1-max</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>EdDSA signing</td>
              <td align="right">21us + 5.3us/KB</td>
              <td align="right">15us + 3.8us/KB</td>
            </tr>
            <tr>
              <td>EdDSA validation</td>
              <td align="right">58us + 2.6us/KB</td>
              <td align="right">41us + 1.9us/KB</td>
            </tr>
            <tr>
              <td>AEAD encryption</td>
              <td align="right">735ns + 885ns/KB</td>
              <td align="right">437ns + 2430ns/KB</td>
            </tr>
            <tr>
              <td>AEAD decryption</td>
              <td align="right">719ns + 853ns/KB</td>
              <td align="right">433ns + 2420ns/KB</td>
            </tr>
            <tr>
              <td>AEGIS encryption</td>
              <td align="right">209ns + 211ns/KB</td>
              <td align="right">176ns + 147ns/KB</td>
            </tr>
            <tr>
              <td>AEGIS decryption</td>
              <td align="right">173ns + 192ns/KB</td>
              <td align="right">205ns + 141ns/KB</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="congestion-control">
        <name>Congestion control</name>
        <t>Each DeftT manages its collection on a single broadcast subnet
(since unicast is a proper subset of multicast, a point-to-point connection is viewed as
a trivial broadcast subnet),
thus it only has to deal with that subnet's congestion.
As described in the previous section, a device connected to two or more subnets may create DeftTs having the same collection name on each subnet with a <strong>Publication</strong> Relay between them but DeftT <em>never</em> forwards <strong>PDUs</strong> between subnets. It is, of course, possible to run DeftT over an extended broadcast network like a PIM multicast group but the result will generally require more configuration and be less reliable, efficient and secure than DeftT's self-configuring peer-to-peer Relay mesh.</t>
        <t>DeftT sends <em>at most one</em> copy of any Publication over any fully connected subnet, <em>independent</em> of the number of publishers and subscribers on the subnet.
Thus the total DeftT traffic on a subnet is strictly upper bounded by the application-level publication rate.
As described in <xref target="syncps-a-set-reconciliation-protocol"/>, DeftTs publish a cState specifying the set elements they currently hold. If a DeftT receives a cState specifying the same elements (Publications) it holds, it doesn't send its cState. Thus the upper bound on cState publication rate is the number of members on the subnet divided by the cState lifetime (typically seconds to minutes) but is typically one per cState lifetime due to the duplicate suppression. Each member can send at most one cAdd in response to a cState. This creates a strict request/response flow balance which upper bounds the cAdd traffic rate to (number of members - 1) times the cState publication rate.  The flow balance ensures an instance can't send a new cState until it's previous one is either obsoleted by a cAdd or times out. Similarly a cAdd can only be sent in response to the cState which it obsoletes. Thus the number of outstanding PDUs per instance is at most one and DeftT cannot cause subnet congestion collapse.</t>
        <t>If a Relay is used to extend a trust domain over a path whose bandwidth delay product is many times larger than typical subnet MTUs (1.5-9KB), the one-outstanding-PDU per member constraint can result in poor performance (1500 bytes per 100ms transcontinental RTT is only 120Kbps). DeftT can run over any lower layer transport and stream-oriented transports like TCP or QUIC allow for a 'virtual MTU' that can be set large enough for DeftT to relay at or above the average publication rate (the default is 64KB which can relay up to 5Mbps of Publications into a 100ms RTT). In this case there can be many lower layer packets in flight for each DeftT cAdd PDU but their congestion control is handled by TCP or QUIC.</t>
      </section>
    </section>
    <section anchor="schemas-for-the-defined-trust-management-engine">
      <name>Schemas for the Defined-trust management engine</name>
      <t>OT applications are distinguished (from general digital communications) by well-defined roles, behaviors and relationships that constrain the information to be communicated (e.g., as noted in <xref target="RFC8520"/>).
The capabilities and attributes of Things can be characterized in structured abstract profiles that can be machine-readable (e.g., <xref target="ONE"/><xref target="RFC8520"/><xref target="ZCL"/>).
Energy applications in particular have defined strict attribute- and role-based access controls <xref target="IEC"/>
but currently proposed enforcement requires the interaction of a number of mechanisms across the communications stack <xref target="NERC"/>.
In Defined-trust Communications, structured profiles and rules strictly define permitted behaviors including what types of messages can be issued or acted on; undefined behaviors are not permitted. These rules, along with local configuration, are incorporated directly into the schemas used by DeftT's integrated trust management engine both to prohibit undefined behaviors and to construct compliant Publications. This not only provides a fine-grained security but a highly <em>usable</em> security, an approach that can make an application writer's job easier since applications do not need to contain local configuration and security considerations.</t>
      <t>DCT <xref target="DCT"/> includes a language (<em>VerSec</em>) for expressing the rules of communication, its compiler,
and other tools to create the credentials a DeftT needs at run-time.
DCT is example code that is provided as open source that
is frequently updated to improve features and performance but may have bugs or unoptimized features in any particular release.</t>
      <section anchor="communication-schemas">
        <name>Communication schemas</name>
        <t>Defined-trust's use of communication schemas is influenced by <xref target="SNC"/><xref target="SDSI"/> and the field of <em>trust management</em> defined
by Blaze et. al. <xref target="DTM"/> as the study of security policies, security credentials, and trust relationships.
and refined by Li et. al. <xref target="DLOG"/>.
Communications schemas also have roots in the <em>trust schemas</em> for Named-Data Networking, described in <xref target="STNDN"/> as "an overall
trust model of an application, i.e., what is (are) legitimate key(s) for each data packet that the application produces or
consumes."
DeftT's use is based on an approach introduced in <xref target="NDNW"/> and extended with introduction of the
declarative VerSec schema language in <xref target="DNMP"/><xref target="IOTK"/><xref target="DCT"/>.
Here a schema is analogous to the plans for constructing a building. Construction plans serve multiple purposes:</t>
        <ol spacing="compact">
<li>Allow permitting authorities to check that the design meets applicable codes</li>
          <li>Show construction workers what to build</li>
          <li>Let building inspectors validate that as-permitted matches as-built</li>
        </ol>
        <t>Construction plans get this flexibility from being declarative: they describe "what" to do, not "how" to do it.
As noted on paragraph 4 of <xref target="DLOG"/>:</t>
        <blockquote>
          <t>a <em>declarative trust management specification</em> based on a
formal foundation guarantees all parties to a communication
have the same notion of what constitutes compliance.</t>
        </blockquote>
        <t>The schema is critical to Defined-trust Communications,
adopting  the more descriptive term <em>communication schema</em>
(or just <em>schema</em> where its usage is clear) for the rules that define
the communications of a trust domain.
The schema details the meaning and relationship of individual components of the filename-like names (URI syntax <xref target="RFC3986"/>)
of Publications and certificates.
The intent for a domain's communications is expressed in fine-grained rules: "who can say what."
Credentials that define "who" are specified along with complete definitions of "what".
Defined-trust communications has been targeted at OT networking where administrative control is explicit and it is not
unreasonable to assume that identities and communication rules can be securely configured at every device.
A single schema, securely provided to all members, provides the same protection as dozens of manually configured,
per-node ACL rules.</t>
        <t>A VerSec compiler, <em>schemaCompile</em>, and examples are included with the Defined-trust Communications Toolkit <xref target="DCT"/>.
The compiler checks the formal soundness of the VerSec text specification (case 1 above)
then converts it to a signed, compact, binary form.
The compiler also reports diagnostics and includes a digraph listing that can be used to
confirm that the intent of the schema has been implemented (and to flag problems).
The binary form is used by DeftT to build (case 2) or validate (case 3) the Publications (format covered in <xref target="publications"/>).
As certificates are a type of Publication,
they are distributed and validated using DeftT,
though they are subject to additional constraints (<xref target="certificates"/>).</t>
      </section>
      <section anchor="versec-schema-description-language">
        <name>VerSec schema description language</name>
        <t>VerSec follows LangSec principles to minimize misconfiguration and attack surface.
Its structure is amenable to a forms-based input or a translator from the structured data profiles
often used by standards <xref target="ONE"/><xref target="RFC8520"/><xref target="ZCL"/>.
As declarative languages are expressive and strongly typed, they can express the constructs of these standards in their rules.
VerSec continues to evolve and add new features as its application domain is expanded; the latest released version is at <xref target="DCT"/>. Other languages and compilers are possible as long as they supply the features and output needed for DeftT.</t>
        <t>VerSec describes <em>constraints</em> on both the layout and components of names and on the structural and signing
relationships between names; its statements simply state facts that can be given in any order.
The language can only produce entities (Publications, certificates, signing chains, etc.) with a fixed layout
so the run-time validatation is loop- and recursion-free.
All alternatives (e.g., different signing chains for the same Publication) must be explicitly enumerated so
validation and construction are constant time and space.
The language is intended for trust domains with a common, local trust anchor.
This means the set of signing chains for any schema must be a directed acyclic grap (DAG).
This property is verified at compile time and exploited to make the runtime testing for signing-loops stateless and O(1).</t>
        <section anchor="lexical-building-blocks">
          <name>Lexical building blocks</name>
          <t><em>Names</em> consist of a sequence of <em>components</em> separated by slashes <tt>/</tt></t>
          <t>Each <em>component</em> is an <em>expression</em> that can be:</t>
          <ul spacing="compact">
            <li>a literal string enclosed in quotes <tt>"</tt></li>
            <li>an <em>identifier</em></li>
            <li>an internal function <em>call</em></li>
            <li>an <em>expression</em> enclosed in parens</li>
            <li>two expressions separated by a vertical bar <tt>|</tt>.</li>
          </ul>
          <t><em>Identifiers</em> are a sequence of letters, digits and underscores starting with a letter, underscore or sharp sign.
A leading underscore indicates that the component's value will be derived from schema rules
and it <em>must</em> resolve to a concrete value (literal string, function call or signing chain component name)
for the schema to be correct.
Component identifiers that don't start with "_" are <em>parameters</em> that must be supplied at run time.</t>
          <t><em>Comments</em> start with "//" and terminate at the end-of-line. Comments, blank lines and whitespace are ignored.</t>
          <t>A schema consists of a series of <em>statements</em>. A statement can describe either a <em>definition</em> or a <em>signing chain</em>. Statements must be terminated by a comma or newline.</t>
          <aside>
            <t>Actually, all statements must be terminated by a comma but, as in javascript, the scanner will automatically insert a line terminator before a newline if the statement is complete (doesn't end with a binary operator, "{" or "(").</t>
          </aside>
        </section>
        <section anchor="definitions">
          <name>Definitions</name>
          <t>A <em>definition</em> consists of an <em>identifier</em> followed by a colon followed by an <em>expression</em>.
Semantically it means that replacing the identifier with the expression, or vice-versa, doesn't change the
meaning of the schema.</t>
          <t>The <em>expression</em> must be a <em>Name</em> (sequence of components separated by slashes) or another definition's identifier. It can be followed by (optional) <em>component constraints</em> and/or <em>signing constraints</em>. For example,</t>
          <artwork><![CDATA[#mypub: /_domain/_topic/param
req: #mypub & {_topic: "request"}
]]>
</artwork>
          <t>defines <tt>#mypub</tt>  as a three component name whose components can be referenced as '_domain', '_topic' and 'param' and <tt>req</tt> as a specialization of it whose <em>_topic</em> component is constrained to be the literal string "request".</t>
          <t>In <em>Publication definitions</em>, like <tt>#mypub</tt> above, the expression must be a <em>Name</em>
which is used to define the Publication's <em>component tag identifiers.</em>
Publication variant definitions, like <tt>req</tt> above, start with the parent Publication's
identifier followed by constraints to specialize it.</t>
          <t>Publication identifiers that start with a sharp sign (<tt>#</tt>) are "exported":
they appear in the binary schema together with
their tags plus the parameters and optimized, compiled form of
component constraints and signing constraints of all their variants.
The current convention is that the first such definition describes publications in the <strong>msgs</strong> collection
and the remainder specify runtime constraints such as signing algorithms (e.g., <xref target="sigmgrschema"/>).
We plan to add <em>collections</em> as first-class entities in the VerSec language which will remove
the need for this hack.</t>
          <section anchor="component-constraints">
            <name>Component Constraints</name>
            <t>A <em>component constraint</em> is an open brace followed by one or more constraint terms followed by a closing brace. Each constraint term consists of a <em>tag identifier</em> followed by a colon followed by an expression followed by a comma or newline. The semantics of a component constraint is that <em>all</em> its terms must hold, e.g.,</t>
            <artwork><![CDATA[#mypub & {_topic: "req", param: "status"} | {_topic: "cmd", param: "start"}
]]>
</artwork>
            <t>resolves to <tt>/_domain/"req"/"status"</tt> and <tt>/_domain/"cmd"/"start"</tt> while</t>
            <artwork><![CDATA[#mypub & {_topic: "req"|"cmd", param: "status"|"start"}
]]>
</artwork>
            <t>resolves to the full cross product {req,cmd} x {status,start}.</t>
            <t>An ampersand (&amp;) must separate the component constraints from the definition's initial <em>Name</em> or <em>identifier</em>. As the examples show, multiple component constraints can be given, separated by <tt>|</tt> or <tt>&amp;</tt>. The two operators have equal precedence so if a mixture of <tt>|</tt> and <tt>&amp;</tt> is used, parens are needed to ensure the intended evaluation order.</t>
          </section>
          <section anchor="signing-constraints">
            <name>Signing Constraints</name>
            <t>A <em>signing constraint</em> consists of a <tt>&lt;=</tt> (signed-by operator) followed by one or more <em>definition identifiers</em> separated by <tt>|</tt> operators, e.g.,</t>
            <artwork><![CDATA[cmd: #mypub & {_topic: "cmd"} <= opCert
req: #mypub & {_topic: "req"} <= opCert | userCert
]]>
</artwork>
            <t>says that <tt>cmd</tt> Publications must be signed by an <tt>opCert</tt> while <tt>req</tt> Publications can be signed by either an
<tt>opCert</tt> or a <tt>userCert</tt>.
If the domain signing authority only signs an <tt>opCert</tt> for designated operators, the semantic enforced here by the run-time library is "operators can issue requests and commands but normal users can only issue requests".  This is enforced <em>at the subscriber(s)</em> via their validating that <tt>cmds</tt> are signed by an <tt>opcert</tt>, so a compromised publisher forging a <tt>cmd</tt> or signing one with a <tt>userCert</tt> produces at most an "attempted security breach" log message. (A compromised publisher with access to a valid <tt>opcert</tt> is still a threat but that needs to be addressed by key hygiene measures like secure signing enclaves and limited key lifetimes.)</t>
          </section>
        </section>
        <section anchor="signing-chains">
          <name>Signing Chains</name>
          <t>A <em>signing chain</em> is a sequence of <em>identifiers</em> separated by <tt>&lt;=</tt> operators.
All of the identifiers must be defined as Publications or certs somewhere in the schema.
The chain doesn't have to include all the certs on the path from the Publication to the trust root as
<em>signing chain</em> and <em>signing constraint</em> information is interpreted as edges in a <em>signing DAG</em> that defines
all the legal chains for the schema.
(For diagnostic purposes the compiler debug option adds the DAG in graphviz dot format to its output.)
The DAG is checked to insure:</t>
          <ul spacing="compact">
            <li>all nodes in the graph have been defined</li>
            <li>the cert graph is a DAG (there are no cycles)</li>
            <li>there is only one trust anchor (the DAG has a single sink)</li>
            <li>all signed Publications have path(s) to the trust anchor</li>
          </ul>
          <t>A Publication's entire signing chain, not just its immediate signing cert, is used to establish provenance,
authorizations, capabilities and trust.
If a chain has variants that are not distinguished by the immediate signer, enough of the chain should be specified to disambiguate.</t>
        </section>
        <section anchor="syntax-and-semantics">
          <name>Syntax and Semantics</name>
          <t>Either a <em>Publication</em> or a <em>certificate</em> is the first element of each signing chain.
The remaining elements must all be <em>certificates</em>, each of which cryptographically signs the element preceding it.
The final element must be a self-signed <em>Trust Anchor</em> so it signs both the preceding element and itself.
This validation structure allows not just the publication's components but all the components in the chain to be used to enforce policy when building and validating publications.
This is normally done implicitly via signing rules as above,
but it can also be done explicitly by mirroring components within a cert chain.
For example, for forensic logging it could be useful to know who issued the <tt>cmd</tt> and <tt>req</tt> publications of the previous example. Say <tt>opCert</tt> and <tt>userCert</tt> are defined as <tt>roleCert</tt> instances and <tt>roleCert</tt> is defined with a <tt>_role</tt> component containing the type of role and a <tt>_roleID</tt> component containing a person identifier like an employee number or name:</t>
          <artwork><![CDATA[roleCert: /_domain/_role/_roleID
opCert:   roleCert & {_role: "operator"}
userCert: roleCert & {_role: "user"}
]]>
</artwork>
          <t>then adding a <tt>roleID</tt> component to <tt>#mypub</tt>:</t>
          <artwork><![CDATA[#mypub: /_domain/_topic/_roleID/param
]]>
</artwork>
          <t>will cause the runtime to set that component to the value of <tt>_roleID</tt> in the signing cert when the publication is built and verify the component matches the signing cert's when the publication is received. For non-parameter identifiers like <tt>_roleID,</tt> the compiler creates runtime schema <em>component correspondence</em> information that allows both the builder and verifier to ensure that <em>all</em> signing chain components with that identifier contain the same value.</t>
          <t><em>Parameters</em> and <em>correspondences</em> are essentially schema 'variables' that are bound to concrete values by the runtime to create
a <em>logically grounded</em> (fully specified and verifiable) Publication.
To ensure that all generated Publications are grounded, the runtime schema describes all the <em>parameters</em> needed and the
publication builder method throws an error if any of them are not supplied.
For <em>correspondences,</em> the compiler checks that all non-parameter identifiers in a Publications also appear in at least one cert of the Publication's signing chain(s) and terminates with an error if not.
(If no cert in the chain contains the identifier, that component can't be filled in with a concrete value at
runtime so the schema doesn't produce grounded Publications and is in error.)
Certs don't need this check because, at runtime, certs are pre-built, grounded objects and the runtime only has to check, once, that they meet the constraints of the schema.</t>
        </section>
      </section>
      <section anchor="schema-examples">
        <name>Schema examples</name>
        <t>(<xref target="fig6"/>) shows a simple communication schema that defines the format of all Publications
in this domain's <strong>msgs</strong> collection to be an "<tt>#mpub</tt>", a six component name.
The strings between the slashes define the tags used to reference components in the VerSec rules
and in the run-time schema library.
For example, the tag of the final component is <em>_ts</em> and the <tt>&amp; {_ts: timestamp()}</tt> constraint on the name
makes the component's TLV type a <em>Timestamp</em> (<xref target="leaf-tlvs"/>) which will be set to the current time
when an <tt>#mpub</tt> is built and be validated as a timepoint when received.</t>
        <t>The first component gets its value from the variable "_domain" and #pubPrefix is set as this value
so that the schema contains information on what part of the name is considered common prefix.
(This is a common prefix for <em>all</em> Publications in this domain, not just those in <strong>msgs</strong>.)
The schema puts no constraints on other name components of an <tt>#mpub</tt>
but requires that <tt>#mpub</tt> Publications be signed by (<tt>&lt;=</tt>) a <tt>mbrCert</tt>.
Thus the schema enforces that only enrolled domain members can publish.</t>
        <t>The Validator lines specify cryptographic signing/validation methods for an <tt>#mpub</tt>,
the domain certs, and the PDU that carries Publications.  Here all use EdDSA signing.</t>
        <t>In operation, this schema puts no constraints on <tt>#mpub</tt>s inner four name components
(additional constraints could be imposed by the application but they won't be enforced by DeftT).
When it starts, a DeftT adds its signing certificate chain to the domain certificate collection
(see <xref target="identity-bundles"/>), thus announcing its identity to all other members.
Using the preconfigured trust anchor and schema, any member can verify the identity of any other member.
This approach means members are not preconfigured with identities of other members
and new entities can join at any time.
Member signing certificates must adhere to the schema; Publications or PDUs with unknown signers are discarded.
The timestamp component is used to prevent replay attacks.</t>
        <figure anchor="fig6">
          <name>An example communication schema in VerSec <xref target="DCT"/>
          </name>
          <artwork><![CDATA[ #mpub: /_domain/trgt/topic/loc/arg/_ts & { _ts: timestamp() } <= mbrCert

 #pubPrefix:     _domain

 mbrCert:        _domain/_mbrType/_mbrId/_certinfo <= netCert
 netCert:        _domain/_certinfo

 #msgsValidator: "EdDSA"
 #certValidator: "EdDSA"
 #pduValidator:  "EdDSA"

 _domain:        "example"
 _certinfo:      "KEY"/_/"dct"/_
]]>
</artwork>
        </figure>
        <t>This schema cryptographically identifies the source of every publication and ensures that
only enrolled members can publish but offers no privacy beyond that supplied by the lower
level communications media. DeftT includes an AEGIS AEAD validator subsystem that leverages each
subnet's certificate collection to securely distribute symmetric-encryption nonce cover keys to
all members on the subnet. This results in PDU privacy and integrity equivalent to TLS-1.3
at zero-cost (<xref target="sigmgrtimes"/> measurements show that AEGIS encrypts/decrypts at memory speed).</t>
        <t>Two changes are required to the above schema to enable this.
First, <tt>#pduValidator</tt> should be changed
to "AEAD" instead of "EdDSA". Second, the definition for a <em>keymaker capability</em> cert should be
added and made an alternative signer of mbrCerts:</t>
        <artwork><![CDATA[kmCap:    _domain/"CAP"/"KM"/_capArg/_certinfo <= netCert
mbrCert:  _domain/_mbrType/_mbrId/_certinfo <= kmCap | netCert
]]>
</artwork>
        <t>If a schema requires that <strong>msgs</strong> PDUs be encrypted,
all subnet members need to use the <em>same</em> randomly-generated encrypt/decrypt cover key to communicate
so DeftT automatically creates a local <em>group key distributor</em> (<xref target="group-key-distributors"/>) to obtain it.
When each member starts, this distributor checks its group-key collection to see if a <em>keymaker</em> has been elected.
If not and if the member's signing chain contains a <tt>KM</tt> capability, it will start/join a Paxos-like election by
publishing a <tt>candidate</tt> message to the group-key collection.
When a keymaker has been elected, members publish requests for the current cover key
and the keymaker publishes replies that contain the group key encrypted using the requesting member's
public signing key.
The keymaker retrieves the member's public signing key from its local store of validated
certificates by using the key locator of that member's signed request.</t>
        <t>In addition to certificate capabilities like <tt>KM</tt>, VerSec and DeftT allow for Attribute-Based
Access Control (ABAC) <xref target="NIST"/> using attributes of the subject, object, action and environment
to determine authorization.
ABAC takes advantage of the system's context to  offer the fine-grained control of capability
enumeration but with much less configuration and DeftT uses the schema to manage the ABAC <em>locally</em>
at each member.
For example, returning to the <xref target="fig6"/> schema,
define the members as either
<em>sensors</em> (whose job is to report measurements), <em>loggers</em> (whose job is to solicit then
archive <em>sensor</em> reports) or <em>admins</em> (whose job is to configure <em>sensors</em> and <em>loggers</em>).
This has the communication pattern that <em>loggers</em> publish <tt>request</tt> messages to solicit <em>sensor</em>
          <tt>status</tt> messages and <em>admins</em> publish <tt>config</tt> messages to <em>sensors</em> and <em>loggers</em> who reply
with <tt>state</tt> messages. Six rules have to be added to the example to express and enforce
this communication pattern: three to distinguish the three member types and three to describe
what they can say.</t>
        <artwork><![CDATA[sensorCert: mbrCert & { _mbrType: "sensor" } <= netCert
loggerCert: mbrCert & { _mbrType: "logger" } <= kmCap | netCert
adminCert:  mbrCert & { _mbrType: "admin" } <= netCert

sensorMsg: #mpub & {topic:"status"|"state"} <= sensorCert
loggerMsg: #mpub & {topic:"request"|"state"} <= loggerCert
adminMsg:  #mpub & {topic:"config"} <= adminCert
]]>
</artwork>
        <t>An AEAD <tt>kmCap</tt> was included in the above to show that ABAC and capabilities are not antagonists. In
this case, <em>sensors</em> have limited processors and are often battery powered and <em>admins</em> are people
who come and go. Since <em>keymaker</em> is a critical, always on infrastructure service, <em>loggers</em> are
the only members qualified to be keymakers but whether any particular <em>logger</em> gets a <tt>kmCap</tt>
is the system administrator's decision which is what the <tt>&lt;=kmCap|netCert</tt> signing
constraint says.</t>
        <t>Communication schema changes are the <em>only</em> changes required in order to increase security and add privacy:
neither code nor binary needs to change and DeftT handles all aspects of validators.
This unique approach of integrating identity and communication rules into
the transport makes it relatively to produce and evolve secure systems.</t>
        <t>Converting desired behavioral structure into a schema is the major task of applying Defined-trust Communications to an application domain. Once completed, all the deployment information is contained in the schema. Although a particular schema cert defines a particular trust domain, the text version of a schema can be re-used for related applications. For example, a home IoT schema could be edited to be specific to a particular home network or a solar rooftop neighborhood and then signed with a chosen trust anchor.</t>
      </section>
    </section>
    <section anchor="certificates-and-identity-bundles">
      <name>Certificates and identity bundles</name>
      <t>Defined-trust's approach is partially based on the seminal SDSI <xref target="SDSI"/> approach to create user-friendly namespaces that establish transitive trust through a certificate (cert) chain that validates locally controlled and managed keys, rather than requiring a global Public Key Infrastructure (PKI). When certificates are created, they have a particular context in which they should be utilized and trusted rather than conferring total authority. This is particularly useful in OT where communicating entities share an administrative control and using a third party to certify identity is both unnecessary and a potential security vulnerability. Well-formed certificates and identity deployment are critical elements of this framework. This section describes certificate requirements and the identity <em>bundles</em> that are securely distributed to trust domain members. (DCT includes utilities to create certs and bundles.)</t>
      <section anchor="obviate-ca-usage">
        <name>Obviate CA usage</name>
        <t>Use of third party certificate authorities (CAs) is often antithetical to OT security needs. Any use of a CA (remote or local) results in a single point of failure that greatly reduces system reliability. An architecture with a single, local, trust root cert (trust anchor) and no CAs simplifies trust management and avoids the well-known CA federation and delegation issues and other weaknesses of the X.509 architecture (summarized at <xref target="W509"/>, original references include <xref target="RSK"/><xref target="NVR"/>). DCT certificates (see <xref target="certificates"/>) can be generated and signed locally (using supplied utilities) so there is no reason to aggregate a plethora of unrelated claims into one cert (avoiding the Aggregation problem <xref target="W509"/>).</t>
        <t>A DCT cert's one and only Subject Name is the Name of the Publication that contains the public key as its content and neither name nor content are allowed to contain any optional information or extensions. Certificates are created with a lifetime; local production means cert lifetimes can be just as long as necessary (as recommended in <xref target="RFC2693"/>) so there's no need for the code burden and increased attack surface associated with certificate revocation lists (CRLs) or use of on-line certificate status protocol (OSCP). Keys that require longer lifetimes, like device keys, get new certs before the current ones expire and may be distributed through DeftT (e.g., using a variant of the group key distributors in DCT). If there is a need to exclude previously authorized identities from a domain, there are a variety of options. The most expedient is via use of an AEAD cAdd or Publication validator by ensuring that the group key maker(s) of a domain exclude that entity from subsequent symmetric key distributions until its identity cert expires (and it is not issued an update). Another option is to publish an identity that supplants that of the excluded member.
A new schema can be distributed at any time but the receiving application will need to start a new DeftT using that schema
though it can run in parallel with the old DeftT for some period of time.
Though more complex, it is also possible to distribute a new schema and identities (without changing the trust anchor), e.g., using remote attestation via the TPM.</t>
        <t>From <xref target="schemas-for-the-defined-trust-management-engine"/>, a member is granted attributes in the schema via the certs that appear in its identity
chain.
Identity certs are <em>always</em> accompanied by their full chain-of-trust, both when installed and when the member publishes its identity to the cert collection.
Every signing chain in the domain has the same trust anchor at its root and its compliant format specified in the schema.
Without the entire chain, a signer's right to issue Publications cannot be validated. Cert validation is according to the schema which may specify attributes and capabilities for Publication signing from any certificate in the chain. For this model to be well founded, each cert's <strong>key locator</strong> must <em>uniquely</em> identify the cert that actually signed it. This property ensures that each locator resolves to one and only one signing chain. A cert's key locator is a <strong>thumbprint</strong>, a SHA256 hash of the <em>entire</em> signer's Publication (name, content, key locator, and signature), ensuring that each locator resolves to one and only one cert and signing chain. Use of the thumbprint locator ensures that certs are not open to the substitution attacks of name-based locators like X.509's "Authority Key Identifier" and "Issuer" <xref target="ConfusedDep"/><xref target="CAvuln"/><xref target="TLSvuln"/>.</t>
      </section>
      <section anchor="identity-bundles">
        <name>Identity bundles</name>
        <t>Identity bundles comprise the certificates needed to participate in a trust domain: trust anchor, schema, and an identity chain.
The private key corresponding to the leaf certificate of the identity chain should be installed securely when a device is first commissioned (e.g., out-of-band) for a network
while the public certs of the bundle may be placed in a file in a well-known location or may, in addition, have their integrity attested or even be encrypted.</t>
        <t><xref target="fig9"/> shows the steps involved in creating identity bundles and their correspondence of the steps to the "building plans" model.
(The corresponding tools available in DCT are shown across the bottom and the relationship to the "building plans" model is shown across the top.)</t>
        <figure anchor="fig9">
          <name>Creating identity bundles
</name>
          <artwork type="svg" originalSrc="./figs/tools.config-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 762 146" version="1.1">
              <desc>tools.config</desc>
              <title>tools.config</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="142.923 57.664 195.923 57.664 195.923 96.336 142.923 96.336"/>
                <line x1="89.34" y1="77" x2="132.523" y2="77" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <polygon stroke="black" fill="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" points="5.84 50.496 98.84 50.496 98.84 103.504 5.84 103.504"/>
                <polygon fill="#000000" points="140.523 77 132.523 74 132.523 80"/>
                <polygon stroke="black" points="140.523 77 132.523 74 132.523 80"/>
                <line x1="196.207" y1="76.5" x2="241.307" y2="76.5" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <polygon fill="#000000" points="249.307 76.5 241.307 73.5 241.307 79.5"/>
                <polygon stroke="black" points="249.307 76.5 241.307 73.5 241.307 79.5"/>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="106.608" y="86.6840806">text</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="202.847" y="86.6840806">binary</tspan>
                </text>
                <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="251.207 50.328 390.207 50.328 390.207 103.328 251.207 103.328"/>
                <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="417 56.664 541.386 56.664 541.386 95.336 417 95.336"/>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="426.056" y="71">make signed identity </tspan>
                  <tspan x="428.663" y="86">certs for each entity </tspan>
                </text>
                <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="566.79 49.496 733.29 49.496 733.29 102.504 566.79 102.504"/>
                <line x1="391.053" y1="77" x2="407.153" y2="77" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <polygon fill="#000000" points="415.153 77 407.153 74 407.153 80"/>
                <polygon stroke="black" points="415.153 77 407.153 74 407.153 80"/>
                <line x1="541.79" y1="77" x2="555.89" y2="77" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <polygon fill="#000000" points="564.89 77 556.89 74 556.89 80"/>
                <polygon stroke="black" points="564.89 77 556.89 74 556.89 80"/>
                <line x1="733.29" y1="77" x2="747.39" y2="77" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <polygon fill="#000000" points="752.39 77 744.39 74 744.39 80"/>
                <polygon stroke="black" points="752.39 77 744.39 74 744.39 80"/>
                <line x1="402" y1="32.5" x2="753" y2="32.5" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <line x1="402" y1="33" x2="402" y2="68.1" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <polygon fill="#000000" points="402 74.1 405 66.1 399 66.1"/>
                <polygon stroke="black" points="402 74.1 405 66.1 399 66.1"/>
                <line x1="753.5" y1="32.5" x2="753.29" y2="76.5" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="406" y="44">r</tspan>
                  <tspan x="410.125" y="44">epeat for all entities</tspan>
                </text>
                <g transform="translate(0.000000, 7.000000)">
                  <path d="M105.398608,14 L104.398608,14 L104.398,10 L1,10 L1,14 L0,14 L0,5 L1,5 L1,9 L104.398,9 L104.398608,5 L105.398608,5 L105.398608,14 Z" fill="#000000" fill-rule="nonzero"/>
                  <rect fill="#FFFFFF" x="10" y="0" width="82" height="18"/>
                </g>
                <text font-family="sans-serif" font-size="11" font-weight="bold" fill="#000000">
                  <tspan x="12.2525" y="19.1959839">draw up plans</tspan>
                </text>
                <g transform="translate(122.000000, 7.000000)">
                  <path d="M97.4035785,14 L96.4035785,14 L96.403,10 L0.596,10 L0.596421471,14 L-0.403578529,14 L-0.403578529,5 L0.596421471,5 L0.596,9 L96.403,9 L96.4035785,5 L97.4035785,5 L97.4035785,14 Z" fill="#000000" fill-rule="nonzero"/>
                  <rect fill="#FFFFFF" x="7" y="0" width="82" height="18"/>
                </g>
                <text font-family="sans-serif" font-size="11" font-weight="bold" fill="#000000">
                  <tspan x="131.6835" y="19.1959839">validate plans</tspan>
                </text>
                <g transform="translate(235.500000, 7.000000)">
                  <path d="M523.5,14 L522.5,14 L522.5,10 L0.5,10 L0.5,14 L-0.5,14 L-0.5,5 L0.5,5 L0.5,9 L522.5,9 L522.5,5 L523.5,5 L523.5,14 Z" fill="#000000" fill-rule="nonzero"/>
                  <rect fill="#FFFFFF" x="157.5" y="0" width="143" height="18"/>
                </g>
                <text fill-rule="nonzero" font-family="sans-serif" font-size="11" font-weight="bold" fill="#000000">
                  <tspan x="395.523" y="19.1959839">authentic copies of plans</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="128.8635" y="136.532181">schemaCompile</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="610.6925" y="136.532181">make_bundle</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="451.8555" y="136.532181">make_cert</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="291.1985" y="136.532181">schema_cert</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="bold" fill="#000000">
                  <tspan x="56.6705" y="136.195984">DCT tools:</tspan>
                </text>
                <text fill-rule="nonzero" font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="260.0735" y="62">wrap binary schema in  </tspan>
                  <tspan x="260.8105" y="77">schema cert signed by </tspan>
                  <tspan x="286.6715" y="92">trust anchor</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="18.956" y="65">create/adapt </tspan>
                  <tspan x="9.0395" y="80">communications </tspan>
                  <tspan x="31.9965" y="95">schema</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="583.235" y="63">make identity bundle with</tspan>
                  <tspan x="584.797" y="78">trust anchor, schema and </tspan>
                  <tspan x="601.5665" y="93">identity chain certs</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="147" y="73">compile </tspan>
                  <tspan x="147" y="88">schema</tspan>
                </text>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>The process in <xref target="fig9"/> can be used to construct an identity bundle using the example schema from <xref target="versec-schema-description-language"/>
for a sensor with mbrId = 1.
Then the bundle can be inspected using the <em>ls_bundle</em> utility at <xref target="DCT"/>
showing the certs it contains. Left hand notations designate the certs by their position in the bundle and show which
cert precedes it ("&lt;=") in the chain. The private key for cert 3 is also in this bundle, indicated by "key" at the first
bytes of the key value.</t>
        <artwork><![CDATA[0 root: /example/KEY/^4c29d555/dct/23-09-20@16:36
1 <= 0: /example/schema/#mpub/KEY/^545b55ff/dct/23-09-20@16:36
2 <= 0: /example/CAP/KM/1/KEY/^77fe722e/dct/23-09-20@16:36
3 <= 2: /example/sensor/1/KEY/^d0660cc1/dct/23-09-20@16:36 key '6ca45831...
]]>
</artwork>
        <t>In the examples at <xref target="DCT"/>, an identity bundle (with private key) is given directly to an application via the command line,
useful for development, and the application passes callbacks to utility functions that supply the certs and a signing pair separately.
For deployment, good key hygiene using best current practices must be followed e.g., <xref target="COMIS"/>.
<xref target="DCT"/> examples use configured member identities to sign locally created signing certs (with associated private keys)
and the example schemas give the format for these signing cert names.
A DeftT will request a new signing cert shortly before expiration of the one in use.
Upon each signing cert update, only this new cert needs to be published via DeftT's cert distributor.</t>
        <t>In deployment, a small application manager may be programmed for two specific purposes.
First, it is registered with a supervisor <xref target="SPRV"/> (or similar process control) for its own (re)start to serve as a bootstrap for the application.
Second, it can have access to the TPM functions and the ability to create "short-lived" (hours to several days) public/private key pair(s) that are signed by the installed (commissioned) private identity key using the TPM.
This signing key pair is created at (re)start and recreated at the periodicity of the signing cert lifetime.
<xref target="fig10"/> outlines a representative procedure.
Since the signing of the public cert happens via requests to the TPM, the <em>identity</em> key (used to sign the cert) cannot be exfiltrated. The locally created <em>signing</em> key is used in the communications path where TPM signing overhead is prohibitive.</t>
        <figure anchor="fig10">
          <name>Representative commissioning and signing key maintenance
</name>
          <artwork type="svg" originalSrc="./figs/InstallIdbundle-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 510 207" version="1.1">
              <desc>InstallIdbundle</desc>
              <title>InstallIdbundle</title>
              <g stroke-width="1" fill="none" fill-rule="evenodd">
                <polygon stroke="black" stroke-linecap="round" points="111.5 3.5 506.5 3.5 506.5 204.3481 111.5 204.3481"/>
                <path d="M255,127 L255,165.091 L258.564212,158.754869 L258.809343,158.319082 L259.680918,158.809343 L259.435788,159.245131 L254.935788,167.245131 L254.5,168.019864 L254.064212,167.245131 L249.564212,159.245131 L249.319082,158.809343 L250.190657,158.319082 L250.435788,158.754869 L254,165.091 L254,127 L255,127 Z" fill="#000000" fill-rule="nonzero"/>
                <polygon stroke="black" fill="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" points="183.5 30.984 493.5 30.984 493.5 134.984 183.5 134.984"/>
                <polygon stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" points="127.244 62.3481 170.244 62.3481 170.244 86.6841 127.244 86.6841"/>
                <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                  <tspan x="134.942" y="78.3681806">TPM</tspan>
                </text>
                <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="127.244 93.6391 171.5 93.6391 171.5 137.1391 127.244 137.1391"/>
                <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                  <tspan x="128.03" y="107.073181">bundle </tspan>
                  <tspan x="130.694" y="121.073181">public </tspan>
                  <tspan x="133.976" y="135.073181">certs</tspan>
                </text>
                <text font-family="sans-serif" font-size="12" font-weight="bold" fill="#000000">
                  <tspan x="188.828" y="22.0059839">supervisor process</tspan>
                </text>
                <text font-family="sans-serif" font-size="12" font-weight="bold" fill="#000000">
                  <tspan x="188.278" y="166.347884">app</tspan>
                </text>
                <polygon stroke="black" stroke-linecap="round" stroke-linejoin="round" points="183.278 171 492.958 171 492.958 195.336 183.278 195.336"/>
                <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                  <tspan x="188.278" y="186.020081">cert distributor publishes entity's signing chain</tspan>
                </text>
                <text font-family="sans-serif" font-size="11" font-weight="normal" fill="#000000">
                  <tspan x="259.722" y="151.868181">cert bundle and new signing cert</tspan>
                </text>
                <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                  <tspan x="2.658" y="98.3520806">commissioning</tspan>
                </text>
                <path d="M114.435259,79.5458764 L114.930917,79.611627 L124.029989,80.8186466 L124.911159,80.9355365 L124.353684,81.6278842 L118.597128,88.7771547 L118.283549,89.1666003 L117.504658,88.5394412 L117.818237,88.1499956 L122.377,82.487 L116.781181,84.726044 L93.6856953,93.9642383 L93.221457,94.1499337 L92.8500663,93.221457 L93.3143047,93.0357617 L116.409791,83.7975673 L122.007,81.558 L114.799416,80.602943 L114.303758,80.5371924 L114.435259,79.5458764 Z" fill="#000000" fill-rule="nonzero"/>
                <path d="M114.942629,93.9279535 L115.418028,94.0828588 L124.145196,96.9265428 L124.99035,97.2019301 L124.316126,97.7811929 L117.354003,103.762735 L116.974752,104.08857 L116.323081,103.330068 L116.702332,103.004233 L122.216,98.266 L116.29047,99.4518079 L93.5980581,103.99029 L93.1077677,104.088348 L92.9116516,103.107768 L93.4019419,103.00971 L116.094354,98.4712272 L122.021,97.285 L115.108217,95.0336571 L114.632818,94.8787518 L114.942629,93.9279535 Z" transform="translate(108.500000, 100.500000) scale(1, -1) translate(-108.500000, -100.500000) " fill="#000000" fill-rule="nonzero"/>
                <text font-family="sans-serif" font-size="12" font-weight="bold" fill="#000000">
                  <tspan x="118.5" y="17.1959839">Device</tspan>
                </text>
                <text font-family="sans-serif" font-size="12" font-weight="normal" fill="#000000">
                  <tspan x="188" y="44">1. start app, passing in cert bundle</tspan>
                  <tspan x="188" y="60">2. make pub signing key pair</tspan>
                  <tspan x="188" y="76">3. put public key in signing cert with ~1 day lifetime</tspan>
                  <tspan x="188" y="92">4. request that TPM sign the cert with device key</tspan>
                  <tspan x="188" y="108">5. give signing cert &amp; its secret key to app</tspan>
                  <tspan x="188" y="124">6. before cert's expiry repeat steps 2-5</tspan>
                </text>
              </g>
            </svg>
          </artwork>
        </figure>
        <t>All DCT certs have a validity period. Publication signing key pairs (with public signing certs) are generated locally so they can easily be refreshed as needed.
Trust anchors, schemas, and the member identity chain are higher value and often require generation under hermetic conditions by some authority central to the organization. Their lifetime should be application- and deployment-specific,
but the higher difficulty of cert production and distribution often necessitates liftetimes of weeks to years.</t>
        <t>Secure device configuration and on-boarding should be carried out using the best practices most applicable to a particular deployment. The process of enrolling a device by provisioning an initial secret and identity in the form of public-private key pair and using this information to securely onboard a device to a network has a long history.
Current and emergent industry best practices provide a range of approaches for both secure installation and update of private keys.
For example, the private key of the bundle can be secured using the Trusted Platform Module, the best current practice in IoT <xref target="TATT"/><xref target="DMR"/><xref target="IAWS"/><xref target="TPM"/><xref target="OTPM"/><xref target="SIOT"/><xref target="QTPM"/><xref target="SKH"/><xref target="RFC8995"/>, or secure enclave or trusted execution environment (TEE) <xref target="ATZ"/> where available.
In that case, an authorized configurer adding a new device can use TPM tools to secure the private signing key and install the rest of the bundle file in a known location before deploying the device in the network.
Where entities have public-private key pair identities of <em>any</em> (e.g., non-DCT) type, these can be leveraged for DeftT identity installation.</t>
        <t>Updating schemas and other certificates over the deployed network (OTA) is application-domain specific and can either make use of domain best practices or develop custom DeftT-based distribution.
Changing the trust anchor is considered a re-commissioning. The example here is merely illustrative; with pre-established secure identities and well-founded approaches to secure on-line communications, a trust domain could be created OTA using secure identities established through some other system of identity.</t>
      </section>
    </section>
    <section anchor="use-cases">
      <name>Use cases</name>
      <section anchor="secure-industrial-iot">
        <name>Secure Industrial IoT</name>
        <t>IIoT sensors offer significant advantages in industrial process control including improved accuracy, process optimization, predictive maintenance and analysis, higher efficiency, low-cost remote accessibility and monitoring, reduced downtime, power savings, and reduced costs <xref target="IIOT"/>. Critical Digital Assets (CDA) are a class of industrial assets such as power plants or chemical factories which must be carefully controlled to avoid loss-of-life accidents and where IIoT sensors require tight security. Even when IIoT sensors are not used for direct control of CDA, spoofed sensor readings can lead to destructive behavior. There are real-life examples (such as uranium centrifuges) of nation-state actors changing sensor readings through cyberattacks leading to equipment damage. These risks result in a requirement for stringent security reviews and regulation of CDA sensor networks. Despite the advantages of deploying CDA sensors, adequate security is prerequisite to deploying the CDA sensors. Information conveyed via DeftT has an ensured provenance and may be efficiently encrypted making it ideal for this use.</t>
        <section anchor="meshing-without-additional-configuration">
          <name>Meshing without additional configuration</name>
          <t>IIoT sensors may be fixed or mobile (including drone-based);
mobility and envirnomental factors may cause different sensor gateways to receive measurements from a particular sensor over time.
A DeftT mesh captures Publications <em>anywhere</em> within its combined network coverage area and ensures it efficiently reaches all members as long as they are in range of at least one member that has received the information.
An out-of-service or out-of-range member can receive all active subscribed Publications once it is in range and/or able to communicate.
DeftT forms meshes with no additional configuration (beyond DeftT's usual identity bundle and
private identity key) needed to make devices recognize one another in the trust domain.
To see how DeftT propagates information throughout a partially connected mesh, consider <xref target="rangedsensor"/> where sensor S1's signal can reach devices D1-D4 but not D5 and D6. (Refer to <xref target="syncps-a-set-reconciliation-protocol"/> and <xref target="synchronizing-a-collection"/>.)</t>
          <figure anchor="rangedsensor">
            <name>Members out-of-range of a Publication's originator can receive from non-originating members
</name>
            <artwork type="svg" originalSrc="./figs/robust-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50%" height="50%" viewBox="0 0 599 630" version="1.1">
                <desc>robust-rfc</desc>
                <title>robust</title>
                <g stroke-width="1" fill="none" fill-rule="evenodd">
                  <g transform="translate(33.500000, 305.000000)">
                    <g transform="translate(7.500000, 4.000000)" fill="#000000" font-family="sans-serif" font-weight="normal">
                      <text font-size="34">
                        <tspan x="4.54" y="36">{</tspan>
                      </text>
                      <text font-size="22">
                        <tspan x="12.82" y="34">{</tspan>
                      </text>
                    </g>
                    <g transform="translate(19.500000, 0.500000)" stroke="black" stroke-linecap="round" stroke-width="3">
                      <line x1="0.5" y1="3.40311113e-14" x2="0.5" y2="8"/>
                      <line x1="9.5" y1="3.40311113e-14" x2="9.5" y2="8"/>
                      <line x1="18.5" y1="3.40311113e-14" x2="18.5" y2="8"/>
                      <line x1="27.5" y1="3.40311113e-14" x2="27.5" y2="8"/>
                      <line x1="36.5" y1="3.40311113e-14" x2="36.5" y2="8"/>
                    </g>
                    <g transform="translate(19.500000, 68.500000)" stroke="black" stroke-linecap="round" stroke-width="3">
                      <line x1="0.5" y1="3.40311113e-14" x2="0.5" y2="8"/>
                      <line x1="9.5" y1="3.40311113e-14" x2="9.5" y2="8"/>
                      <line x1="18.5" y1="3.40311113e-14" x2="18.5" y2="8"/>
                      <line x1="27.5" y1="3.40311113e-14" x2="27.5" y2="8"/>
                      <line x1="36.5" y1="3.40311113e-14" x2="36.5" y2="8"/>
                    </g>
                    <line x1="38" y1="20.5" x2="38" y2="47.5" stroke="black" stroke-width="13" fill="black" stroke-linecap="round"/>
                    <circle stroke="#000000" stroke-width="3" cx="38" cy="53.5" r="9.5"/>
                    <line x1="38" y1="20.5" x2="38" y2="46.5" stroke="#FFFFFF" stroke-width="7" stroke-linecap="round"/>
                    <circle stroke="#FFFFFF" stroke-width="3" fill="black" cx="38" cy="53.5" r="6.5"/>
                    <line x1="38" y1="28.5" x2="38" y2="49.5" stroke="black" stroke-width="3"/>
                    <circle stroke="#000000" stroke-width="3" cx="38" cy="53.5" r="3.5"/>
                    <rect stroke="black" stroke-width="3" x="8.5" y="10" width="58" height="58" rx="3"/>
                    <g transform="translate(68.000000, 20.000000)" stroke="black" stroke-linecap="round" stroke-width="3">
                      <line x1="-1.11022302e-16" y1="0.5" x2="8" y2="0.5"/>
                      <line x1="-1.11022302e-16" y1="9.5" x2="8" y2="9.5"/>
                      <line x1="-1.11022302e-16" y1="18.5" x2="8" y2="18.5"/>
                      <line x1="-1.11022302e-16" y1="27.5" x2="8" y2="27.5"/>
                      <line x1="-1.11022302e-16" y1="36.5" x2="8" y2="36.5"/>
                    </g>
                    <g transform="translate(0.000000, 20.000000)" stroke="black" stroke-linecap="round" stroke-width="3">
                      <line x1="-1.11022302e-16" y1="0.5" x2="8" y2="0.5"/>
                      <line x1="-1.11022302e-16" y1="9.5" x2="8" y2="9.5"/>
                      <line x1="-1.11022302e-16" y1="18.5" x2="8" y2="18.5"/>
                      <line x1="-1.11022302e-16" y1="27.5" x2="8" y2="27.5"/>
                      <line x1="-1.11022302e-16" y1="36.5" x2="8" y2="36.5"/>
                    </g>
                    <rect fill="#000000" x="48.5" y="19" width="9" height="4"/>
                    <rect fill="#000000" x="48.5" y="26" width="7" height="4"/>
                    <rect fill="#000000" x="48.5" y="33" width="9" height="4"/>
                    <rect fill="#000000" x="48.5" y="40" width="7" height="4"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="5.727" y="92">sensor S1</tspan>
                    </text>
                  </g>
                  <g transform="translate(40.000000, 69.000000)">
                    <rect stroke="black" fill="#000000" x="0" y="74" width="118" height="44" rx="1"/>
                    <rect fill="#FFFFFF" x="12" y="86" width="45" height="20"/>
                    <rect fill="#FFFFFF" x="83" y="86" width="15" height="5"/>
                    <rect fill="#FFFFFF" x="103" y="86" width="5" height="5"/>
                    <rect fill="#000000" x="88" y="24" width="5" height="52" rx="2"/>
                    <path d="M66,13 C80,-0.333333333 101,-0.333333333 115,13" stroke="black" stroke-width="5"/>
                    <path d="M74,21 C84,11.6666667 97,11.6666667 107,21" stroke="black" stroke-width="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="27.283" y="139">device D1</tspan>
                    </text>
                  </g>
                  <g transform="translate(189.000000, 171.500000)">
                    <rect stroke="black" fill="#000000" x="0" y="74" width="118" height="44" rx="1"/>
                    <rect fill="#FFFFFF" x="12" y="86" width="45" height="20"/>
                    <rect fill="#FFFFFF" x="83" y="86" width="15" height="5"/>
                    <rect fill="#FFFFFF" x="103" y="86" width="5" height="5"/>
                    <rect fill="#000000" x="88" y="24" width="5" height="52" rx="2"/>
                    <path d="M66,13 C80,-0.333333333 101,-0.333333333 115,13" stroke="black" stroke-width="5"/>
                    <path d="M74,21 C84,11.6666667 97,11.6666667 107,21" stroke="black" stroke-width="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="27.283" y="139">device D2</tspan>
                    </text>
                  </g>
                  <g transform="translate(189.000000, 379.000000)">
                    <rect stroke="black" fill="#000000" x="0" y="74" width="118" height="44" rx="1"/>
                    <rect fill="#FFFFFF" x="12" y="86" width="45" height="20"/>
                    <rect fill="#FFFFFF" x="83" y="86" width="15" height="5"/>
                    <rect fill="#FFFFFF" x="103" y="86" width="5" height="5"/>
                    <rect fill="#000000" x="88" y="24" width="5" height="52" rx="2"/>
                    <path d="M66,13 C80,-0.333333333 101,-0.333333333 115,13" stroke="black" stroke-width="5"/>
                    <path d="M74,21 C84,11.6666667 97,11.6666667 107,21" stroke="black" stroke-width="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="27.283" y="139">device D3</tspan>
                    </text>
                  </g>
                  <g transform="translate(18.000000, 479.000000)">
                    <rect stroke="black" fill="#000000" x="0" y="74" width="118" height="44" rx="1"/>
                    <rect fill="#FFFFFF" x="12" y="86" width="45" height="20"/>
                    <rect fill="#FFFFFF" x="83" y="86" width="15" height="5"/>
                    <rect fill="#FFFFFF" x="103" y="86" width="5" height="5"/>
                    <rect fill="#000000" x="88" y="24" width="5" height="52" rx="2"/>
                    <path d="M66,13 C80,-0.333333333 101,-0.333333333 115,13" stroke="black" stroke-width="5"/>
                    <path d="M74,21 C84,11.6666667 97,11.6666667 107,21" stroke="black" stroke-width="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="27.283" y="139">device D4</tspan>
                    </text>
                  </g>
                  <g transform="translate(468.000000, 78.000000)">
                    <rect stroke="black" fill="#000000" x="0" y="74" width="118" height="44" rx="1"/>
                    <rect fill="#FFFFFF" x="12" y="86" width="45" height="20"/>
                    <rect fill="#FFFFFF" x="83" y="86" width="15" height="5"/>
                    <rect fill="#FFFFFF" x="103" y="86" width="5" height="5"/>
                    <rect fill="#000000" x="88" y="24" width="5" height="52" rx="2"/>
                    <path d="M66,13 C80,-0.333333333 101,-0.333333333 115,13" stroke="black" stroke-width="5"/>
                    <path d="M74,21 C84,11.6666667 97,11.6666667 107,21" stroke="black" stroke-width="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="27.283" y="139">device D5</tspan>
                    </text>
                  </g>
                  <g transform="translate(458.000000, 409.000000)">
                    <rect stroke="black" fill="#000000" x="0" y="74" width="118" height="44" rx="1"/>
                    <rect fill="#FFFFFF" x="12" y="86" width="45" height="20"/>
                    <rect fill="#FFFFFF" x="83" y="86" width="15" height="5"/>
                    <rect fill="#FFFFFF" x="103" y="86" width="5" height="5"/>
                    <rect fill="#000000" x="88" y="24" width="5" height="52" rx="2"/>
                    <path d="M66,13 C80,-0.333333333 101,-0.333333333 115,13" stroke="black" stroke-width="5"/>
                    <path d="M74,21 C84,11.6666667 97,11.6666667 107,21" stroke="black" stroke-width="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="27.283" y="139">device D6</tspan>
                    </text>
                  </g>
                  <path d="M248.721956,628.660421 C342.034646,569.65841 404,465.565597 404,347 C404,163.089178 254.910822,14 71,14 C50.1241181,14 29.6969034,15.9209728 9.88547865,19.5957957" stroke="black" stroke-width="3" stroke-dasharray="13"/>
                  <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                    <tspan x="248" y="59">S1 Range Limit</tspan>
                  </text>
                </g>
              </svg>
            </artwork>
          </figure>
          <ol spacing="compact">
<li>S1 sends a cAdd with its latest measurement Publication that is received by D1-D4 and added
to their collections after which they synchronize their cStates which now contain this Publication</li>
            <li>Either a device in range of D5 and/or D6 sends a cState that shows the new Publication
which results in a cState that lacks the new Publication being set from D5 and/or D6.
This cState serves as a request for the new Publication.
<strong>Or</strong> D5 and/or D6 send a periodic cState update that lacks the new Publication and it is
received by at least one of D1-D4.</li>
            <li>When devices that have received the new Publication hear those cStates without it,
they wait a <em>dispersion delay</em> (plus a small random value) so that the originator or some
other device might respond, after which they send the Publication in a cAdd unless
a cAdd responding to the specific lacking cState is overheard first.</li>
          </ol>
        </section>
        <section anchor="mixed-connectivity-in-a-challenging-environment">
          <name>Mixed connectivity in a challenging environment</name>
          <t>The large physical scale of many industrial processes necessitates that expensive cabling costs be avoided through wireless transport and battery power. Wireless sensor deployments in an industrial environment can suffer from signal outages due to shielding walls and interference caused by  rotating machinery and electrical generators.
In particular, nuclear power plant applications have radioactive shielding walls of very thick concrete and security regulations make any plant modifications to add cabling subject to expensive and time-consuming reviews and permitting.</t>
          <t>Consider an industrial setting where LoRa sensors collect a wide range of information (e.g., temperature, movement/vibration, light levels, etc.) that is broadcast in layer 2 LoRaWAN messages (see <xref target="fig11"/>).
The site's WiFi network includes fixed displays, mobile tablets, and devices with both a LoRaWAN gateway interface and a WiFi interface (Gateways).
The WiFi-enabled devices can subscribe to subsets of the information available through DeftT.
Data privacy is ensured by encrypting cAdd PDUs.
Deploying several Gateways within a single sensor's broadcast range reduces the number of lost sensor LoRa packets
and the DeftT WiFi mesh is resilient against transmission outages.
DeftT Publications are sent once and heard by all in-range members while Publications missing from one DeftT's set can be supplied by another within range.
In <xref target="fig11"/> Gateways are deployed in fixed locations near the doorways in shielded walls to ensure connectivity of the WiFi mesh.
A Controller with long-term data storage is sited in a control room and connected via an Ethernet cable to a Gateway that also
has an Ethernet interface and runs a DeftT relay.
Mobile WiFi devices can move throughout the site and maintain connection to both the sensors and the Controller (through the Gateways).</t>
          <t>As in many existing MQTT-based deployments,
LoRaWAN server components are assumed to be integrated with the Gateway devices
but these devices communicate via DeftT over adhoc WiFi.
All Gateways participate in a collection for join messages but only the join server originates LoRaWAN join-accept Publications.
Only one Gateway has the join server <em>capability</em> (defined in the schema and conferred via identity chain).
The join server may distribute the (encrypted) application key to Gateways that display sensor information or to WiFi devices
that may perform more sophisticated tasks e.g., a tablet that analyzes and displays historical sensor input.</t>
          <t>Multiple Gateways can receive sensor messages which they package as Publications using the device identifier (DevAddr)
and unique count (uplink FCnt) as components of the name and publish in a collection of sensor measurements.
If Publications are encrypted with a group key, the full name will be unique and only those Gateways that did not receive
the broadcast directly from a sensor will obtain it via the DeftT WiFi interface.
(Collection synchronization discards duplicates.)
Otherwise, if Publications are signed with the identity of the originating Gateway,
the shim can discard duplicates before passing to the subscribing application.
The Controller receives Publications of sensor data via a TCP connection to the TCP face of the DeftT relay
and receives a copy of the application key.</t>
          <figure anchor="fig11">
            <name>IIOT Gateways and relay extend a trust domain
</name>
            <artwork type="svg" originalSrc="./figs/meshEx-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 922 247" version="1.1">
                <desc>meshEx-rfc</desc>
                <title>meshEx</title>
                <g stroke-width="1" fill="none" fill-rule="evenodd">
                  <g>
                    <rect stroke="black" fill="black" x="0" y="0" width="18" height="247"/>
                    <rect stroke="black" fill="black" x="345" y="210" width="17" height="37"/>
                    <rect stroke="black" fill="black" x="700" y="129" width="17" height="118"/>
                    <rect stroke="black" fill="black" x="344.620112" y="0" width="17.7597765" height="191"/>
                    <rect stroke="black" fill="black" x="700" y="0" width="17" height="123"/>
                    <polygon fill="white" points="830.493 176.79938 809.373 176.7995 811.024 167.368 828.943 167.368"/>
                    <polygon stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" points="830.493 176.7994 809.373 176.7995 811.024 167.368 828.943 167.368"/>
                    <path d="M831.547,178.44158 L808.179,178.4416 C807.972,178.4416 807.803,178.35006 807.803,178.23714 C807.803,178.19805 807.824,178.15978 807.863,178.12686 L809.314,176.89367 C809.383,176.83499 809.502,176.7995 809.631,176.7995 L830.185,176.7995 C830.317,176.7995 830.44,176.83712 830.507,176.89862 L831.869,178.13179 C831.976,178.22857 831.919,178.35418 831.741,178.41236 C831.683,178.43148 831.616,178.44158 831.547,178.44158 Z" fill="black"/>
                    <path d="M831.547,178.4416 L808.179,178.4416 C807.972,178.4416 807.803,178.3501 807.803,178.2371 C807.803,178.1981 807.824,178.1598 807.863,178.1269 L809.314,176.8937 C809.383,176.835 809.502,176.7995 809.631,176.7995 L830.185,176.7995 C830.317,176.7995 830.44,176.8371 830.507,176.8986 L831.869,178.1318 C831.976,178.2286 831.919,178.3542 831.741,178.4124 C831.683,178.4315 831.616,178.4416 831.547,178.4416 Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                    <path d="M784,112 L857,112 C859.761,112 862,114.2386 862,117 L862,162.14653 C862,164.90795 859.761,167.14653 857,167.14653 L784,167.14653 C781.239,167.14653 779,164.90795 779,162.14653 L779,117 C779,114.2386 781.239,112 784,112 Z" fill="white"/>
                    <path d="M784,112 L857,112 C859.761,112 862,114.2386 862,117 L862,162.1465 C862,164.908 859.761,167.1465 857,167.1465 L784,167.1465 C781.239,167.1465 779,164.908 779,162.1465 L779,117 C779,114.2386 781.239,112 784,112 Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                    <path d="M785.952,115.6912 L855.048,115.6912 C856.704,115.6912 858.048,117.0343 858.048,118.6912 L858.048,153.2944 C858.048,154.95126 856.704,156.2944 855.048,156.2944 L785.952,156.2944 C784.296,156.2944 782.952,154.95126 782.952,153.2944 L782.952,118.6912 C782.952,117.0343 784.296,115.6912 785.952,115.6912 Z" fill="white"/>
                    <path d="M785.952,115.6912 L855.048,115.6912 C856.704,115.6912 858.048,117.0343 858.048,118.6912 L858.048,153.2944 C858.048,154.9513 856.704,156.2944 855.048,156.2944 L785.952,156.2944 C784.296,156.2944 782.952,154.9513 782.952,153.2944 L782.952,118.6912 C782.952,117.0343 784.296,115.6912 785.952,115.6912 Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                    <text font-family="sans-serif" font-size="16" font-weight="normal" fill="black">
                      <tspan x="784.448" y="139.584107">Cont</tspan>
                      <tspan x="819.12" y="139.584107">r</tspan>
                      <tspan x="823.872" y="139.584107">oller</tspan>
                    </text>
                    <path d="M258.406699,136.198 L329.593301,136.198 C333.683939,136.198 337,140.224877 337,145.192365 L337,210.203635 C337,215.171123 333.683939,219.198 329.593301,219.198 L258.406699,219.198 C254.316061,219.198 251,215.171123 251,210.203635 L251,145.192365 C251,140.224877 254.316061,136.198 258.406699,136.198 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                    <path d="M587.318182,87.198 L681.681818,87.198 C687.104291,87.198 691.5,91.0308108 691.5,95.7589016 L691.5,157.637098 C691.5,162.365189 687.104291,166.198 681.681818,166.198 L587.318182,166.198 C581.895709,166.198 577.5,162.365189 577.5,157.637098 L577.5,95.7589016 C577.5,91.0308108 581.895709,87.198 587.318182,87.198 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
                    <text font-family="sans-serif" font-size="16" font-weight="normal" fill="black">
                      <tspan x="276.072" y="151.360107">GW1</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="16" font-weight="normal" fill="black">
                      <tspan x="616.572" y="102.360107">GW2</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="856.331" y="191.4663">Da</tspan>
                      <tspan x="874.233084" y="191.4663">t</tspan>
                      <tspan x="878.119933" y="191.4663">a</tspan>
                      <tspan x="885.908866" y="191.4663"> </tspan>
                      <tspan x="889.795714" y="191.4663">s</tspan>
                      <tspan x="896.795714" y="191.4663">t</tspan>
                      <tspan x="900.682563" y="191.4663">o</tspan>
                      <tspan x="908.471495" y="191.4663">re</tspan>
                    </text>
                  </g>
                  <g transform="translate(640.520000, 112.000000)">
                    <line x1="28.48" y1="14" x2="126.48" y2="14" stroke="black" stroke-width="2" stroke-linecap="square"/>
                    <g transform="translate(20.000000, 7.532107)">
                      <rect stroke="black" fill="white" x="0" y="0" width="23" height="13" rx="3"/>
                      <text font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                        <tspan x="2.20307692" y="10.2381521">TCP</tspan>
                      </text>
                    </g>
                    <g transform="translate(114.000000, 7.532107)">
                      <rect stroke="black" fill="white" x="0" y="0" width="23" height="13" rx="3"/>
                      <text font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                        <tspan x="2.20307692" y="10.2381521">TCP</tspan>
                      </text>
                    </g>
                    <rect stroke="black" stroke-width="2" x="0" y="0" width="46" height="41" rx="5"/>
                    <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                      <tspan x="8.203" y="36">relay</tspan>
                    </text>
                  </g>
                  <g transform="translate(265.000000, 158.360107)" fill-rule="nonzero">
                    <g>
                      <g transform="translate(31.111111, 14.000000) scale(-1, 1) rotate(-180.000000) translate(-31.111111, -14.000000) " fill="black">
                        <path d="M51.7040386,0 C57.4890977,0 62.2222222,4.8605978 62.2222222,10.7882143 L62.2222222,17.2129779 C62.2222222,23.1417866 57.4890977,28 51.7040386,28 L10.5181836,28 C4.73777396,28 -3.23851042e-15,23.1417866 -3.23851042e-15,17.2129779 L-3.23851042e-15,10.7882143 C-3.23851042e-15,4.8605978 4.73777396,0 10.5181836,0"/>
                      </g>
                      <g transform="translate(44.158006, 13.998205) scale(-1, 1) rotate(-180.000000) translate(-44.158006, -13.998205) translate(28.180223, 2.058922)" fill="white">
                        <path d="M4.33792257,8.72690113 L4.33792257,15.1516648 C4.33792257,20.0063016 8.18997922,23.878566 12.8463881,23.878566 L23.5249772,23.878566 C28.1825484,23.878566 31.9555647,20.0063016 31.9555647,15.1516648 L31.9555647,8.72690113 C31.9555647,3.9521417 28.1825484,5.5264435e-15 23.5249772,5.5264435e-15 L-2.98592552e-15,5.5264435e-15 C2.65134014,1.97428255 4.33792257,5.10738312 4.33792257,8.72690113"/>
                      </g>
                      <g transform="translate(13.646672, 13.587496) scale(-1, 1) rotate(-180.000000) translate(-13.646672, -13.587496) translate(5.377072, 6.584515)" fill="white">
                        <path d="M13.3310916,2.76322175e-15 L9.79403419,2.76322175e-15 L9.15473692,3.052031 C8.75372318,5.19083709 8.35038472,7.82679043 8.27018197,8.8139317 C8.18997922,7.82679043 7.78664076,5.19083709 7.31123606,3.052031 L6.666127,2.76322175e-15 L3.21624645,2.76322175e-15 L-2.33110547e-15,14.005961 L3.85554372,14.005961 L4.25423275,11.616793 C4.57504374,9.63774163 4.90050417,7.25453462 5.06207203,5.60333816 C5.22015281,7.25453462 5.62116655,9.63774163 6.1035454,11.616793 L6.58243718,14.005961 L10.0369672,14.005961 L10.5170213,11.616793 C10.9215221,9.63774163 11.3225359,7.25453462 11.4852661,5.60333816 C11.6433468,7.25453462 12.0455229,9.63774163 12.3651716,11.616793 L12.6883073,14.005961 L16.5392016,14.005961"/>
                      </g>
                      <g transform="translate(25.410903, 13.217551) scale(-1, 1) rotate(-180.000000) translate(-25.410903, -13.217551) translate(23.363409, 5.845346)" fill="white">
                        <path d="M2.00739343,11.2858384 C0.882230234,11.2858384 -3.21919566e-15,11.9451248 -3.21919566e-15,13.01572 C-3.21919566e-15,14.0875075 0.882230234,14.7444094 2.00739343,14.7444094 C3.21159702,14.7444094 4.09498961,14.0875075 4.09498961,13.01572 C4.09498961,11.9451248 3.21159702,11.2858384 2.00739343,11.2858384 M0.239445887,10.1317892 L3.77313249,10.1317892 L3.77313249,0 L0.239445887,0 L0.239445887,10.1317892 Z"/>
                      </g>
                      <g transform="translate(43.233931, 13.585106) scale(-1, 1) rotate(-180.000000) translate(-43.233931, -13.585106) translate(37.331474, 6.582125)" fill="black">
                        <polyline points="3.77417862 10.7035681 3.77417862 7.58238951 11.0040496 7.58238951 11.0040496 4.28357319 3.77417862 4.28357319 3.77417862 0 -2.33081278e-15 0 -2.33081278e-15 14.005961 11.8049147 14.005961 11.8049147 10.7035681"/>
                      </g>
                      <g transform="translate(53.111656, 13.217551) scale(-1, 1) rotate(-180.000000) translate(-53.111656, -13.217551) translate(51.063580, 5.845346)" fill="black">
                        <path d="M2.00739343,11.2858384 C0.879905517,11.2858384 -2.33101724e-15,11.9451248 -2.33101724e-15,13.01572 C-2.33101724e-15,14.0875075 0.879905517,14.7444094 2.00739343,14.7444094 C3.21043466,14.7444094 4.09615197,14.0875075 4.09615197,13.01572 C4.09615197,11.9451248 3.21043466,11.2858384 2.00739343,11.2858384 M0.239445887,10.1317892 L3.76964542,10.1317892 L3.76964542,2.76322175e-15 L0.239445887,2.76322175e-15 L0.239445887,10.1317892 Z"/>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(582.000000, 110.360107)">
                    <g transform="translate(0.000000, -0.000000)" fill-rule="nonzero">
                      <g>
                        <g transform="translate(22.611111, 10.175000) scale(-1, 1) rotate(-180.000000) translate(-22.611111, -10.175000) " fill="black">
                          <path d="M37.5777564,0 C41.7822547,0 45.222222,3.53261303 45.222222,7.84071996 L45.222222,12.5101464 C45.222222,16.8191198 41.7822547,20.3499999 37.5777564,20.3499999 L7.64446558,20.3499999 C3.44334641,20.3499999 -2.3537031e-15,16.8191198 -2.3537031e-15,12.5101464 L-2.3537031e-15,7.84071996 C-2.3537031e-15,3.53261303 3.44334641,0 7.64446558,0"/>
                        </g>
                        <g transform="translate(32.093408, 10.173695) scale(-1, 1) rotate(-180.000000) translate(-32.093408, -10.173695) translate(20.480984, 1.496395)" fill="white">
                          <path d="M3.15274014,6.34258704 L3.15274014,11.0120135 C3.15274014,14.5402941 5.95235987,17.3546005 9.33657129,17.3546005 L17.0976173,17.3546005 C20.4826735,17.3546005 23.2248478,14.5402941 23.2248478,11.0120135 L23.2248478,6.34258704 C23.2248478,2.87236012 20.4826735,4.01654017e-15 17.0976173,4.01654017e-15 L-2.170128e-15,4.01654017e-15 C1.92695613,1.43488035 3.15274014,3.71197307 3.15274014,6.34258704"/>
                        </g>
                        <g transform="translate(9.918206, 9.875198) scale(-1, 1) rotate(-180.000000) translate(-9.918206, -9.875198) translate(3.907979, 4.785532)" fill="white">
                          <path d="M9.68884691,2.00827008e-15 L7.1181641,2.00827008e-15 L6.65353198,2.21817252 C6.36208092,3.77262623 6.06894029,5.68839944 6.01065008,6.40583962 C5.95235987,5.68839944 5.65921924,3.77262623 5.3137019,2.21817252 L4.84484585,2.00827008e-15 L2.33752196,2.00827008e-15 L-1.69421414e-15,10.1793323 L2.80215409,10.1793323 L3.09191557,8.44291914 C3.32507642,7.0045729 3.56161641,5.2724921 3.67904162,4.07242611 C3.79393247,5.2724921 4.08538353,7.0045729 4.43596958,8.44291914 L4.78402128,10.1793323 L7.29472431,10.1793323 L7.64362079,8.44291914 C7.93760621,7.0045729 8.22905727,5.2724921 8.34732726,4.07242611 C8.46221811,5.2724921 8.75451396,7.0045729 8.98683002,8.44291914 L9.22168043,10.1793323 L12.0204554,10.1793323"/>
                        </g>
                        <g transform="translate(18.468282, 9.606327) scale(-1, 1) rotate(-180.000000) translate(-18.468282, -9.606327) translate(16.980192, 4.248314)" fill="white">
                          <path d="M1.45894486,8.20238606 C0.641192328,8.20238606 -2.36028384e-15,8.68154598 -2.36028384e-15,9.45963931 C-2.36028384e-15,10.2385991 0.641192328,10.7160261 1.45894486,10.7160261 C2.33414282,10.7160261 2.97617994,10.2385991 2.97617994,9.45963931 C2.97617994,8.68154598 2.33414282,8.20238606 1.45894486,8.20238606 M0.174025849,7.36363958 L2.74225878,7.36363958 L2.74225878,0 L0.174025849,0 L0.174025849,7.36363958 Z"/>
                        </g>
                        <g transform="translate(31.421804, 9.873461) scale(-1, 1) rotate(-180.000000) translate(-31.421804, -9.873461) translate(27.131982, 4.783795)" fill="black">
                          <polyline points="2.74301909 7.77920034 2.74301909 5.51077235 7.99758599 5.51077235 7.99758599 3.11323979 2.74301909 3.11323979 2.74301909 0 -1.69400142e-15 0 -1.69400142e-15 10.1793323 8.57964332 10.1793323 8.57964332 7.77920034"/>
                        </g>
                        <g transform="translate(38.600793, 9.606327) scale(-1, 1) rotate(-180.000000) translate(-38.600793, -9.606327) translate(37.112280, 4.248314)" fill="black">
                          <path d="M1.45894486,8.20238606 C0.639502756,8.20238606 -1.69415002e-15,8.68154598 -1.69415002e-15,9.45963931 C-1.69415002e-15,10.2385991 0.639502756,10.7160261 1.45894486,10.7160261 C2.33329804,10.7160261 2.97702472,10.2385991 2.97702472,9.45963931 C2.97702472,8.68154598 2.33329804,8.20238606 1.45894486,8.20238606 M0.174025849,7.36363958 L2.73972442,7.36363958 L2.73972442,2.00827008e-15 L0.174025849,2.00827008e-15 L0.174025849,7.36363958 Z"/>
                        </g>
                      </g>
                    </g>
                    <g transform="translate(2.844782, 24.059913)">
                      <g transform="translate(1.490730, 0.000000)">
                        <g transform="translate(0.000000, 5.527095)" fill="black" fill-rule="nonzero">
                          <polygon points="0 11.4094674 0 0 2.73532427 0 2.73532427 9.41201166 7.20977446 9.41201166 7.20977446 11.4094674"/>
                          <path d="M17.4836286,7.03104436 C17.4836286,8.47986563 17.0980942,9.59844086 16.3270254,10.3867701 C15.5559566,11.1750993 14.50629,11.5692639 13.1780255,11.5692639 C12.3450461,11.5692639 11.6077468,11.3934878 10.9661275,11.0419356 C10.3245082,10.6903834 9.82078084,10.1763714 9.45494529,9.49989971 C9.08910974,8.82342802 8.90619196,8.00047624 8.90619196,7.03104436 C8.90619196,5.5822231 9.29172635,4.46897441 10.0627951,3.69129829 C10.8338639,2.91362217 11.8891588,2.52478411 13.2286797,2.52478411 C14.0504026,2.52478411 14.7820737,2.70056022 15.423693,3.05211244 C16.0653123,3.40366466 16.5690397,3.91501334 16.9348752,4.58615848 C17.3007108,5.25730363 17.4836286,6.07226559 17.4836286,7.03104436 Z M11.6584009,7.03104436 C11.6584009,7.89394526 11.776594,8.54644748 12.01298,8.98855103 C12.2493661,9.43065458 12.6489711,9.65170635 13.211795,9.65170635 C13.7633624,9.65170635 14.154525,9.43065458 14.3852829,8.98855103 C14.6160407,8.54644748 14.7314196,7.89394526 14.7314196,7.03104436 C14.7314196,6.16814346 14.6132265,5.52096779 14.3768405,5.08951734 C14.1404544,4.65806689 13.7464777,4.44234167 13.1949103,4.44234167 C12.6433428,4.44234167 12.2493661,4.65806689 12.01298,5.08951734 C11.776594,5.52096779 11.6584009,6.16814346 11.6584009,7.03104436 Z"/>
                          <path d="M23.4687644,0 C26.5080135,0 28.0276381,1.13988143 28.0276381,3.4196443 C28.0276381,4.20797352 27.836278,4.8444961 27.4535577,5.32921203 C27.0708375,5.81392797 26.5924371,6.18412311 26.0183567,6.43979745 L29.3277614,11.4094674 L26.2716275,11.4094674 L23.7220351,7.03104436 L22.6920673,7.03104436 L22.6920673,11.4094674 L19.9567431,11.4094674 L19.9567431,0 L23.4687644,0 Z M23.3505713,1.98147614 L22.6920673,1.98147614 L22.6920673,5.06554787 L23.367456,5.06554787 C24.6394381,5.06554787 25.2754291,4.53821954 25.2754291,3.48356289 C25.2754291,2.94025492 25.1206526,2.55408013 24.8110994,2.32503853 C24.5015463,2.09599694 24.0147036,1.98147614 23.3505713,1.98147614 Z"/>
                          <path d="M34.7388168,2.50880447 C35.8757211,2.50880447 36.7565406,2.76181553 37.3812751,3.26783766 C38.0060097,3.7738598 38.3183769,4.54887264 38.3183769,5.5928762 L38.3183769,11.4094674 L36.4441733,11.4094674 L35.920747,10.2269736 L35.8532082,10.2269736 C35.4817444,10.6957099 35.0905817,11.036609 34.6797203,11.249671 C34.2688588,11.4627329 33.6975925,11.5692639 32.9659214,11.5692639 C32.2117374,11.5692639 31.5785605,11.3455489 31.0663907,10.8981188 C30.5542209,10.4506887 30.298136,9.75291078 30.298136,8.8047851 C30.298136,7.87796562 30.6217598,7.1935041 31.2690073,6.75140055 C31.9162548,6.30929701 32.8702414,6.06693904 34.130967,6.02432665 L35.6168221,5.97638771 L35.6168221,5.5928762 C35.6168221,5.134793 35.5098856,4.79922043 35.2960125,4.58615848 C35.0821394,4.37309653 34.7894709,4.26656556 34.4180072,4.26656556 C34.0240304,4.26656556 33.6216113,4.32782087 33.2107498,4.45033149 C32.7998884,4.57284211 32.3862128,4.72464875 31.9697231,4.90575141 L31.1423719,3.29180713 C31.6264005,3.05743899 32.1723397,2.86834651 32.7801895,2.72452969 C33.3880394,2.58071287 34.0409151,2.50880447 34.7388168,2.50880447 Z M35.6337068,7.36661693 L34.8232404,7.39857623 C34.1591082,7.41988242 33.6975925,7.55837269 33.4386935,7.81404703 C33.1797945,8.06972137 33.050345,8.40529394 33.050345,8.82076475 C33.050345,9.18297006 33.143211,9.44130768 33.3289429,9.59577759 C33.5146748,9.7502475 33.7595032,9.82748246 34.0634281,9.82748246 C34.4911743,9.82748246 34.8598239,9.67567582 35.1693771,9.37206254 C35.4789303,9.06844926 35.6337068,8.63966209 35.6337068,8.08570102 L35.6337068,7.36661693 Z"/>
                        </g>
                        <g transform="translate(6.509270, 0.000000)" fill="black">
                          <g>
                            <path d="M0.718411061,3.21393253 C0.718411061,3.21393253 0,2.04084475 0,2.04084475 C4.15081947,-0.696360077 7.34375752,-0.696360077 11.494577,2.13860206 C11.494577,2.13860206 10.7761659,3.31168984 10.7761659,3.31168984 C7.34375752,0.76999965 4.15081947,0.76999965 0.718411061,3.21393253 Z"/>
                            <path d="M1.9057849,5.26706188 C1.9057849,5.26706188 1.35699867,4.36672826 1.35699867,4.36672826 C4.52776354,2.26594981 6.96681344,2.26594981 10.1375783,4.44175606 C10.1375783,4.44175606 9.58879208,5.34208968 9.58879208,5.34208968 C6.96681344,3.39136684 4.52776354,3.39136684 1.9057849,5.26706188 Z"/>
                            <path d="M2.9534677,7.35070476 C2.9534677,7.35070476 2.55435044,6.66145414 2.55435044,6.66145414 C4.86036125,5.05320269 6.63421573,5.05320269 8.94022654,6.71889169 C8.94022654,6.71889169 8.54110929,7.40814231 8.54110929,7.40814231 C6.63421573,5.91476597 4.86036125,5.91476597 2.9534677,7.35070476 Z"/>
                          </g>
                          <g transform="translate(5.747288, 21.690065) scale(-1, -1) translate(-5.747288, -21.690065) translate(0.000000, 17.975287)">
                            <path d="M0.718411061,3.22322257 C0.718411061,3.22322257 0,2.04674392 0,2.04674392 C4.15081947,-0.698372943 7.34375752,-0.698372943 11.494577,2.14478381 C11.494577,2.14478381 10.7761659,3.32126246 10.7761659,3.32126246 C7.34375752,0.772225375 4.15081947,0.772225375 0.718411061,3.22322257 Z"/>
                            <path d="M1.9057849,5.28228661 C1.9057849,5.28228661 1.35699867,4.37935053 1.35699867,4.37935053 C4.52776354,2.27249966 6.96681344,2.27249966 10.1375783,4.4545952 C10.1375783,4.4545952 9.58879208,5.35753128 9.58879208,5.35753128 C6.96681344,3.40116977 4.52776354,3.40116977 1.9057849,5.28228661 Z"/>
                            <path d="M2.9534677,7.37195237 C2.9534677,7.37195237 2.55435044,6.68070943 2.55435044,6.68070943 C4.86036125,5.06780925 6.63421573,5.06780925 8.94022654,6.73831301 C8.94022654,6.73831301 8.54110929,7.42955595 8.54110929,7.42955595 C6.63421573,5.93186292 4.86036125,5.93186292 2.9534677,7.37195237 Z"/>
                          </g>
                        </g>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(124.170996, 137.136707)">
                    <rect fill="black" fill-rule="nonzero" x="0" y="0" width="58.1818182" height="48" rx="8"/>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="11.5349091" y="40.3636364">device</tspan>
                    </text>
                    <g transform="translate(-0.000000, 0.000000)" fill-rule="nonzero">
                      <g transform="translate(29.090909, 13.090909) scale(-1, 1) rotate(-180.000000) translate(-29.090909, -13.090909) " fill="black">
                        <path d="M48.3466335,0 C53.7560394,0 58.1818182,4.54497457 58.1818182,10.0876809 L58.1818182,16.0952521 C58.1818182,21.6390732 53.7560394,26.1818182 48.3466335,26.1818182 L9.83518471,26.1818182 C4.4301263,26.1818182 -2.8500871e-15,21.6390732 -2.8500871e-15,16.0952521 L-2.8500871e-15,10.0876809 C-2.8500871e-15,4.54497457 4.4301263,0 9.83518471,0"/>
                      </g>
                      <g transform="translate(41.290603, 13.089230) scale(-1, 1) rotate(-180.000000) translate(-41.290603, -13.089230) translate(26.350339, 1.925226)" fill="white">
                        <path d="M4.05623929,8.16021924 L4.05623929,14.1677905 C4.05623929,18.7071911 7.65816239,22.3280097 12.012207,22.3280097 L21.9973813,22.3280097 C26.3525128,22.3280097 29.880528,18.7071911 29.880528,14.1677905 L29.880528,8.16021924 C29.880528,3.69550912 26.3525128,5.16758353e-15 21.9973813,5.16758353e-15 L-2.79203425e-15,5.16758353e-15 C2.47917519,1.84608239 4.05623929,4.77573487 4.05623929,8.16021924"/>
                      </g>
                      <g transform="translate(12.760525, 12.705191) scale(-1, 1) rotate(-180.000000) translate(-12.760525, -12.705191) translate(5.027911, 6.156949)" fill="white">
                        <path d="M12.4654363,2.58379177e-15 L9.15805795,2.58379177e-15 L8.56027349,2.85384717 C8.1852996,4.85376975 7.80815195,7.31855728 7.73315717,8.24159848 C7.65816239,7.31855728 7.28101474,4.85376975 6.83648048,2.85384717 L6.23326161,2.58379177e-15 L3.00739928,2.58379177e-15 L-2.17973498e-15,13.096483 L3.60518374,13.096483 L3.97798387,10.8624558 C4.27796298,9.01191425 4.58228962,6.78346094 4.73336605,5.23948503 C4.88118185,6.78346094 5.25615574,9.01191425 5.70721128,10.8624558 L6.15500619,13.096483 L9.38521604,13.096483 L9.83409783,10.8624558 C10.2123324,9.01191425 10.5873063,6.78346094 10.7394696,5.23948503 C10.8872854,6.78346094 11.2633461,9.01191425 11.5622384,10.8624558 L11.8643912,13.096483 L15.4652275,13.096483"/>
                      </g>
                      <g transform="translate(23.760845, 12.359269) scale(-1, 1) rotate(-180.000000) translate(-23.760845, -12.359269) translate(21.846304, 5.465778)" fill="white">
                        <path d="M1.87704321,10.5529917 C0.824942557,10.5529917 -3.06783091e-15,11.1694673 -3.06783091e-15,12.1705434 C-3.06783091e-15,13.1727342 0.824942557,13.7869803 1.87704321,13.7869803 C3.00305176,13.7869803 3.8290812,13.1727342 3.8290812,12.1705434 C3.8290812,11.1694673 3.00305176,10.5529917 1.87704321,10.5529917 M0.223897453,9.47388076 L3.52812389,9.47388076 L3.52812389,0 L0.223897453,0 L0.223897453,9.47388076 Z"/>
                      </g>
                      <g transform="translate(40.426533, 12.702956) scale(-1, 1) rotate(-180.000000) translate(-40.426533, -12.702956) translate(34.907352, 6.154715)" fill="black">
                        <polyline points="3.52910208 10.0085312 3.52910208 7.09002655 10.2895009 7.09002655 10.2895009 4.00541909 3.52910208 4.00541909 3.52910208 0 -2.1794613e-15 0 -2.1794613e-15 13.096483 11.0383618 13.096483 11.0383618 10.0085312"/>
                      </g>
                      <g transform="translate(49.662847, 12.359269) scale(-1, 1) rotate(-180.000000) translate(-49.662847, -12.359269) translate(47.747763, 5.465778)" fill="black">
                        <path d="M1.87704321,10.5529917 C0.822768795,10.5529917 -2.17965249e-15,11.1694673 -2.17965249e-15,12.1705434 C-2.17965249e-15,13.1727342 0.822768795,13.7869803 1.87704321,13.7869803 C3.00196488,13.7869803 3.83016808,13.1727342 3.83016808,12.1705434 C3.83016808,11.1694673 3.00196488,10.5529917 1.87704321,10.5529917 M0.223897453,9.47388076 L3.52486325,9.47388076 L3.52486325,2.58379177e-15 L0.223897453,2.58379177e-15 L0.223897453,9.47388076 Z"/>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(421.170996, 83.136707)">
                    <rect fill="black" fill-rule="nonzero" x="0" y="0" width="58.1818182" height="48" rx="8"/>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="11.5349091" y="40.3636364">device</tspan>
                    </text>
                    <g transform="translate(-0.000000, 0.000000)" fill-rule="nonzero">
                      <g transform="translate(29.090909, 13.090909) scale(-1, 1) rotate(-180.000000) translate(-29.090909, -13.090909) " fill="black">
                        <path d="M48.3466335,0 C53.7560394,0 58.1818182,4.54497457 58.1818182,10.0876809 L58.1818182,16.0952521 C58.1818182,21.6390732 53.7560394,26.1818182 48.3466335,26.1818182 L9.83518471,26.1818182 C4.4301263,26.1818182 -2.8500871e-15,21.6390732 -2.8500871e-15,16.0952521 L-2.8500871e-15,10.0876809 C-2.8500871e-15,4.54497457 4.4301263,0 9.83518471,0"/>
                      </g>
                      <g transform="translate(41.290603, 13.089230) scale(-1, 1) rotate(-180.000000) translate(-41.290603, -13.089230) translate(26.350339, 1.925226)" fill="white">
                        <path d="M4.05623929,8.16021924 L4.05623929,14.1677905 C4.05623929,18.7071911 7.65816239,22.3280097 12.012207,22.3280097 L21.9973813,22.3280097 C26.3525128,22.3280097 29.880528,18.7071911 29.880528,14.1677905 L29.880528,8.16021924 C29.880528,3.69550912 26.3525128,5.16758353e-15 21.9973813,5.16758353e-15 L-2.79203425e-15,5.16758353e-15 C2.47917519,1.84608239 4.05623929,4.77573487 4.05623929,8.16021924"/>
                      </g>
                      <g transform="translate(12.760525, 12.705191) scale(-1, 1) rotate(-180.000000) translate(-12.760525, -12.705191) translate(5.027911, 6.156949)" fill="white">
                        <path d="M12.4654363,2.58379177e-15 L9.15805795,2.58379177e-15 L8.56027349,2.85384717 C8.1852996,4.85376975 7.80815195,7.31855728 7.73315717,8.24159848 C7.65816239,7.31855728 7.28101474,4.85376975 6.83648048,2.85384717 L6.23326161,2.58379177e-15 L3.00739928,2.58379177e-15 L-2.17973498e-15,13.096483 L3.60518374,13.096483 L3.97798387,10.8624558 C4.27796298,9.01191425 4.58228962,6.78346094 4.73336605,5.23948503 C4.88118185,6.78346094 5.25615574,9.01191425 5.70721128,10.8624558 L6.15500619,13.096483 L9.38521604,13.096483 L9.83409783,10.8624558 C10.2123324,9.01191425 10.5873063,6.78346094 10.7394696,5.23948503 C10.8872854,6.78346094 11.2633461,9.01191425 11.5622384,10.8624558 L11.8643912,13.096483 L15.4652275,13.096483"/>
                      </g>
                      <g transform="translate(23.760845, 12.359269) scale(-1, 1) rotate(-180.000000) translate(-23.760845, -12.359269) translate(21.846304, 5.465778)" fill="white">
                        <path d="M1.87704321,10.5529917 C0.824942557,10.5529917 -3.06783091e-15,11.1694673 -3.06783091e-15,12.1705434 C-3.06783091e-15,13.1727342 0.824942557,13.7869803 1.87704321,13.7869803 C3.00305176,13.7869803 3.8290812,13.1727342 3.8290812,12.1705434 C3.8290812,11.1694673 3.00305176,10.5529917 1.87704321,10.5529917 M0.223897453,9.47388076 L3.52812389,9.47388076 L3.52812389,0 L0.223897453,0 L0.223897453,9.47388076 Z"/>
                      </g>
                      <g transform="translate(40.426533, 12.702956) scale(-1, 1) rotate(-180.000000) translate(-40.426533, -12.702956) translate(34.907352, 6.154715)" fill="black">
                        <polyline points="3.52910208 10.0085312 3.52910208 7.09002655 10.2895009 7.09002655 10.2895009 4.00541909 3.52910208 4.00541909 3.52910208 0 -2.1794613e-15 0 -2.1794613e-15 13.096483 11.0383618 13.096483 11.0383618 10.0085312"/>
                      </g>
                      <g transform="translate(49.662847, 12.359269) scale(-1, 1) rotate(-180.000000) translate(-49.662847, -12.359269) translate(47.747763, 5.465778)" fill="black">
                        <path d="M1.87704321,10.5529917 C0.822768795,10.5529917 -2.17965249e-15,11.1694673 -2.17965249e-15,12.1705434 C-2.17965249e-15,13.1727342 0.822768795,13.7869803 1.87704321,13.7869803 C3.00196488,13.7869803 3.83016808,13.1727342 3.83016808,12.1705434 C3.83016808,11.1694673 3.00196488,10.5529917 1.87704321,10.5529917 M0.223897453,9.47388076 L3.52486325,9.47388076 L3.52486325,2.58379177e-15 L0.223897453,2.58379177e-15 L0.223897453,9.47388076 Z"/>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(869.000000, 148.000000)">
                    <ellipse stroke="black" fill="white" cx="18" cy="23.5" rx="16" ry="5.5"/>
                    <ellipse fill="white" cx="18" cy="20.5" rx="18" ry="5.5"/>
                    <ellipse fill="white" cx="18" cy="17.5" rx="16" ry="5.5"/>
                    <ellipse stroke="black" fill="white" cx="18" cy="14.5" rx="16" ry="5.5"/>
                    <ellipse fill="white" cx="18" cy="11.5" rx="18" ry="5.5"/>
                    <ellipse fill="white" cx="18" cy="8.5" rx="16" ry="5.5"/>
                    <ellipse stroke="black" fill="white" cx="18" cy="5.5" rx="16" ry="5.5"/>
                    <line x1="2" y1="5" x2="2" y2="23.5" stroke="black" stroke-linecap="round"/>
                    <line x1="34" y1="5" x2="34" y2="23.5" stroke="black" stroke-linecap="round"/>
                    <rect stroke="black" x="7" y="22" width="2" height="2"/>
                    <rect stroke="black" x="7" y="13" width="2" height="2"/>
                  </g>
                  <g transform="translate(273.222222, 188.000000)">
                    <g transform="translate(1.490730, 0.000000)">
                      <g transform="translate(0.000000, 6.526820)" fill="black" fill-rule="nonzero">
                        <polygon points="0 13.47318 0 0 3.27109241 0 3.27109241 11.11443 8.62195345 11.11443 8.62195345 13.47318"/>
                        <path d="M20.908148,8.3028 C20.908148,10.01368 20.447099,11.33458 19.5250009,12.2655 C18.6029029,13.19642 17.347638,13.66188 15.7592063,13.66188 C14.7630711,13.66188 13.8813569,13.45431 13.1140636,13.03917 C12.3467704,12.62403 11.7443778,12.017045 11.306886,11.218215 C10.8693943,10.419385 10.6506484,9.44758 10.6506484,8.3028 C10.6506484,6.59192 11.1116974,5.27731 12.0337955,4.35897 C12.9558935,3.44063 14.2178891,2.98146 15.8197821,2.98146 C16.8024559,2.98146 17.6774395,3.18903 18.4447328,3.60417 C19.212026,4.01931 19.8144186,4.62315 20.2519104,5.41569 C20.6894021,6.20823 20.908148,7.1706 20.908148,8.3028 Z M13.9419327,8.3028 C13.9419327,9.32178 14.0832762,10.092305 14.3659632,10.614375 C14.6486502,11.136445 15.1265258,11.39748 15.7995901,11.39748 C16.4591931,11.39748 16.9269728,11.136445 17.2029292,10.614375 C17.4788855,10.092305 17.6168637,9.32178 17.6168637,8.3028 C17.6168637,7.28382 17.4755202,6.519585 17.1928332,6.010095 C16.9101462,5.500605 16.4390012,5.24586 15.7793982,5.24586 C15.1197952,5.24586 14.6486502,5.500605 14.3659632,6.010095 C14.0832762,6.519585 13.9419327,7.28382 13.9419327,8.3028 Z"/>
                        <path d="M28.0655928,0 C31.7001399,0 33.5174135,1.34606 33.5174135,4.03818 C33.5174135,4.9691 33.2885716,5.720755 32.8308879,6.293145 C32.3732042,6.865535 31.8010995,7.30269 31.114574,7.60461 L35.0721919,13.47318 L31.4174529,13.47318 L28.3684717,8.3028 L27.1367641,8.3028 L27.1367641,13.47318 L23.8656717,13.47318 L23.8656717,0 L28.0655928,0 Z M27.9242493,2.33988 L27.1367641,2.33988 L27.1367641,5.98179 L27.9444412,5.98179 C29.4655665,5.98179 30.2261291,5.35908 30.2261291,4.11366 C30.2261291,3.47208 30.0410364,3.016055 29.6708511,2.745585 C29.3006657,2.475115 28.7184651,2.33988 27.9242493,2.33988 Z"/>
                        <path d="M41.5431111,2.96259 C42.902701,2.96259 43.9560466,3.261365 44.7031479,3.858915 C45.4502493,4.456465 45.8238,5.37166 45.8238,6.6045 L45.8238,13.47318 L43.5824959,13.47318 L42.9565461,12.0768 L42.8757784,12.0768 C42.431556,12.63032 41.9637763,13.03288 41.4724394,13.28448 C40.9811025,13.53608 40.2979422,13.66188 39.4229586,13.66188 C38.5210525,13.66188 37.7638552,13.3977 37.1513667,12.86934 C36.5388782,12.34098 36.2326339,11.51699 36.2326339,10.39737 C36.2326339,9.30291 36.6196459,8.494645 37.3936698,7.972575 C38.1676938,7.450505 39.3085377,7.16431 40.8162017,7.11399 L42.5930914,7.05738 L42.5930914,6.6045 C42.5930914,6.06356 42.4652092,5.66729 42.2094448,5.41569 C41.9536803,5.16409 41.6036869,5.03829 41.1594645,5.03829 C40.6883195,5.03829 40.2070785,5.110625 39.7157416,5.255295 C39.2244047,5.399965 38.7297024,5.57923 38.2316349,5.79309 L37.2422304,3.88722 C37.8210656,3.61046 38.473938,3.387165 39.2008474,3.217335 C39.9277568,3.047505 40.7085114,2.96259 41.5431111,2.96259 Z M42.6132833,8.69907 L41.6440708,8.73681 C40.8498549,8.76197 40.2979422,8.92551 39.9883326,9.22743 C39.6787231,9.52935 39.5239183,9.92562 39.5239183,10.41624 C39.5239183,10.84396 39.6349739,11.149025 39.8570851,11.331435 C40.0791963,11.513845 40.3719793,11.60505 40.735434,11.60505 C41.2469628,11.60505 41.6878199,11.425785 42.0580053,11.067255 C42.4281907,10.708725 42.6132833,10.20238 42.6132833,9.54822 L42.6132833,8.69907 Z"/>
                      </g>
                      <g transform="translate(6.509270, 0.000000)" fill="black">
                        <g>
                          <path d="M1.1875,3.79525965 C1.1875,3.79525965 0,2.40998703 0,2.40998703 C6.86111111,-0.822315739 12.1388889,-0.822315739 19,2.52542642 C19,2.52542642 17.8125,3.91069904 17.8125,3.91069904 C12.1388889,0.909275032 6.86111111,0.909275032 1.1875,3.79525965 Z"/>
                          <path d="M3.15017361,6.2197533 C3.15017361,6.2197533 2.24305556,5.15656985 2.24305556,5.15656985 C7.4841821,2.67580848 11.5158179,2.67580848 16.7569444,5.24516848 C16.7569444,5.24516848 15.8498264,6.30835192 15.8498264,6.30835192 C11.5158179,4.00478779 7.4841821,4.00478779 3.15017361,6.2197533 Z"/>
                          <path d="M4.88194444,8.68027967 C4.88194444,8.68027967 4.22222222,7.86635933 4.22222222,7.86635933 C8.03395062,5.96721186 10.9660494,5.96721186 14.7777778,7.93418602 C14.7777778,7.93418602 14.1180556,8.74810637 14.1180556,8.74810637 C10.9660494,6.98461229 8.03395062,6.98461229 4.88194444,8.68027967 Z"/>
                        </g>
                        <g transform="translate(9.500000, 25.613303) scale(-1, -1) translate(-9.500000, -25.613303) translate(0.000000, 21.226607)">
                          <path d="M1.1875,3.80623006 C1.1875,3.80623006 0,2.41695323 0,2.41695323 C6.86111111,-0.824692688 12.1388889,-0.824692688 19,2.5327263 C19,2.5327263 17.8125,3.92200313 17.8125,3.92200313 C12.1388889,0.911903341 6.86111111,0.911903341 1.1875,3.80623006 Z"/>
                          <path d="M3.15017361,6.23773184 C3.15017361,6.23773184 2.24305556,5.1714752 2.24305556,5.1714752 C7.4841821,2.68354305 11.5158179,2.68354305 16.7569444,5.26032992 C16.7569444,5.26032992 15.8498264,6.32658656 15.8498264,6.32658656 C11.5158179,4.01636384 7.4841821,4.01636384 3.15017361,6.23773184 Z"/>
                          <path d="M4.88194444,8.70537049 C4.88194444,8.70537049 4.22222222,7.88909747 4.22222222,7.88909747 C8.03395062,5.98446041 10.9660494,5.98446041 14.7777778,7.95712022 C14.7777778,7.95712022 14.1180556,8.77339324 14.1180556,8.77339324 C10.9660494,7.00480169 8.03395062,7.00480169 4.88194444,8.70537049 Z"/>
                        </g>
                      </g>
                    </g>
                  </g>
                  <g transform="translate(269.000000, 15.500000)">
                    <rect fill="black" x="0" y="0" width="50" height="45" rx="8"/>
                    <g transform="translate(1.000000, 1.000000)" fill="white">
                      <text font-family="sans-serif" font-size="18.87" font-weight="bold">
                        <tspan x="0" y="20">LoRa</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="3.552" font-weight="bold">
                        <tspan x="44.9801605" y="12.2842792">®</tspan>
                      </text>
                      <g transform="translate(8.241404, 0.640373)">
                        <g>
                          <path d="M1.00560589,3.71424697 C1.00560589,3.71424697 0,2.35854404 0,2.35854404 C5.81016736,-0.804762788 10.2795269,-0.804762788 16.0896942,2.47151928 C16.0896942,2.47151928 15.0840883,3.82722221 15.0840883,3.82722221 C10.2795269,0.88986587 5.81016736,0.88986587 1.00560589,3.71424697 Z"/>
                          <path d="M2.66764896,6.08698797 C2.66764896,6.08698797 1.89947779,5.04649897 1.89947779,5.04649897 C6.33780008,2.61869132 9.75189415,2.61869132 14.1902164,5.13320639 C14.1902164,5.13320639 13.4220453,6.17369538 13.4220453,6.17369538 C9.75189415,3.91930256 6.33780008,3.91930256 2.66764896,6.08698797 Z"/>
                          <path d="M4.13415754,8.49499254 C4.13415754,8.49499254 3.57548761,7.69844594 3.57548761,7.69844594 C6.80335836,5.83983721 9.28633586,5.83983721 12.5142066,7.76482483 C12.5142066,7.76482483 11.9555367,8.56137142 11.9555367,8.56137142 C9.28633586,6.83552046 6.80335836,6.83552046 4.13415754,8.49499254 Z"/>
                        </g>
                        <g transform="translate(8.044847, 25.066568) scale(-1, -1) translate(-8.044847, -25.066568) translate(0.000000, 20.773509)">
                          <path d="M1.00560589,3.7249832 C1.00560589,3.7249832 0,2.36536154 0,2.36536154 C5.81016736,-0.807088999 10.2795269,-0.807088999 16.0896942,2.47866334 C16.0896942,2.47866334 15.0840883,3.838285 15.0840883,3.838285 C10.2795269,0.892438075 5.81016736,0.892438075 1.00560589,3.7249832 Z"/>
                          <path d="M2.66764896,6.10458274 C2.66764896,6.10458274 1.89947779,5.06108615 1.89947779,5.06108615 C6.33780008,2.62626079 9.75189415,2.62626079 14.1902164,5.1480442 C14.1902164,5.1480442 13.4220453,6.19154079 13.4220453,6.19154079 C9.75189415,3.93063152 6.33780008,3.93063152 2.66764896,6.10458274 Z"/>
                          <path d="M4.13415754,8.51954778 C4.13415754,8.51954778 3.57548761,7.72069872 3.57548761,7.72069872 C6.80335836,5.85671758 9.28633586,5.85671758 12.5142066,7.78726947 C12.5142066,7.78726947 11.9555367,8.58611853 11.9555367,8.58611853 C9.28633586,6.8552789 6.80335836,6.8552789 4.13415754,8.51954778 Z"/>
                        </g>
                      </g>
                    </g>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="7.552" y="42">sensor</tspan>
                    </text>
                  </g>
                  <g transform="translate(385.000000, 15.500000)">
                    <rect fill="black" x="0" y="0" width="50" height="45" rx="8"/>
                    <g transform="translate(1.000000, 1.000000)" fill="white">
                      <text font-family="sans-serif" font-size="18.87" font-weight="bold">
                        <tspan x="0" y="20">LoRa</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="3.552" font-weight="bold">
                        <tspan x="44.9801605" y="12.2842792">®</tspan>
                      </text>
                      <g transform="translate(8.241404, 0.640373)">
                        <g>
                          <path d="M1.00560589,3.71424697 C1.00560589,3.71424697 0,2.35854404 0,2.35854404 C5.81016736,-0.804762788 10.2795269,-0.804762788 16.0896942,2.47151928 C16.0896942,2.47151928 15.0840883,3.82722221 15.0840883,3.82722221 C10.2795269,0.88986587 5.81016736,0.88986587 1.00560589,3.71424697 Z"/>
                          <path d="M2.66764896,6.08698797 C2.66764896,6.08698797 1.89947779,5.04649897 1.89947779,5.04649897 C6.33780008,2.61869132 9.75189415,2.61869132 14.1902164,5.13320639 C14.1902164,5.13320639 13.4220453,6.17369538 13.4220453,6.17369538 C9.75189415,3.91930256 6.33780008,3.91930256 2.66764896,6.08698797 Z"/>
                          <path d="M4.13415754,8.49499254 C4.13415754,8.49499254 3.57548761,7.69844594 3.57548761,7.69844594 C6.80335836,5.83983721 9.28633586,5.83983721 12.5142066,7.76482483 C12.5142066,7.76482483 11.9555367,8.56137142 11.9555367,8.56137142 C9.28633586,6.83552046 6.80335836,6.83552046 4.13415754,8.49499254 Z"/>
                        </g>
                        <g transform="translate(8.044847, 25.066568) scale(-1, -1) translate(-8.044847, -25.066568) translate(0.000000, 20.773509)">
                          <path d="M1.00560589,3.7249832 C1.00560589,3.7249832 0,2.36536154 0,2.36536154 C5.81016736,-0.807088999 10.2795269,-0.807088999 16.0896942,2.47866334 C16.0896942,2.47866334 15.0840883,3.838285 15.0840883,3.838285 C10.2795269,0.892438075 5.81016736,0.892438075 1.00560589,3.7249832 Z"/>
                          <path d="M2.66764896,6.10458274 C2.66764896,6.10458274 1.89947779,5.06108615 1.89947779,5.06108615 C6.33780008,2.62626079 9.75189415,2.62626079 14.1902164,5.1480442 C14.1902164,5.1480442 13.4220453,6.19154079 13.4220453,6.19154079 C9.75189415,3.93063152 6.33780008,3.93063152 2.66764896,6.10458274 Z"/>
                          <path d="M4.13415754,8.51954778 C4.13415754,8.51954778 3.57548761,7.72069872 3.57548761,7.72069872 C6.80335836,5.85671758 9.28633586,5.85671758 12.5142066,7.78726947 C12.5142066,7.78726947 11.9555367,8.58611853 11.9555367,8.58611853 C9.28633586,6.8552789 6.80335836,6.8552789 4.13415754,8.51954778 Z"/>
                        </g>
                      </g>
                    </g>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="7.552" y="42">sensor</tspan>
                    </text>
                  </g>
                  <g transform="translate(486.000000, 186.500000)">
                    <rect fill="black" x="0" y="0" width="50" height="45" rx="8"/>
                    <g transform="translate(1.000000, 1.000000)" fill="white">
                      <text font-family="sans-serif" font-size="18.87" font-weight="bold">
                        <tspan x="0" y="20">LoRa</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="3.552" font-weight="bold">
                        <tspan x="44.9801605" y="12.2842792">®</tspan>
                      </text>
                      <g transform="translate(8.241404, 0.640373)">
                        <g>
                          <path d="M1.00560589,3.71424697 C1.00560589,3.71424697 0,2.35854404 0,2.35854404 C5.81016736,-0.804762788 10.2795269,-0.804762788 16.0896942,2.47151928 C16.0896942,2.47151928 15.0840883,3.82722221 15.0840883,3.82722221 C10.2795269,0.88986587 5.81016736,0.88986587 1.00560589,3.71424697 Z"/>
                          <path d="M2.66764896,6.08698797 C2.66764896,6.08698797 1.89947779,5.04649897 1.89947779,5.04649897 C6.33780008,2.61869132 9.75189415,2.61869132 14.1902164,5.13320639 C14.1902164,5.13320639 13.4220453,6.17369538 13.4220453,6.17369538 C9.75189415,3.91930256 6.33780008,3.91930256 2.66764896,6.08698797 Z"/>
                          <path d="M4.13415754,8.49499254 C4.13415754,8.49499254 3.57548761,7.69844594 3.57548761,7.69844594 C6.80335836,5.83983721 9.28633586,5.83983721 12.5142066,7.76482483 C12.5142066,7.76482483 11.9555367,8.56137142 11.9555367,8.56137142 C9.28633586,6.83552046 6.80335836,6.83552046 4.13415754,8.49499254 Z"/>
                        </g>
                        <g transform="translate(8.044847, 25.066568) scale(-1, -1) translate(-8.044847, -25.066568) translate(0.000000, 20.773509)">
                          <path d="M1.00560589,3.7249832 C1.00560589,3.7249832 0,2.36536154 0,2.36536154 C5.81016736,-0.807088999 10.2795269,-0.807088999 16.0896942,2.47866334 C16.0896942,2.47866334 15.0840883,3.838285 15.0840883,3.838285 C10.2795269,0.892438075 5.81016736,0.892438075 1.00560589,3.7249832 Z"/>
                          <path d="M2.66764896,6.10458274 C2.66764896,6.10458274 1.89947779,5.06108615 1.89947779,5.06108615 C6.33780008,2.62626079 9.75189415,2.62626079 14.1902164,5.1480442 C14.1902164,5.1480442 13.4220453,6.19154079 13.4220453,6.19154079 C9.75189415,3.93063152 6.33780008,3.93063152 2.66764896,6.10458274 Z"/>
                          <path d="M4.13415754,8.51954778 C4.13415754,8.51954778 3.57548761,7.72069872 3.57548761,7.72069872 C6.80335836,5.85671758 9.28633586,5.85671758 12.5142066,7.78726947 C12.5142066,7.78726947 11.9555367,8.58611853 11.9555367,8.58611853 C9.28633586,6.8552789 6.80335836,6.8552789 4.13415754,8.51954778 Z"/>
                        </g>
                      </g>
                    </g>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="7.552" y="42">sensor</tspan>
                    </text>
                  </g>
                  <g transform="translate(581.000000, 15.500000)">
                    <rect fill="black" x="0" y="0" width="50" height="45" rx="8"/>
                    <g transform="translate(1.000000, 1.000000)" fill="white">
                      <text font-family="sans-serif" font-size="18.87" font-weight="bold">
                        <tspan x="0" y="20">LoRa</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="3.552" font-weight="bold">
                        <tspan x="44.9801605" y="12.2842792">®</tspan>
                      </text>
                      <g transform="translate(8.241404, 0.640373)">
                        <g>
                          <path d="M1.00560589,3.71424697 C1.00560589,3.71424697 0,2.35854404 0,2.35854404 C5.81016736,-0.804762788 10.2795269,-0.804762788 16.0896942,2.47151928 C16.0896942,2.47151928 15.0840883,3.82722221 15.0840883,3.82722221 C10.2795269,0.88986587 5.81016736,0.88986587 1.00560589,3.71424697 Z"/>
                          <path d="M2.66764896,6.08698797 C2.66764896,6.08698797 1.89947779,5.04649897 1.89947779,5.04649897 C6.33780008,2.61869132 9.75189415,2.61869132 14.1902164,5.13320639 C14.1902164,5.13320639 13.4220453,6.17369538 13.4220453,6.17369538 C9.75189415,3.91930256 6.33780008,3.91930256 2.66764896,6.08698797 Z"/>
                          <path d="M4.13415754,8.49499254 C4.13415754,8.49499254 3.57548761,7.69844594 3.57548761,7.69844594 C6.80335836,5.83983721 9.28633586,5.83983721 12.5142066,7.76482483 C12.5142066,7.76482483 11.9555367,8.56137142 11.9555367,8.56137142 C9.28633586,6.83552046 6.80335836,6.83552046 4.13415754,8.49499254 Z"/>
                        </g>
                        <g transform="translate(8.044847, 25.066568) scale(-1, -1) translate(-8.044847, -25.066568) translate(0.000000, 20.773509)">
                          <path d="M1.00560589,3.7249832 C1.00560589,3.7249832 0,2.36536154 0,2.36536154 C5.81016736,-0.807088999 10.2795269,-0.807088999 16.0896942,2.47866334 C16.0896942,2.47866334 15.0840883,3.838285 15.0840883,3.838285 C10.2795269,0.892438075 5.81016736,0.892438075 1.00560589,3.7249832 Z"/>
                          <path d="M2.66764896,6.10458274 C2.66764896,6.10458274 1.89947779,5.06108615 1.89947779,5.06108615 C6.33780008,2.62626079 9.75189415,2.62626079 14.1902164,5.1480442 C14.1902164,5.1480442 13.4220453,6.19154079 13.4220453,6.19154079 C9.75189415,3.93063152 6.33780008,3.93063152 2.66764896,6.10458274 Z"/>
                          <path d="M4.13415754,8.51954778 C4.13415754,8.51954778 3.57548761,7.72069872 3.57548761,7.72069872 C6.80335836,5.85671758 9.28633586,5.85671758 12.5142066,7.78726947 C12.5142066,7.78726947 11.9555367,8.58611853 11.9555367,8.58611853 C9.28633586,6.8552789 6.80335836,6.8552789 4.13415754,8.51954778 Z"/>
                        </g>
                      </g>
                    </g>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="7.552" y="42">sensor</tspan>
                    </text>
                  </g>
                  <g transform="translate(74.000000, 40.500000)">
                    <rect fill="black" x="0" y="0" width="50" height="45" rx="8"/>
                    <g transform="translate(1.000000, 1.000000)" fill="white">
                      <text font-family="sans-serif" font-size="18.87" font-weight="bold">
                        <tspan x="0" y="20">LoRa</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="3.552" font-weight="bold">
                        <tspan x="44.9801605" y="12.2842792">®</tspan>
                      </text>
                      <g transform="translate(8.241404, 0.640373)">
                        <g>
                          <path d="M1.00560589,3.71424697 C1.00560589,3.71424697 0,2.35854404 0,2.35854404 C5.81016736,-0.804762788 10.2795269,-0.804762788 16.0896942,2.47151928 C16.0896942,2.47151928 15.0840883,3.82722221 15.0840883,3.82722221 C10.2795269,0.88986587 5.81016736,0.88986587 1.00560589,3.71424697 Z"/>
                          <path d="M2.66764896,6.08698797 C2.66764896,6.08698797 1.89947779,5.04649897 1.89947779,5.04649897 C6.33780008,2.61869132 9.75189415,2.61869132 14.1902164,5.13320639 C14.1902164,5.13320639 13.4220453,6.17369538 13.4220453,6.17369538 C9.75189415,3.91930256 6.33780008,3.91930256 2.66764896,6.08698797 Z"/>
                          <path d="M4.13415754,8.49499254 C4.13415754,8.49499254 3.57548761,7.69844594 3.57548761,7.69844594 C6.80335836,5.83983721 9.28633586,5.83983721 12.5142066,7.76482483 C12.5142066,7.76482483 11.9555367,8.56137142 11.9555367,8.56137142 C9.28633586,6.83552046 6.80335836,6.83552046 4.13415754,8.49499254 Z"/>
                        </g>
                        <g transform="translate(8.044847, 25.066568) scale(-1, -1) translate(-8.044847, -25.066568) translate(0.000000, 20.773509)">
                          <path d="M1.00560589,3.7249832 C1.00560589,3.7249832 0,2.36536154 0,2.36536154 C5.81016736,-0.807088999 10.2795269,-0.807088999 16.0896942,2.47866334 C16.0896942,2.47866334 15.0840883,3.838285 15.0840883,3.838285 C10.2795269,0.892438075 5.81016736,0.892438075 1.00560589,3.7249832 Z"/>
                          <path d="M2.66764896,6.10458274 C2.66764896,6.10458274 1.89947779,5.06108615 1.89947779,5.06108615 C6.33780008,2.62626079 9.75189415,2.62626079 14.1902164,5.1480442 C14.1902164,5.1480442 13.4220453,6.19154079 13.4220453,6.19154079 C9.75189415,3.93063152 6.33780008,3.93063152 2.66764896,6.10458274 Z"/>
                          <path d="M4.13415754,8.51954778 C4.13415754,8.51954778 3.57548761,7.72069872 3.57548761,7.72069872 C6.80335836,5.85671758 9.28633586,5.85671758 12.5142066,7.78726947 C12.5142066,7.78726947 11.9555367,8.58611853 11.9555367,8.58611853 C9.28633586,6.8552789 6.80335836,6.8552789 4.13415754,8.51954778 Z"/>
                        </g>
                      </g>
                    </g>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="7.552" y="42">sensor</tspan>
                    </text>
                  </g>
                  <g transform="translate(32.000000, 177.500000)">
                    <rect fill="black" x="0" y="0" width="50" height="45" rx="8"/>
                    <g transform="translate(1.000000, 1.000000)" fill="white">
                      <text font-family="sans-serif" font-size="18.87" font-weight="bold">
                        <tspan x="0" y="20">LoRa</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="3.552" font-weight="bold">
                        <tspan x="44.9801605" y="12.2842792">®</tspan>
                      </text>
                      <g transform="translate(8.241404, 0.640373)">
                        <g>
                          <path d="M1.00560589,3.71424697 C1.00560589,3.71424697 0,2.35854404 0,2.35854404 C5.81016736,-0.804762788 10.2795269,-0.804762788 16.0896942,2.47151928 C16.0896942,2.47151928 15.0840883,3.82722221 15.0840883,3.82722221 C10.2795269,0.88986587 5.81016736,0.88986587 1.00560589,3.71424697 Z"/>
                          <path d="M2.66764896,6.08698797 C2.66764896,6.08698797 1.89947779,5.04649897 1.89947779,5.04649897 C6.33780008,2.61869132 9.75189415,2.61869132 14.1902164,5.13320639 C14.1902164,5.13320639 13.4220453,6.17369538 13.4220453,6.17369538 C9.75189415,3.91930256 6.33780008,3.91930256 2.66764896,6.08698797 Z"/>
                          <path d="M4.13415754,8.49499254 C4.13415754,8.49499254 3.57548761,7.69844594 3.57548761,7.69844594 C6.80335836,5.83983721 9.28633586,5.83983721 12.5142066,7.76482483 C12.5142066,7.76482483 11.9555367,8.56137142 11.9555367,8.56137142 C9.28633586,6.83552046 6.80335836,6.83552046 4.13415754,8.49499254 Z"/>
                        </g>
                        <g transform="translate(8.044847, 25.066568) scale(-1, -1) translate(-8.044847, -25.066568) translate(0.000000, 20.773509)">
                          <path d="M1.00560589,3.7249832 C1.00560589,3.7249832 0,2.36536154 0,2.36536154 C5.81016736,-0.807088999 10.2795269,-0.807088999 16.0896942,2.47866334 C16.0896942,2.47866334 15.0840883,3.838285 15.0840883,3.838285 C10.2795269,0.892438075 5.81016736,0.892438075 1.00560589,3.7249832 Z"/>
                          <path d="M2.66764896,6.10458274 C2.66764896,6.10458274 1.89947779,5.06108615 1.89947779,5.06108615 C6.33780008,2.62626079 9.75189415,2.62626079 14.1902164,5.1480442 C14.1902164,5.1480442 13.4220453,6.19154079 13.4220453,6.19154079 C9.75189415,3.93063152 6.33780008,3.93063152 2.66764896,6.10458274 Z"/>
                          <path d="M4.13415754,8.51954778 C4.13415754,8.51954778 3.57548761,7.72069872 3.57548761,7.72069872 C6.80335836,5.85671758 9.28633586,5.85671758 12.5142066,7.78726947 C12.5142066,7.78726947 11.9555367,8.58611853 11.9555367,8.58611853 C9.28633586,6.8552789 6.80335836,6.8552789 4.13415754,8.51954778 Z"/>
                        </g>
                      </g>
                    </g>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="white">
                      <tspan x="7.552" y="42">sensor</tspan>
                    </text>
                  </g>
                </g>
              </svg>
            </artwork>
          </figure>
          <t>In addition to specifying encryption and signing types, schema rules control which users can access specific sensors.
For example, an outside predictive maintenance analysis vendor can be allowed access to the vibration sensor data from
critical motors, relayed through the Internet, while only plant Security can see images from on-site cameras.</t>
        </section>
      </section>
      <section anchor="secure-access-to-distributed-energy-resources-der">
        <name>Secure access to Distributed Energy Resources (DER)</name>
        <t>The electrical power grid is evolving to encompass many smaller generators with complex interconnections. Renewable energy systems such as smaller-scale wind and solar generator sites must be economically accessed by multiple users such as building owners, renewable asset aggregators, utilities, and maintenance personnel with varying levels of access rights. North American Electric Reliability Corporation Critical Infrastructure Protection (NERC CIP) regulations specify requirements for communications security and reliability to guard against grid outages <xref target="DER"/>. Legacy NERC CIP compliant utility communications approaches, using dedicated physically secured links to a few large generators, are no longer practical. DeftT offers multiple advantages over bilateral TLS sessions for this use case:</t>
        <ul spacing="compact">
          <li>Security. Encryption, authentication, and authorization of all information objects. Secure brokerless pub/sub avoids single-point broker vulnerabilities. Large generation assets of hundreds of megawatts to more than 1 gigawatt, particularly nuclear power plants must be controlled securely or risk large-scale loss of life accidents. Hence, they are attractive targets for sophisticated nation-state cyber attackers seeking damage with national security implications. Even small-scale DER generators are susceptible to a coordinated attack which could still bring down the electric grid.</li>
          <li>Scalability. Provisioning, maintaining, and distributing multiple keys with descriptive, institutionalized, hierarchical names. DeftT allows keys to be published and securely updated on-line. Where historically a few hundred large-scale generators could supply all of the energy needs for a wide geographic area, now small-scale DER such as residential solar photovoltaic (PV) systems are located at hundreds of thousands of geographically dispersed sites. Many new systems are added daily and must be accommodated economically to spur wider adoption.</li>
          <li>Resiliency. A mesh network of multiple client users, redundant servers, and end devices adds reliability without sacrificing security. Generation assets must be kept on-line continuously or failures risk causing a grid-wide blackout. Climate change is driving frequent natural disasters including wildfires, hurricanes, and temperature extremes which can impact the communications infrastructure. If the network is not resilient communications breakdowns can disable generators on the grid leading to blackouts.</li>
          <li>Efficiency. Data can be published once from edge gateways over expensive cellular links and be accessed through servers by multiple authorized users, without sacrificing security. For small residential DER systems, economical but reliable connectivity is required to spur adoption of PV compared to purchasing from the grid. However, for analytics, maintenance and grid control purposes, regular updates from the site by multiple users are required. Pub/sub via DeftT allows both goals to be met efficiently.</li>
          <li>Flexible Trust rules: Varying levels of permissions are possible on a user-by-user and site-by-site basis to tightly control user security and privacy at the information object level. In an energy ecosystem with many DER, access requirements are quite complex. For example, a PV and battery storage system can be monitored on a regular basis by a homeowner. Separate equipment vendors for batteries and solar generation assets, including inverters, need to perform firmware updates or to monitor that the equipment is operating correctly for maintenance and warranty purposes. DER aggregators may contract with a utility to supply and control multiple DER systems, while the utility may want to access production data and perform some controls themselves such as during a fire event where the system must be shut down. Different permissions are required for each user. For example, hourly usage data which gives detailed insight into customer behaviors can be seen by the homeowner, but for privacy reasons might only be shared with the aggregator if permission is given. These roles and permissions can be expressed in the communication rules and then secured by DeftT's use of compiled schemas.</li>
        </ul>
        <t>The specificity of the requirements of NERC CIP can be used to create communication schemas that contain site-specifics, allowing applications to be streamlined and generic for their functionality, rather than containing security and site-specifics.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document presents a transport protocol that secures the information it conveys (COMSEC in the language of <xref target="RFC3552"/>). Security of data in the application space is out-of-scope for this document, but use of a trusted execution environment (TEE), e.g., ARM's TrustZone, is recommended where this is of concern.
There is significant industry awareness of the ubiquitous need for trust of computing devices.
To the extent that they have sponsored Caliptra <xref target="caliptra"/>, the RTL (registered transfer language) for a root of trust element
that can be included without cost in any design.</t>
      <t>Unauthorized changes to DeftT code could bypass validation of received PDUs or modify the content of outgoing PDUs prior to
signing
(but only valid PDUs are accepted at receiver; invalid PDUs are dropped by uncompromised member). Although securing DeftT's code is out-of-scope for this document, DeftT has been designed to be easily deployed with a TEE. Revisiting <xref target="figte"/>, <xref target="fig12"/> highlights how all of the DeftT code and data can be placed in the secure zone (long-dashed line), reachable <em>only</em> via callgates for the Publish and Subscribe API calls.</t>
      <figure anchor="fig12">
        <name>DeftT secured with a Trusted Execution Environment
</name>
        <artwork type="svg" originalSrc="./figs/hwtrust-rfc.svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80%" height="80%" viewBox="0 0 386 218" version="1.1">
            <desc>hwtrust</desc>
            <title>hwtrust-rfc</title>
            <g stroke-width="1" fill="none" fill-rule="evenodd">
              <g>
                <g transform="translate(5, 41)">
                  <g transform="translate(12, 34)">
                    <rect stroke="black" stroke-width="2" fill="white" x="0" y="0" width="86" height="111" rx="8"/>
                    <text font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                      <tspan x="12.73" y="44">Device- and </tspan>
                      <tspan x="12.075" y="56">app-specific </tspan>
                      <tspan x="13.89" y="68">commands </tspan>
                      <tspan x="31.06" y="80">and </tspan>
                      <tspan x="11" y="92">notifications</tspan>
                    </text>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="4" y="13">Application</tspan>
                    </text>
                  </g>
                  <g transform="translate(84.9969, 9)">
                    <path d="M35.0030914,0 L221.003091,0 C225.421369,-8.11624501e-16 229.003091,3.581722 229.003091,8 L229.003091,134 C229.003091,138.418278 225.421369,142 221.003091,142 L35.0030914,142 C30.5848134,142 27.0030914,138.418278 27.0030914,134 L27.0030914,8 C27.0030914,3.581722 30.5848134,5.41083001e-16 35.0030914,0 Z" stroke="black" stroke-dasharray="1"/>
                    <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                      <tspan x="32.1730914" y="13">DeftT</tspan>
                    </text>
                    <g transform="translate(93.0031, 6)">
                      <g transform="translate(24.5, 27)" fill="black" fill-rule="nonzero">
                        <path d="M82,0 L82,25.591 L85.5642122,19.2548694 L86.4357878,19.7451306 L81.9357878,27.7451306 L81.5,28.5198644 L81.0642122,27.7451306 L76.5642122,19.7451306 L77.4357878,19.2548694 L81,25.591 L81,0 L82,0 Z"/>
                        <path d="M1,0 L1,64.591 L4.56421223,58.2548694 L5.43578777,58.7451306 L0.935787769,66.7451306 L0.5,67.5198644 L0.0642122314,66.7451306 L-4.43578777,58.7451306 L-3.56421223,58.2548694 L0,64.591 L0,0 L1,0 Z"/>
                      </g>
                      <rect stroke="black" fill="white" x="0" y="0" width="129" height="33"/>
                      <text font-family="sans-serif" font-size="14" font-weight="normal" fill="black">
                        <tspan x="13" y="15">Certs, keys and </tspan>
                        <tspan x="37.227" y="30">schema</tspan>
                      </text>
                    </g>
                    <g transform="translate(0, 75)">
                      <path d="M8.25796073,9.06421223 L8.74822197,9.93578777 L2.411,13.5 L46.0030914,13.5 L46.0030914,14.5 L2.411,14.5 L8.74822197,18.0642122 L8.25796073,18.9357878 L0.257960734,14.4357878 L-0.516773076,14 L0.257960734,13.5642122 L8.25796073,9.06421223 Z" fill="black" fill-rule="nonzero"/>
                      <path d="M7.17353208,33.2612185 L7.67892974,34.124105 L1.406,37.798 L7.47998729,37.6923328 L36.9915475,37.1772068 L37.0089999,38.1770545 L7.49743969,38.6921805 L1.423,38.798 L7.82079025,42.2512915 L7.34581476,43.1312905 L-0.731502599,38.7715951 L-1.51372396,38.3493947 L-0.746713684,37.9001523 L7.17353208,33.2612185 Z" transform="translate(18.5031, 38) scale(-1, 1) rotate(1) translate(-18.5031, -38)" fill="black" fill-rule="nonzero"/>
                      <path d="M87.2433526,38.3784245 L99.2433526,45.1284245 L100.79282,46 L99.2433526,46.8715755 L87.2433526,53.6215755 L86.2628301,51.8784245 L94.935,47 L46.0030914,47 L46.0030914,45 L94.935,45 L86.2628301,40.1215755 L87.2433526,38.3784245 Z" fill="black" fill-rule="nonzero"/>
                      <rect stroke="black" fill="white" x="39.0030914" y="0" width="11" height="52" rx="5.5"/>
                      <text transform="translate(45.0031, 26) rotate(90) translate(-45.0031, -26)" font-family="sans-serif" font-size="10" font-weight="normal" fill="black">
                        <tspan x="33.2030914" y="30">Shim</tspan>
                      </text>
                    </g>
                    <g transform="translate(51.0031, 69)">
                      <path d="M196.688664,43.9517946 L208.734304,50.6200077 L210.289664,51.4810227 L208.746161,52.3631184 L196.792356,59.194593 L195.799999,57.4581523 L204.439,52.52 L196.266869,52.576439 L134.006803,52.9999769 L133.993197,51.0000231 L196.253264,50.5764853 L204.427,50.521 L195.720022,45.7015754 L196.688664,43.9517946 Z" fill="black" fill-rule="nonzero"/>
                      <path d="M12.7597388,5.37842446 L13.7402612,7.12157554 L5.065,12 L152,12 L152,14 L5.068,14 L13.7402612,18.8784245 L12.7597388,20.6215755 L0.75973876,13.8715755 L-0.789728861,13 L0.75973876,12.1284245 L12.7597388,5.37842446 Z" fill="black" fill-rule="nonzero"/>
                      <path d="M184.759739,5.37842446 L185.740261,7.12157554 L177.065,12 L208,12 L208,14 L177.068,14 L185.740261,18.8784245 L184.759739,20.6215755 L172.759739,13.8715755 L171.210271,13 L172.759739,12.1284245 L184.759739,5.37842446 Z" fill="black" fill-rule="nonzero"/>
                      <text font-family="sans-serif" font-size="9" font-weight="bold" fill="black">
                        <tspan x="19.2425" y="10">Subscribe</tspan>
                      </text>
                      <text font-family="sans-serif" font-size="9" font-weight="bold" fill="black">
                        <tspan x="0.431" y="61">Publish</tspan>
                      </text>
                    </g>
                    <g transform="translate(126.0031, 64)">
                      <rect stroke="black" fill="white" x="0" y="0" width="96" height="33" rx="8"/>
                      <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                        <tspan x="16" y="14">Publication </tspan>
                        <tspan x="22.15" y="28">Validator</tspan>
                      </text>
                    </g>
                    <g transform="translate(101.0031, 103)">
                      <rect stroke="black" fill="white" x="0" y="0" width="96" height="33" rx="8"/>
                      <text font-family="sans-serif" font-size="12" font-weight="normal" fill="black">
                        <tspan x="16" y="14">Publication </tspan>
                        <tspan x="27.166" y="28">Builder</tspan>
                      </text>
                    </g>
                  </g>
                  <g transform="translate(343, 54)">
                    <g stroke="black">
                      <path d="M3,0 C6.42663109,6.75 6.42663109,8.25 3,15 C-0.426631091,21.75 -0.807367879,23.25 3,30 C6.80736788,36.75 6.80736788,37.5 3,45 C-0.807367879,52.5 -1.18810467,52.5 3,60 C7.18810467,67.5 6.80736788,68.25 3,75 C-0.807367879,81.75 -0.807367879,82.5 3,90 C6.80736788,97.5 7.18810467,97.5 3,105"/>
                      <path d="M6,0 C9.42663109,6.75 9.42663109,8.25 6,15 C2.57336891,21.75 2.19263212,23.25 6,30 C9.80736788,36.75 9.80736788,37.5 6,45 C2.19263212,52.5 1.81189533,52.5 6,60 C10.1881047,67.5 9.80736788,68.25 6,75 C2.19263212,81.75 2.19263212,82.5 6,90 C9.80736788,97.5 10.1881047,97.5 6,105"/>
                      <path d="M9,0 C12.4266311,6.75 12.4266311,8.25 9,15 C5.57336891,21.75 5.19263212,23.25 9,30 C12.8073679,36.75 12.8073679,37.5 9,45 C5.19263212,52.5 4.81189533,52.5 9,60 C13.1881047,67.5 12.8073679,68.25 9,75 C5.19263212,81.75 5.19263212,82.5 9,90 C12.8073679,97.5 13.1881047,97.5 9,105"/>
                      <path d="M12,0 C15.4266311,6.75 15.4266311,8.25 12,15 C8.57336891,21.75 8.19263212,23.25 12,30 C15.8073679,36.75 15.8073679,37.5 12,45 C8.19263212,52.5 7.81189533,52.5 12,60 C16.1881047,67.5 15.8073679,68.25 12,75 C8.19263212,81.75 8.19263212,82.5 12,90 C15.8073679,97.5 16.1881047,97.5 12,105"/>
                    </g>
                    <text transform="translate(28, 54.5) rotate(90) translate(-28, -54.5)" font-family="sans-serif" font-size="14" font-weight="bold" fill="black">
                      <tspan x="-2.709" y="60">Network</tspan>
                    </text>
                  </g>
                  <path d="M8,0 L317,0 C321.418278,-8.11624501e-16 325,3.581722 325,8 L325,151 C325,155.418278 321.418278,159 317,159 L8,159 C3.581722,159 2.705415e-16,155.418278 0,151 L0,8 C-5.41083001e-16,3.581722 3.581722,5.41083001e-16 8,0 Z" stroke="black" stroke-dasharray="3"/>
                  <text font-family="sans-serif" font-size="14" font-weight="bold" fill="black">
                    <tspan x="5.045" y="15">On-Device</tspan>
                  </text>
                  <g transform="translate(297, 36)" fill="black" fill-rule="nonzero">
                    <path d="M4,8 C3.445,8 3,7.55 3,7 C3,6.445 3.445,6 4,6 C4.55228475,6 5,6.44771525 5,7 C5,7.55228475 4.55228475,8 4,8 M7,9.5 L7,4.5 L1,4.5 L1,9.5 L7,9.5 M7,3.5 C7.55228475,3.5 8,3.94771525 8,4.5 L8,9.5 C8,10.0522847 7.55228475,10.5 7,10.5 L1,10.5 C0.445,10.5 0,10.05 0,9.5 L0,4.5 C0,3.945 0.445,3.5 1,3.5 L1.5,3.5 L1.5,2.5 C1.5,1.11928813 2.61928813,0 4,0 C4.66304122,0 5.29892601,0.263392101 5.76776695,0.732233047 C6.2366079,1.20107399 6.5,1.83695878 6.5,2.5 L6.5,3.5 L7,3.5 M4,1 C3.17157288,1 2.5,1.67157288 2.5,2.5 L2.5,3.5 L5.5,3.5 L5.5,2.5 C5.5,1.67157288 4.82842712,1 4,1 Z"/>
                  </g>
                </g>
                <g transform="translate(36.5, 3)" fill="black">
                  <g transform="translate(67.5, 172.5) scale(-1, 1) translate(-67.5, -172.5)translate(44.5, 139)" fill-rule="nonzero">
                    <path d="M-0.734736968,-1.33046964 L0.0212699137,-0.862947397 L7.82789326,3.96474687 L7.30193073,4.81525461 L1.117,0.991 L4.0549534,6.30846194 L37.4376935,66.7582886 L36.5623065,67.2417114 L3.17956635,6.79188464 L0.243,1.473 L0.186413195,8.74471952 L-0.813556158,8.73689058 L-0.741696027,-0.441607997 L-0.734736968,-1.33046964 Z"/>
                    <path d="M-0.869638456,22.7535182 L-0.0689487319,23.1395486 L8.19907533,27.125747 L7.7647912,28.0265229 L1.217,24.869 L4.66908821,29.8185113 L30.261,66.5 L46,66.5 L46,67.5 L29.7391755,67.5 L29.5899365,67.2860908 L3.84896125,30.3906929 L0.396,25.441 L1.0984512,32.6774578 L0.103130151,32.7740809 L-0.783751323,23.638248 L-0.869638456,22.7535182 Z"/>
                  </g>
                  <text font-family="sans-serif" font-size="9" font-weight="bold">
                    <tspan x="0.1385" y="209">call gates</tspan>
                  </text>
                  <text font-family="sans-serif" font-size="9" font-weight="bold">
                    <tspan x="34.387" y="10">secured code and </tspan>
                    <tspan x="34" y="21">data in TrustZone</tspan>
                  </text>
                  <path d="M124.881898,11.5 L124.982382,11.8684413 L132.010138,37.6368801 L133.611,43.509 L135.383126,36.4584132 L136.352987,36.7020728 L134.116489,45.6042117 L133.899903,46.4663102 L133.275625,45.8335384 L126.829248,39.2994562 L127.541116,38.5971432 L132.646,43.772 L131.045374,37.8999975 L124.118,12.5 L115.5,12.5 L115.5,11.5 L124.881898,11.5 Z" fill-rule="nonzero"/>
                </g>
              </g>
            </g>
          </svg>
        </artwork>
      </figure>
      <t>Providing crypto functions is out-of-scope of this document. The example implementation uses <strong>libsodium</strong>, an open source library maintained by experts in the field <xref target="SOD"/>. Crypto functions used in any alternative implementation should be of similar high quality.</t>
      <t>Enrollment of devices is out-of-scope. A range of solutions, from preconfiguration to over-the-air,
are available and selection of one is dependent on specifics of a deployment.
Example approaches include the Open Connectivity Foundation (OCF) onboarding and BRSKI <xref target="RFC8995"/>. NIST NCCOE network layer onboarding might be adapted, treating a communication schema like a MUD URL.</t>
      <t>Protecting private identity and signing keys is out-of-scope for this document.
Good key hygiene should be practiced, securing private credentials using best practices for a particular application class, e.g. <xref target="COMIS"/><xref target="OWASP"/>.
As signing key pairs are updated locally and the private key is used for every Publication,
TPM storage for that key is not practical but other trusted memory and execution could be used for the key and its signing functions.
These key pairs can be updated frequently.
DeftT does not contain any specific remediation if a signing or identity key is exfiltrated;
additional monitoring may be implemented where the threat level is high.</t>
      <t>DeftT's unit of information transfer is a Publication.
It is an atomic unit sized to fit in a lower layer transport PDU (if needed, fragmentation and reassembly are done in shim or application).
All Publications must be signed and the signature must be validated.
All Publications start with a Name (<xref target="publications"/>).
Publications are used both for ephemeral communication, like commands and status reports, and long-lived information like certs.
The set reconciliation-based syncps protocol identifies Publications using a hash of the <em>entire</em> Publication, including its
signature. A sync collection can contain at most one instance of any Publication so replays of Publications in
the collection are discarded as duplicates on arrival.
The current DeftT implementation requires weakly synchronized clocks with a known maximum skew.
Publications have a lifetime enforced by their sync collection; their names include a timestamp
used both to enforce that lifetime and prevent replay attacks by keeping a Publication in the local collection
(but not advertising its existence) until its lifetime plus the skew has passed. (Lifetimes in current applications range from days or years for certs to milliseconds for status and command communications). Publications arriving a skew
time before their timestamp or a skew time plus lifetime after their timestamp are discarded.</t>
      <t>An attacker can modify, drop, spoof, or replay any DeftT PDU or Publication but DeftT is designed for this to have minimal effect:</t>
      <ol>
<li>
          <t>modification - all DeftT cAdd PDUs must be either signed or AEAD encrypted with a securely distributed nonce group key. This choice is specified in the schema and each DeftT checks at startup that one of these two properties holds for the schema and throws an error if not.</t>
          <ul>
            <li>
              <t>for signed PDUs each receiving DeftT must already have the complete, fully validated signing chain of the signer or the PDU is dropped.
The signing cert must validate the PDU's signature or the PDU is dropped.</t>
            </li>
            <li>
              <t>for encrypted PDUs (and Publications) the symmetric group key is automatically and securely distributed using signing identities.
Each receiver uses its copy of the current symmetric key to validate the AEAD MAC and decrypt the PDU content.
Invalid or malformed PDUs and Publications are dropped.</t>
            </li>
          </ul>
          <t>cState modification to continually send an older, less complete state in order to generate the sending of cAdds could create a DoS attack but counter measures could be implemented using available DeftT information in order to isolate that entity or remove it from the trust domain.</t>
        </li>
        <li>
          <t>dropped PDUs - DeftT's sync protocol periodically publishes cStates regardless of whether the collection has changed, resulting in (re)sending dropped cAdds (if any).
Unlike connection-oriented transports, DeftT can and will obtain any Publications missing from its collection from any member
that has a valid copy.</t>
        </li>
        <li>
          <t>spoofing - DeftT uses a trust management engine that validates the signing. Malformed Publications and PDUs are dropped as early as possible.</t>
        </li>
        <li>
          <t>replay - A cAdd is sent in response to a specific cState, so a replayed cAdd must match a current cState and, if so, the cAdd's Publication(s) will be filtered for duplicates and obsolescence as described above.
A cAdd that doesn't match a current cState will be dropped on arrival.</t>
        </li>
      </ol>
      <t>Peer member authentication in DeftT comes through the integrated trust management engine.
Every DeftT instance is started with an identity bundle that includes the domain trust anchor, the schema in certificate format signed by this trust anchor, and its own member identity chain with a private identity key and the chain signed at the root by trust anchor.
Members publish their identity chains before any Publications are sent.
The trust management engine unconditionally drops any Publication or PDU that does not have a valid signer or whose signer lacks the role or capabilities required for that particular Publication or PDU.</t>
      <t>DeftT takes a modular approach to signing/validation of its PDUs and Publications, so a number of approaches to integrity, authenticity, and confidentiality are possible (and several are available at <xref target="DCT"/>). Security features that are found to have vulnerabilities will be removed or updated and new features are easily added.</t>
      <t>A compromised member of a trust domain can only build messages that match the role and attributes in its signing chain. Thus, a compromised lightbulb can lie about its state or refuse to turn on, but it can't tell the front door to unlock or send camera footage to a remote location. Multiple PDUs could be generated, resulting in flooding the subnet. There are possible counter-measures that could be taken if some detection code is added to the current DeftT, but this is deferred for specific applications with specific types of threats and desired responses.</t>
      <t>DeftT's modular structure allows for any cryptographic methods to be used as sigmgrs. New methods can easily be added to the transport as long as they present the same API.</t>
      <t>The example implementation's encryption modules provide for encryption on both cAdd PDUs and Publications. The latter <em>must</em> be signed by the originator in addition to being encrypted. This is not required for cAdd PDUs, so the specific entity that sent the cAdd cannot be determined but the Publications it carries <em>must</em> be signed, even if not encrypted. In DeftT, any member can resend a Publication from any other member (without modification) so group encryption (in effect, group signing) is no different. Some other encryption approaches are provided whose potential vulnerabilities are described with their implementations and a signed, encrypted approach is also available <xref target="DCT"/>. <xref target="DCT"/> relies on the crypto library libsodium and on linux random implementations with respect to entropy issues. In general, these are quite application-dependent and should be further addressed for particular deployments.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC1422" target="https://www.rfc-editor.org/info/rfc1422" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1422.xml">
          <front>
            <title>Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management</title>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="February" year="1993"/>
            <abstract>
              <t>This is one of a series of documents defining privacy enhancement mechanisms for electronic mail transferred using Internet mail protocols. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1422"/>
          <seriesInfo name="DOI" value="10.17487/RFC1422"/>
        </reference>
        <reference anchor="RFC8366" target="https://www.rfc-editor.org/info/rfc8366" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8366.xml">
          <front>
            <title>A Voucher Artifact for Bootstrapping Protocols</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="M. Pritikin" initials="M." surname="Pritikin"/>
            <author fullname="T. Eckert" initials="T." surname="Eckert"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>This document defines a strategy to securely assign a pledge to an owner using an artifact signed, directly or indirectly, by the pledge's manufacturer. This artifact is known as a "voucher".</t>
              <t>This document defines an artifact format as a YANG-defined JSON document that has been signed using a Cryptographic Message Syntax (CMS) structure. Other YANG-derived formats are possible. The voucher artifact is normally generated by the pledge's manufacturer (i.e., the Manufacturer Authorized Signing Authority (MASA)).</t>
              <t>This document only defines the voucher artifact, leaving it to other documents to describe specialized protocols for accessing it.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8366"/>
          <seriesInfo name="DOI" value="10.17487/RFC8366"/>
        </reference>
        <reference anchor="RFC8613" target="https://www.rfc-editor.org/info/rfc8613" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8613.xml">
          <front>
            <title>Object Security for Constrained RESTful Environments (OSCORE)</title>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="J. Mattsson" initials="J." surname="Mattsson"/>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <date month="July" year="2019"/>
            <abstract>
              <t>This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE). OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t>
              <t>Although an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration. Therefore, this document updates RFC 7252.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8613"/>
          <seriesInfo name="DOI" value="10.17487/RFC8613"/>
        </reference>
        <reference anchor="RFC8799" target="https://www.rfc-editor.org/info/rfc8799" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8799.xml">
          <front>
            <title>Limited Domains and Internet Protocols</title>
            <author fullname="B. Carpenter" initials="B." surname="Carpenter"/>
            <author fullname="B. Liu" initials="B." surname="Liu"/>
            <date month="July" year="2020"/>
            <abstract>
              <t>There is a noticeable trend towards network behaviors and semantics that are specific to a particular set of requirements applied within a limited region of the Internet. Policies, default parameters, the options supported, the style of network management, and security requirements may vary between such limited regions. This document reviews examples of such limited domains (also known as controlled environments), notes emerging solutions, and includes a related taxonomy. It then briefly discusses the standardization of protocols for limited domains. Finally, it shows the need for a precise definition of "limited domain membership" and for mechanisms to allow nodes to join a domain securely and to find other members, including boundary nodes.</t>
              <t>This document is the product of the research of the authors. It has been produced through discussions and consultation within the IETF but is not the product of IETF consensus.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8799"/>
          <seriesInfo name="DOI" value="10.17487/RFC8799"/>
        </reference>
        <reference anchor="RFC9119" target="https://www.rfc-editor.org/info/rfc9119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9119.xml">
          <front>
            <title>Multicast Considerations over IEEE 802 Wireless Media</title>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="M. McBride" initials="M." surname="McBride"/>
            <author fullname="D. Stanley" initials="D." surname="Stanley"/>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <author fullname="JC. Zúñiga" initials="JC." surname="Zúñiga"/>
            <date month="October" year="2021"/>
            <abstract>
              <t>Well-known issues with multicast have prevented the deployment of multicast in 802.11 (Wi-Fi) and other local-area wireless environments. This document describes the known limitations of wireless (primarily 802.11) Layer 2 multicast. Also described are certain multicast enhancement features that have been specified by the IETF and by IEEE 802 for wireless media, as well as some operational choices that can be made to improve the performance of the network. Finally, some recommendations are provided about the usage and combination of these features and operational choices.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9119"/>
          <seriesInfo name="DOI" value="10.17487/RFC9119"/>
        </reference>
        <reference anchor="RFC9200" target="https://www.rfc-editor.org/info/rfc9200" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9200.xml">
          <front>
            <title>Authentication and Authorization for Constrained Environments Using the OAuth 2.0 Framework (ACE-OAuth)</title>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This specification defines a framework for authentication and authorization in Internet of Things (IoT) environments called ACE-OAuth. The framework is based on a set of building blocks including OAuth 2.0 and the Constrained Application Protocol (CoAP), thus transforming a well-known and widely used authorization solution into a form suitable for IoT devices. Existing specifications are used where possible, but extensions are added and profiles are defined to better serve the IoT use cases.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9200"/>
          <seriesInfo name="DOI" value="10.17487/RFC9200"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="ATZ" target="https://doi.org/10.1109/CIC.2016.065">
          <front>
            <title>TrustZone Explained: Architectural Features and Use Cases</title>
            <author fullname="Bernard Ngabonziza" surname="Ngabonziza"/>
            <author fullname="Daniel Martin" surname="Martin"/>
            <author fullname="Anna Bailey" surname="Bailey"/>
            <author fullname="Haehyun Cho" surname="Cho"/>
            <author fullname="Sarah Martin" surname="Martin"/>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="CAvuln" target="http://2015.hack.lu/archive/2009/moxie-marlinspike-some_tricks_for_defeating_ssl_in_practice.pdf">
          <front>
            <title>More Tricks for Defeating SSL in Practice</title>
            <author fullname="M. Marlinspike" surname="Marlinspike"/>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="CHPT" target="https://www.globenewswire.com/news-release/2020/02/05/1980090/0/en/The-Dark-Side-of-Smart-Lighting-Check-Point-Research-Shows-How-Business-and-Home-Networks-Can-Be-Hacked-from-a-Lightbulb.html">
          <front>
            <title>The Dark Side of Smart Lighting: Check Point Research Shows How Business and Home Networks Can Be Hacked from a Lightbulb</title>
            <author fullname="CheckPoint" surname="CheckPoint"/>
            <date year="2020" month="February"/>
          </front>
        </reference>
        <reference anchor="CIDS" target="https://www.sbir.gov/sbirsearch/detail/2104327">
          <front>
            <title>Cybersecurity Intrusion Detection System for Large-Scale Solar Field Networks</title>
            <author fullname="OperantNetworks" surname="OperantNetworks"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="COMIS" target="https://www.silabs.com/documents/public/presentations/ew-2019-iot-security-commissioning-methods-for-iot.pdf">
          <front>
            <title>Commissioning Methods for IoT</title>
            <author fullname="Lars Lydersen" surname="Lydersen"/>
            <date year="2019" month="February"/>
          </front>
        </reference>
        <reference anchor="COST" target="https://www.fierceelectronics.com/embedded/wired-vs-wireless-cost-and-reliability">
          <front>
            <title>Wireless Industrial Networking Alliance, Wired vs. Wireless: Cost and Reliability</title>
            <author fullname="Wise Guy" surname="Guy"/>
            <date year="2005" month="October"/>
          </front>
        </reference>
        <reference anchor="ConfusedDep" target="https://cloud.google.com/kms/docs/additional-authenticated-data#confused_deputy_attack_example">
          <front>
            <title>Additional authenticated data guide</title>
            <author fullname="Google Cloud Support" surname="Support"/>
            <date year="2021" month="July"/>
          </front>
        </reference>
        <reference anchor="DCT" target="https://github.com/pollere/DCT">
          <front>
            <title>Defined-trust Communications Toolkit</title>
            <author fullname="Pollere" surname="Pollere"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="DER" target="https://www.nerc.com/pa/RAPA/ra/Reliability%20Assessments%20DL/Distributed_Energy_Resources_Report.pdf">
          <front>
            <title>North American Electric Reliability Corporation: Distributed Energy Resources: Connection, Modeling, and Reliability Considerations</title>
            <author fullname="NERC" surname="NERC"/>
            <date year="2017" month="February"/>
          </front>
        </reference>
        <reference anchor="DIFF" target="">
          <front>
            <title>What's the difference?: efficient set reconciliation without prior context</title>
            <author fullname="David Eppstein" surname="Eppstein"/>
            <author fullname="Michael T. Goodrich" surname="Goodrich"/>
            <author fullname="Frank Uyeda" surname="Uyeda"/>
            <author fullname="George Varghese" surname="Varghese"/>
            <date year="2011"/>
          </front>
        </reference>
        <reference anchor="DIGN" target="https://www.utilitydive.com/news/as-nuclear-plants-look-to-digitize-controls-and-enhance-performance-cyber/566478/">
          <front>
            <title>As Dominion, others target 80-year nuclear plants, cybersecurity concerns complicate digital upgrades</title>
            <author fullname="M. Bandyk" surname="Bandyk"/>
            <date year="2019" month="November"/>
          </front>
        </reference>
        <reference anchor="DLOG" target="https://doi.org/10.1145/605434.605438">
          <front>
            <title>Delegation logic</title>
            <author fullname="Ninghui Li" surname="Li"/>
            <author fullname="Benjamin Grosof" surname="Grosof"/>
            <author fullname="Joan Feigenbaum" surname="Feigenbaum"/>
            <date year="2003" month="02"/>
          </front>
        </reference>
        <reference anchor="DMR" target="https://www.wwt.com/white-paper/device-management-requirements-to-secure-enterprise-iot-edge-infrastructure/">
          <front>
            <title>Device Management Requirements to Secure Enterprise IoT Edge Infrastructure</title>
            <author fullname="Marcos Carranza et. al." surname="al."/>
            <date year="2021" month="April"/>
          </front>
        </reference>
        <reference anchor="DNMP" target="">
          <front>
            <title>Lessons Learned Building a Secure Network Measurement Framework Using Basic NDN</title>
            <author fullname="K. Nichols" surname="Nichols"/>
            <date year="2019" month="September"/>
          </front>
        </reference>
        <reference anchor="DTM" target="https://doi.org/10.1109/SECPRI.1996.502679">
          <front>
            <title>Decentralized Trust Management</title>
            <author fullname="Matt Blaze" surname="Blaze"/>
            <author fullname="Joan Feigenbaum" surname="Feigenbaum"/>
            <author fullname="Jack Lacy" surname="Lacy"/>
            <date year="1996" month="06"/>
          </front>
        </reference>
        <reference anchor="Demers87" target="https://doi.org/10.1145/41840.41841">
          <front>
            <title>Epidemic Algorithms for Replicated Database Maintenance</title>
            <author fullname="Alan J. Demers" surname="Demers"/>
            <author fullname="Daniel H. Greene" surname="Greene"/>
            <author fullname="Carl Hauser" surname="Hauser"/>
            <author fullname="Wes Irish" surname="Irish"/>
            <author fullname="John Larson" surname="Larson"/>
            <author fullname="Scott Shenker" surname="Shenker"/>
            <author fullname="Howard E. Sturgis" surname="Sturgis"/>
            <author fullname="Daniel C. Swinehart" surname="Swinehart"/>
            <author fullname="Douglas B. Terry" surname="Terry"/>
            <date year="1987"/>
          </front>
        </reference>
        <reference anchor="Graphene19" target="https://doi.org/10.1145/3341302.3342082">
          <front>
            <title>Graphene: efficient interactive set reconciliation applied to blockchain propagation</title>
            <author fullname="A. Pinar Ozisik" surname="Ozisik"/>
            <author fullname="Gavin Andresen" surname="Andresen"/>
            <author fullname="Brian Neil Levine" surname="Levine"/>
            <author fullname="Darren Tapp" surname="Tapp"/>
            <author fullname="George Bissias" surname="Bissias"/>
            <author fullname="Sunny Katkuri" surname="Katkuri"/>
            <date year="2019"/>
          </front>
        </reference>
        <reference anchor="HSE" target="https://encyclopedia.kaspersky.com/glossary/secure-element/">
          <front>
            <title>Secure Element</title>
            <author fullname="Kapersky" surname="Kapersky"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="IAWS" target="Using a Trusted Platform Module for endpoint device security in AWS IoT Greengrass">
          <front>
            <title>Using a Trusted Platform Module for endpoint device security in AWS IoT Greengrass</title>
            <author fullname="Krishnan Ganapathy" surname="Ganapathy"/>
            <date year="2019" month="November"/>
          </front>
        </reference>
        <reference anchor="IBLT" target="https://doi.org/10.1109/Allerton.2011.6120248">
          <front>
            <title>Invertible bloom lookup tables</title>
            <author fullname="Michael T. Goodrich" surname="Goodrich"/>
            <author fullname="Michael Mitzenmacher" surname="Mitzenmacher"/>
            <date year="2011"/>
          </front>
        </reference>
        <reference anchor="IEC" target="https://webstore.iec.ch/publication/61822">
          <front>
            <title>Power systems management and associated information exchange - Data and communications security - Part 8: Role-based access control for power system management</title>
            <author fullname="IEC" surname="IEC"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="IEC61850" target="https://en.wikipedia.org/wiki/IEC_61850">
          <front>
            <title>IEC 61850</title>
            <author fullname="Wikipedia" surname="Wikipedia"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="IIOT" target="https://www.rfpage.com/applications-of-industrial-internet-of-things/">
          <front>
            <title>Applications of Industrial Internet of Things (IIoT)</title>
            <author fullname="Rajiv" surname="Rajiv"/>
            <date year="2018" month="June"/>
          </front>
        </reference>
        <reference anchor="IOTK" target="https://doi.org/10.1145/3460417.3482972">
          <front>
            <title>Trust schemas and {ICN:} key to secure home IoT</title>
            <author fullname="Kathleen Nichols" surname="Nichols"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="ISO9506MMS" target="https://www.iso.org/obp/ui/#iso:std:iso:9506:-1:ed-2:v1:en">
          <front>
            <title>Industrial automation systems --- Manufacturing Message Specification --- Part 1: Service definition</title>
            <author fullname="ISO" surname="ISO"/>
            <date year="2003"/>
          </front>
        </reference>
        <reference anchor="LANGSEC" target="http://langsec.org">
          <front>
            <title>LANGSEC: Language-theoretic Security "The View from the Tower of Babel"</title>
            <author fullname="LANGSEC" surname="LANGSEC"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="LangSecErr" target="https://langsec.org/papers/langsec-cwes-secdev2016.pdf">
          <front>
            <title>The Seven Turrets of Babel: {A} Taxonomy of LangSec Errors and How to Expunge Them</title>
            <author fullname="Falcon Momot" surname="Momot"/>
            <author fullname="Sergey Bratus" surname="Bratus"/>
            <author fullname="Sven M. Hallberg" surname="Hallberg"/>
            <author fullname="Meredith L. Patterson" surname="Patterson"/>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="MATR" target="https://buildwithmatter.com/">
          <front>
            <title>Matter is the foundation for connected things</title>
            <author fullname="Connectivity Standards Alliance" surname="Alliance"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="MHST" target="https://en.wikipedia.org/wiki/MQTT">
          <front>
            <title>MQTT</title>
            <author fullname="Wikipedia" surname="Wikipedia"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="MINSKY03" target="https://doi.org/10.1109/TIT.2003.815784">
          <front>
            <title>Set reconciliation with nearly optimal communication complexity</title>
            <author fullname="Yaron Minsky" surname="Minsky"/>
            <author fullname="Ari Trachtenberg" surname="Trachtenberg"/>
            <author fullname="Richard Zippel" surname="Zippel"/>
            <date year="2003"/>
          </front>
        </reference>
        <reference anchor="MODOT" target="https://www.nrel.gov/docs/fy22osti/79974.pdf">
          <front>
            <title>Modular Security Apparatus for Managing Distributed Cryptography for Command and Control Messages on Operational Technology Networks (Module-OT)</title>
            <author fullname="D. Saleem" surname="Saleem"/>
            <author fullname="S. Granda" surname="Granda"/>
            <author fullname="MD Touhiduzzaman" surname="Touhiduzzaman"/>
            <author fullname="A. Hasandka" surname="Hasandka"/>
            <author fullname="W. Hupp" surname="Hupp"/>
            <author fullname="M. Martin" surname="Martin"/>
            <author fullname="S. Hossain-McKenzie" surname="Hossain-McKenzie"/>
            <author fullname="P. Cordeiro" surname="Cordeiro"/>
            <author fullname="I. Onunkwo" surname="Onunkwo"/>
            <author fullname="D. Jose" surname="Jose"/>
            <date year="2022" month="January"/>
          </front>
        </reference>
        <reference anchor="MPSR" target="">
          <front>
            <title>Simple multi-party set reconciliation</title>
            <author fullname="Michael Mitzenmacher" surname="Mitzenmacher"/>
            <author fullname="Rasmus Pagh" surname="Pagh"/>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="MQTT" target="mqtt.org">
          <front>
            <title>MQTT: The Standard for IoT Messaging</title>
            <author fullname="OASIS" surname="OASIS"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="NDNW" target="http://ice-ar.named-data.net/meetings/2019-ICE-WEN-Annual/0-ICNWEN-Van-Keynote.pdf">
          <front>
            <title>Watching NDN's Waist: How Simplicity Creates Innovation and Opportunity</title>
            <author fullname="Van Jacobson" surname="Jacobson"/>
            <date year="2019" month="July"/>
          </front>
        </reference>
        <reference anchor="NERC" target="https://www.nerc.com/pa/CI/Documents/roundtable%20-%20IEC%2061850%20slides%20%20(20161115).pdf">
          <front>
            <title>Emerging Technology Roundtable - Substation Automation/IEC 61850</title>
            <author fullname="NERC" surname="NERC"/>
            <date year="2016" month="November"/>
          </front>
        </reference>
        <reference anchor="NIST" target="https://www.nist.gov/publications/guide-attribute-based-access-control-abac-definition-and-considerations-0">
          <front>
            <title>Guide to Attribute Based Access Control (ABAC) Definition and Considerations</title>
            <author fullname="Chung Hu" surname="Hu"/>
            <author fullname="David Ferraiolo" surname="Ferraiolo"/>
            <author fullname="David Kuhn" surname="Kuhn"/>
            <author fullname="Adam Schnitzer" surname="Schnitzer"/>
            <author fullname="Kenneth Sandlin" surname="Sandlin"/>
            <author fullname="Robert Miller" surname="Miller"/>
            <author fullname="Karen Scarfone" surname="Scarfone"/>
            <date year="2019" month="August"/>
          </front>
        </reference>
        <reference anchor="NMUD" target="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.1800-15.pdf">
          <front>
            <title>Securing Small-Business and Home Internet of Things (IoT) Devices: Mitigating Network-Based Attacks Using Manufacturer Usage Description (MUD)</title>
            <author fullname="D. Dodson et al" surname="al"/>
            <date year="2021" month="May"/>
          </front>
        </reference>
        <reference anchor="NPPI" target="https://cdn.intechopen.com/pdfs/21051/InTechNuclear_power_plant_instrumentation_and_control.pdf">
          <front>
            <title>Nuclear Power Plant Instrumentation and Control</title>
            <author fullname="H. M. Hashemian" surname="Hashemian"/>
            <date year="2011"/>
          </front>
        </reference>
        <reference anchor="NVR" target="https://www.cs.auckland.ac.nz/~pgut001/pubs/pkitutorial.pdf">
          <front>
            <title>Everything you Never Wanted to Know about PKI but were Forced to Find Out</title>
            <author fullname="Peter Gutmann" surname="Gutmann"/>
            <date year="2002"/>
          </front>
        </reference>
        <reference anchor="ONE" target="https://onedm.org/">
          <front>
            <title>One Data Model</title>
            <author fullname="OneDM" surname="OneDM"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="OPR" target="https://www.nist.gov/news-events/events/2019/09/ndn-community-meeting">
          <front>
            <title>Commercialization of NDN in Cybersecure Energy System Communications video</title>
            <author fullname="Randall King" surname="King"/>
            <date year="2019"/>
          </front>
        </reference>
        <reference anchor="OSCAL" target="https://pages.nist.gov/OSCAL/">
          <front>
            <title>OSCAL: the Open Security Controls Assessment Language</title>
            <author fullname="NIST" surname="NIST"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="OTPM" target="https://www.youtube.com/watch?v=YtPsruEqGeY">
          <front>
            <title>Keylime - An Open Source TPM Project for Remote Trust</title>
            <author fullname="Luke Hinds" surname="Hinds"/>
            <date year="2019" month="November"/>
          </front>
        </reference>
        <reference anchor="OWASP" target="https://github.com/OWASP/SideKEK">
          <front>
            <title>SideKEK README</title>
            <author fullname="owasp.org/www-project-sidekek/" surname="owasp.org/www-project-sidekek/"/>
            <date year="2020" month="June"/>
          </front>
        </reference>
        <reference anchor="PRAG" target="https://www.mdpi.com/1424-8220/21/20/6904">
          <front>
            <title>Messaging Protocols for IoT Systems---A Pragmatic Comparison</title>
            <author fullname="Jacek Wytr{\k e}bowicz" surname="Wytr{\k e}bowicz"/>
            <author fullname="Krzysztof Cabaj" surname="Cabaj"/>
            <author fullname="Jerzy Krawiec" surname="Krawiec"/>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="QTPM" target="https://link.springer.com/chapter/10.1007/978-1-4302-6584-9_3">
          <front>
            <title>Quick Tutorial on TPM 2.0</title>
            <author fullname="D. Challener W. Arthur" surname="W. Arthur"/>
            <date year="2015" month="January"/>
          </front>
        </reference>
        <reference anchor="RFC2693" target="https://www.rfc-editor.org/info/rfc2693" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2693.xml">
          <front>
            <title>SPKI Certificate Theory</title>
            <author fullname="C. Ellison" initials="C." surname="Ellison"/>
            <author fullname="B. Frantz" initials="B." surname="Frantz"/>
            <author fullname="B. Lampson" initials="B." surname="Lampson"/>
            <author fullname="R. Rivest" initials="R." surname="Rivest"/>
            <author fullname="B. Thomas" initials="B." surname="Thomas"/>
            <author fullname="T. Ylonen" initials="T." surname="Ylonen"/>
            <date month="September" year="1999"/>
            <abstract>
              <t>This document gives the theory behind SPKI certificates and ACLs without going into technical detail about those structures or their uses. This memo defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2693"/>
          <seriesInfo name="DOI" value="10.17487/RFC2693"/>
        </reference>
        <reference anchor="RFC3552" target="https://www.rfc-editor.org/info/rfc3552" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3552.xml">
          <front>
            <title>Guidelines for Writing RFC Text on Security Considerations</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="B. Korver" initials="B." surname="Korver"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>All RFCs are required to have a Security Considerations section. Historically, such sections have been relatively weak. This document provides guidelines to RFC authors on how to write a good Security Considerations section. 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="72"/>
          <seriesInfo name="RFC" value="3552"/>
          <seriesInfo name="DOI" value="10.17487/RFC3552"/>
        </reference>
        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4291" target="https://www.rfc-editor.org/info/rfc4291" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4291.xml">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
        <reference anchor="RFC4292" target="https://www.rfc-editor.org/info/rfc4292" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4292.xml">
          <front>
            <title>IP Forwarding Table MIB</title>
            <author fullname="B. Haberman" initials="B." surname="Haberman"/>
            <date month="April" year="2006"/>
            <abstract>
              <t>This document defines a portion of the Management Information Base (MIB) for use with network management protocols in the Internet community. In particular, it describes managed objects related to the forwarding of Internet Protocol (IP) packets in an IP version-independent manner. This document obsoletes RFC 2096. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4292"/>
          <seriesInfo name="DOI" value="10.17487/RFC4292"/>
        </reference>
        <reference anchor="RFC4949" target="https://www.rfc-editor.org/info/rfc4949" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4949.xml">
          <front>
            <title>Internet Security Glossary, Version 2</title>
            <author fullname="R. Shirey" initials="R." surname="Shirey"/>
            <date month="August" year="2007"/>
            <abstract>
              <t>This Glossary provides definitions, abbreviations, and explanations of terminology for information system security. The 334 pages of entries offer recommendations to improve the comprehensibility of written material that is generated in the Internet Standards Process (RFC 2026). The recommendations follow the principles that such writing should (a) use the same term or definition whenever the same concept is mentioned; (b) use terms in their plainest, dictionary sense; (c) use terms that are already well-established in open publications; and (d) avoid terms that either favor a particular vendor or favor a particular technology or mechanism over other, competing techniques that already exist or could be developed. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="FYI" value="36"/>
          <seriesInfo name="RFC" value="4949"/>
          <seriesInfo name="DOI" value="10.17487/RFC4949"/>
        </reference>
        <reference anchor="RFC6335" target="https://www.rfc-editor.org/info/rfc6335" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6335.xml">
          <front>
            <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
            <date month="August" year="2011"/>
            <abstract>
              <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry. It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
              <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP). It also updates the DNS SRV specification to clarify what a service name is and how it is registered. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="165"/>
          <seriesInfo name="RFC" value="6335"/>
          <seriesInfo name="DOI" value="10.17487/RFC6335"/>
        </reference>
        <reference anchor="RFC7252" target="https://www.rfc-editor.org/info/rfc7252" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7252.xml">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
        <reference anchor="RFC7693" target="https://www.rfc-editor.org/info/rfc7693" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7693.xml">
          <front>
            <title>The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)</title>
            <author fullname="M-J. Saarinen" role="editor" surname="M-J. Saarinen"/>
            <author fullname="J-P. Aumasson" surname="J-P. Aumasson"/>
            <date month="November" year="2015"/>
            <abstract>
              <t>This document describes the cryptographic hash function BLAKE2 and makes the algorithm specification and C source code conveniently available to the Internet community. BLAKE2 comes in two main flavors: BLAKE2b is optimized for 64-bit platforms and BLAKE2s for smaller architectures. BLAKE2 can be directly keyed, making it functionally equivalent to a Message Authentication Code (MAC).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7693"/>
          <seriesInfo name="DOI" value="10.17487/RFC7693"/>
        </reference>
        <reference anchor="RFC8103" target="https://www.rfc-editor.org/info/rfc8103" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8103.xml">
          <front>
            <title>Using ChaCha20-Poly1305 Authenticated Encryption in the Cryptographic Message Syntax (CMS)</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document describes the conventions for using ChaCha20-Poly1305 Authenticated Encryption in the Cryptographic Message Syntax (CMS). ChaCha20-Poly1305 is an authenticated encryption algorithm constructed of the ChaCha stream cipher and Poly1305 authenticator.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8103"/>
          <seriesInfo name="DOI" value="10.17487/RFC8103"/>
        </reference>
        <reference anchor="RFC8520" target="https://www.rfc-editor.org/info/rfc8520" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8520.xml">
          <front>
            <title>Manufacturer Usage Description Specification</title>
            <author fullname="E. Lear" initials="E." surname="Lear"/>
            <author fullname="R. Droms" initials="R." surname="Droms"/>
            <author fullname="D. Romascanu" initials="D." surname="Romascanu"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This memo specifies a component-based architecture for Manufacturer Usage Descriptions (MUDs). The goal of MUD is to provide a means for end devices to signal to the network what sort of access and network functionality they require to properly function. The initial focus is on access control. Later work can delve into other aspects.</t>
              <t>This memo specifies two YANG modules, IPv4 and IPv6 DHCP options, a Link Layer Discovery Protocol (LLDP) TLV, a URL, an X.509 certificate extension, and a means to sign and verify the descriptions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8520"/>
          <seriesInfo name="DOI" value="10.17487/RFC8520"/>
        </reference>
        <reference anchor="RFC8995" target="https://www.rfc-editor.org/info/rfc8995" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8995.xml">
          <front>
            <title>Bootstrapping Remote Secure Key Infrastructure (BRSKI)</title>
            <author fullname="M. Pritikin" initials="M." surname="Pritikin"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="T. Eckert" initials="T." surname="Eckert"/>
            <author fullname="M. Behringer" initials="M." surname="Behringer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document specifies automated bootstrapping of an Autonomic Control Plane. To do this, a Secure Key Infrastructure is bootstrapped. This is done using manufacturer-installed X.509 certificates, in combination with a manufacturer's authorizing service, both online and offline. We call this process the Bootstrapping Remote Secure Key Infrastructure (BRSKI) protocol. Bootstrapping a new device can occur when using a routable address and a cloud service, only link-local connectivity, or limited/disconnected networks. Support for deployment models with less stringent security requirements is included. Bootstrapping is complete when the cryptographic identity of the new key infrastructure is successfully deployed to the device. The established secure connection can be used to deploy a locally issued certificate to the device as well.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8995"/>
          <seriesInfo name="DOI" value="10.17487/RFC8995"/>
        </reference>
        <reference anchor="RSK" target="">
          <front>
            <title>Ten Risks of PKI: What You're Not Being Told About Public Key Infrastructure</title>
            <author fullname="Carl Ellison" surname="Ellison"/>
            <author fullname="Bruce Schneier" surname="Schneier"/>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="SDSI" target="">
          <front>
            <title>SDSI - A Simple Distributed Security Infrastructure</title>
            <author fullname="R. L. Rivest" surname="Rivest"/>
            <author fullname="B. W. Lampson" surname="Lampson"/>
            <date year="1996" month="April"/>
          </front>
        </reference>
        <reference anchor="SIOT" target="https://tonytruong.net/how-to-use-the-tpm-to-secure-your-iot-device-data/">
          <front>
            <title>How to Use the TPM to Secure Your IoT/Device Data</title>
            <author fullname="Tony Truong" surname="Truong"/>
            <date year="2017" month="January"/>
          </front>
        </reference>
        <reference anchor="SKH" target="https://lwn.net/Articles/768419/">
          <front>
            <title>Secure key handling using the TPM</title>
            <author fullname="Tom Yates" surname="Yates"/>
            <date year="2018" month="October"/>
          </front>
        </reference>
        <reference anchor="SNC" target="https://named-data.net/wp-content/uploads/securing-network-content-tr.pdf">
          <front>
            <title>Securing Network Content</title>
            <author fullname="Diana K. Smetters" surname="Smetters"/>
            <author fullname="Van Jacobson" surname="Jacobson"/>
            <date year="2009" month="October"/>
          </front>
        </reference>
        <reference anchor="SOD" target="https://doc.libsodium.org/">
          <front>
            <title>libsodium</title>
            <author fullname="Daniel Bernstein" surname="Bernstein"/>
            <author fullname="Tanja Lange" surname="Lange"/>
            <author fullname="Peter Schwabe" surname="Schwabe"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="SPRV" target="http://supervisord.org/">
          <front>
            <title>Supervisor: A Process Control System</title>
            <author fullname="AgendalessConsulting" surname="AgendalessConsulting"/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="ST" target="https://smartthings.developer.samsung.com/docs/api-ref/st-api.html##operation/listCapabilities">
          <front>
            <title>SmartThings API (v1.0-PREVIEW)</title>
            <author fullname="Samsung" surname="Samsung"/>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="STNDN" target="">
          <front>
            <title>Schematizing Trust in Named Data Networking</title>
            <author fullname="Yingdi Yu" surname="Yu"/>
            <author fullname="Alexander Afanasyev" surname="Afanasyev"/>
            <author fullname="David D. Clark" surname="Clark"/>
            <author fullname="kc claffy" surname="claffy"/>
            <author fullname="Van Jacobson" surname="Jacobson"/>
            <author fullname="Lixia Zhang" surname="Zhang"/>
            <date year="2015"/>
          </front>
        </reference>
        <reference anchor="TATT" target="https://docs.microsoft.com/en-us/azure/iot-dps/concepts-tpm-attestation">
          <front>
            <title>TPM attestation</title>
            <author fullname="Microsoft" surname="Microsoft"/>
            <date year="2021" month="June"/>
          </front>
        </reference>
        <reference anchor="TLSvuln" target="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4232952/">
          <front>
            <title>Using Frankencerts for Automated Adversarial Testing of Certificate Validation in SSL/TLS Implementations</title>
            <author fullname="C. Brubaker et al." surname="al."/>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <reference anchor="TPM" target="https://www.globalsign.com/en/resources/white-papers-ebooks/white-paper-tpm-20-and-certificate-based-iot-device-authentication">
          <front>
            <title>TPM 2.0 and Certificate-Based IoT Device Authentication</title>
            <author fullname="Paul Griffiths" surname="Griffiths"/>
            <date year="2020" month="September"/>
          </front>
        </reference>
        <reference anchor="W509" target="https://en.wikipedia.org/wiki/X.509#Security">
          <front>
            <title>X.509: Security</title>
            <author fullname="Wikipedia" surname="Wikipedia"/>
            <date year="2021" month="October"/>
          </front>
        </reference>
        <reference anchor="WSEN" target="https://www.aceee.org/files/proceedings/2002/data/papers/SS02_Panel7_Paper10.pdf">
          <front>
            <title>Wireless Sensors: Technology and Cost-Savings for Commercial Buildings</title>
            <author fullname="M. Kintner-Meyer" surname="Kintner-Meyer"/>
            <author fullname="M Brambley" surname="Brambley"/>
            <author fullname="T. Carlon" surname="Carlon"/>
            <author fullname="N. Bauman" surname="Bauman"/>
            <date year="2002"/>
          </front>
        </reference>
        <reference anchor="WegmanC81" target="https://doi.org/10.1016/0022-0000(81)90033-7">
          <front>
            <title>New Hash Functions and Their Use in Authentication and Set Equality</title>
            <author fullname="Mark N. Wegman" surname="Wegman"/>
            <author fullname="Larry Carter" surname="Carter"/>
            <date year="1981"/>
          </front>
        </reference>
        <reference anchor="ZCL" target="https://zigbeealliance.org/wp-content/uploads/2019/12/07-5123-06-zigbee-cluster-library-specification.pdf">
          <front>
            <title>Zigbee Cluster Library Specification Revision 6</title>
            <author fullname="zigbeealliance" surname="zigbeealliance"/>
            <date year="2019"/>
          </front>
        </reference>
        <reference anchor="caliptra" target="https://www.opencompute.org/documents/caliptra-silicon-rot-services-09012022-pdf">
          <front>
            <title>Caliptra -- Silicon RoT Services</title>
            <author fullname="Open Compute Project" surname="Project"/>
            <date year="2022" month="July"/>
          </front>
        </reference>
        <reference anchor="netstrings" target="https://cr.yp.to/proto/netstrings.txt">
          <front>
            <title>Netstrings</title>
            <author fullname="Daniel J. Bernstein" surname="Bernstein"/>
            <date year="1997" month="February"/>
          </front>
        </reference>
        <reference anchor="tnetstrings" target="https://web.archive.org/web/20140210012056/http://tnetstrings.org/">
          <front>
            <title>About Tagged Netstrings</title>
            <author fullname="tnetstrings" surname="tnetstrings"/>
            <date year="2011" month="August"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="contributors" numbered="false">
      <name>Contributors</name>
      <contact initials="L." surname="Lixia" fullname="Lixia Zhang">
        <organization>UCLA</organization>
        <address>
          <postal>
            <street/>
          </postal>
          <email>lixia@cs.ucla.edu</email>
        </address>
      </contact><contact initials="R." surname="Jungerman" fullname="Roger Jungerman">
        <organization>Operant Networks Inc.</organization>
        <address>
          <postal>
            <street/>
          </postal>
        </address>
      </contact><t>Roger contributed significantly to <xref target="use-cases"/>.</t>
    </section>
  </back>
</rfc>
