<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-howard-rats-coserv-04" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="CoSERV">Concise Selector for Endorsements and Reference Values</title>
    <seriesInfo name="Internet-Draft" value="draft-howard-rats-coserv-04"/>
    <author initials="P." surname="Howard" fullname="Paul Howard">
      <organization>Arm</organization>
      <address>
        <email>paul.howard@arm.com</email>
      </address>
    </author>
    <author initials="T." surname="Fossati" fullname="Thomas Fossati">
      <organization>Linaro</organization>
      <address>
        <email>Thomas.Fossati@linaro.org</email>
      </address>
    </author>
    <author initials="H." surname="Birkholz" fullname="Henk Birkholz">
      <organization>Fraunhofer SIT</organization>
      <address>
        <email>henk.birkholz@ietf.contact</email>
      </address>
    </author>
    <author initials="S." surname="Kamal" fullname="Shefali Kamal">
      <organization>Fujitsu</organization>
      <address>
        <email>Shefali.Kamal@fujitsu.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="20"/>
    <area>Security</area>
    <workgroup>Remote ATtestation ProcedureS</workgroup>
    <keyword>RATS</keyword>
    <keyword>attestation</keyword>
    <keyword>endorsement</keyword>
    <keyword>reference value</keyword>
    <abstract>
      <?line 70?>

