<?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-ietf-rats-coserv-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="CoSERV">Concise Selector for Endorsements and Reference Values</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-rats-coserv-02"/>
    <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>
    <author initials="G." surname="Mandyam" fullname="Giridhar Mandyam">
      <organization>AMD</organization>
      <address>
        <email>gmandyam@amd.com</email>
      </address>
    </author>
    <author initials="D." surname="Ma" fullname="Ding Ma">
      <organization>Alibaba Cloud</organization>
      <address>
        <email>xynnn@linux.alibaba.com</email>
      </address>
    </author>
    <date year="2025" month="October" 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 84?>

<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://ietf-rats-wg.github.io/draft-ietf-rats-coserv/draft-ietf-rats-coserv.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-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/ietf-rats-wg/draft-ietf-rats-coserv"/>.</t>
    </note>
  </front>
  <middle>
    <?line 90?>

<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.</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>
      <t>In addition to the CBOR-based data formats for CoSERV queries and responses, this specification also defines API bindings and behaviours for the exchange of CoSERV queries and responses.
This is to facilitate standard interactions between CoSERV producers and consumers.
Standard API endpoints and behaviours will encourage the growth of interoperable software tools and modules, not only for parsing and emitting CoSERV-compliant data, but also for implementing the clients and services that need to exchange such data when acting in the capacity of the relevant RATS roles.
This will be of greater benefit to the software ecosystem than the CoSERV data format alone.
See <xref target="secapibindings"/> for the API binding specifications.</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-coserv"/>.</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="secencoding">
        <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 = #6.18([
  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[
]]></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="secapibindings">
      <name>API Bindings</name>
      <t>This section sets out the ways in which CoSERV queries and responses can be exchanged between software components and services using APIs.
The CoSERV data format itself is agnostic of any particular API model or transport.
The API bindings provided here are intended to complement the data format.
They will allow implementations to build the complete functionality of a CoSERV producer or consumer, in a way that is well-suited to any transport or interaction model that is needed.</t>
      <t>It is intended that these API definitions carry minimal additional semantics, since these are largely the preserve of the CoSERV query language itself.
The API definitions are merely vehicles for the exchange of CoSERV queries and responses.
Their purpose is to facilitate standard interactions that make the most effective use of available transports and protocols.</t>
      <t>The only API binding that is specified in this document is a request-response protocol that uses HTTP for transport.
This is a simple pattern, and likely to be a commonly occurring one for a variety of use cases.
Future specifications may define other API bindings.
Such future bindings may introduce further HTTP-based protocols.
Alternatively, they may define protocols for use with other transports, such as CoAP <xref target="RFC7252"/>.</t>
      <section anchor="secrrapi">
        <name>Request Response over HTTP</name>
        <t>This section defines and mandates the API endpoint behaviours for CoSERV request-response transactions over HTTP.
Implementations <bcp14>MUST</bcp14> provide all parts of the API as specified in this section.
The API is a simple protocol for the execution of CoSERV queries.
It takes a single CoSERV query as input, and produces a corresponding single CoSERV result set as the output.
It is a RESTful API because the CoSERV query serves as a unique and stable identifier of the target resource, where that resource is the set of artifacts being selected for by the query.
The encoding rules for CoSERV are deterministic as set out in <xref target="secencoding"/>.
This means that any given CoSERV query will always encode to the same sequence of bytes.
The Base64Url encoding (<xref section="2" sectionFormat="of" target="RFC7515"/>) of the byte sequence becomes the rightmost path segment of the URI used to identify the target resource.
The HTTP <tt>GET</tt> verb is then used with this URI to execute the query.
Further details are provided in the subsections below.</t>
        <t>Authentication is out of scope for this document.
Implementations <bcp14>MAY</bcp14> authenticate clients, for example for authorization or for preventing denial of service attacks.</t>
        <section anchor="secrrapidisco">
          <name>Discovery</name>
          <t>Clients discover CoSERV HTTP API endpoints by means of a well-known URI that is formed using the <tt>/.well-known/</tt> path prefix as defined in <xref target="RFC8615"/>.
This URI supplies a single discovery document that clients can use to locate the URIs of other API endpoints, in addition to finding out other relevant information about the configuration and capabilities of the service.</t>
          <t>Implementations that provide CoSERV HTTP API endpoints <bcp14>MUST</bcp14> also provide the discovery endpoint at the path <tt>/.well-known/coserv-configuration</tt>.
This endpoint <bcp14>MUST</bcp14> be available via an HTTP GET method with no additional query parameters, and <bcp14>MUST</bcp14> return an HTTP 200 (OK) response code unless prevented by an error condition outside the scope of this specification.</t>
          <t>The response body can be formatted using either JSON or CBOR, governed by standard HTTP content-type negotiation.
The media types defined for this purpose are <tt>application/coserv-discovery+json</tt> (for JSON-formatted documents) or <tt>application/coserv-discovery+cbor</tt> (for CBOR-formatted documents).
In either case, the endpoint implementation <bcp14>MUST</bcp14> provide a document that conforms to the CDDL schema as follows:</t>
          <sourcecode type="cddl"><![CDATA[
;# import rfc9711 as eat
;# import cmw-autogen as cmw
;# import rfc9052 as cose
;# import jwk-autogen as jwk

coserv-well-known-info = {
  version-label => version,
  capabilities-label => [ + capability ],
  api-endpoints-label => { + tstr => tstr },
  ? result-verification-key-label => eat.JC<jwk.JWK_Set, cose.COSE_KeySet>
}

version-label = eat.JC<"version", 1>
capabilities-label = eat.JC<"capabilities", 2>
api-endpoints-label = eat.JC<"api-endpoints", 3>
result-verification-key-label = eat.JC<"result-verification-key", 4>

version = tstr

capability = {
  media-type-label => cmw.media-type,
  artifact-support-label => artifact-support
}

media-type-label = eat.JC<"media-type", 1>
artifact-support-label = eat.JC<"artifact-support", 2>

non-empty-array<M> = (M) .and ([ + any ])
artifact-support = non-empty-array<[ ? "source", ? "collected" ]>
]]></sourcecode>
          <section anchor="discovery-document-contents">
            <name>Discovery Document Contents</name>
            <t>This section defines how to populate and interpret the data fields in the discovery document.</t>
            <t>The collated CDDL is in <xref target="collated-cddl-discovery"/>.</t>
            <section anchor="version">
              <name>Version</name>
              <t>The version field is denoted by the label <tt>"version"</tt> in JSON documents and by the codepoint <tt>1</tt> in CBOR documents.
It is a Semantic Versioning (semver) string, which denotes the version and patch level of the service that is providing the API endpoints described by the document.
The semver string <bcp14>MUST</bcp14> conform to the ABNF defined in <xref target="SEMVER"/>.
Version numbers and patch levels are otherwise implementation-defined.</t>
            </section>
            <section anchor="capabilities">
              <name>Capabilities</name>
              <t>The capabilities field is denoted by the label <tt>"capabilities"</tt> in JSON documents and by the codepoint <tt>2</tt> in CBOR documents.
This field allows clients to discover the profiled variants of CoSERV for which the service implementation can satisfy queries and provide artifacts.
This field is structured as an array, which allows for service implementations that support more than one profile.
Each supported profile is indicated according to its parameterized media type, along with the categories of artifact that can be provided for the profile.
The artifact categories are <tt>source</tt> and <tt>collected</tt>, as described in <xref target="secartifacts"/>.
Each profile is paired with a non-empty set of artifact categories, allowing the service implementation to indicate whether it supports the retrieval of source artifacts, collected artifacts, or both.
This pairing caters for situations where the service implementation might support different combinations of artifact category for different profiles.</t>
            </section>
            <section anchor="api-endpoints">
              <name>API Endpoints</name>
              <t>The API endpoints field is denoted by the label <tt>"api-endpoints"</tt> in JSON documents and by the codepoint <tt>3</tt> in CBOR documents.
This field allows clients to derive the correct URL for making HTTP API calls.
The field is a map whose keys are the symbolic names of the APIs, and whose values are the URL path for the API endpoint.</t>
              <t>The symbolic name <tt>CoSERVRequestResponse</tt> is defined for services that offer the transactional API described in <xref target="secrrapiquery"/>.
Service implementations that offer this API <bcp14>MUST</bcp14> include a key with this name in the endpoints map field, and the corresponding endpoint URL path <bcp14>MUST</bcp14> end with <tt>/{query}</tt>.
This allows the consumer to form a valid CoSERV query URI using variable expansion as per <xref target="RFC6570"/>, replacing the <tt>{query}</tt> variable with the Base64Url-encoded CoSERV query object.
There <bcp14>MUST NOT</bcp14> be any other variables that require substitution.</t>
            </section>
            <section anchor="result-verification-key">
              <name>Result Verification Key</name>
              <t>The result verification key is denoted by the label <tt>"result-verification-key"</tt> in JSON documents and by the codepoint <tt>4</tt> in CBOR documents.
This field provides one or more public keys that can be used for the cryptographic verification of CoSERV query results that are returned by the service implementation.
In JSON-formatted discovery documents, each key is a JSON Web Key (JWK) as defined in <xref target="RFC7517"/>.
In CBOR-formatted discovery documents, each key is a COSE Key as defined in <xref target="STD96"/>.</t>
              <t>This field is optional.
As described in <xref target="signed-coserv"/>, there are situations where it is permissible for CoSERV result sets to be unsigned, namely when they are transacted over an end-to-end secure channel without any untrusted intermediaries.
CoSERV service implementations <bcp14>MAY</bcp14> publish discovery documents without result-verification keys in cases where they exclusively produce unsigned CoSERV result sets.
Unsigned CoSERV result sets are characterized by use of the <tt>application/coserv+cbor</tt> media type (as opposed to the <tt>application/coserv+cose</tt> media type).
The supported media types, along with their profile parameters, are published in the <tt>capabilities</tt> field of the discovery document.
If all supported media types are variants of <tt>application/coserv+cbor</tt>, indicating unsigned results only, then there is no need for the verification key set to be included in the discovery document.
If one or more of the supported media types are variants of <tt>application/coserv+cose</tt>, indicating signed results, then the verification key set <bcp14>MUST</bcp14> be included.</t>
            </section>
          </section>
          <section anchor="discovery-document-cbor-encoding">
            <name>Discovery Document CBOR Encoding</name>
            <t>When the discovery document is encoded as CBOR, it is exempt from the encoding rules specified in <xref target="secencoding"/>.
These encoding rules are designed to ensure that CoSERV queries can be used as canonical and stable identifiers.
The discovery document is an independent structure, and not part of the CoSERV data model itself.
Therefore, these encoding rules do not apply.</t>
          </section>
          <section anchor="discovery-document-examples">
            <name>Discovery Document Examples</name>
            <t>In the following examples, the contents of bodies are informative examples only.</t>
            <t>Example HTTP request for retrieving the discovery document in JSON format:</t>
            <sourcecode type="http-message"><![CDATA[
GET /.well-known/coserv-configuration HTTP/1.1
Host: endorsements-distributor.example
Accept: application/coserv-discovery+json
]]></sourcecode>
            <t>Corresponding HTTP response:</t>
            <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/coserv-discovery+json

Body (JSON)

=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "version": "1.2.3-beta",
  "capabilities": [
    {
      "media-type": "application/coserv+cose; profile=\"tag:vendor.\
                                       com,2025:cc_platform#1.0.0\"",
      "artifact-support": [
        "source",
        "collected"
      ]
    }
  ],
  "api-endpoints": {
    "CoSERVRequestResponse": "/endorsement-distribution/v1/coserv/{\
                                                              query}"
  },
  "result-verification-key": [
    {
      "alg": "ES256",
      "crv": "P-256",
      "kty": "EC",
      "x": "usWxHK2PmfnHKwXPS54m0kTcGJ90UiglWiGahtagnv8",
      "y": "IBOL-C3BttVivg-lSreASjpkttcsz-1rb7btKLv8EX4",
      "kid": "key1"
    }
  ]
}
]]></sourcecode>
            <t>Example HTTP request for retrieving the discovery document in CBOR format:</t>
            <sourcecode type="http-message"><![CDATA[
GET /.well-known/coserv-configuration HTTP/1.1
Host: endorsements-distributor.example
Accept: application/coserv-discovery+cbor
]]></sourcecode>
            <t>Corresponding HTTP response:</t>
            <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/coserv-discovery+cbor

Body (in CBOR Extended Diagnostic Notation (EDN))

=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  / version / 1: "1.2.3-beta",
  / capabilities / 2: [
    {
      / media-type / 1: "application/coserv+cose; profile=\"tag:\
                                vendor.com,2025:cc_platform#1.0.0\"",
      / artifact-support / 2: [
        "source",
        "collected"
      ]
    }
  ],
  / api-endpoints / 3: {
    "CoSERVRequestResponse": "/endorsement-distribution/v1/coserv/{\
                                                              query}"
  },
  / result-verification-key / 4: [
    {
      / kty / 1: 2,
      / alg / 3: -7,
      / crv / -1: 1,
      / x / -2: h'1A2B3C4D',
      / y / -3: h'5E6F7A8B',
      / kid / 2: h'ABCDEF1234'
    }
  ]
}
]]></sourcecode>
          </section>
        </section>
        <section anchor="secrrapiquery">
          <name>Execute Query</name>
          <t>This endpoint executes a single CoSERV query and returns a CoSERV result set.</t>
          <t>The HTTP method is <tt>GET</tt>.</t>
          <t>The URL path is formed of the discovered <tt>coserv</tt> endpoint (as set out in <xref target="secrrapidisco"/>), where the <tt>{query}</tt> template variable is substituted with the CoSERV query to be executed, which is represented as a Base64Url encoding of the query's serialized CBOR byte sequence.</t>
          <t>There are no additional URL query parameters.</t>
          <t>Clients <bcp14>MUST</bcp14> set the HTTP <tt>Accept</tt> header to a suitably-profiled <tt>application/coserv+cose</tt> or <tt>application/coserv+cbor</tt> media type.</t>
          <t>Endpoint implementations <bcp14>MUST</bcp14> respond with an HTTP status code and response body according to one of the subheadings below.</t>
          <section anchor="responses">
            <name>Responses</name>
            <section anchor="successful-transaction-200">
              <name>Successful Transaction (200)</name>
              <t>This response indicates that the CoSERV query was executed successfully.</t>
              <t>Example HTTP request:</t>
              <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

GET /coserv/ogB4I3R... HTTP/1.1
Host: endorsements-distributor.example
Accept: application/coserv+cose; \
        profile="tag:vendor.com,2025:cc_platform#1.0.0"
]]></sourcecode>
              <t>Example HTTP response:</t>
              <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 200 OK
Content-Type: application/coserv+cose; \
              profile="tag:vendor.com,2025:cc_platform#1.0.0"

Body (in CBOR Extended Diagnostic Notation (EDN))

/ signed-coserv / 18([
  / protected / << {
    / alg / 1: -7 / ECDSA 256 /,
    / cty / 2 : "application/coserv+cbor"
  } >>,
  / unprotected / {},
  / payload / <<
{
  / 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: 0 / collected-material /
  },
  / results / 2: {
    / rvq / 0: [
      {
        / authorities / 1: [ 560(h'abcdef') ],
        / reference-triple / 2: [
          / environment-map / {
            / class / 0: {
              / class-id /  0: 560(h'00112233'),
              / vendor /    1: "Example Vendor",
              / model /     2: "Example Model"
            }
          },
          [
            / measurement-map / {
              / mval / 1: {
                / name / 11: "Component A",
                / digests / 2: [
                  [ 1, h'aa' ],
                  [ 2, h'bb' ]
                ]
              }
            },
            / measurement-map / {
              / mval / 1: {
                / name / 11: "Component B",
                / digests / 2: [
                  [ 1, h'cc' ],
                  [ 2, h'dd' ]
                ]
              }
            }
          ]
        ]
      }
    ],
    / expiry / 10: 0("2030-12-13T18:30:02Z")
  }
}
  >>,
  / signature / h'face5190'
])
]]></sourcecode>
            </section>
            <section anchor="failure-to-validate-query-400">
              <name>Failure to Validate Query (400)</name>
              <t>This response indicates that the supplied query is badly formed.</t>
              <t>Example HTTP request:</t>
              <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

GET /coserv/badquery... HTTP/1.1
Host: endorsements-distributor.example
Accept: application/coserv+cose; \
        profile="tag:vendor.com,2025:cc_platform#1.0.0"
]]></sourcecode>
              <t>Example HTTP response:</t>
              <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 400 Bad Request
Content-Type: application/concise-problem-details+cbor

Body (in CBOR Extended Diagnostic Notation (EDN))

{
  / title /  -1: "Query validation failed",
  / detail / -2: "The query payload is not in CBOR format"
}
]]></sourcecode>
            </section>
            <section anchor="failure-to-negotiate-profile-406">
              <name>Failure to Negotiate Profile (406)</name>
              <t>This response indicates that the client has specified a CoSERV profile that is not understood or serviceable by the receiving endpoint implementation.</t>
              <t>Example HTTP request:</t>
              <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

GET /coserv/ogB4I3R... HTTP/1.1
Host: endorsements-distributor.example
Accept: application/coserv+cose; \
        profile="tag:vendor.com,2025:cc_platform#2.0.0"
]]></sourcecode>
              <t>Example HTTP response:</t>
              <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 406 Not Acceptable
Content-Type: application/concise-problem-details+cbor

Body (in CBOR Extended Diagnostic Notation (EDN))

{
  / title /  -1: "Unsupported profile",
  / detail / -2: "Profile tag:vendor.com,2025:cc_platform#2.0.0 \
                  not supported",
}
]]></sourcecode>
            </section>
          </section>
        </section>
        <section anchor="secrrapicaching">
          <name>Caching</name>
          <t>In practical usage, the artifacts transacted via CoSERV queries (such as trust anchors and reference values) may change significantly less often than they are used.
For example, a Verifier needs to use the artifacts whenever it needs to verify or appraise Evidence from an Attester.
This might be a very frequent operation, for which a low latency is desirable.
By contrast, the artifacts themselves would vary only as a consequence of impactful changes to the Attester's desired state or environment.
One example of such an impactful change might be the roll-out of a firmware update, which would result in a new reference value for the impacted firmware component(s).
Such changes would tend to be relatively infrequent.
The caching of CoSERV artifacts is therefore beneficial for overall system performance.</t>
          <t>CoSERV is designed to facilitate both client-side and server-side caching by use of the standard HTTP caching mechanisms specified in <xref target="STD98"/>.
This includes use of the HTTP <tt>Cache-Control</tt> header and its associated directives.
It also includes the use of entity-tags (ETags).
The following features of CoSERV and its HTTP binding are specifically designed to favor caching implementations:</t>
          <ul spacing="normal">
            <li>
              <t>CoSERV queries form stable URL paths.
As specified in <xref target="secencoding"/>, any given CoSERV query will always serialize to the same fixed sequence of bytes.
This allows queries to be used as canonical and stable resource identifiers, which in turn allows them to function effectively as cache keys.</t>
            </li>
            <li>
              <t>The result set is cryptographically bound to the query.
As specified in <xref target="signed-coserv"/>, the origin server is required to return a signed response that combines the result set with the client's original query, in any deployment where untrusted intermediaries might exist.
This means that the client can always verify the integrity of the result on an end-to-end basis, even in the presence of caching infrastructure.</t>
            </li>
            <li>
              <t>The use of safe HTTP methods.
CoSERV queries are executed as read-only operations using HTTP <tt>GET</tt>.
The execution of a query does not modify any state on the server, which creates more opportunities for the re-use of cached results.</t>
            </li>
          </ul>
          <section anchor="http-caching-and-result-set-expiry">
            <name>HTTP Caching and Result Set Expiry</name>
            <t>CoSERV's data model includes a mandatory expiration timestamp on every result set.
This is an authoritative marker of the point in time at which the entire result set becomes invalid, and the query must be re-executed to obtain fresh results.
This timestamp is established by the origin server.</t>
            <t>In the presence of HTTP caching infrastructure, the origin server <bcp14>MUST NOT</bcp14> set HTTP cache directives (e.g. <tt>Cache-Control: max-age</tt>, <tt>Expires</tt>) such that the freshness lifetime of the HTTP response exceeds the result set expiry timestamp contained within the CoSERV result set payload.</t>
          </section>
          <section anchor="example-http-messages-with-caching">
            <name>Example HTTP Messages with Caching</name>
            <t>This section illustrates a caching scenario.</t>
            <t>In this example, the CoSERV HTTP API server endpoint is hosted by an HTTP origin (coserv.example), while a reverse proxy (cache.example) operates a public cache in front of the origin.</t>
            <t>Client A sends a request using a specific CoSERV query.