<t>In the Remote Attestation Procedures (RATS) architecture, Verifiers require Endorsements and Reference Values to assess the trustworthiness of Attesters.
This document specifies the Concise Selector for Endorsements and Reference Values (CoSERV), a structured query/result format designed to facilitate the discovery and retrieval of these artifacts from various providers.
CoSERV defines a query language and corresponding result structure using CDDL, which can be serialized in CBOR format, enabling efficient interoperability across diverse systems.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rats-endorsements-distribution.github.io/draft-howard-rats-coserv/draft-howard-rats-coserv.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-howard-rats-coserv/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Remote ATtestation ProcedureS Working Group mailing list (<eref target="mailto:rats@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/rats/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/rats/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/rats-endorsements-distribution/draft-howard-rats-coserv"/>.</t>
    </note>
  </front>
  <middle>
    <?line 76?>

<section anchor="sec-intro">
      <name>Introduction</name>
      <t>Remote Attestation Procedures (RATS) enable Relying Parties to evaluate the trustworthiness of remote Attesters by appraising Evidence.
This appraisal necessitates access to Endorsements and Reference Values, which are often distributed across multiple providers, including hardware manufacturers, firmware developers, and software vendors.
The lack of standardized methods for querying and retrieving these artifacts poses challenges in achieving seamless interoperability.</t>
      <t>The Concise Selector for Endorsements and Reference Values (CoSERV) addresses this challenge by defining a query language and a corresponding result structure for the transaction of artifacts between a provider and a consumer.
The query language format provides Verifiers with a standard way to specify the environment characteristics of Attesters, such that the relevant artifacts can be obtained from Endorsers and Reference Value Providers.
In turn, the result format allows those Endorsers and Reference Value Providers to package the artifacts within a standard structure.
This facilitates the efficient discovery and retrieval of relevant Endorsements and Reference Values from providers, maximising the re-use of common software tools and libraries within the transactions.</t>
      <t>The CoSERV query language is intended to form the input data type for tools and services that provide access to Endorsements and Reference Values.
The CoSERV result set is intended to form the corresponding output data type from those tools and services.
This document does not define the complete APIs or interaction models for such tools and services.
The scope of this document is limited to the definitions of the query language and the result set only.</t>
      <t>Both the query language and the result set are designed for extensibility.
This addresses the need for a common baseline format to optimise for interoperability and software reuse, while maintaining the flexibility demanded by a dynamic and diverse ecosystem.</t>
      <t>The environment characteristics of Endorsements and Reference Values are derived from the equivalent concepts in CoRIM <xref target="I-D.ietf-rats-corim"/>.
CoSERV therefore borrows heavily from CoRIM, and shares some data types for its fields.
And, like CoRIM, the CoSERV schema is defined using CDDL <xref target="RFC8610"/>. A CoSERV query can be serialized in CBOR <xref target="STD94"/> format.</t>
      <section anchor="terminology-and-requirements-language">
        <name>Terminology and Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>This document uses terms and concepts defined by the RATS architecture.
For a complete glossary, see <xref section="4" sectionFormat="of" target="RFC9334"/>.</t>
        <t>This document uses terms and concepts defined by the CoRIM specification.
For a complete glossary, see <xref section="1.1.1" sectionFormat="of" target="I-D.ietf-rats-corim"/>.</t>
        <t>This document uses the terms <em>"actual state"</em> and <em>"reference state"</em> as defined in <xref section="2" sectionFormat="of" target="I-D.ietf-rats-endorsements"/>.</t>
        <t>The terminology from CBOR <xref target="STD94"/>, CDDL <xref target="RFC8610"/> and COSE <xref target="STD96"/> applies;
in particular, CBOR diagnostic notation is defined in <xref section="8" sectionFormat="of" target="STD94"/>
and <xref section="G" sectionFormat="of" target="RFC8610"/>. Terms and concepts are always referenced as proper nouns, i.e., with Capital Letters.</t>
      </section>
    </section>
    <section anchor="secaggregation">
      <name>Aggregation and Trust Models</name>
      <t>The roles of Endorser or Reference Value Provider might sometimes be fulfilled by aggregators, which collect from multiple supply chain sources, or even from other aggregators, in order to project a holistic view of the endorsed system.
The notion of such an aggregator is not explicit in the RATS architecture.
In practice, however, supply chains are complex and multi-layered.
Supply chain sources can include silicon manufacturers, device manufacturers, firmware houses, system integrators, service providers and more.
In practical terms, an Attester is likely to be a complex entity, formed of components from across such supply chains.
Evidence would be likewise structured, with contributions from different segments of the Attester's overall anatomy.
A Verifier for such Evidence may find it convenient to contact an aggregator as a single source of truth for Endorsements and Reference Values.
An aggregator would have intelligence about the Attester's complete anatomy and supply chain.
It would have the ability to contact all contributing supply chain actors for their individual Endorsements and Reference Values, before collecting them into a cohesive set, and delivering them to the Verifier as a single, ergonomic package.
In pure RATS terms, an aggregator is still an Endorser or a Reference Value Provider - or, more likely, both.
It is not a distinct role, and so there is no distinctly-modeled conveyance between an aggregator and a Verifier.
However, when consuming from an aggregator, the Verifier may need visibility of the aggregation process, possibly to the extent of needing to audit the results by inspecting the individual inputs that came from the original supply chain actors.
CoSERV addresses this need, catering equally for both aggregating and non-aggregating supply chain sources.</t>
      <t>To support deployments with aggregators, CoSERV allows for flexible trust models as follows.</t>
      <ul spacing="normal">
        <li>
          <t><strong>Shallow Trust</strong>: in this model, the consumer trusts the aggregator, solely and completely, to provide authentic descriptions of the endorsed system.
The consumer does not need to audit the results of the aggregation process.</t>
        </li>
        <li>
          <t><strong>Deep Trust</strong>: in this model, the consumer has a trust relationship with the aggregator, but does not deem this to be sufficient.
The consumer can still use the collected results from the aggregation process, where it is convenient to do so, but also needs to audit those results.</t>
        </li>
      </ul>
      <t>Any given CoSERV transaction can operate according to either model.
The consumer decides which model to use when it forms a query.
The CoSERV result payload can convey both the aggregated result and the audit trail as needed.
The payload size may be smaller when the shallow model is used, but the choice between the two models is a question for implementations and deployments.</t>
      <t>Although CoSERV is designed to support aggregation, it is not a requirement.
When aggregation is not used, CoSERV still fulfills the need for a standard conveyance mechanism between Verifiers and Endorsers or Reference Value Providers.</t>
    </section>
    <section anchor="secinfomodel">
      <name>CoSERV Information Model</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>CoSERV is designed to facilitate query-response transactions between a producer and a consumer.
In the RATS model, the producer is either an Endorser or a Reference Value Provider, and the consumer is a Verifier.
CoSERV defines a single top-level data type that can be used for both queries and result sets.
Queries are authored by the consumer (Verifier), while result sets are authored by the producer (Endorser or Reference Value Provider) in response to the query.
A CoSERV data object always contains a query.
When CoSERV is used to express a result set, the query is retained alongside the result set that was yielded by that query.
This allows consumers to verify a match between the query that was sent to the producer, and the query that was subsequently returned with the result set.
Such verification is useful because it mitigates security threats arising from any untrusted infrastructure or intermediaries that might reside between the producer and the consumer.
An example of this is caching in HTTP <xref target="STD98"/> and CoAP <xref target="RFC7252"/>.
It might be expensive to compute the result set for a query, which would make caching desirable.
However, if caching is managed by an untrusted intermediary, then there is a risk that such an untrusted intermediary might return incorrect results, either accidentally or maliciously.
Pairing the original query with each result set provides an end-to-end contract between the consumer and producer, mitigating such risks.
The transactional pattern between the producer and the consumer would be that the consumer begins the transaction by authoring a query and sending it to the producer as a CoSERV object.
The producer receives the query, computes results, and returns a new CoSERV object formed from the results along with the original query.
Notionally, the producer is "adding" the results to the query before sending it back to the consumer.</t>
      </section>
      <section anchor="secartifacts">
        <name>Artifacts</name>
        <t>Artifacts are what the consumer (Verifier) needs in order to verify and appraise Evidence from the Attester, and therefore they form the bulk of the response payload in a CoSERV transaction.
The common CoSERV query language recognises three artifact types.
These correspond to the three categories of endorsement artifact that can be identified natively in the RATS architecture:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Trust Anchor</strong>: A trust anchor is as defined in <xref target="RFC6024"/>.
An example of a trust anchor would be the public part of the asymmetric signing key that is used by the Attester to sign Evidence, such that the Verifier can verify the cryptographic signature.</t>
          </li>
          <li>
            <t><strong>Endorsed Value</strong>: An endorsed value is as defined in <xref section="1.1.1" sectionFormat="of" target="I-D.ietf-rats-corim"/>.
This represents a characteristic of the Attester that is not directly presented in the Evidence, such as certification data related to a hardware or firmware module.</t>
          </li>
          <li>
            <t><strong>Reference Value</strong>: A reference value is as defined in <xref section="1.1.1" sectionFormat="of" target="I-D.ietf-rats-corim"/>.
A reference value specifies an individual aspect of the Attester's desired state.
Reference values are sometimes informally called "golden values".
An example of a reference value would be the expected hash or checksum of a binary firmware or software image running in the Attester's environment.
Evidence from the Attester would then include claims about the Attester's actual state, which the Verifier can then compare with the reference values at Evidence appraisal time.</t>
          </li>
        </ul>
        <t>When artifacts are produced by an aggregator (see <xref target="secaggregation"/>), the following additional classifications apply:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Collected Artifacts</strong>: these refer to artifacts that were derived by the aggregator by collecting and presenting data from original supply chain sources, or from other aggregators.
Collected artifacts form a single holistic package, and provide the most ergonomic consumption experience for the Verifier.</t>
          </li>
          <li>
            <t><strong>Source Arfifacts</strong>: these refer to artifacts that were obtained directly from the original supply chain sources, and used as inputs into the aggregation process, allowing the aggregator to derive the collected artifacts.</t>
          </li>
        </ul>
        <t>In the shallow trust model of aggregation, only the collected artifacts are used by the consumer.
In the deep trust model, both the collected artifacts and the source artifacts are used.
The source artifacts allow the consumer to audit the collected artifacts and operate the trust-but-verify principle.</t>
      </section>
      <section anchor="secenvironments">
        <name>Environments</name>
        <t>The environment defines the scope (or scopes) in which the endorsement artifacts are applicable.
Given that the consumer of these artifacts is likely to be a Verifier in the RATS model, the typical interpretation of the environment would be that of an Attester that either has produced evidence, or is expected to produce evidence, that the Verifier needs to appraise.
The Verifier consequently needs to query the Endorser or Reference Value Provider for artifacts that are applicable in that environment.
There are three mutually-exclusive methods for defining the environment within a CoSERV query.
Exactly one of these three methods <bcp14>MUST</bcp14> be used for the query to be valid.
All three methods correspond to environments that are also defined within CoRIM <xref target="I-D.ietf-rats-corim"/>.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Class</strong>: A class is an environment that is expected to be common to a group of similarly-constructed Attesters, who might therefore share the same set of endorsed characteristics.
An example of this might be a fleet of computing devices of the same model and manufacturer.</t>
          </li>
          <li>
            <t><strong>Instance</strong>: An instance is an environment that is unique to an individual and identifiable Attester, such as a single computing device or component.</t>
          </li>
          <li>
            <t><strong>Group</strong>: A group is a collection of common Attester instances that are collected together based on some defined semantics.
For example, Attesters may be put into groups for the purpose of anonymity.</t>
          </li>
        </ul>
        <section anchor="secstateful">
          <name>Stateful Environments</name>
          <t>In addition to specifying the Attester environment by class, instance, or group, it is sometimes necessary to constrain the target environment further by specifying aspects of its state.
This is because the applicability of Endorsements and Reference Values might vary, depending on these stateful properties.
Consider, for example, an Attester instance who signs Evidence using a derived attestation key, where the derivation algorithm is dependent on one or more aspects of the Attester's current state, such as the version number of an upgradable firmware component.
This example Attester would, at different points in its lifecycle, sign Evidence with different attestation keys, since the keys would change upon any firmware update.
To provide the correct public key to use as the trust anchor for verification, the Endorser would need to know the configured state of the Attester at the time the Evidence was produced.
Specifying such an Attester solely by its instance identifier is therefore insufficient for the Endorser to supply the correct artifact.
The environment specification would need to include these critical stateful aspects as well.
In CoRIM <xref target="I-D.ietf-rats-corim"/>, stateful environments are modeled as an environment identifier plus a collection of measurements, and CoSERV takes the same approach.
Therefore, any environment selector in a CoSERV query can optionally be enhanced with a collection of one or more measurements, which specify aspects of the target environment state that might materially impact the selection of artifacts.</t>
        </section>
      </section>
      <section anchor="queries">
        <name>Queries</name>
        <t>The purpose of a query is to allow the consumer (Verifier) to specify the artifacts that it needs.
The information that is conveyed in a CoSERV query includes the following:</t>
        <ul spacing="normal">
          <li>
            <t>A specification of the required artifact type: Reference Value, Endorsed Value or Trust Anchor.
See <xref target="secartifacts"/> for definitions of artifact types.
A single CoSERV query can only specify a single artifact type.</t>
          </li>
          <li>
            <t>A specification of the Attester's environment.
Environments can be selected according to Attester instance, group or class.
Additional properties of the environment state can be specified by adding one or more measurements to the selector.
See <xref target="secenvironments"/> for full definitions.
To facilitate efficient transactions, a single query can specify either multiple instances, multiple groups or multiple classes.
However, it is not possible to mix instance-based selectors, group-based selectors and class-based selectors in a single query.</t>
          </li>
          <li>
            <t>A timestamp, denoting the time at which the CoSERV query was sent.</t>
          </li>
          <li>
            <t>A switch to select the desired supply chain depth.
A CoSERV query can request collected artifacts, source artifacts, or both.
This switch is especially relevant when the CoSERV query is fulfilled by an aggregator.
The collected artifacts are intended for convenient consumption (according to the shallow trust model), while the source artifacts are principally useful for auditing (according to the deep trust model).
It is possible for a query to select for source artifacts only, without the collected artifacts.
This might happen when the consumer needs to inspect or audit artifacts from across the deep supply chain, while not requiring the convenience of the aggregated view.
It could also happen when the consumer is acting as an intermediate broker, gathering artifacts for delivery to another aggregator.
See <xref target="secaggregation"/> for details on aggregation, auditing and trust models.</t>
          </li>
        </ul>
      </section>
      <section anchor="result-sets">
        <name>Result Sets</name>
        <t>The result set contains the artifacts that the producer collected in response to the query.
The top-level structure of the result set consists of the following three items:</t>
        <ul spacing="normal">
          <li>
            <t>A collection of one or more result entries.
This will be a collection of either reference values, endorsed values or trust anchors.
See <xref target="secartifacts"/> for definitions of artifact types.
In the future, it may be possible to support additional artifact types via an extension mechanism.
Artifact types are never mixed in any single CoSERV result set.
The artifacts in the result collection therefore <bcp14>MUST</bcp14> match the single artifact type specified in the original CoSERV query.</t>
          </li>
          <li>
            <t>A timestamp indicating the expiry time of the entire result set.
Consumers <bcp14>MUST NOT</bcp14> consider any part of the result set to be valid after this expiry time.</t>
          </li>
          <li>
            <t>A collection of the original source materials from which the producer derived the correct artifacts to include in the result set.
These source materials are optional, and their intended purpose is auditing.
They are included only when requested by the original CoSERV query.
Source materials would typically be requested in cases where the consumer is not willing to place sole trust in the producer, and therefore needs an audit trail to enable additional verifications.</t>
          </li>
        </ul>
        <t>Each individual result entry combines a CoMID triple with an authority delegation chain.
CoMID triples are exactly as defined in <xref section="5.1.4" sectionFormat="of" target="I-D.ietf-rats-corim"/>.
Each CoMID triple will demonstrate the association between an environment matching that of the CoSERV query, and a single artifact such as a reference value, trust anchor or endorsed value.
The authority delegation chain is composed of one or more authority delegates.
Each authority delegate is represented by a public key or key identifier, which the consumer can check against its own set of trusted authorities.
The authority delegation chain serves to establish the provenance of the result entry, and enables the Verifier to evaluate the trustworthiness of the associated artifact.
The purpose of the authority delegation chain is to allow CoSERV responses to support decentralized trust models, where Verifiers may apply their own policy to determine which authorities are acceptable for different classes of artifact.</t>
        <t>Because each result entry combines a CoMID triple with an authority delegation chain, the entries are consequently known as quadruples (or "quads" for short).</t>
      </section>
    </section>
    <section anchor="secdatamodel">
      <name>CoSERV Data Model</name>
      <t>This section specifies the CBOR data model for CoSERV queries and result sets.</t>
      <t>CDDL is used to express rules and constraints of the data model for CBOR.
These rules must be strictly followed when creating or validating CoSERV data objects.</t>
      <t>The top-level CoSERV data structure is given by the following CDDL:</t>
      <sourcecode type="cddl"><![CDATA[
;# import comid-autogen

coserv = {
  &(profile: 0) => profile
  &(query: 1) => query
  ? &(results: 2) => results
}

profile = comid.oid-type / ~uri
]]></sourcecode>
      <section anchor="common-data-types">
        <name>Common Data Types</name>
        <t>CoSERV inherits the following types from the CoRIM data model <tt>class-map</tt>, <tt>$class-id-type-choice</tt>, <tt>$instance-id-type-choice</tt> and <tt>$group-id-type-choice</tt>.</t>
        <t>The collated CDDL is in <xref target="collated-cddl"/>.</t>
      </section>
      <section anchor="profile">
        <name>Profile</name>
        <t>In common with EAT and CoRIM, CoSERV supports the notion of profiles.
As with EAT and CoRIM, profiles are a way to extend or specialize the structure of a generic CoSERV query in order to cater for a specific use case or environment.</t>
        <t>In a CoSERV query, the profile can be identified by either a Uniform Resource Identifier (URI) or an Object Identifier (OID).
This convention is identical to how EAT profiles are identified using the <tt>eat_profile</tt> claim as described in <xref section="4.3.2" sectionFormat="of" target="I-D.ietf-rats-eat"/>.</t>
      </section>
      <section anchor="query-structure">
        <name>Query Structure</name>
        <t>The CoSERV query language enables Verifiers to specify the desired characteristics of Endorsements and Reference Values based on the environment in which they are applicable.</t>
        <t>The top-level structure of a CoSERV query is given by the following CDDL:</t>
        <sourcecode type="cddl"><![CDATA[
query = {
  &(artifact-type: 0) => artifact-type
  &(environment-selector: 1) => environment-selector-map
  &(timestamp: 2) => tdate ; RFC3339 date
  &(result-type: 3) => result-type
}

artifact-type = &(endorsed-values: 0)
                / &(trust-anchors: 1)
                / &(reference-values: 2)

result-type = &(collected-artifacts: 0)
              / &(source-artifacts: 1)
              / &(both: 2)
]]></sourcecode>
        <t>The meanings of these fields are detailed in the following subsections.</t>
        <section anchor="artifact-type">
          <name>Artifact Type</name>
          <t>The <tt>artifact-type</tt> field is the foremost discriminator of the query.
It is a top-level category selector. Its three permissible values are <tt>trust-anchors</tt> (codepoint 1), <tt>endorsed-values</tt> (codepoint 0) and <tt>reference-values</tt> (codepoint 2).</t>
          <t>See <xref target="secartifacts"/> for full definitions of artifact types.</t>
          <t>It is expected that implementations might choose to store these different categories of artifacts in different top-level stores or database tables.
Where this is the case, the <tt>artifact-type</tt> field serves to narrow the query down to the correct store or table.
Even where this is not the case, the discriminator is useful as a filter for the consumer, resulting in an efficiency gain by avoiding the transfer of unwanted data items.</t>
        </section>
        <section anchor="environment-selector">
          <name>Environment Selector</name>
          <t>The environment selector forms the main body of the query, and its CDDL is given below:</t>
          <sourcecode type="cddl"><![CDATA[
;# import comid-autogen

environment-selector-map = { selector }

stateful-class = [
  class: comid.class-map
  ? measurements: [ + comid.measurement-map ]
]

selector //= ( &(class: 0) => [
  + stateful-class
] )

stateful-instance = [
  instance: comid.$instance-id-type-choice
  ? measurements: [ + comid.measurement-map ]
]

selector //= ( &(instance: 1) => [
  + stateful-instance
] )