As the reverse proxy has a "cache miss" for the resource, it forwards the request to the origin.
The origin then constructs the response and returns it to the proxy.
The response includes cache-control headers that are compatible with the time-to-live associated with the computed result set.
For the purposes of this example, the HTTP response <tt>max-age</tt> has been set to 10 minutes and the <tt>s-maxage</tt> to 1 hour.
This means that the origin allows intermediaries (e.g., its CDN) to cache this resource for longer than the client.
The result is different caching behaviours between clients and intermediaries, which reduces the load on the origin by enabling CDNs to cache content for longer, while ensuring that clients receive fresher content.
Before forwarding it to the client, the proxy stores the response in its cache using the request URI as the cache key alongside the entry's time-to-live value.</t>
            <aside>
              <t>This "differential caching" strategy could be useful if the origin and its CDN have control plane APIs that the origin owner can use to instruct the CDN operator to purge certain cached entries <xref target="RFC8007"/>. For instance, in CoSERV, this feature could be used in case of an unexpected revocation.</t>
            </aside>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="576" width="576" viewBox="0 0 576 576" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 40,64 L 40,560" fill="none" stroke="black"/>
                  <path d="M 200,64 L 200,96" fill="none" stroke="black"/>
                  <path d="M 224,112 L 224,560" fill="none" stroke="black"/>
                  <path d="M 248,64 L 248,96" fill="none" stroke="black"/>
                  <path d="M 408,80 L 408,560" fill="none" stroke="black"/>
                  <path d="M 216,48 L 232,48" fill="none" stroke="black"/>
                  <path d="M 216,80 L 232,80" fill="none" stroke="black"/>
                  <path d="M 216,112 L 232,112" fill="none" stroke="black"/>
                  <path d="M 40,144 L 216,144" fill="none" stroke="black"/>
                  <path d="M 224,160 L 248,160" fill="none" stroke="black"/>
                  <path d="M 232,192 L 248,192" fill="none" stroke="black"/>
                  <path d="M 224,256 L 400,256" fill="none" stroke="black"/>
                  <path d="M 408,272 L 432,272" fill="none" stroke="black"/>
                  <path d="M 416,304 L 432,304" fill="none" stroke="black"/>
                  <path d="M 232,384 L 408,384" fill="none" stroke="black"/>
                  <path d="M 224,432 L 248,432" fill="none" stroke="black"/>
                  <path d="M 232,464 L 248,464" fill="none" stroke="black"/>
                  <path d="M 48,544 L 224,544" fill="none" stroke="black"/>
                  <path d="M 216,48 C 207.16936,48 200,55.16936 200,64" fill="none" stroke="black"/>
                  <path d="M 232,48 C 240.83064,48 248,55.16936 248,64" fill="none" stroke="black"/>
                  <path d="M 408,48 C 399.16936,48 392,55.16936 392,64" fill="none" stroke="black"/>
                  <path d="M 408,48 C 416.83064,48 424,55.16936 424,64" fill="none" stroke="black"/>
                  <path d="M 216,80 C 207.16936,80 200,72.83064 200,64" fill="none" stroke="black"/>
                  <path d="M 232,80 C 240.83064,80 248,72.83064 248,64" fill="none" stroke="black"/>
                  <path d="M 408,80 C 399.16936,80 392,72.83064 392,64" fill="none" stroke="black"/>
                  <path d="M 408,80 C 416.83064,80 424,72.83064 424,64" fill="none" stroke="black"/>
                  <path d="M 216,112 C 207.16936,112 200,104.83064 200,96" fill="none" stroke="black"/>
                  <path d="M 232,112 C 240.83064,112 248,104.83064 248,96" fill="none" stroke="black"/>
                  <path d="M 248,160 C 256.83064,160 264,167.16936 264,176" fill="none" stroke="black"/>
                  <path d="M 248,192 C 256.83064,192 264,184.83064 264,176" fill="none" stroke="black"/>
                  <path d="M 432,272 C 440.83064,272 448,279.16936 448,288" fill="none" stroke="black"/>
                  <path d="M 432,304 C 440.83064,304 448,296.83064 448,288" fill="none" stroke="black"/>
                  <path d="M 248,432 C 256.83064,432 264,439.16936 264,448" fill="none" stroke="black"/>
                  <path d="M 248,464 C 256.83064,464 264,456.83064 264,448" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="424,304 412,298.4 412,309.6" fill="black" transform="rotate(180,416,304)"/>
                  <polygon class="arrowhead" points="408,256 396,250.4 396,261.6" fill="black" transform="rotate(0,400,256)"/>
                  <polygon class="arrowhead" points="240,464 228,458.4 228,469.6" fill="black" transform="rotate(180,232,464)"/>
                  <polygon class="arrowhead" points="240,384 228,378.4 228,389.6" fill="black" transform="rotate(180,232,384)"/>
                  <polygon class="arrowhead" points="240,192 228,186.4 228,197.6" fill="black" transform="rotate(180,232,192)"/>
                  <polygon class="arrowhead" points="224,144 212,138.4 212,149.6" fill="black" transform="rotate(0,216,144)"/>
                  <polygon class="arrowhead" points="56,544 44,538.4 44,549.6" fill="black" transform="rotate(180,48,544)"/>
                  <circle cx="40" cy="64" r="6" class="opendot" fill="white" stroke="black"/>
                  <g class="text">
                    <text x="28" y="36">client</text>
                    <text x="64" y="36">A</text>
                    <text x="224" y="36">cache.example</text>
                    <text x="412" y="36">coserv.example</text>
                    <text x="80" y="132">GET</text>
                    <text x="144" y="132">ogB4I3RhZ..</text>
                    <text x="312" y="148">lookup(obB4I3RhZ..)</text>
                    <text x="252" y="212">MISS</text>
                    <text x="264" y="244">GET</text>
                    <text x="328" y="244">ogB4I3RhZ..</text>
                    <text x="488" y="276">compute</text>
                    <text x="484" y="292">result</text>
                    <text x="472" y="308">set</text>
                    <text x="256" y="324">200</text>
                    <text x="284" y="324">OK</text>
                    <text x="448" y="324">(expiry</text>
                    <text x="488" y="324">=</text>
                    <text x="512" y="324">now</text>
                    <text x="536" y="324">+</text>
                    <text x="560" y="324">1h)</text>
                    <text x="260" y="340">C-C:</text>
                    <text x="332" y="340">max-age=600,</text>
                    <text x="336" y="356">s-maxage=3600</text>
                    <text x="292" y="372">#6.18([...])</text>
                    <text x="316" y="420">store(K=obB4I3RhZ..,</text>
                    <text x="340" y="436">V=#6.18([...],</text>
                    <text x="320" y="452">TTL=3600)</text>
                    <text x="72" y="484">200</text>
                    <text x="100" y="484">OK</text>
                    <text x="76" y="500">C-C:</text>
                    <text x="148" y="500">max-age=600,</text>
                    <text x="152" y="516">s-maxage=3600</text>
                    <text x="108" y="532">#6.18([...])</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
client A             cache.example          coserv.example
                         .---.                   .-.
    o                   |     |                 |   |
    |                   |'---'|                  '+'
    |                   |     |                   |
    |                    '-+-'                    |
    |   GET ogB4I3RhZ..    |                      |
    +--------------------->| lookup(obB4I3RhZ..)  |
    |                      +---.                  |
    |                      |    |                 |
    |                      |<--'                  |
    |                      | MISS                 |
    |                      |                      |
    |                      |   GET ogB4I3RhZ..    |
    |                      +--------------------->|
    |                      |                      +---.  compute
    |                      |                      |    | result
    |                      |                      |<--'  set
    |                      |  200 OK              | (expiry = now + 1h)
    |                      |  C-C: max-age=600,   |
    |                      |       s-maxage=3600  |
    |                      |  #6.18([...])        |
    |                      |<---------------------+
    |                      |                      |
    |                      | store(K=obB4I3RhZ.., |
    |                      +---.   V=#6.18([...], |
    |                      |    |  TTL=3600)      |
    |                      |<--'                  |
    |  200 OK              |                      |
    |  C-C: max-age=600,   |                      |
    |       s-maxage=3600  |                      |
    |  #6.18([...])        |                      |
    |<---------------------+                      |
    |                      |                      |
]]></artwork>
            </artset>
            <t>At a later point, after 2 minutes, a different client B makes the same request.
This time, the request generates a "cache hit" event on the proxy.
The response is therefore served from the public cache, bypassing the origin.
This reduces the load on the origin, where computing the result set is generally costly, as well as reducing the overall latency of the transaction.
Client B operates a local cache, where it stores a copy of the response.</t>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="472" viewBox="0 0 472 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 24,80 L 24,96" fill="none" stroke="black"/>
                  <path d="M 40,112 L 40,400" fill="none" stroke="black"/>
                  <path d="M 56,80 L 56,96" fill="none" stroke="black"/>
                  <path d="M 200,64 L 200,96" fill="none" stroke="black"/>
                  <path d="M 224,112 L 224,400" fill="none" stroke="black"/>
                  <path d="M 248,64 L 248,96" fill="none" stroke="black"/>
                  <path d="M 408,80 L 408,400" fill="none" stroke="black"/>
                  <path d="M 216,48 L 232,48" fill="none" stroke="black"/>
                  <path d="M 216,80 L 232,80" fill="none" stroke="black"/>
                  <path d="M 216,112 L 232,112" fill="none" stroke="black"/>
                  <path d="M 40,144 L 216,144" fill="none" stroke="black"/>
                  <path d="M 224,160 L 248,160" fill="none" stroke="black"/>
                  <path d="M 232,192 L 248,192" fill="none" stroke="black"/>
                  <path d="M 48,304 L 224,304" fill="none" stroke="black"/>
                  <path d="M 40,352 L 64,352" fill="none" stroke="black"/>
                  <path d="M 48,384 L 64,384" fill="none" stroke="black"/>
                  <path d="M 216,48 C 207.16936,48 200,55.16936 200,64" fill="none" stroke="black"/>
                  <path d="M 232,48 C 240.83064,48 248,55.16936 248,64" fill="none" stroke="black"/>
                  <path d="M 408,48 C 399.16936,48 392,55.16936 392,64" fill="none" stroke="black"/>
                  <path d="M 408,48 C 416.83064,48 424,55.16936 424,64" fill="none" stroke="black"/>
                  <path d="M 40,64 C 31.16936,64 24,71.16936 24,80" fill="none" stroke="black"/>
                  <path d="M 40,64 C 48.83064,64 56,71.16936 56,80" fill="none" stroke="black"/>
                  <path d="M 216,80 C 207.16936,80 200,72.83064 200,64" fill="none" stroke="black"/>
                  <path d="M 232,80 C 240.83064,80 248,72.83064 248,64" fill="none" stroke="black"/>
                  <path d="M 408,80 C 399.16936,80 392,72.83064 392,64" fill="none" stroke="black"/>
                  <path d="M 408,80 C 416.83064,80 424,72.83064 424,64" fill="none" stroke="black"/>
                  <path d="M 40,96 C 31.16936,96 24,88.83064 24,80" fill="none" stroke="black"/>
                  <path d="M 40,96 C 48.83064,96 56,88.83064 56,80" fill="none" stroke="black"/>
                  <path d="M 40,112 C 31.16936,112 24,104.83064 24,96" fill="none" stroke="black"/>
                  <path d="M 40,112 C 48.83064,112 56,104.83064 56,96" fill="none" stroke="black"/>
                  <path d="M 216,112 C 207.16936,112 200,104.83064 200,96" fill="none" stroke="black"/>
                  <path d="M 232,112 C 240.83064,112 248,104.83064 248,96" fill="none" stroke="black"/>
                  <path d="M 248,160 C 256.83064,160 264,167.16936 264,176" fill="none" stroke="black"/>
                  <path d="M 248,192 C 256.83064,192 264,184.83064 264,176" fill="none" stroke="black"/>
                  <path d="M 64,352 C 72.83064,352 80,359.16936 80,368" fill="none" stroke="black"/>
                  <path d="M 64,384 C 72.83064,384 80,376.83064 80,368" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="240,192 228,186.4 228,197.6" fill="black" transform="rotate(180,232,192)"/>
                  <polygon class="arrowhead" points="224,144 212,138.4 212,149.6" fill="black" transform="rotate(0,216,144)"/>
                  <polygon class="arrowhead" points="56,384 44,378.4 44,389.6" fill="black" transform="rotate(180,48,384)"/>
                  <polygon class="arrowhead" points="56,304 44,298.4 44,309.6" fill="black" transform="rotate(180,48,304)"/>
                  <g class="text">
                    <text x="28" y="36">client</text>
                    <text x="64" y="36">B</text>
                    <text x="224" y="36">cache.example</text>
                    <text x="412" y="36">coserv.example</text>
                    <text x="80" y="132">GET</text>
                    <text x="144" y="132">ogB4I3RhZ..</text>
                    <text x="312" y="148">lookup(obB4I3RhZ..)</text>
                    <text x="248" y="212">HIT</text>
                    <text x="72" y="228">200</text>
                    <text x="100" y="228">OK</text>
                    <text x="76" y="244">C-C:</text>
                    <text x="148" y="244">max-age=480,</text>
                    <text x="152" y="260">s-maxage=3480</text>
                    <text x="80" y="276">Etag:</text>
                    <text x="128" y="276">"xyz"</text>
                    <text x="108" y="292">#6.18([...])</text>
                    <text x="132" y="340">store(K=obB4I3RhZ..,</text>
                    <text x="156" y="356">V=#6.18([...],</text>
                    <text x="132" y="372">TTL=480)</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
client B             cache.example          coserv.example
                         .---.                   .-.
   .-.                  |     |                 |   |
  |   |                 |'---'|                  '+'
  |'-'|                 |     |                   |
   '+'                   '-+-'                    |
    |   GET ogB4I3RhZ..    |                      |
    +--------------------->| lookup(obB4I3RhZ..)  |
    |                      +---.                  |
    |                      |    |                 |
    |                      |<--'                  |
    |                      | HIT                  |
    |  200 OK              |                      |
    |  C-C: max-age=480,   |                      |
    |       s-maxage=3480  |                      |
    |  Etag: "xyz"         |                      |
    |  #6.18([...])        |                      |
    |<---------------------+                      |
    |                      |                      |
    | store(K=obB4I3RhZ.., |                      |
    +---.   V=#6.18([...], |                      |
    |    |  TTL=480)       |                      |
    |<--'                  |                      |
    |                      |                      |
]]></artwork>
            </artset>
            <t>After 9 more minutes, B is instructed to make the same request again.
The request generates a "cache hit" event on the local cache.
However, the cached resource is become stale and needs to be revalidated.
Therefore, B sends a conditional request to the proxy.
The request generates a "cache hit" event on the proxy where the resource is still fresh due to the differential caching behaviour dictated by the original response from the origin.
The proxy returns a 304 (Not modified) status code, which instructs the client to reuse its local copy of the response.</t>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="480" viewBox="0 0 480 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 24,80 L 24,96" fill="none" stroke="black"/>
                  <path d="M 40,112 L 40,400" fill="none" stroke="black"/>
                  <path d="M 56,80 L 56,96" fill="none" stroke="black"/>
                  <path d="M 200,64 L 200,96" fill="none" stroke="black"/>
                  <path d="M 224,112 L 224,400" fill="none" stroke="black"/>
                  <path d="M 248,64 L 248,96" fill="none" stroke="black"/>
                  <path d="M 408,80 L 408,400" fill="none" stroke="black"/>
                  <path d="M 216,48 L 232,48" fill="none" stroke="black"/>
                  <path d="M 216,80 L 232,80" fill="none" stroke="black"/>
                  <path d="M 216,112 L 232,112" fill="none" stroke="black"/>
                  <path d="M 40,144 L 64,144" fill="none" stroke="black"/>
                  <path d="M 48,176 L 64,176" fill="none" stroke="black"/>
                  <path d="M 40,256 L 216,256" fill="none" stroke="black"/>
                  <path d="M 224,272 L 248,272" fill="none" stroke="black"/>
                  <path d="M 232,304 L 248,304" fill="none" stroke="black"/>
                  <path d="M 48,384 L 224,384" fill="none" stroke="black"/>
                  <path d="M 216,48 C 207.16936,48 200,55.16936 200,64" fill="none" stroke="black"/>
                  <path d="M 232,48 C 240.83064,48 248,55.16936 248,64" fill="none" stroke="black"/>
                  <path d="M 408,48 C 399.16936,48 392,55.16936 392,64" fill="none" stroke="black"/>
                  <path d="M 408,48 C 416.83064,48 424,55.16936 424,64" fill="none" stroke="black"/>
                  <path d="M 40,64 C 31.16936,64 24,71.16936 24,80" fill="none" stroke="black"/>
                  <path d="M 40,64 C 48.83064,64 56,71.16936 56,80" fill="none" stroke="black"/>
                  <path d="M 216,80 C 207.16936,80 200,72.83064 200,64" fill="none" stroke="black"/>
                  <path d="M 232,80 C 240.83064,80 248,72.83064 248,64" fill="none" stroke="black"/>
                  <path d="M 408,80 C 399.16936,80 392,72.83064 392,64" fill="none" stroke="black"/>
                  <path d="M 408,80 C 416.83064,80 424,72.83064 424,64" fill="none" stroke="black"/>
                  <path d="M 40,96 C 31.16936,96 24,88.83064 24,80" fill="none" stroke="black"/>
                  <path d="M 40,96 C 48.83064,96 56,88.83064 56,80" fill="none" stroke="black"/>
                  <path d="M 40,112 C 31.16936,112 24,104.83064 24,96" fill="none" stroke="black"/>
                  <path d="M 40,112 C 48.83064,112 56,104.83064 56,96" fill="none" stroke="black"/>
                  <path d="M 216,112 C 207.16936,112 200,104.83064 200,96" fill="none" stroke="black"/>
                  <path d="M 232,112 C 240.83064,112 248,104.83064 248,96" fill="none" stroke="black"/>
                  <path d="M 64,144 C 72.83064,144 80,151.16936 80,160" fill="none" stroke="black"/>
                  <path d="M 64,176 C 72.83064,176 80,168.83064 80,160" fill="none" stroke="black"/>
                  <path d="M 248,272 C 256.83064,272 264,279.16936 264,288" fill="none" stroke="black"/>
                  <path d="M 248,304 C 256.83064,304 264,296.83064 264,288" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="240,304 228,298.4 228,309.6" fill="black" transform="rotate(180,232,304)"/>
                  <polygon class="arrowhead" points="224,256 212,250.4 212,261.6" fill="black" transform="rotate(0,216,256)"/>
                  <polygon class="arrowhead" points="56,384 44,378.4 44,389.6" fill="black" transform="rotate(180,48,384)"/>
                  <polygon class="arrowhead" points="56,176 44,170.4 44,181.6" fill="black" transform="rotate(180,48,176)"/>
                  <g class="text">
                    <text x="28" y="36">client</text>
                    <text x="64" y="36">B</text>
                    <text x="232" y="36">cache.example</text>
                    <text x="420" y="36">coserv.example</text>
                    <text x="128" y="132">lookup(obB4I3RhZ..)</text>
                    <text x="64" y="196">HIT</text>
                    <text x="112" y="196">(stale)</text>
                    <text x="64" y="228">GET</text>
                    <text x="128" y="228">ogB4I3RhZ..</text>
                    <text x="128" y="244">If-None-Match:"xyz"</text>
                    <text x="248" y="324">HIT</text>
                    <text x="72" y="340">304</text>
                    <text x="104" y="340">Not</text>
                    <text x="156" y="340">modified</text>
                    <text x="76" y="356">C-C:</text>
                    <text x="140" y="356">max-age=0,</text>
                    <text x="152" y="372">s-maxage=3060</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