stateful-group = [
  group: comid.$group-id-type-choice
  ? measurements: [ + comid.measurement-map ]
]

selector //= ( &(group: 2) => [
  + stateful-group
] )
]]></sourcecode>
          <t>Environments can be specified according to instance, group or class. See <xref target="secenvironments"/> for details.</t>
          <t>Although these three environment definitions are mutually-exclusive in a CoSERV query, all three support multiple entries.
This is to gain efficiency by allowing the consumer (Verifier) to query for multiple artifacts in a single transaction.
For example, where artifacts are being indexed by instance, it would be possible to specify an arbitrary number of instances in a single query, and therefore obtain the artifacts for all of them in a single transaction.
Likewise for classes and groups.
However, it would not be possible for a single query to specify more than one kind of environment.
For example, it would not be possible to query for both class-level and instance-level artifacts in a single CoSERV transaction.</t>
          <t>All three environment selector types can optionally be enhanced with one or more <tt>measurement-map</tt> entries, which are used to express aspects of the environment state.
See <xref target="secstateful"/> for a description of stateful environments.</t>
          <section anchor="selector-semantics">
            <name>Selector Semantics</name>
            <t>When multiple environment selectors are present in a single query, such as multiple instances or multiple groups, the implementation of the artifact producer <bcp14>MUST</bcp14> consider these to be alternatives, and hence use a logical <tt>OR</tt> operation when applying the query to its internal data stores.</t>
            <t>Below is an illustrative example of how a CoSERV query for endorsed values, selecting for multiple Attester instances, might be transformed into a semantically-equivalent SQL database query:</t>
            <sourcecode type="sql"><![CDATA[
SELECT *
  FROM endorsed_values
 WHERE ( instance-id = "At6tvu/erQ==" ) OR
       ( instance-id = "iZl4ZVY=" )`
]]></sourcecode>
            <t>The same applies for class-based selectors; however, since class selectors are themselves composed of multiple inner fields, the implementation of the artifact producer <bcp14>MUST</bcp14> use a logical <tt>AND</tt> operation in consideration of the inner fields for each class.</t>
            <t>Also, for class-based selectors, any unset fields in the class are assumed to be wildcard (<tt>*</tt>), and therefore match any value.</t>
            <t>Below is an illustrative example of how a CoSERV query for reference values, selecting for multiple Attester classes, might be transformed into a semantically-equivalent SQL database query:</t>
            <sourcecode type="sql"><![CDATA[
SELECT *
  FROM reference_values
 WHERE ( class-id = "iZl4ZVY=" AND class-vendor = "ACME Inc." ) OR
       ( class-id = "31fb5abf-023e-4992-aa4e-95f9c1503bfa" )
]]></sourcecode>
          </section>
        </section>
        <section anchor="timestamp">
          <name>Timestamp</name>
          <t>The <tt>timestamp</tt> field records the date and time at which the query was made, formatted according to <xref section="3.4.1" sectionFormat="of" target="STD94"/>.
Implementations <bcp14>SHOULD</bcp14> populate this field with the current date and time when forming a CoSERV query.</t>
        </section>
        <section anchor="result-type">
          <name>Result Type</name>
          <t>The <tt>result-type</tt> field selects for either <tt>collected-artifacts</tt> (codepoint 0), <tt>source-artifacts</tt> (codepoint 1) or <tt>both</tt> (codepoint 2).
See <xref target="secaggregation"/> for definitions of source and collected artifacts.</t>
        </section>
      </section>
      <section anchor="result-set-structure">
        <name>Result Set Structure</name>
        <t>The result set structure is given by the following CDDL:</t>
        <sourcecode type="cddl"><![CDATA[
;# import cmw-autogen
;# import comid-autogen

results = {
  result-set
  &(expiry: 10) => tdate ; RFC3339 date
  ? &(source-artifacts: 11) => [ + cmw.cbor-record ]
}

result-set //= reference-values
result-set //= endorsed-values
result-set //= trust-anchors
result-set //= $$result-set-extensions

refval-quad = {
  &(authorities: 1) => [ + comid.$crypto-key-type-choice ]
  &(rv-triple: 2) => comid.reference-triple-record
}

reference-values = (
  &(rvq: 0) => [ * refval-quad ]
)

endval-quad = {
  &(authorities: 1) => [ + comid.$crypto-key-type-choice ]
  &(ev-triple: 2) => comid.endorsed-triple-record
}

cond-endval-quad = {
  &(authorities: 1) => [ + comid.$crypto-key-type-choice ]
  &(ce-triple: 2) => comid.conditional-endorsement-triple-record
}

endorsed-values = (
  &(evq: 1) => [ * endval-quad ]
  &(ceq: 2) => [ * cond-endval-quad ]
)

ak-quad = {
  &(authorities: 1) => [ + comid.$crypto-key-type-choice ]
  &(ak-triple: 2) => comid.attest-key-triple-record
}

cots-stmt = {
  &(authorities: 1) => [ + comid.$crypto-key-type-choice ]
  &(cots: 2) => cots
}

trust-anchors = (
  &(akq: 3) => [ * ak-quad ]
  &(tas: 4) => [ * cots-stmt ]
)

;
; import CoTS
;
cots = "TODO COTS"
]]></sourcecode>
      </section>
      <section anchor="encoding-requirements">
        <name>Encoding Requirements</name>
        <t>Implementations may wish to use serialized CoSERV queries as canonical identifiers for artifact collections.
For example, a Reference Value Provider service may wish the cache the results of a CoSERV query to gain efficiency when responding to a future identical query.
For these use cases to be effective, it is essential that any given CoSERV query is always serialized to the same fixed sequence of CBOR bytes.
Therefore, CoSERV queries <bcp14>MUST</bcp14> always use CBOR deterministic encoding as specified in <xref section="4.2" sectionFormat="of" target="STD94"/>.
Further, CoSERV queries <bcp14>MUST</bcp14> use CBOR definite-length encoding.</t>
      </section>
      <section anchor="signed-coserv">
        <name>Cryptographic Binding Between Query and Result Set</name>
        <t>CoSERV is designed to ensure that any result set passed from a producer to a consumer is precisely the result set that corresponds to the consumer's original query.
This is the reason why the original query is always included along with the result set in the data model.
However, this measure is only sufficient in cases where the conveyance protocol guarantees that CoSERV result sets are always transacted over a secure channel without any untrusted intermediaries.
Wherever this is not the case, producers <bcp14>MUST</bcp14> create an additional cryptographic binding between the query and the result.
This is achieved by transacting the result set within a cryptographic envelope, with a signature added by the producer, which is verified by the consumer.
A CoSERV data object can be signed using COSE <xref target="STD96"/>.
A <tt>signed-coserv</tt> is a <tt>COSE_Sign1</tt> with the following layout:</t>
        <sourcecode type="cddl"><![CDATA[
signed-coserv = [
  protected: bytes .cbor signed-coserv-protected-hdr
  unprotected: signed-coserv-unprotected-hdr
  payload: bytes .cbor coserv
  signature: bytes
]
]]></sourcecode>
        <t>The payload <bcp14>MUST</bcp14> be the CBOR-encoded CoSERV.</t>
        <sourcecode type="cddl"><![CDATA[
signed-coserv-protected-hdr = {
  1 => int                            ; alg
  2 => "application/coserv+cbor" / 10000 ; cty
  * cose.label => cose.values
}

signed-coserv-unprotected-hdr = {
  * cose.label => cose.values
}

cose.label = int / text
cose.values = any
]]></sourcecode>
        <t>The protected header <bcp14>MUST</bcp14> include the signature algorithm identifier.
The protected header <bcp14>MUST</bcp14> include either the content type <tt>application/coserv+cbor</tt> or the CoAP Content-Format TBD1.
Other header parameters <bcp14>MAY</bcp14> be added to the header buckets, for example a <tt>kid</tt> that identifies the signing key.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="query-data-examples">
        <name>Query Data Examples</name>
        <t>This section provides some illustrative examples of valid CoSERV query objects.</t>
        <t>The following example shows a query for Reference Values scoped by a single class.
The <tt>artifact-type</tt> is set to 2 (<tt>reference-values</tt>), indicating a query for Reference Values.
The <tt>profile</tt> is given the example value of <tt>tag:example.com,2025:cc-platform#1.0.0</tt>.
Finally, the <tt>environment-selector</tt> uses the key 0 to select for class, and the value contains a single entry with illustrative settings for the identifier, vendor and model.</t>
        <sourcecode type="edn"><![CDATA[
{
  / profile / 0: "tag:example.com,2025:cc-platform#1.0.0",
  / query /   1: {
    / artifact-type /         0: 2, / reference-values /
    / environment-selector /  1: {
      / class / 0: [ [
        {
          / class-id /  0: 560(h'00112233'),  / tagged-bytes /
          / vendor /    1: "Example Vendor",
          / model /     2: "Example Model"
        }
      ] ]
    },
    / timestamp /   2: 0("2030-12-01T18:30:01Z"),
    / result-type / 3: 1 / source-material /
  }
}
]]></sourcecode>
        <t>The next example is similar, but adds a second entry to the set of classes in the <tt>environment-map</tt>, showing how multiple classes can be queried at the same time.</t>
        <sourcecode type="edn"><![CDATA[
{
  / profile / 0: "tag:example.com,2025:cc-platform#1.0.0",
  / query /   1: {
    / artifact-type /         0: 2, / reference-values /
    / environment-selector /  1: {
      / class / 0: [
        [ {
          / class-id /  0: 560(h'8999786556'),  / tagged-bytes /
          / vendor /    1: "Example Vendor",
          / model /     2: "Example Model"
        } ],
        [ {
          / class-id /  0:
            37(h'31FB5ABF023E4992AA4E95F9C1503BFA')  / UUID /
        } ]
      ]
    },
    / timestamp /   2: 0("2030-12-01T18:30:01Z"),
    / result-type / 3: 2 / both collected and source material /
  }
}
]]></sourcecode>
        <t>The following example shows a query for Reference Values scoped by instance.
Again, the <tt>artifact-type</tt> is set to 2, and <tt>profile</tt> is given a demonstration value. The <tt>environment-selector</tt> now uses the key 1 to select for instances, and the value contains two entries with example instance identifiers.</t>
        <sourcecode type="edn"><![CDATA[
{
  / profile / 0: "tag:example.com,2025:cc-platform#1.0.0",
  / query /   1: {
    / artifact-type / 0: 2, / reference-values /
    / environment-selector /  1: {
      / instance / 1: [
        [ 550(h'02DEADBEEFDEAD') ], / UEID /
        [ 560(h'8999786556') ]      / tagged-bytes /
      ]
    },
    / timestamp /   2: 0("2030-12-01T18:30:01Z"),
    / result-type / 3: 0 / collected material /
  }
}
]]></sourcecode>
      </section>
      <section anchor="result-data-examples">
        <name>Result Data Examples</name>
        <t>This section provides some illustrative examples of valid CoSERV queries with their corresponding result sets.</t>
        <t>In this next example, the query is a reference value query based on class.</t>
        <t>The top-level structure is a map with three entries: <tt>profile</tt> (codepoint 0), <tt>query</tt> (codepoint 1) and <tt>results</tt> (codepoint 2).</t>
        <t>The profile and query structures are the same as in the previous examples.
The result structure is a map with two entries: <tt>expiry</tt> (codepoint 10) and <tt>rvq</tt> (codepoint 0).
The <tt>rvq</tt> (reference value quad) entry comprises the asserting authority and the asserted triples.
A single reference-value triple is shown in this example.
Its <tt>environment-map</tt>, as expected, is the same as the <tt>environment-map</tt> that was supplied in the query.
The rest of the structure is the <tt>measurement-map</tt> as defined in CoRIM <xref target="I-D.ietf-rats-corim"/>.</t>
        <sourcecode type="edn"><![CDATA[
{
  / profile / 0: "tag:example.com,2025:cc-platform#1.0.0",
  / query / 1: {
    0: 2,
    1: {
      0: [ [
        {
          0: 560(h'8999786556')
        }
      ] ]
    },
    2: 0("2030-12-01T18:30:01Z"),
    3: 0
  },
  / results / 2: {
    0: [
      {
        1: [ 560(h'abcdef') ],
        2: [
          {
            0: {
              0: 560(h'8999786556')
            }
          },
          [
            {
              0: 37(h'31FB5ABF023E4992AA4E95F9C1503BFA'),
              1: {
                / version / 0: {
                  0: "1.2.3",
                  1: 16384
                },
                / svn / 1: 553(2)
              }
            }
          ]
        ]
      }
    ],
    10: 0("2030-12-13T18:30:02Z")
  }
}
]]></sourcecode>
        <t>The following example is for a query that requested the results be provided in the "source artifacts" format.
This means one or more original signed manifests containing information that satisfies the query criteria.</t>
        <t>Compared with the previous example, the <tt>rvq</tt> entry is empty, while the <tt>source-artifacts</tt> (codepoint 11) contain two CMW records <xref target="I-D.ietf-rats-msg-wrap"/>, each of which contains a (made up) manifest with the type "application/vnd.example.refvals".</t>
        <sourcecode type="edn"><![CDATA[
{
  / profile / 0: "tag:example.com,2025:cc-platform#1.0.0",
  / query /   1: {
    / artifact-type /         0: 2, / reference-values /
    / environment-selector /  1: {
      / class / 0: [ [
        {
          / class-id /  0: 560(h'00112233'),  / tagged-bytes /
          / vendor /    1: "Example Vendor",
          / model /     2: "Example Model"
        }
      ] ]
    },
    / timestamp /   2: 0("2030-12-01T18:30:01Z"),
    / result-type / 3: 1 / source-artifacts /
  },
  / results / 2: {
    / rvq / 0: [ ],
    / expiry / 10: 0("2030-12-13T18:30:02Z"),
    / source artifacts / 11: [
      [ "application/vnd.example.refvals", h'afaeadac' ],
      [ "application/vnd.example.refvals", h'adacabaa' ]
    ]
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><cref anchor="rfced">RFC Editor:</cref> please remove this section prior to publication.</t>
      <t>This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>.
The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs.
Please note that the listing of any individual implementation here does not imply endorsement by the IETF.
Furthermore, no effort has been spent to verify the information presented here that was supplied by IETF contributors.
This is not intended as, and must not be construed to be, a catalog of available implementations or their features.
Readers are advised to note that other implementations may exist.</t>
      <t>According to <xref target="RFC7942"/>, "this will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.
It is up to the individual working groups to use this information as they see fit".</t>
      <section anchor="veraison">
        <name>Veraison</name>
        <t>Responsible Organisation: Veraison (open source project within the Confidential Computing Consortium).</t>
        <t>Location: https://github.com/veraison</t>
        <t>Description: Veraison provides components that can be used to build a Verifier, and also exemplifies adjacent RATS roles such as the Relying Party.
There is an active effort to extend Veraison so that it can act in the capacity of an Endorser or Reference Value Provider, showing how CoSERV can be used as a query language for such services.
This includes library code to assist with the creation, parsing and manipulation of CoSERV queries.</t>
        <t>Level of Maturity: This is a proof-of-concept prototype implementation.</t>
        <t>License: Apache-2.0.</t>
        <t>Coverage: This implementation covers all aspects of the CoSERV query language.</t>
        <t>Contact: Thomas Fossati, Thomas.Fossati@linaro.org</t>
      </section>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>The CoSERV data type serves an auxiliary function in the RATS architecture.
It does not directly convey Evidence, Endorsements, Reference Values, Policies or Attestation Results.
CoSERV exists only to facilitate the interactions between the Verifier and the Endorser or Reference Value Provider roles.
Consequently, there are fewer security considerations for CoSERV, particularly when compared with data objects such as EAT or CoRIM.</t>
      <t>Certain security characteristics are desirable for interactions between the Verifier and the Endorser or Reference Value Provider.
However, these characteristics would be the province of the specific implementations of these roles, and of the transport protocols in between them.
They would not be the province of the CoSERV data object itself.
Examples of such desirable characteristics might be:</t>
      <ul spacing="normal">
        <li>
          <t>The Endorser or Reference Value Provider is available to the Verifier when needed.</t>
        </li>
        <li>
          <t>The Verifier is authorised to query data from the Endorser or Reference Value Provider.</t>
        </li>
        <li>
          <t>Queries cannot be intercepted or undetectably modified by an entity that is interposed between the Verifier and the Endorser or Reference Value Provider.</t>
        </li>
      </ul>
      <section anchor="forming-native-database-queries-from-coserv">
        <name>Forming Native Database Queries from CoSERV</name>
        <t>Implementations should take care when transforming CoSERV queries into native query types that are compatible with their underlying storage technology (such as SQL queries).
There is a risk of injection attacks arising from poorly-formed or maliciously-formed CoSERV queries.
Implementations must ensure that suitable sanitization procedures are in place when performing such translations.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>A CoSERV query can potentially contain privacy-sensitive information.
Specifically, the <tt>environment-selector</tt> field of the query may reference identifiable Attester instances in some cases.
This concern naturally also extends to the data objects that might be returned to the consumer in response to the query, although the specifications of such data objects are beyond the scope of this document.
Implementations should ensure that appropriate attention is paid to this.
Suitable mitigations include the following:</t>
      <ul spacing="normal">
        <li>
          <t>The use of authenticated secure channels between the producers and the consumers of CoSERV queries and returned artifacts.</t>
        </li>
        <li>
          <t>Collating Attester instances into anonymity groups, and referencing the groups rather than the individual instances.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t><cref anchor="rfced_1">RFC Editor:</cref> replace "RFCthis" with the RFC number assigned to this document.</t>
      <section anchor="media-types-registrations">
        <name>Media Types Registrations</name>
        <t>IANA is requested to add the following media types to the "Media Types" registry <xref target="IANA.media-types"/>.</t>
        <table anchor="tab-mc-regs">
          <name>CoSERV Media Types</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Template</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>coserv+cbor</tt></td>
              <td align="left">
                <tt>application/coserv+cbor</tt></td>
              <td align="left">
                <xref target="secdatamodel"/> of RFCthis</td>
            </tr>
            <tr>
              <td align="left">
                <tt>coserv+cose</tt></td>
              <td align="left">
                <tt>application/coserv+cose</tt></td>
              <td align="left">
                <xref target="signed-coserv"/> of RFCthis</td>
            </tr>
          </tbody>
        </table>
        <section anchor="applicationcoservcbor">
          <name><tt>application/coserv+cbor</tt></name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>coserv+cbor</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>"profile" (CoSERV profile in string format.  OIDs must use the dotted-decimal notation.)</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>binary (CBOR)</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t><xref target="seccons"/> of RFCthis</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFCthis</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Verifiers, Endorsers, Reference Value Providers</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>The syntax and semantics of fragment identifiers are as specified for "application/cbor". (No fragment identification syntax is currently defined for "application/cbor".)</t>
            </dd>
            <dt>Person &amp; email address to contact for further information:</dt>
            <dd>
              <t>RATS WG mailing list (rats@ietf.org)</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>none</t>
            </dd>
            <dt>Author/Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
            <dt>Provisional registration:</dt>
            <dd>
              <t>no</t>
            </dd>
          </dl>
        </section>
        <section anchor="applicationcoservcose">
          <name><tt>application/coserv+cose</tt></name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t><tt>application</tt></t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t><tt>coserv+cose</tt></t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>n/a (cose-type is explicitly not supported, as it is understood to be "cose-sign1")</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>"profile" CoSERV profile in string format.
OIDs must use the dotted-decimal notation.
Note that the <tt>cose-type</tt> parameter is explicitly not supported, as it is understood to be <tt>"cose-sign1"</tt>.</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>binary</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t><xref target="seccons"/> of RFCthis</t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>RFCthis</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Verifiers, Endorsers, Reference Value Providers</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>RATS WG mailing list (rats@ietf.org)</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>none</t>
            </dd>
            <dt>Author/Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
            <dt>Provisional registration?</dt>
            <dd>
              <t>no</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="coap-content-formats">
        <name>CoAP Content-Formats</name>
        <t>IANA is requested to register the following Content-Format IDs in the "CoAP Content-Formats" registry, within the "Constrained RESTful Environments (CoRE) Parameters" registry group <xref target="IANA.core-parameters"/>:</t>
        <table align="left">
          <name>New CoAP Content Formats</name>
          <thead>
            <tr>
              <th align="left">Content-Type</th>
              <th align="left">Content Coding</th>
              <th align="left">ID</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">application/coserv+cbor</td>
              <td align="left">-</td>
              <td align="left">TBD1</td>
              <td align="left">
                <xref target="secdatamodel"/> of RFCthis</td>
            </tr>
            <tr>
              <td align="left">application/coserv+cose</td>
              <td align="left">-</td>
              <td align="left">TBD2</td>
              <td align="left">
                <xref target="signed-coserv"/> of RFCthis</td>
            </tr>
          </tbody>
        </table>
        <t>If possible, TBD1 and TBD2 should be assigned in the 256..9999 range.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="STD96">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="STD94">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="N. Smith" initials="N." surname="Smith"/>
            <author fullname="W. Pan" initials="W." surname="Pan"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>In network protocol exchanges, it is often useful for one end of a communication to know whether the other end is in an intended operating state. This document provides an architectural overview of the entities involved that make such tests possible through the process of generating, conveying, and evaluating evidentiary Claims. It provides a model that is neutral toward processor architectures, the content of Claims, and protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>
        <reference anchor="I-D.ietf-rats-corim">
          <front>
            <title>Concise Reference Integrity Manifest</title>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <author fullname="Yogesh Deshpande" initials="Y." surname="Deshpande">
              <organization>arm</organization>
            </author>
            <author fullname="Ned Smith" initials="N." surname="Smith">
              <organization>Intel</organization>
            </author>
            <author fullname="Wei Pan" initials="W." surname="Pan">
              <organization>Huawei Technologies</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   Remote Attestation Procedures (RATS) enable Relying Parties to assess
   the trustworthiness of a remote Attester and therefore to decide
   whether or not to engage in secure interactions with it.  Evidence
   about trustworthiness can be rather complex and it is deemed
   unrealistic that every Relying Party is capable of the appraisal of
   Evidence.  Therefore that burden is typically offloaded to a
   Verifier.  In order to conduct Evidence appraisal, a Verifier
   requires not only fresh Evidence from an Attester, but also trusted
   Endorsements and Reference Values from Endorsers and Reference Value
   Providers, such as manufacturers, distributors, or device owners.
   This document specifies the information elements for representing
   Endorsements and Reference Values in CBOR format.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rats-corim-08"/>
        </reference>
        <reference anchor="I-D.ietf-rats-msg-wrap">
          <front>
            <title>RATS Conceptual Messages Wrapper (CMW)</title>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Ned Smith" initials="N." surname="Smith">
              <organization>Intel</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
              <organization>University of Applied Sciences Bonn-Rhein-Sieg</organization>
            </author>
            <author fullname="Dionna Glaze" initials="D." surname="Glaze">
              <organization>Google LLC</organization>
            </author>
            <date day="3" month="July" year="2025"/>
            <abstract>
              <t>   The Remote Attestation Procedures architecture (RFC 9334) defines
   several types of conceptual messages, such as Evidence, Attestation
   Results, Endorsements, and Reference Values.  These messages can
   appear in different formats and be transported via various protocols.

   This document introduces the Conceptual Message Wrapper (CMW) that
   provides a common structure to encapsulate these messages.  It
   defines a dedicated CBOR tag, corresponding JSON Web Token (JWT) and
   CBOR Web Token (CWT) claims, and an X.509 extension.

   This allows CMWs to be used in CBOR-based protocols, web APIs using
   JWTs and CWTs, and PKIX artifacts like X.509 certificates.
   Additionally, the draft defines a media type and a CoAP content
   format to transport CMWs over protocols like HTTP, MIME, and CoAP.

   The goal is to improve the interoperability and flexibility of remote
   attestation protocols.  By introducing a shared message format like
   the CMW, we can consistently support different attestation message
   types, evolve message serialization formats without breaking
   compatibility, and avoid having to redefine how messages are handled
   in each protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rats-msg-wrap-16"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="IANA.media-types" target="https://www.iana.org/assignments/media-types">
          <front>
            <title>Media Types</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.core-parameters" target="https://www.iana.org/assignments/core-parameters">
          <front>
            <title>Constrained RESTful Environments (CoRE) Parameters</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <referencegroup anchor="STD98" target="https://www.rfc-editor.org/info/std98">
          <reference anchor="RFC9111" target="https://www.rfc-editor.org/info/rfc9111">
            <front>
              <title>HTTP Caching</title>
              <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
              <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
              <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
              <date month="June" year="2022"/>
              <abstract>
                <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
                <t>This document obsoletes RFC 7234.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="98"/>
            <seriesInfo name="RFC" value="9111"/>
            <seriesInfo name="DOI" value="10.17487/RFC9111"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC6024">
          <front>
            <title>Trust Anchor Management Requirements</title>
            <author fullname="R. Reddy" initials="R." surname="Reddy"/>
            <author fullname="C. Wallace" initials="C." surname="Wallace"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>A trust anchor represents an authoritative entity via a public key and associated data. The public key is used to verify digital signatures, and the associated data is used to constrain the types of information for which the trust anchor is authoritative. A relying party uses trust anchors to determine if a digitally signed object is valid by verifying a digital signature using the trust anchor's public key, and by enforcing the constraints expressed in the associated data for the trust anchor. This document describes some of the problems associated with the lack of a standard trust anchor management mechanism and defines requirements for data formats and push-based protocols designed to address these problems. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6024"/>
          <seriesInfo name="DOI" value="10.17487/RFC6024"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="RFC7252">
          <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="I-D.ietf-rats-endorsements">
          <front>
            <title>RATS Endorsements</title>
            <author fullname="Dave Thaler" initials="D." surname="Thaler">
              <organization>Armidale Consulting</organization>
            </author>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <date day="3" month="March" year="2025"/>
            <abstract>
              <t>   In the IETF Remote Attestation Procedures (RATS) architecture, a
   Verifier accepts Evidence and, using Appraisal Policy typically with
   additional input from Endorsements and Reference Values, generates
   Attestation Results in formats that are useful for Relying Parties.
   This document illustrates the purpose and role of Endorsements and
   discusses some considerations in the choice of message format for
   Endorsements in the scope of the RATS architecture.

   This document does not aim to define a conceptual message format for
   Endorsements and Reference Values.  Instead, it extends RFC9334 to
   provide further details on Reference Values and Endorsements, as
   these topics were outside the scope of the RATS charter when RFC9334
   was developed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rats-endorsements-06"/>
        </reference>
        <reference anchor="I-D.ietf-rats-eat">
          <front>
            <title>The Entity Attestation Token (EAT)</title>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <author fullname="Giridhar Mandyam" initials="G." surname="Mandyam">
              <organization>Mediatek USA</organization>
            </author>
            <author fullname="Jeremy O'Donoghue" initials="J." surname="O'Donoghue">
              <organization>Qualcomm Technologies Inc.</organization>
            </author>
            <author fullname="Carl Wallace" initials="C." surname="Wallace">
              <organization>Red Hound Software, Inc.</organization>
            </author>
            <date day="6" month="September" year="2024"/>
            <abstract>
              <t>   An Entity Attestation Token (EAT) provides an attested claims set
   that describes state and characteristics of an entity, a device like
   a smartphone, IoT device, network equipment or such.  This claims set
   is used by a relying party, server or service to determine the type
   and degree of trust placed in the entity.

   An EAT is either a CBOR Web Token (CWT) or JSON Web Token (JWT) with
   attestation-oriented claims.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rats-eat-31"/>
        </reference>
      </references>
    </references>
    <?line 914?>

<section anchor="collated-cddl">
      <name>Collated CoSERV CDDL</name>
      <artwork><![CDATA[
;# import comid-autogen

coserv = {
  &(profile: 0) => profile
  &(query: 1) => query
  ? &(results: 2) => results
}

profile = comid.oid-type / ~uri

;# import comid-autogen

environment-selector-map = { selector }

stateful-class = [
  class: comid.class-map
  ? measurements: [ + comid.measurement-map ]
]

selector //= ( &(class: 0) => [
  + stateful-class
] )

stateful-instance = [
  instance: comid.$instance-id-type-choice
  ? measurements: [ + comid.measurement-map ]
]

selector //= ( &(instance: 1) => [
  + stateful-instance
] )

stateful-group = [
  group: comid.$group-id-type-choice
  ? measurements: [ + comid.measurement-map ]
]

selector //= ( &(group: 2) => [
  + stateful-group
] )

concise-mid-tag = {
  ? &(language: 0) => text
  &(tag-identity: 1) => tag-identity-map
  ? &(entities: 2) => [ + comid-entity-map ]
  ? &(linked-tags: 3) => [ + linked-tag-map ]
  &(triples: 4) => triples-map
  * $$concise-mid-tag-extension
}

attest-key-triple-record = [
  environment: environment-map
  key-list: [ + $crypto-key-type-choice ]
  ? conditions: non-empty< {
    ? &(mkey: 0) => $measured-element-type-choice,
    ? &(authorized-by: 1) => [ + $crypto-key-type-choice ]
  }>
]

$class-id-type-choice /= tagged-oid-type
$class-id-type-choice /= tagged-uuid-type
$class-id-type-choice /= tagged-bytes

class-map = non-empty<{
  ? &(class-id: 0) => $class-id-type-choice
  ? &(vendor: 1) => tstr
  ? &(model: 2) => tstr
  ? &(layer: 3) => uint
  ? &(index: 4) => uint
}>

comid-entity-map =
  entity-map<$comid-role-type-choice, $$comid-entity-map-extension>

$comid-role-type-choice /= &(tag-creator: 0)
$comid-role-type-choice /= &(creator: 1)
$comid-role-type-choice /= &(maintainer: 2)

conditional-endorsement-series-triple-record = [
  condition: stateful-environment-record
  series: [ + conditional-series-record ]
]

conditional-series-record = [
  selection: [ + measurement-map]
  addition: [ + measurement-map ]
]

COSE_KeySet = [ + COSE_Key ]

COSE_Key = {
    1 => tstr / int
    ? 2 => bstr 
    ? 3 => tstr / int 
    ? 4 => [+ (tstr / int) ]
    ? 5 => bstr
    * cose-label => cose-value
}

cose-label = int / tstr
cose-value = any

coswid-triple-record = [
  environment-map
  [ + concise-swid-tag-id ]
]

concise-swid-tag-id = text / bstr .size 16

$crypto-key-type-choice /= tagged-pkix-base64-key-type
$crypto-key-type-choice /= tagged-pkix-base64-cert-type
$crypto-key-type-choice /= tagged-pkix-base64-cert-path-type
$crypto-key-type-choice /= tagged-cose-key-type
$crypto-key-type-choice /= tagged-thumbprint-type
$crypto-key-type-choice /= tagged-cert-thumbprint-type
$crypto-key-type-choice /= tagged-cert-path-thumbprint-type
$crypto-key-type-choice /= tagged-pkix-asn1der-cert-type
$crypto-key-type-choice /= tagged-bytes

tagged-pkix-base64-key-type = #6.554(tstr)
tagged-pkix-base64-cert-type = #6.555(tstr)
tagged-pkix-base64-cert-path-type = #6.556(tstr)
tagged-thumbprint-type = #6.557(digest)
tagged-cose-key-type = #6.558(COSE_KeySet / COSE_Key)
tagged-cert-thumbprint-type = #6.559(digest)
tagged-cert-path-thumbprint-type = #6.561(digest)
tagged-pkix-asn1der-cert-type = #6.562(bstr)

domain-dependency-triple-record = [
  $domain-type-choice
  [ + $domain-type-choice ]
]

domain-membership-triple-record = [
  $domain-type-choice
  [ + environment-map ]
]

conditional-endorsement-triple-record = [
  conditions: [ + stateful-environment-record ]
  endorsements: [ + endorsed-triple-record ]
]

$domain-type-choice /= uint
$domain-type-choice /= text
$domain-type-choice /= tagged-uuid-type
$domain-type-choice /= tagged-oid-type

endorsed-triple-record = [
  condition: environment-map
  endorsement: [ + measurement-map ]
]

entity-map<role-type-choice, extension-socket> = {
  &(entity-name: 0) => $entity-name-type-choice
  ? &(reg-id: 1) => uri
  &(role: 2) => [ + role-type-choice ]
  * extension-socket
}

$entity-name-type-choice /= text

environment-map = non-empty<{
  ? &(class: 0) => class-map
  ? &(instance: 1) => $instance-id-type-choice
  ? &(group: 2) => $group-id-type-choice
}>

flags-map = {
  ? &(is-configured: 0) => bool
  ? &(is-secure: 1) => bool
  ? &(is-recovery: 2) => bool
  ? &(is-debug: 3) => bool
  ? &(is-replay-protected: 4) => bool
  ? &(is-integrity-protected: 5) => bool
  ? &(is-runtime-meas: 6) => bool
  ? &(is-immutable: 7) => bool
  ? &(is-tcb: 8) => bool
  ? &(is-confidentiality-protected: 9) => bool
  * $$flags-map-extension
}

$group-id-type-choice /= tagged-uuid-type
$group-id-type-choice /= tagged-bytes

identity-triple-record = [
  environment: environment-map
  key-list: [ + $crypto-key-type-choice ]
  ? conditions: non-empty<{
    ? &(mkey: 0) => $measured-element-type-choice,
    ? &(authorized-by: 1) => [ + $crypto-key-type-choice ] 
  }>
]

$instance-id-type-choice /= tagged-ueid-type
$instance-id-type-choice /= tagged-uuid-type
$instance-id-type-choice /= $crypto-key-type-choice
$instance-id-type-choice /= tagged-bytes

ip-addr-type-choice = ip4-addr-type / ip6-addr-type
ip4-addr-type = bytes .size 4
ip6-addr-type = bytes .size 16

raw-int-type-choice = int / tagged-int-range
int-range = [min: int / negative-inf, max: int / positive-inf]
tagged-int-range = #6.564(int-range)
positive-inf = null
negative-inf = null

linked-tag-map = {
  &(linked-tag-id: 0) => $tag-id-type-choice
  &(tag-rel: 1) => $tag-rel-type-choice
}

mac-addr-type-choice = eui48-addr-type / eui64-addr-type
eui48-addr-type = bytes .size 6
eui64-addr-type = bytes .size 8

$measured-element-type-choice /= tagged-oid-type
$measured-element-type-choice /= tagged-uuid-type
$measured-element-type-choice /= uint
$measured-element-type-choice /= tstr

measurement-map = {
  ? &(mkey: 0) => $measured-element-type-choice
  &(mval: 1) => measurement-values-map
  ? &(authorized-by: 2) => [ + $crypto-key-type-choice ]
}

measurement-values-map = non-empty<{
  ? &(version: 0) => version-map
  ? &(svn: 1) => svn-type-choice
  ? &(digests: 2) => digests-type
  ? &(flags: 3) => flags-map
  ? (
      &(raw-value: 4) => $raw-value-type-choice,
      ? &(raw-value-mask: 5) => raw-value-mask-type
    )
  ? &(mac-addr: 6) => mac-addr-type-choice
  ? &(ip-addr: 7) =>  ip-addr-type-choice
  ? &(serial-number: 8) => text
  ? &(ueid: 9) => ueid-type
  ? &(uuid: 10) => uuid-type
  ? &(name: 11) => text
  ? &(cryptokeys: 13) => [ + $crypto-key-type-choice ]
  ? &(integrity-registers: 14) => integrity-registers
  ? &(raw-int: 15) => raw-int-type-choice
  * $$measurement-values-map-extension
}>

non-empty<M> = (M) .and ({ + any => any })

oid-type = bytes
tagged-oid-type = #6.111(oid-type)

$raw-value-type-choice /= tagged-bytes
$raw-value-type-choice /= tagged-masked-raw-value

raw-value-mask-type = bytes

tagged-masked-raw-value = #6.563([
  value: bytes
  mask : bytes
])

reference-triple-record = [
  ref-env: environment-map
  ref-claims: [ + measurement-map ]
]

stateful-environment-record = [
  environment: environment-map,
  claims-list: [ + measurement-map ]
]

svn-type = uint
svn = svn-type
min-svn = svn-type
tagged-svn = #6.552(svn)
tagged-min-svn = #6.553(min-svn)
svn-type-choice = svn / tagged-svn / tagged-min-svn

$tag-id-type-choice /= tstr
$tag-id-type-choice /= uuid-type

tag-identity-map = {
  &(tag-id: 0) => $tag-id-type-choice
  ? &(tag-version: 1) => tag-version-type
}

$tag-rel-type-choice /= &(supplements: 0)
$tag-rel-type-choice /= &(replaces: 1)

tag-version-type = uint .default 0

tagged-bytes = #6.560(bytes)

triples-map = non-empty<{
  ? &(reference-triples: 0) =>
    [ + reference-triple-record ]
  ? &(endorsed-triples: 1) =>
    [ + endorsed-triple-record ]
  ? &(identity-triples: 2) =>
    [ + identity-triple-record ]
  ? &(attest-key-triples: 3) =>
    [ + attest-key-triple-record ]
  ? &(dependency-triples: 4) =>
    [ + domain-dependency-triple-record ]
  ? &(membership-triples: 5) =>
    [ + domain-membership-triple-record ]
  ? &(coswid-triples: 6) =>
    [ + coswid-triple-record ]
  ? &(conditional-endorsement-series-triples: 8) =>
    [ + conditional-endorsement-series-triple-record ]
  ? &(conditional-endorsement-triples: 10) =>
    [ + conditional-endorsement-triple-record ]
  * $$triples-map-extension
}>

ueid-type = bytes .size (7..33)
tagged-ueid-type = #6.550(ueid-type)

uuid-type = bytes .size 16
tagged-uuid-type = #6.37(uuid-type)

version-map = {
  &(version: 0) => text
  ? &(version-scheme: 1) => $version-scheme
}

digest = [
  alg: (int / text),
  val: bytes
]

digests-type = [ + digest ]

integrity-register-id-type-choice = uint / text

integrity-registers = {
  + integrity-register-id-type-choice => digests-type
}

concise-swid-tag = {
  tag-id => text / bstr .size 16,
  tag-version => integer,
  ? corpus => bool,
  ? patch => bool,
  ? supplemental => bool,
  software-name => text,
  ? software-version => text,
  ? version-scheme => $version-scheme,
  ? media => text,
  ? software-meta => one-or-more<software-meta-entry>,
  entity => one-or-more<entity-entry>,
  ? link => one-or-more<link-entry>,
  ? payload-or-evidence,
  * $$coswid-extension,
  global-attributes,
}

payload-or-evidence //= ( payload => payload-entry )
payload-or-evidence //= ( evidence => evidence-entry )

any-uri = uri
label = text / int

$version-scheme /= multipartnumeric
$version-scheme /= multipartnumeric-suffix
$version-scheme /= alphanumeric
$version-scheme /= decimal
$version-scheme /= semver
$version-scheme /= int / text

any-attribute = (
  label => one-or-more<text> / one-or-more<int>
)

one-or-more<T> = T / [ 2* T ]

global-attributes = (
  ? lang => text,
  * any-attribute,
)

hash-entry = [
  hash-alg-id: int,
  hash-value: bytes,
]

entity-entry = {
  entity-name => text,
  ? reg-id => any-uri,
  role => one-or-more<$role>,
  ? thumbprint => hash-entry,
  * $$entity-extension,
  global-attributes,
}

$role /= tag-creator
$role /= software-creator
$role /= aggregator
$role /= distributor
$role /= licensor
$role /= maintainer
$role /= int / text

link-entry = {
  ? artifact => text,
  href => any-uri,
  ? media => text,
  ? ownership => $ownership,
  rel => $rel,
  ? media-type => text,
  ? use => $use,
  * $$link-extension,
  global-attributes,
}

$ownership /= shared
$ownership /= private
$ownership /= abandon
$ownership /= int / text

$rel /= ancestor
$rel /= component
$rel /= feature
$rel /= installationmedia
$rel /= packageinstaller
$rel /= parent
$rel /= patches
$rel /= requires
$rel /= see-also
$rel /= supersedes
$rel /= supplemental
$rel /= -256..64436 / text

$use /= optional
$use /= required
$use /= recommended
$use /= int / text

software-meta-entry = {
  ? activation-status => text,
  ? channel-type => text,
  ? colloquial-version => text,
  ? description => text,
  ? edition => text,
  ? entitlement-data-required => bool,
  ? entitlement-key => text,
  ? generator =>  text / bstr .size 16,
  ? persistent-id => text,
  ? product => text,
  ? product-family => text,
  ? revision => text,
  ? summary => text,
  ? unspsc-code => text,
  ? unspsc-version => text,
  * $$software-meta-extension,
  global-attributes,
}

path-elements-group = ( ? directory => one-or-more<directory-entry>,
                        ? file => one-or-more<file-entry>,
                      )

resource-collection = (
  path-elements-group,
  ? process => one-or-more<process-entry>,
  ? resource => one-or-more<resource-entry>,
  * $$resource-collection-extension,
)

file-entry = {
  filesystem-item,
  ? size => uint,
  ? file-version => text,
  ? hash => hash-entry,
  * $$file-extension,
  global-attributes,
}

directory-entry = {
  filesystem-item,
  ? path-elements => { path-elements-group },
  * $$directory-extension,
  global-attributes,
}

process-entry = {
  process-name => text,
  ? pid => integer,
  * $$process-extension,
  global-attributes,
}

resource-entry = {
  type => text,
  * $$resource-extension,
  global-attributes,
}

filesystem-item = (
  ? key => bool,
  ? location => text,
  fs-name => text,
  ? root => text,
)

payload-entry = {
  resource-collection,
  * $$payload-extension,
  global-attributes,
}

evidence-entry = {
  resource-collection,
  ? date => integer-time,
  ? device-id => text,
  ? location => text,
  * $$evidence-extension,
  global-attributes,
}

integer-time = #6.1(int)

tag-id = 0
software-name = 1
entity = 2
evidence = 3
link = 4
software-meta = 5
payload = 6
hash = 7
corpus = 8
patch = 9
media = 10
supplemental = 11
tag-version = 12
software-version = 13
version-scheme = 14
lang = 15
directory = 16
file = 17
process = 18
resource = 19
size = 20
file-version = 21
key = 22
location = 23
fs-name = 24
root = 25
path-elements = 26
process-name = 27
pid = 28
type = 29
entity-name = 31
reg-id = 32
role = 33
thumbprint = 34
date = 35
device-id = 36
artifact = 37
href = 38
ownership = 39
rel = 40
media-type = 41
use = 42
activation-status = 43
channel-type = 44
colloquial-version = 45
description = 46
edition = 47
entitlement-data-required = 48
entitlement-key = 49
generator = 50
persistent-id = 51
product = 52
product-family = 53
revision = 54
summary = 55
unspsc-code = 56
unspsc-version = 57

multipartnumeric = 1
multipartnumeric-suffix = 2
alphanumeric = 3
decimal = 4
semver = 16384

tag-creator=1
software-creator=2
aggregator=3
distributor=4
licensor=5
maintainer=6

abandon=1
private=2
shared=3

ancestor=1
component=2
feature=3
installationmedia=4
packageinstaller=5
parent=6
patches=7
requires=8
see-also=9
supersedes=10

optional=1
required=2
recommended=3

]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
d9bRJ253UNeK+cEDehGbUeidCkpTPP1yA+oujcQKqRrhKX/Sf8GX91x883w4
iN5QjzLYEpjYIqFj5a9P/kx+xunUyVdpNV5NPiR4LMc72oz75EM6vZTgrs6q
shOXKlyUMXfG31RebgllT7nnQcKcrfZHJ+O7fDikuXACeKAshPlobssq0Hgd
i7vIcNaud1FxERLJRtU6Aeza6soCIKgpI31ktttx9Z2enxh/17jSvc3dsaY0
Z9Mz+FxYCqZ+WcfzY3mKl6H2Rnujw+PJpL/M4hrdFo+Gg73B3iXoI6lXmO+y
K6R66e4hwXzbvcahITnYr/KAQfAKoAqOOEWTuGWwYICdmlIyNIrt5/OKa4pv
ViAxjdsrmeYRbtldm3+1a/aOzdbD5rzVo08Z07vAc4bHxADwYZgIs2vZEvQ+
6sHvlqW7Kx924Q2/t31jI3ZgEqw/kAjg/z5Fjv/tOlfbLg17+Hhv++o3e3vD
4Wi0v/8boBfkPPF8DsyL2fpu8LlgjECHwbdkB5k/0nOau2vM2YU8zZHXmJJW
t2zTW/nrPZlM8Lsns3anO3a5h73trdHe/l5/OOrvDS+GT4/39473hn/Z2tEv
/JyfXbMPNh/8I24XPXVAM7oFpms5aQ6c1tI47iguaiIlwqfTivWlgrKr69KW
2JcMb43midYXEDnnVOK2pxsusXZ246CmagqsqE/1ID6ZFlKh7H8JTdoF/+Eh
NPn06OjoydPHh4eP/4eo0rzvPRDiIDds/wkAvz988c3hyTcv9kb7Z+jCPjk5
ODs6fHF0ig7sb16c/GYHe/n++5fPvZncCv2b/4J9MIJ/OJbrXK104UVwIKe9
Nf5JEabxKtB15zYP/g4Zxny+QwrF3tkVFNEcbKG7ozcIFax8EQiWYUOweKG/
DcIFi9dr0j6XBVYe0a5tUf1379NfZ3/amezic3+LHh6SZBg9Pzt5/s3Z2Qv8
F8j2PY75/VlAuD90bFng5jJE57799Sl8D7elJe5uinYRhf8K9c+SCZ9S6b6E
N3FF/uhKFCd5GnXZ2wU9pVyxZiRrwHNTqjH1gVlPAhNnXRA1H3tbrBn5oVGa
4R7J2iSnXTtZ88JLVceWDKiFxIaSJTJtJeWyTK7pzm9F6yAI7WyaiduVMA+O
voTw2jTT6x8b8xMtl1+08RtPd9xZn2WZKvtAQV2yCm3P+Ng7NegdnWFKeQ62
sEZja+p5oVSvZdRLVpQxRJh826E+xC6XtafeKkVlp8ZhvFr5lAdgk469s9Yl
1kPQCmk+rqnLVl5NeARxU4m5X5sFWmZF7C4yJuBfd2i6nXrEfSrn/YwHGU0k
7XetG3sXv7RwKkAOHGStAk48ngAaiZHa1yOf84bToA7DB/fNzZ+fNzdh1UGz
jo4fqL70Gl8O21CyYsZVvHa7piEjbg0Ho8H+VrNH6XX4eP/pQevVbbs16PnX
OVPM4eH+9qiZsX+7EUHvo+Zf/FZWaLgXUMVwX6liBFRxv76UVmFFDNyZ7oyz
HwwZ29v+7HbdapbM2LLX5F6IHxmD6V5CnDthzp7HRZynswSLJYhawxmUjeJG
FfxdWfeJlE0BNocyFI//cYVlL2uhybpFsyPGyhwU+dpiWa/9GiT3pBWAoBEg
icmfvv6Tzd2wnGZxg2W4KOMHeJdeWmm9AduYu2FWyx07cQcz6QqB0+86nw6U
JXH0GAtr/2+xt/7lA2j5AFyq6u6dXBweXv+oaHyvPUuBh927WYK2blW7ge88
HfuH+0mxZ0BezOIknsaT3ziB8dAv4at4HMe/EZS+DzRhE4aNqTbnqop++D/l
bJJM3xt4GVNF7UVxLYlLTj9OuZY1H5aXq4lDHdrPuaqoa9yufNC5eRJHdBAb
2gouQk6rRpUxv1AhHvTE+37xjLAUhn1JOaVJ3X9exjO5ozL1zvFRZBE+wqzT
8FQi3pxzdDDiCw+SZqJvE2jV3XTCaeXqZ2DIssIKNQTpy7OLF1ppEq9+q7xS
4ew1gh9zTEymSrAINoUuAR5QJt/yOuSFFtDDLqm6Ok8aA3b+jY3hqlII0d6+
hy/XQUFriWUhiDZ0vKBgdV5gwBwTE7BU9BiDc7AOfEuTdx2FL0lcKQWJXDZ1
UBiNkGEvL6X6OBdeLNGiMBarnI6IS4a6VBjWxEzMPwCaiLOCEXEdpxnXgW7S
l96EOksoGlLh7Qsx36lLgb/rVBLEHZa5slLrzFgM6PsIyMc80zAp0FJPD4SE
rSTEdRBQViY3eh/cTVF+wM+kdpsQyzw3U/Y9eAmvdFkhX9YtYV57L+w4yWGb
kAKvVzOgJNWAJUJK58fIeNBanmy1rghLXGbfkQqCNkuSKV9+Y8cieRok9iZT
u1UrKZsnV5DwsbvVUv2jHl22J831cdMqICE2aNZ0nTnMbovzEf6YYFXxIodl
o0oSdEzhTTnHKkb03bFtYrYLrLolvFdvnZZoMAem8hl7bag6jRZgxkpAQOzp
aoEG7atiIv1e1fWyOt7dnUMPqzGK/N1rhSZ67liEB4F1H3hXK7cuqEMKXqWZ
f1esFFLB2mHJR1CdMrleZPq3GEtlcFV4vgDcL5T7LuHs+rcgaNZa75yzj+MJ
Oy14H7vj7RZUuu+WS19OuL1Nho6X8UQKFjcu9dt8pZ/v5ha/iD/n2LkN7elt
e6ezJAxZfqD1NLN0TEd2kLg9xurSZ6lIBNYxAw210jJmqPxRzq1w79BLgytM
zhJ48xppFyZ6bGyGAa5gMevD/8qN70zvpFCEHAE7AqDzKjk2J0vMbuqPQP9D
hRmpZJ5oryFXnuBbuhmheRSl84g79UdXP2N3xQLw+KKokPJ78nsgv3+X4T0u
xaAo5yjiz/Uyu1Ofq0jFbeQ0t/65enedohw8pZImH9OMbl2brfKJZuUT2XVc
tO5f9Kp3bMjlpO6uH//Mfa/jAuq3WNgl5bMsJ17B5Xd6IauAS3xY0mfC2y6Z
9YAa0LziEl+4i6nFf/Ogywdo23G9MK3a0uNDACRCZsjd3d2BkxDdrsIKEWmd
TlZUMl+vhPZtK7+qid3mWHuB+nj38jUSQ1LWXCVIx2tUNuDT5nJNn/i6f010
BNlMVFK5AUB4YRZ+5ZUssuUwuvVAVDoR28wOtaYwZvpQmqQTPWlwRd5CKpQF
Z9q6hu/I1QHNLMlmdJmD9e4S7h0SmzPU4xZUZfDioWSE3MWqKc2b0oka9Epe
7tRdDFKp51GEhxwDt7f5PHzp+lpKGXmz4InIAzldQrVPVjmmIU7wHDmeK5y6
krk5VdGr3d1mfCUJnQv6FcgKhf0LOfTwHXvcn+v5FIWapsuL2Ep9BQFE9eT4
vspSjlHYEzFe9SD119MJGT7Wpg4aOoPoXZwA27MmjcPz7SOGSpa7eGwNJRkg
7CovQBldm23duHjARkba8UUzX3ZJx0//JvZDXAOD/9C4b3RZFHi1hpzmKYJL
LPVpU7S10oFRg/bTLqtVytWwqhhPY/zdu7toar31aJVQQT3CIGiKij++pQ4x
mtmCeFizJ72OJ01B01WId1nUrHyxbCBGtuSv+xWeOaj54LLVCbXmPB9fujOP
hM+8+DUASA92fv7OiznCM8AU86EETFcXZ4LXcVImFYEtKhqqUjbHNODbXqFz
KmgoN9Q20lE3lkLFQ9ru7Hdo/nq8yR+RD0evC72jia40UpNYTYg2bch+CZJy
scg8LAhlbta1qwi0jFOZQopFTZWI9FpTtold7llYAx2Z2UoKtus191QOKkxD
DWWTSydt3npatXU6727R8BhR35xSlSkk3s4l50q6fFGJPTTLvTHdaHqp2C5l
LDlxfP9cYH1rt7QpXp58d9LcEc7BUia8wbY+ffr387NXL25vt5xWC9akHlJn
4zCxuPeWE9nla8zO5TJgwFjnqUbI8WAAjk9FDq23ucB0lkY6KeX3KttjMtzy
et2C76nbNVi5/4Z9DugLcrBVFPT5CZg17JqfzAWaLUg5P3lM/qfop37zv/aT
rjfwJR5X87ILf7oj8/AnPnfmyuDdIpVY7JqgN/hnY2/yDnoLUtpb3X06No9g
E/QXkz6gCJCX1lnybEvo0kfhLR/Z2wh7BH2RoJnUoJKjCp4DQo+jY+N9EcGm
G9f+S6+LKHqn9wm4nEpsk+/GUfRmqbXyg3db4tveMtsCtDq7kRHWpRw7xXCD
MW9ePhdhojfbTAs8HdlHnxbIJdS5mGHvYJ0MObgQqsI4qFw1uY35vjtY6KdT
acaWtJxkpoSox/A5TIEOCsu1Ou2Pad5vV1Q7E/mMz0S5c9vbicOx8G7rm3B7
A7+xJcasFVO2TRirzsAOfAGaQfMKkDaoyByrNTDlj3INsxQLwEnP2j3oGWXv
RAiq+GE2M6YxD8z2d0W7B/GjyoipvYUnW1vP64b+YLnewvjw8b8bADLNkJtQ
RQW+SAlNVCnSxHcmeWIcJ0o2459+j/V6qGovujHNNsZ1fpcm9QzN1h1eXPIB
riq0oOG70zevX7/5DkmcK0WyHMxdA2DfCawjaci7p3z9DjkZMR+kxBbodwTo
cWkq3gqlxyy5jzs2KbKEzZvU/+SyvU0vw142b1QMhlUJRy64fhVqe3RpXlFr
vRbMAcAUCrmFDAmtLgo9rL5FPSDjGm7tPGDj37fvo4dve7yG2/NRX9q5XLrR
f+m0Lv15YU3JexnMvziLBZW3LNUG/t+0ab+2m7brtMEm/Yd7kDMN3vnw8KgC
Er2G4Ls6d0pRz3cub51qFVwY7N3Z+UXrsjsQtO/OdtBZK9vRU6+4TpQqWZOi
TPpu297eHqOipXAQ/7E/4V/aDD8B4E3dy2xQOqBdH1W2b54PH6Q6bWCLrpvR
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

-->

</rfc>