client B              cache.example          coserv.example
                         .---.                   .-.
   .-.                  |     |                 |   |
  |   |                 |'---'|                  '+'
  |'-'|                 |     |                   |
   '+'                   '-+-'                    |
    | lookup(obB4I3RhZ..)  |                      |
    +---.                  |                      |
    |    |                 |                      |
    |<--'                  |                      |
    | HIT (stale)          |                      |
    |                      |                      |
    | GET ogB4I3RhZ..      |                      |
    | If-None-Match:"xyz"  |                      |
    +--------------------->|                      |
    |                      +---.                  |
    |                      |    |                 |
    |                      |<--'                  |
    |                      | HIT                  |
    |  304 Not modified    |                      |
    |  C-C: max-age=0,     |                      |
    |       s-maxage=3060  |                      |
    |<---------------------+                      |
    |                      |                      |
]]></artwork>
            </artset>
          </section>
        </section>
      </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>
            <tr>
              <td align="left">
                <tt>coserv-discovery+cbor</tt></td>
              <td align="left">
                <tt>application/coserv-discovery+cbor</tt></td>
              <td align="left">
                <xref target="secrrapidisco"/> of RFCthis</td>
            </tr>
            <tr>
              <td align="left">
                <tt>coserv-discovery+json</tt></td>
              <td align="left">
                <tt>application/coserv-discovery+json</tt></td>
              <td align="left">
                <xref target="secrrapidisco"/> 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 anchor="applicationcoserv-discoverycbor">
          <name><tt>application/coserv-discovery+cbor</tt></name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>coserv-discovery+cbor</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>n/a</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="applicationcoserv-discoveryjson">
          <name><tt>application/coserv-discovery+json</tt></name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>coserv-discovery+json</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>n/a</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>binary (JSON is UTF-8-encoded text)</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/json". (No fragment identification syntax is currently defined for "application/json".)</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>
      <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 anchor="well-known-uri-for-coserv-configuration">
        <name>Well-Known URI for CoSERV Configuration</name>
        <t>IANA is requested to register the following in the "Well-Known URIs" registry <xref target="IANA.well-known-uris"/>:</t>
        <t>URI suffix: coserv-configuration</t>
        <t>Change controller: IETF</t>
        <t>Specification document: RFCthis</t>
        <t>Related information: N/A</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <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="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </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>Independent</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="17" month="October" year="2025"/>
            <abstract>
              <t>   The Conceptual Messages introduced by the RATS architecture (RFC9334)
   are protocol-agnostic data units that are conveyed between RATS roles
   during remote attestation procedures.  Conceptual Messages describe
   the meaning and function of such data units within RATS data flows
   without specifying a wire format, encoding, transport mechanism, or
   processing details.  The initial set of Conceptual Messages is
   defined in Section 8 of RFC9334 and includes Evidence, Attestation
   Results, Endorsements, Reference Values, and Appraisal Policies.

   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-19"/>
        </reference>
        <reference anchor="SEMVER" target="https://semver.org/spec/v2.0.0.html">
          <front>
            <title>Semantic Versioning 2.0.0</title>
            <author>
              <organization/>
            </author>
            <date year="2013"/>
          </front>
        </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="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="M. Hadley" initials="M." surname="Hadley"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="D. Orchard" initials="D." surname="Orchard"/>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </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>
        <reference anchor="IANA.well-known-uris" target="https://www.iana.org/assignments/well-known-uris">
          <front>
            <title>Well-Known URIs</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="25" month="August" 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-07"/>
        </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>
        <reference anchor="RFC8007">
          <front>
            <title>Content Delivery Network Interconnection (CDNI) Control Interface / Triggers</title>
            <author fullname="R. Murray" initials="R." surname="Murray"/>
            <author fullname="B. Niven-Jenkins" initials="B." surname="Niven-Jenkins"/>
            <date month="December" year="2016"/>
            <abstract>
              <t>This document describes the part of the Content Delivery Network Interconnection (CDNI) Control interface that allows a CDN to trigger activity in an interconnected CDN that is configured to deliver content on its behalf. The upstream CDN can use this mechanism to request that the downstream CDN pre-position metadata or content or to request that it invalidate or purge metadata or content. The upstream CDN can monitor the status of activity that it has triggered in the downstream CDN.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8007"/>
          <seriesInfo name="DOI" value="10.17487/RFC8007"/>
        </reference>
      </references>
    </references>
    <?line 1588?>

<section anchor="collated-cddl">
      <name>Collated CDDL</name>
      <section anchor="collated-cddl-coserv">
        <name>CoSERV Data Model</name>
        <artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

signed-coserv = #6.18([
    protected: bytes .cbor signed-coserv-protected-hdr,
    unprotected: signed-coserv-unprotected-hdr,
    payload: bytes .cbor coserv,
    signature: bytes,
])
signed-coserv-protected-hdr = {
  1 => int,
  2 => "application/coserv+cbor" / 10000,
  * cose.label => cose.values,
}
signed-coserv-unprotected-hdr = {* cose.label => cose.values}
cose.label = int / text
cose.values = any
coserv = {
  &(profile: 0) => profile,
  &(query: 1) => query,
  ? &(results: 2) => results,
}
profile = comid.oid-type / ~uri
query = {
  &(artifact-type: 0) => artifact-type,
  &(environment-selector: 1) => environment-selector-map,
  &(timestamp: 2) => tdate,
  &(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)
results = {
  result-set,
  &(expiry: 10) => tdate,
  ? &(source-artifacts: 11) => [+ cmw.cbor-record],
}
result-set //= (reference-values // endorsed-values // trust-\
                                  anchors // $$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],
  )
cots = "TODO COTS"
environment-selector-map = {selector}
stateful-class = [
  class: comid.class-map,
  ? measurements: [+ comid.measurement-map],
]
selector //= (&(class: 0) => [+ stateful-class] // &(instance: 1) =\
        > [+ stateful-instance] // &(group: 2) => [+ stateful-group])
stateful-instance = [
  instance: comid.$instance-id-type-choice,
  ? measurements: [+ comid.measurement-map],
]
stateful-group = [
  group: comid.$group-id-type-choice,
  ? measurements: [+ comid.measurement-map],
]
cmw.start = cmw.cmw
cmw.cmw = cmw.json-cmw / cmw.cbor-cmw
cmw.json-cmw = cmw.json-record / cmw.json-collection
cmw.cbor-cmw = cmw.cbor-record / cmw.cbor-collection / cmw.$cbor-tag
cmw.json-record = [
  type: cmw.media-type,
  value: cmw.base64url-string,
  ? ind: uint .bits cmw.cm-type,
]
cmw.cbor-record = [
  type: cmw.coap-content-format-type / cmw.media-type,
  value: bytes,
  ? ind: uint .bits cmw.cm-type,
]
cmw.tag-cm-cbor<tn, fmt> = #6.<tn>(bytes .cbor fmt)
cmw.tag-cm-data<tn> = #6.<tn>(bytes)
cmw.json-collection = {
  ? __cmwc_t: ~uri / cmw.oid,
  + &(label: text) => cmw.json-cmw,
}
cmw.cbor-collection = {
  ? __cmwc_t: ~uri / cmw.oid,
  + &(label: int / text) => cmw.cbor-cmw,
}
cmw.media-type = text .abnf ("Content-Type" .cat cmw.Content-Type-\
                                                                ABNF)
cmw.base64url-string = text .regexp "[A-Za-z0-9_-]+"
cmw.coap-content-format-type = uint .size 2
cmw.oid = text .regexp "([0-2])((\\.0)|(\\.[1-9][0-9]*))*"
cmw.cm-type = &(
  reference-values: 0,
  endorsements: 1,
  evidence: 2,
  attestation-results: 3,
)
cmw.Content-Type-ABNF = '

Content-Type   = Media-Type-Name *( *SP ";" *SP parameter )
parameter      = token "=" ( token / quoted-string )

token          = 1*tchar
tchar          = "!" / "#" / "$" / "%" / "&" / "\'" / "*"
               / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
               / DIGIT / ALPHA
quoted-string  = %x22 *( qdtext / quoted-pair ) %x22
qdtext         = SP / %x21 / %x23-5B / %x5D-7E
quoted-pair    = "\\" ( SP / VCHAR )

Media-Type-Name = type-name "/" subtype-name

type-name = restricted-name
subtype-name = restricted-name

restricted-name = restricted-name-first *126restricted-name-chars
restricted-name-first  = ALPHA / DIGIT
restricted-name-chars  = ALPHA / DIGIT / "!" / "#" /
                         "$" / "&" / "-" / "^" / "_"
restricted-name-chars =/ "." ; Characters before first dot always
                             ; specify a facet name
restricted-name-chars =/ "+" ; Characters after last plus always
                             ; specify a structured syntax suffix

DIGIT     =  %x30-39           ; 0 - 9
POS-DIGIT =  %x31-39           ; 1 - 9
ALPHA     =  %x41-5A / %x61-7A ; A - Z / a - z
SP        =  %x20
VCHAR     =  %x21-7E           ; printable ASCII (no SP)
'
cmw.$cbor-tag /= cmw.tag-cm-data<1668576935> / cmw.tag-cm-cbor<\
                                         1668576819, cmw.my-evidence>
cmw.my-evidence = {&(eat_nonce: 10) => bstr .size (8 .. 64)}
comid.concise-mid-tag = {
  ? &(language: 0) => text,
  &(tag-identity: 1) => comid.tag-identity-map,
  ? &(entities: 2) => [+ comid.comid-entity-map],
  ? &(linked-tags: 3) => [+ comid.linked-tag-map],
  &(triples: 4) => comid.triples-map,
  * $$concise-mid-tag-extension,
}
comid.attest-key-triple-record = [
  environment: comid.environment-map,
  key-list: [+ comid.$crypto-key-type-choice],
  ? conditions: comid.non-empty<{
            ? &(mkey: 0) => comid.$measured-element-type-choice,
            ? &(authorized-by: 1) => [+ comid.$crypto-key-type-\
                                                             choice],
}>,
]
comid.$class-id-type-choice /= comid.tagged-oid-type / comid.tagged-\
                                       uuid-type / comid.tagged-bytes
comid.class-map = comid.non-empty<{
    ? &(class-id: 0) => comid.$class-id-type-choice,
    ? &(vendor: 1) => tstr,
    ? &(model: 2) => tstr,
    ? &(layer: 3) => uint,
    ? &(index: 4) => uint,
}>
comid.comid-entity-map = comid.entity-map<comid.$comid-role-type-\
                                choice, $$comid-entity-map-extension>
comid.$comid-role-type-choice /= &(tag-creator: 0) / &(creator: 1) \
                                                   / &(maintainer: 2)
comid.conditional-endorsement-series-triple-record = [
  condition: comid.stateful-environment-record,
  series: [+ comid.conditional-series-record],
]
comid.conditional-series-record = [
  selection: [+ comid.measurement-map],
  addition: [+ comid.measurement-map],
]
comid.COSE_KeySet = [+ comid.COSE_Key]
comid.COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * comid.cose-label => comid.cose-value,
}
comid.cose-label = int / tstr
comid.cose-value = any
comid.coswid-triple-record = [
  comid.environment-map,
  [+ comid.concise-swid-tag-id],
]
comid.concise-swid-tag-id = text / bstr .size 16
comid.$crypto-key-type-choice /= comid.tagged-pkix-base64-key-type \
/ comid.tagged-pkix-base64-cert-type / comid.tagged-pkix-base64-cert\
-path-type / comid.tagged-cose-key-type / comid.tagged-thumbprint-\
type / comid.tagged-cert-thumbprint-type / comid.tagged-cert-path-\
thumbprint-type / comid.tagged-pkix-asn1der-cert-type / comid.tagged\
                                                               -bytes
comid.tagged-pkix-base64-key-type = #6.554(tstr)
comid.tagged-pkix-base64-cert-type = #6.555(tstr)
comid.tagged-pkix-base64-cert-path-type = #6.556(tstr)
comid.tagged-thumbprint-type = #6.557(comid.digest)
comid.tagged-cose-key-type = #6.558(comid.COSE_KeySet / comid.\
                                                            COSE_Key)
comid.tagged-cert-thumbprint-type = #6.559(comid.digest)
comid.tagged-cert-path-thumbprint-type = #6.561(comid.digest)
comid.tagged-pkix-asn1der-cert-type = #6.562(bstr)
comid.domain-dependency-triple-record = [
  comid.$domain-type-choice,
  [+ comid.$domain-type-choice],
]
comid.domain-membership-triple-record = [
  comid.$domain-type-choice,
  [+ comid.environment-map],
]
comid.conditional-endorsement-triple-record = [
  conditions: [+ comid.stateful-environment-record],
  endorsements: [+ comid.endorsed-triple-record],
]
comid.$domain-type-choice /= uint / text / comid.tagged-uuid-type / \
                                                comid.tagged-oid-type
comid.endorsed-triple-record = [
  condition: comid.environment-map,
  endorsement: [+ comid.measurement-map],
]
comid.entity-map<role-type-choice, extension-socket> = {
    &(entity-name: 0) => comid.$entity-name-type-choice,
    ? &(reg-id: 1) => uri,
    &(role: 2) => [+ role-type-choice],
    * extension-socket,
}
comid.$entity-name-type-choice /= text
comid.environment-map = comid.non-empty<{
    ? &(class: 0) => comid.class-map,
    ? &(instance: 1) => comid.$instance-id-type-choice,
    ? &(group: 2) => comid.$group-id-type-choice,
}>
comid.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,
}
comid.$group-id-type-choice /= comid.tagged-uuid-type / comid.tagged\
                                                               -bytes
comid.identity-triple-record = [
  environment: comid.environment-map,
  key-list: [+ comid.$crypto-key-type-choice],
  ? conditions: comid.non-empty<{
            ? &(mkey: 0) => comid.$measured-element-type-choice,
            ? &(authorized-by: 1) => [+ comid.$crypto-key-type-\
                                                             choice],
}>,
]
comid.$instance-id-type-choice /= comid.tagged-ueid-type / comid.\
tagged-uuid-type / comid.$crypto-key-type-choice / comid.tagged-bytes
comid.ip-addr-type-choice = comid.ip4-addr-type / comid.ip6-addr-type
comid.ip4-addr-type = bytes .size 4
comid.ip6-addr-type = bytes .size 16
comid.raw-int-type-choice = int / comid.tagged-int-range
comid.int-range = [
  min: int / comid.negative-inf,
  max: int / comid.positive-inf,
]
comid.tagged-int-range = #6.564(comid.int-range)
comid.positive-inf = null
comid.negative-inf = null
comid.linked-tag-map = {
  &(linked-tag-id: 0) => comid.$tag-id-type-choice,
  &(tag-rel: 1) => comid.$tag-rel-type-choice,
}
comid.mac-addr-type-choice = comid.eui48-addr-type / comid.eui64-\
                                                            addr-type
comid.eui48-addr-type = bytes .size 6
comid.eui64-addr-type = bytes .size 8
comid.$measured-element-type-choice /= comid.tagged-oid-type / comid\
                                      .tagged-uuid-type / uint / tstr
comid.measurement-map = {
  ? &(mkey: 0) => comid.$measured-element-type-choice,
  &(mval: 1) => comid.measurement-values-map,
  ? &(authorized-by: 2) => [+ comid.$crypto-key-type-choice],
}
comid.measurement-values-map = comid.non-empty<{
    ? &(version: 0) => comid.version-map,
    ? &(svn: 1) => comid.svn-type-choice,
    ? &(digests: 2) => comid.digests-type,
    ? &(flags: 3) => comid.flags-map,
    ? (
                  &(raw-value: 4) => comid.$raw-value-type-choice,
                  ? &(raw-value-mask: 5) => comid.raw-value-mask-\
                                                                type,
          ),
    ? &(mac-addr: 6) => comid.mac-addr-type-choice,
    ? &(ip-addr: 7) => comid.ip-addr-type-choice,
    ? &(serial-number: 8) => text,
    ? &(ueid: 9) => comid.ueid-type,
    ? &(uuid: 10) => comid.uuid-type,
    ? &(name: 11) => text,
    ? &(cryptokeys: 13) => [+ comid.$crypto-key-type-choice],
    ? &(integrity-registers: 14) => comid.integrity-registers,
    ? &(raw-int: 15) => comid.raw-int-type-choice,
    * $$measurement-values-map-extension,
}>
comid.non-empty<M> = M .and ({+ any => any})
comid.oid-type = bytes
comid.tagged-oid-type = #6.111(comid.oid-type)
comid.$raw-value-type-choice /= comid.tagged-bytes / comid.tagged-\
                                                     masked-raw-value
comid.raw-value-mask-type = bytes
comid.tagged-masked-raw-value = #6.563([
    value: bytes,
    mask: bytes,
])
comid.reference-triple-record = [
  ref-env: comid.environment-map,
  ref-claims: [+ comid.measurement-map],
]
comid.stateful-environment-record = [
  environment: comid.environment-map,
  claims-list: [+ comid.measurement-map],
]
comid.svn-type = uint
comid.svn = comid.svn-type
comid.min-svn = comid.svn-type
comid.tagged-svn = #6.552(comid.svn)
comid.tagged-min-svn = #6.553(comid.min-svn)
comid.svn-type-choice = comid.svn / comid.tagged-svn / comid.tagged-\
                                                              min-svn
comid.$tag-id-type-choice /= tstr / comid.uuid-type
comid.tag-identity-map = {
  &(tag-id: 0) => comid.$tag-id-type-choice,
  ? &(tag-version: 1) => comid.tag-version-type,
}
comid.$tag-rel-type-choice /= &(supplements: 0) / &(replaces: 1)
comid.tag-version-type = uint .default 0
comid.tagged-bytes = #6.560(bytes)
comid.triples-map = comid.non-empty<{
    ? &(reference-triples: 0) => [+ comid.reference-triple-record],
    ? &(endorsed-triples: 1) => [+ comid.endorsed-triple-record],
    ? &(identity-triples: 2) => [+ comid.identity-triple-record],
    ? &(attest-key-triples: 3) => [+ comid.attest-key-triple-record],
    ? &(dependency-triples: 4) => [+ comid.domain-dependency-triple-\
                                                             record],
    ? &(membership-triples: 5) => [+ comid.domain-membership-triple-\
                                                             record],
    ? &(coswid-triples: 6) => [+ comid.coswid-triple-record],
    ? &(conditional-endorsement-series-triples: 8) => [+ comid.\
                       conditional-endorsement-series-triple-record],
    ? &(conditional-endorsement-triples: 10) => [+ comid.conditional\
                                         -endorsement-triple-record],
    * $$triples-map-extension,
}>
comid.ueid-type = bytes .size (7 .. 33)
comid.tagged-ueid-type = #6.550(comid.ueid-type)
comid.uuid-type = bytes .size 16
comid.tagged-uuid-type = #6.37(comid.uuid-type)
comid.version-map = {
  &(version: 0) => text,
  ? &(version-scheme: 1) => comid.$version-scheme,
}
comid.digest = [
  alg: int / text,
  val: bytes,
]
comid.digests-type = [+ comid.digest]
comid.integrity-register-id-type-choice = uint / text
comid.integrity-registers = {+ comid.integrity-register-id-type-\
                                        choice => comid.digests-type}
comid.concise-swid-tag = {
  comid.tag-id => text / bstr .size 16,
  comid.tag-version => integer,
  ? comid.corpus => bool,
  ? comid.patch => bool,
  ? comid.supplemental => bool,
  comid.software-name => text,
  ? comid.software-version => text,
  ? comid.version-scheme => comid.$version-scheme,
  ? comid.media => text,
  ? comid.software-meta => comid.one-or-more<comid.software-meta-\
                                                              entry>,
  comid.entity => comid.one-or-more<comid.entity-entry>,
  ? comid.link => comid.one-or-more<comid.link-entry>,
  ? comid.payload-or-evidence,
  * $$coswid-extension,
  comid.global-attributes,
}
comid.payload-or-evidence //= (comid.payload => comid.payload-entry \
                           // comid.evidence => comid.evidence-entry)
comid.any-uri = uri
comid.label = text / int
comid.$version-scheme /= comid.multipartnumeric / comid.\
multipartnumeric-suffix / comid.alphanumeric / comid.decimal / comid\
                                                 .semver / int / text
comid.any-attribute = (comid.label => comid.one-or-more<text> / \
                                              comid.one-or-more<int>)
comid.one-or-more<T> = T / [2*T]
comid.global-attributes = (
  ? comid.lang => text,
  * comid.any-attribute,
  )
comid.hash-entry = [
  hash-alg-id: int,
  hash-value: bytes,
]
comid.entity-entry = {
  comid.entity-name => text,
  ? comid.reg-id => comid.any-uri,
  comid.role => comid.one-or-more<comid.$role>,
  ? comid.thumbprint => comid.hash-entry,
  * $$entity-extension,
  comid.global-attributes,
}
comid.$role /= comid.tag-creator / comid.software-creator / comid.\
aggregator / comid.distributor / comid.licensor / comid.maintainer \
                                                         / int / text
comid.link-entry = {
  ? comid.artifact => text,
  comid.href => comid.any-uri,
  ? comid.media => text,
  ? comid.ownership => comid.$ownership,
  comid.rel => comid.$rel,
  ? comid.media-type => text,
  ? comid.use => comid.$use,
  * $$link-extension,
  comid.global-attributes,
}
comid.$ownership /= comid.shared / comid.private / comid.abandon / \
                                                           int / text
comid.$rel /= comid.ancestor / comid.component / comid.feature / \
comid.installationmedia / comid.packageinstaller / comid.parent / \
comid.patches / comid.requires / comid.see-also / comid.supersedes \
                          / comid.supplemental / -256 .. 64436 / text
comid.$use /= comid.optional / comid.required / comid.recommended / \
                                                           int / text
comid.software-meta-entry = {
  ? comid.activation-status => text,
  ? comid.channel-type => text,
  ? comid.colloquial-version => text,
  ? comid.description => text,
  ? comid.edition => text,
  ? comid.entitlement-data-required => bool,
  ? comid.entitlement-key => text,
  ? comid.generator => text / bstr .size 16,
  ? comid.persistent-id => text,
  ? comid.product => text,
  ? comid.product-family => text,
  ? comid.revision => text,
  ? comid.summary => text,
  ? comid.unspsc-code => text,
  ? comid.unspsc-version => text,
  * $$software-meta-extension,
  comid.global-attributes,
}
comid.path-elements-group = (
  ? comid.directory => comid.one-or-more<comid.directory-entry>,
  ? comid.file => comid.one-or-more<comid.file-entry>,
  )
comid.resource-collection = (
  comid.path-elements-group,
  ? comid.process => comid.one-or-more<comid.process-entry>,
  ? comid.resource => comid.one-or-more<comid.resource-entry>,
  * $$resource-collection-extension,
  )
comid.file-entry = {
  comid.filesystem-item,
  ? comid.size => uint,
  ? comid.file-version => text,
  ? comid.hash => comid.hash-entry,
  * $$file-extension,
  comid.global-attributes,
}
comid.directory-entry = {
  comid.filesystem-item,
  ? comid.path-elements => {comid.path-elements-group},
  * $$directory-extension,
  comid.global-attributes,
}
comid.process-entry = {
  comid.process-name => text,
  ? comid.pid => integer,
  * $$process-extension,
  comid.global-attributes,
}
comid.resource-entry = {
  comid.type => text,
  * $$resource-extension,
  comid.global-attributes,
}
comid.filesystem-item = (
  ? comid.key => bool,
  ? comid.location => text,
  comid.fs-name => text,
  ? comid.root => text,
  )
comid.payload-entry = {
  comid.resource-collection,
  * $$payload-extension,
  comid.global-attributes,
}
comid.evidence-entry = {
  comid.resource-collection,
  ? comid.date => comid.integer-time,
  ? comid.device-id => text,
  ? comid.location => text,
  * $$evidence-extension,
  comid.global-attributes,
}
comid.integer-time = #6.1(int)
comid.tag-id = 0
comid.software-name = 1
comid.entity = 2
comid.evidence = 3
comid.link = 4
comid.software-meta = 5
comid.payload = 6
comid.hash = 7
comid.corpus = 8
comid.patch = 9
comid.media = 10
comid.supplemental = 11
comid.tag-version = 12
comid.software-version = 13
comid.version-scheme = 14
comid.lang = 15
comid.directory = 16
comid.file = 17
comid.process = 18
comid.resource = 19
comid.size = 20
comid.file-version = 21
comid.key = 22
comid.location = 23
comid.fs-name = 24
comid.root = 25
comid.path-elements = 26
comid.process-name = 27
comid.pid = 28
comid.type = 29
comid.entity-name = 31
comid.reg-id = 32
comid.role = 33
comid.thumbprint = 34
comid.date = 35
comid.device-id = 36
comid.artifact = 37
comid.href = 38
comid.ownership = 39
comid.rel = 40
comid.media-type = 41
comid.use = 42
comid.activation-status = 43
comid.channel-type = 44
comid.colloquial-version = 45
comid.description = 46
comid.edition = 47
comid.entitlement-data-required = 48
comid.entitlement-key = 49
comid.generator = 50
comid.persistent-id = 51
comid.product = 52
comid.product-family = 53
comid.revision = 54
comid.summary = 55
comid.unspsc-code = 56
comid.unspsc-version = 57
comid.multipartnumeric = 1
comid.multipartnumeric-suffix = 2
comid.alphanumeric = 3
comid.decimal = 4
comid.semver = 16384
comid.tag-creator = 1
comid.software-creator = 2
comid.aggregator = 3
comid.distributor = 4
comid.licensor = 5
comid.maintainer = 6
comid.abandon = 1
comid.private = 2
comid.shared = 3
comid.ancestor = 1
comid.component = 2
comid.feature = 3
comid.installationmedia = 4
comid.packageinstaller = 5
comid.parent = 6
comid.patches = 7
comid.requires = 8
comid.see-also = 9
comid.supersedes = 10
comid.optional = 1
comid.required = 2
comid.recommended = 3
]]></artwork>
      </section>
      <section anchor="collated-cddl-discovery">
        <name>API Discovery Data Model</name>
        <artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

coserv-well-known-info = {
  version-label => version,
  capabilities-label => [+ capability],
  api-endpoints-label => {+ tstr => tstr},
  ? result-verification-key-label => eat.JC<jwk.JWK_Set, cose.\
                                                        COSE_KeySet>,
}
version-label = eat.JC<"version", 1>
capabilities-label = eat.JC<"capabilities", 2>
api-endpoints-label = eat.JC<"api-endpoints", 3>
result-verification-key-label = eat.JC<"result-verification-key", 4>
version = tstr
capability = {
  media-type-label => cmw.media-type,
  artifact-support-label => artifact-support,
}
media-type-label = eat.JC<"media-type", 1>
artifact-support-label = eat.JC<"artifact-support", 2>
non-empty-array<M> = M .and ([+ any])
artifact-support = non-empty-array<[
    ? "source",
    ? "collected",
]>
cmw.start = cmw.cmw
cmw.cmw = cmw.json-cmw / cmw.cbor-cmw
cmw.json-cmw = cmw.json-record / cmw.json-collection
cmw.cbor-cmw = cmw.cbor-record / cmw.cbor-collection / cmw.$cbor-tag
cmw.json-record = [
  type: cmw.media-type,
  value: cmw.base64url-string,
  ? ind: uint .bits cmw.cm-type,
]
cmw.cbor-record = [
  type: cmw.coap-content-format-type / cmw.media-type,
  value: bytes,
  ? ind: uint .bits cmw.cm-type,
]
cmw.tag-cm-cbor<tn, fmt> = #6.<tn>(bytes .cbor fmt)
cmw.tag-cm-data<tn> = #6.<tn>(bytes)
cmw.json-collection = {
  ? __cmwc_t: ~uri / cmw.oid,
  + &(label: text) => cmw.json-cmw,
}
cmw.cbor-collection = {
  ? __cmwc_t: ~uri / cmw.oid,
  + &(label: int / text) => cmw.cbor-cmw,
}
cmw.media-type = text .abnf ("Content-Type" .cat cmw.Content-Type-\
                                                                ABNF)
cmw.base64url-string = text .regexp "[A-Za-z0-9_-]+"
cmw.coap-content-format-type = uint .size 2
cmw.oid = text .regexp "([0-2])((\\.0)|(\\.[1-9][0-9]*))*"
cmw.cm-type = &(
  reference-values: 0,
  endorsements: 1,
  evidence: 2,
  attestation-results: 3,
)
cmw.Content-Type-ABNF = '

Content-Type   = Media-Type-Name *( *SP ";" *SP parameter )
parameter      = token "=" ( token / quoted-string )

token          = 1*tchar
tchar          = "!" / "#" / "$" / "%" / "&" / "\'" / "*"
               / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
               / DIGIT / ALPHA
quoted-string  = %x22 *( qdtext / quoted-pair ) %x22
qdtext         = SP / %x21 / %x23-5B / %x5D-7E
quoted-pair    = "\\" ( SP / VCHAR )

Media-Type-Name = type-name "/" subtype-name

type-name = restricted-name
subtype-name = restricted-name

restricted-name = restricted-name-first *126restricted-name-chars
restricted-name-first  = ALPHA / DIGIT
restricted-name-chars  = ALPHA / DIGIT / "!" / "#" /
                         "$" / "&" / "-" / "^" / "_"
restricted-name-chars =/ "." ; Characters before first dot always
                             ; specify a facet name
restricted-name-chars =/ "+" ; Characters after last plus always
                             ; specify a structured syntax suffix

DIGIT     =  %x30-39           ; 0 - 9
POS-DIGIT =  %x31-39           ; 1 - 9
ALPHA     =  %x41-5A / %x61-7A ; A - Z / a - z
SP        =  %x20
VCHAR     =  %x21-7E           ; printable ASCII (no SP)
'
cmw.$cbor-tag /= cmw.tag-cm-data<1668576935> / cmw.tag-cm-cbor<\
                                         1668576819, cmw.my-evidence>
cmw.my-evidence = {&(eat_nonce: 10) => bstr .size (8 .. 64)}
jwk.JWK = {
  "kty" => tstr,
  ? "use" => tstr,
  ? "key_ops" => [* tstr],
  ? "alg" => tstr,
  ? "kid" => tstr,
  ? "x5u" => tstr,
  ? "x5c" => [* jwk.bytes-b64u],
  ? "x5t" => jwk.bytes-b64u,
  ? "x5t#S256" => jwk.bytes-b64u,
  ? jwk.RSA-Key-Fields,
  ? jwk.EC-Key-Fields,
  ? jwk.Symmetric-Key-Fields,
}
jwk.JWK_Set = [+ jwk.JWK]
jwk.RSA-Key-Fields = (
  "n" => jwk.bytes-b64u,
  "e" => jwk.bytes-b64u,
  ? "d" => jwk.bytes-b64u,
  ? "p" => jwk.bytes-b64u,
  ? "q" => jwk.bytes-b64u,
  ? "dp" => jwk.bytes-b64u,
  ? "dq" => jwk.bytes-b64u,
  ? "qi" => jwk.bytes-b64u,
  )
jwk.EC-Key-Fields = (
  "crv" => tstr,
  "x" => jwk.bytes-b64u,
  "y" => jwk.bytes-b64u,
  ? "d" => jwk.bytes-b64u,
  )
jwk.Symmetric-Key-Fields = ("k" => jwk.bytes-b64u)
jwk.bytes-b64u = tstr .b64u bytes
eat.JC<J, C> = eat.JSON-ONLY<J> / eat.CBOR-ONLY<C>
eat.JSON-ONLY<J> = J .feature "json"
eat.CBOR-ONLY<C> = C .feature "cbor"
cose.COSE_KeySet = [+ cose.COSE_Key]
cose.COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * cose.label => cose.values,
}
cose.label = int / tstr
cose.values = any
]]></artwork>
      </section>
    </section>
    <section anchor="openapi-schema">
      <name>OpenAPI Schema</name>
      <t>The OpenAPI schema for the request/response HTTP API described in <xref target="secrrapi"/> is provided below.</t>
      <artwork><![CDATA[
openapi: '3.0.0'

info:
  title: CoSERV HTTP API Binding
  description: CoSERV HTTP API Binding, including request-response and discovery
  version: '1.0.0alpha'
paths:
  /coserv/{query}:
    get:
      summary: Query the CoSERV endpoint.
      parameters:
        - in: path
          name: query
          schema:
            type: string
            format: base64url
          required: true
          description: base64url-encoded CoSERV query
      responses:
        '200':
          description: >
            A CoSERV result set has been successfully computed.
          content:
            application/coserv+cose:
              schema:
                type: string
                format: binary
                description: >
                  A CoSERV result set enveloped in a COSE Sign1 object.
        '400':
          description: >
            The request was malformed; e.g., the query was not valid base64url,
            or the CoSERV data item could not be successfully parsed.
          content:
            application/concise-problem-details+cbor:
              schema:
                type: string
                format: binary
                description: >
                  A CBOR-encoded problem details data item.
        '406':
          description: >
            The server cannot produce a response matching the list of acceptable
            values defined in the request's 'Accept' header field.  In particular,
            the client may have specified a CoSERV profile that is not understood or
            serviceable by the server.
          content:
            application/concise-problem-details+cbor:
              schema:
                type: string
                format: binary
                description: >
                  A CBOR-encoded problem details data item.
  /.well-known/coserv-configuration:
    get:
      summary: Retrieve the CoSERV configuration document.
      responses:
        '200':
          description: >
            The CoSERV configuration document has been successfully retrieved.
          content:
            application/coserv-discovery+json:
              schema:
                type: string
                format: binary
                description: >
                  A JSON-encoded CoSERV configuration document.
            application/coserv-discovery+cbor:
              schema:
                type: string
                format: binary
                description: >
                  A CBOR-encoded CoSERV configuration document.
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The participants in the "Staircase meeting" at FOSDEM '25:</t>
      <artwork><![CDATA[
@@@@#=+++==+=+++++==+++++++++=========-========================-=======
@@@@@@@@#+*++++=+++****#########+====================================-=
*+@@@@@@%@%@%=***#*########%#####*++===============================-===
%%%%%@@%#@*@@@%%%%##%%%####%%###%#%++++=+=+================--==========
%%%%%%@@@%#%@%@@%###%#%#%%%#%%%#%%####===%%%+==================-=======
%%%%%%%@%%##%%%%%####%++=+=++++*%*=#+*++++++%#=== Mathias Brossard ====
%%%@%%%%%%%%%%%@%%####*##**#***+%%#**=*==*==*%================-========
%%%%%%@%%%%%%%%%#@###**+==%**%###%#+*+++=*+=*%=========================
%%%%%%%%%%%#%%%#*%###%###@#**%##%@#*%#++=+*#*=======================-==
@@@@@@@@%@@@#%#%%####%##%%%**###**%#+++++++++++======================--
%%@@@@@@@@%%#%%#%#==+%##%+%+=**##*%#%@@%%%***+==============-===-===-=:
%-*@%@%%%%#%%%##%==--#**##+*@@%%#*#@@@%%%%%%@%##%%==----======----=---:
%%%@@%#**%%%%%##%---#%@@%%%##**@@@%%%%%%%%@@#***%%=...-== Thomas ==-::+
=###%@@%%%%%%#*+===%#%%##%*#@@@@%%%%%%%%@@%%*+*+#=..:==== Fossati =-:**
+**+#%@@@@@@@@@@@@####*+++*@@@@@%%%@%%%%%#@%=+=--.:====================
+++**+%%@@@@@@%%%%%%%@@+#++#@@%@%%%@%%%%%@#+=-:.:==++++++++++++++++++++
+=++*#%#%@@%%%%%%#%**@+#+-+-%#%*%%%###%%%%#%%++++********++++++++++++++
++++**###=*@%%%%%%%++%*%+*==%##*#%+###@@@@%%%#===++++* Yogesh ++ ++++++
++=+++#**+=@*@@@@%#++#==+=+-%##**#*=+@@@@@%%#*----===+ Deshpande =+=+==
==+**+###++%++**@%*++#====+*##*****@%@#%%##%%*-==========+++++===+=++++
*+++++###++%=++*%#**+%===*++##***++@@%#%@%%%@%###-:::===++=---=-----:==
%++=-=%###+#====****=#===+=*=##*+%*@@%%%%%%@@%*=++#--===*==+=-+==+=-+++
%==----###=%===++*++=%*=+=***@#+***@%%*@%%%##%*##*%%@+=+==+++++++++++++
#*++----##=@*=+=**+*=*++#+=%%#*##%#*+@%@@%%%%%**%@%@@+#+**#*#####***#*+
+*+++@**+#%=%=+++++*=#++#%#+*****##*+@+++%%%%%#@@@@@@=-====-----+**++++
+*+*=%%#**#%=%@%=#++=%+***++*********%%%@%%#-==*+===++===++++++++++++++
#+**++%@%**#%@@%+#+*+%++=+=+*##*****%%%##%==-==**-+====-----:---::::--=
%%***+#%@%**%%=#*#+++%=====+*****#*+*@@+====-==%#*+-.-..-==:==.-.:::...
##**++=@%%#*#%%++#**=%-====+%%+###+++%#=====-+=%%##**+------===::=---::
#***++=+%%%#*%%==#+-+---==+*%%#@@%%++##=====-==%%%%=*++== Paul =:---===
##***+===%%@##@#%#*#=----===+++=+##*+##=====-==%%%%=*=-.. Howard .:-===
##***++==%%%%+**#%%#++-#%====+++%*++==#=====-==%%%%%%+--.:.-::--+=--+=+
##***+=+=%@%%##%##+######=++*=%=---*=+*=====--+%%%%%%+#--:.:--+**#*####
****+++==+%%@@%%%#%*########-%%=-====+*=-===-=+%%%%%%+++++++++*********
*+****++=##%%@@@%%#%+###%###%#@#+=+++==--===-=+%%%%%#+=+++--..====----=
++**+=#++#%%@+#@@@#%%####*#*##@*##%#*++=======+------++=++=--.-----=---
*%++*=+*+%#@#*@*%%#%%*###%#####+##%%=--+======+==:---+=--- Thore -===--
*++##**%=:==-#*+%#%=-=%%#%#%#%%##%*-=====-=--====--*-+-=== Sommer --=-=
-++*=%%*=%++-:#+=:*:####%#%%#%%**++=-==+---*-=*==--**+-===============+
-%#=%%%%%%@%%*%%##*%%%%%%%%%*@#%#++==---------=*+###++========+++++++++
-%@=*%%@%#%%@#@%%%%%%#@++++++@%%@#%%%%%%%---=====++++++++++++++++++++++
-%@=++*#@%#%*@++*#%%%*%*#*##@%+:%##+@@%%#%%#==========+++++++++++++++++
=%%=*==+%###+@%@%%@@%%%%####****+%#%%%%@%*###=:-========++++++++=++++++
==@==-+*##**+#%%%%#%##**###******++*%#%%##%*%#--===========++++++++++++
=-%=+*+-%#**-%@%%%@##**#*******+***%%%%##*%%%%-==++##===== Hannes +++++
+=@+*++++%**=%*+++%##+=@%%@%@@%*@%%%%%%+###+*==+=---%#==== Tschofenig +
+=@=++++*%**+%@+*=%###=-=-=-###%%@%%%#%*%#%%+==--+==%#====+=+++++++++++
*=%%==*+*#**=%@+#@@#==+=%*-----=%%#%%%%##%#%%%@=-+*%*++++++++++++++++++
#*@#+*+++#**=*=++-=+=+*#%%%%%%=-+%%%@@@%##%%%@#=+=+++++++++++++++++++++
****:::::-:::.=*++.=+**#######%%####%####*%%#%%%+++++++++++++++++++++++
*****:-::---==%+++=###+%********%%####%####@%##%%+++++++++++***********
#***##+++%#*++%++=+##*=%++#@@@@@%%%#%#####*%%##%%@*+++++++*************
#####+++*@%#+*@++*+%##+%++===+++++++++==========-=***+*****************
%%%#+***++@%@*@++*%%%%*#+===========================%%+================
%===++*++#***#@**%%%#%#+==========================%%%==================
######*****###*##*##===========================%%%#====================
#######****##*#*##**=====+++=++-----=======++%%#+======================
#########**#***##*#*#=+=======-:::::--====@%##-========================
######*=####**=#####*++++++++=-------+++@%##--=============------------
%%######@@@@@@@%++++=%====%+==----=++%%%#==---=========================
%%%%#%%###@@=**=++=------==#----+++%%%#+====-======================+===
======+##=%@++**=#-:--::---+-+++%%%#===== Ionut Mihalcea ==============
---------=+=*++%#*+=-=::---*++%%%#==================================+==
------------==%==-:::=*=*##%%%%#======*================================
===========-=##------+%%@%%%#+====================== =  /` _____ `\;,
###############*+*****@%%%#+========================   /__(^===^)__\';,
*############++++++#%%%#++==========++==============     /  :::  \   ,;
+++****##*#++=+++@%%%#+==== The Staircase ==========    |   :::   | ,;'
++++++++======++@#%#================================    '._______.'`
++++++++====++@#%#===================================  Dionna Glaze ===
]]></artwork>
      <t>Henk Birkholz and Jag Raman are puppeteering in the shadows.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
5Ia7dlKOchvumuQqVWrD3S9d7LYrs+HuvZZGTCS7OmFHeQ33dNo1JTXc27Ik
wMppuLftPzJKabi3Y3Cpymi4Z7a9KqHhns7VUz7Dvbv+Y4ucPZ1yw81mGdE8
N5vlTJ6jzXIndbU5DIo9Z7h7d+7pQ9cLYkdt+EGc4awfxBnM8YTYAY0vxDJD
xxti+aHa3nZ8tc7tsGK+2yGNKW2/Ghhj2n6n5rT9sGlOW4gbBrXLxgvu2TAP
MaktIzdGtWXlxqy23NwxrB2WbuxgOx2H7g1DcWxhnBHfULwUHr56Gj7WcsqL
Kl2amsuft9ilFG10aoJikU5RJVTEGEesPCCBHk+4gDLGLk0DjFfpixkf0Zyk
GFqc5CkqtKbhezkYKQcnP7BmIYXs6PJdKUpJgW/zGdBE789HX/3j+m3vz3/9
9qeTpOqGVCjy070LzvmvB6iO1CatQ3bkeacbbj0I2mZvWrovofn2g6AVCaa9
9xY+2HkQ3IAI8+mcdtDJ7oPA8itOMTULI8trJYpz8rRRj8kUkpT7H2zb+hvE
XrNPA6t9xTic17HFS60B49Kkg0RxUcS1PLcfKM/tzWqjc2hT//AHCbF3WMvp
aMi9Y0pUwqM3D36v//V7/a/f63992s/v9b9+r//1e/2v3+t//V7/6/f6X/8x
9b/EeBBx23lbzTpqhrC+0ZmWSf0RKNU/5ZOSHv+wRm/kSGonHl00WqfD+qN3
e9Pmo4H2hzCR1hH1QUq+MQ0qauC/tS+XTrb37s5tgc9enxxGYNtET/Da4NI+
Pz5qfXwyAxsVt4v31qDsJ1M6Rx68CZqDhOxy72RzAOsk8+c0nP9qMv/Vzws6
XPDZcMF3P6dz3q0GDfTphAfFlbfCnXfzMDD7eAzwuG3rg8N33rZ8xp/Y38UO
BCUaf+FTMWJq/bkbHj1Qy+vk5Yvo5Ytnf/vqz7iF8RFedMaPjh4EjTYH4Z9D
463p0G0/Qf0raHTkNKIbJsj30FaVyXn6xm8U/ttqMi247qLtwgo+wlm/sIKd
POHLSZKhn+cEPfUx3UabwyM0+8l5H38I8OJ0044f0r0weKWL3P6yYS7S/ub0
9BU5jtg12+frZuwtuB8+0GXWfJUUXkszyq977DWScffDOzu9zd4m6J/o7tlH
aw29svt65YoZ4hFe/ZxdQAPHDzy3WVfux0Y9TcCODNhooBsvlvUuASxbCAt5
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
ulqdoiedAQA=

-->

</rfc>
