Skip to main content

Concise Reference Integrity Manifest
draft-birkholz-rats-corim-00

The information below is for an old version of the document.
Document Type
This is an older version of an Internet-Draft whose latest revision state is "Replaced".
Authors Henk Birkholz , Thomas Fossati , Yogesh Deshpande , Ned Smith , Wei Pan
Last updated 2021-07-12
Replaced by draft-ietf-rats-corim
RFC stream (None)
Formats
Additional resources
Stream Stream state (No stream defined)
Consensus boilerplate Unknown
RFC Editor Note (None)
IESG IESG state I-D Exists
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-birkholz-rats-corim-00
RATS Working Group                                           H. Birkholz
Internet-Draft                                            Fraunhofer SIT
Intended status: Standards Track                              T. Fossati
Expires: 13 January 2022                                    Y. Deshpande
                                                             Arm Limited
                                                                N. Smith
                                                                   Intel
                                                                  W. Pan
                                                     Huawei Technologies
                                                            12 July 2021

                  Concise Reference Integrity Manifest
                      draft-birkholz-rats-corim-00

Abstract

   Abstract

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the RATS Working Group
   mailing list (rats@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/rats/.

   Source for this draft and an issue tracker can be found at
   https://github.com/ietf-rats/draft-birkholz-rats-corim.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 13 January 2022.

Birkholz, et al.         Expires 13 January 2022                [Page 1]
Internet-Draft                    CoRIM                        July 2021

Copyright Notice

   Copyright (c) 2021 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.  Code Components
   extracted from this document must include Simplified BSD License text
   as described in Section 4.e of the Trust Legal Provisions and are
   provided without warranty as described in the Simplified BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
     1.1.  Requirements Notation . . . . . . . . . . . . . . . . . .   4
   2.  Concise Reference Integrity Manifests . . . . . . . . . . . .   4
     2.1.  Typographical Conventions . . . . . . . . . . . . . . . .   5
     2.2.  Prefixes and Namespaces . . . . . . . . . . . . . . . . .   6
     2.3.  Extensibility . . . . . . . . . . . . . . . . . . . . . .   6
     2.4.  Concise RIM Extension Points  . . . . . . . . . . . . . .   6
     2.5.  CDDL Generic Types  . . . . . . . . . . . . . . . . . . .   7
       2.5.1.  Non-Empty . . . . . . . . . . . . . . . . . . . . . .   7
       2.5.2.  One-Or-More . . . . . . . . . . . . . . . . . . . . .   7
   3.  Concise RIM Data Definition . . . . . . . . . . . . . . . . .   8
     3.1.  The signed-corim Container  . . . . . . . . . . . . . . .   8
       3.1.1.  The corim-meta-map Container  . . . . . . . . . . . .   8
       3.1.2.  The corim-entity-map Container  . . . . . . . . . . .   9
       3.1.3.  The validity-map Container  . . . . . . . . . . . . .   9
     3.2.  The unsigned-corim-map Container  . . . . . . . . . . . .  10
       3.2.1.  The corim-locator-map Container . . . . . . . . . . .  10
     3.3.  The concise-mid-tag Container . . . . . . . . . . . . . .  11
     3.4.  The tag-identity-map Container  . . . . . . . . . . . . .  11
     3.5.  The entity-map Container  . . . . . . . . . . . . . . . .  12
     3.6.  The linked-tag-map Container  . . . . . . . . . . . . . .  13
     3.7.  The triples-map Container . . . . . . . . . . . . . . . .  13
     3.8.  The environment-map Container . . . . . . . . . . . . . .  14
     3.9.  The class-map Container . . . . . . . . . . . . . . . . .  15
     3.10. The measurement-map and measurement-values-map
            Containers . . . . . . . . . . . . . . . . . . . . . . .  16
       3.10.1.  The version-map Container  . . . . . . . . . . . . .  18
       3.10.2.  The svn-type-choice Enumeration  . . . . . . . . . .  18
       3.10.3.  The raw-value-group Container  . . . . . . . . . . .  19
       3.10.4.  The ip-addr-type-choice Enumeration  . . . . . . . .  19
       3.10.5.  The mac-addr-type-choice Enumeration . . . . . . . .  19
     3.11. The verification-key-map Container  . . . . . . . . . . .  20

Birkholz, et al.         Expires 13 January 2022                [Page 2]
Internet-Draft                    CoRIM                        July 2021

   4.  Full CDDL Definition  . . . . . . . . . . . . . . . . . . . .  20
   5.  Privacy Considerations  . . . . . . . . . . . . . . . . . . .  34
   6.  Security Considerations . . . . . . . . . . . . . . . . . . .  34
   7.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  34
   8.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  34
     8.1.  Normative References  . . . . . . . . . . . . . . . . . .  34
     8.2.  Informative References  . . . . . . . . . . . . . . . . .  35
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  35

1.  Introduction

   The Remote Attestation Procedures (RATS) architecture
   [I-D.ietf-rats-architecture] describes appraisal procedures for
   attestation Evidence and Attestation Results.  Appraisal procedures
   for Evidence are conducted by Verifiers and are intended to assess
   the trustworthiness of a remote peer.  Appraisal procedures for
   Attestation Results are conducted by Relying Parties and are intended
   to operationalize the assessment about a remote peer and to act
   appropriately based on the assessment.  In order to enable their
   intent, appraisal procedures consume Appraisal Policies, Reference
   Values, and Endorsements.

   This documents specifies a binary encoding for Reference Values using
   the Concise Binary Object Representation (CBOR).  The encoding is
   based on three parts that are defined using the Concise Data
   Definition Language (CDDL):

   *  Concise Reference Integrity Manifests (CoRIM),

   *  Concise Module Identifiers (CoMID), and

   *  Concise Software Identifier (CoSWID).

   CoRIM and CoMID tags are defined in this document, CoSWID tags are
   defined in [I-D.ietf-sacm-coswid].  CoRIM provide a wrapper
   structure, in which CoMID tags, CoSWID tags, as well as corresponding
   metadata can be bundled and signed as a whole.  CoMID tags represent
   hardware components and provide a counterpart to CoSWID tags, which
   represent software components.

   In accordance to [RFC4949], software components that are stored in
   hardware modules are referred to as firmware.  While firmware can be
   represented as a software component, it is also very hardware-
   specific and often resides directly on block devices instead of a
   file system.  In this specification, firmware and their Reference
   Values are represented via CoMID tags.  Reference Values for any
   other software components stored on a file system are represented via
   CoSWID tags.

Birkholz, et al.         Expires 13 January 2022                [Page 3]
Internet-Draft                    CoRIM                        July 2021

   In addition to CoRIM - and respective CoMID tags - this specification
   defines a Concise Manifest Revocation that represents a list of
   reference to CoRIM that are actively marked as invalid before their
   expiration time.

1.1.  Requirements Notation

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in
   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

2.  Concise Reference Integrity Manifests

   This section specifies the Concise RIM (CoRIM) format, the Concise
   MID format (CoMID), and the extension to the CoSWID specification
   that augments CoSWID tags to express specific relationships to CoMID
   tags.

   While each specification defines its own start rule, only CoMID and
   CoSWID are stand-alone specifications.  The CoRIM specification - as
   the bundling format - has a dependency on CoMID and CoSWID and is not
   a stand-alone specification.

   While stand-alone CoSWID tags may be signed [I-D.ietf-sacm-coswid],
   CoMID tags are not intended to be stand-alone and are always part of
   a CoRIM that must be signed.  [I-D.ietf-sacm-coswid] specifies the
   use of COSE [RFC7231] for signing.  This specification defines how to
   generate singed CoRIM tags with COSE to enable proof of authenticity
   and temper-evidence.

   This document uses the Concise Data Definition Language (CDDL
   [RFC8610]) to define the data structure of CoRIM and CoMID tags, as
   well as the extensions to CoSWID.  The CDDL definitions provided
   define nested containers.  Typically, the CDDL types used for nested
   containers are maps.  Every key used in the maps is a named type that
   is associated with an corresponding uint via a block of rules
   appended at the end of the CDDL definition.

   Every set of uint keys that is used in the context of the "collision
   domain" of map is intended to be collision-free (each key is intended
   to be unique in the scope of a map, not a multimap).  To accomplish
   that, for each map there is an IANA registry for the map members of
   maps.

Birkholz, et al.         Expires 13 January 2022                [Page 4]
Internet-Draft                    CoRIM                        July 2021

2.1.  Typographical Conventions

   Type names in the following CDDL definitions follow the naming
   convention illustrated in table Table 1.

   +========================+===============+=========================+
   | type trait             | example       | typo convention         |
   +========================+===============+=========================+
   | extensible type choice | int / text /  | "$"NAME"-type-choice"   |
   |                        | ...           |                         |
   +------------------------+---------------+-------------------------+
   | closed type choice     | int / text    | NAME"-type-choice"      |
   +------------------------+---------------+-------------------------+
   | group choice           | ( 1 => int // | "$$"NAME"-group-choice" |
   |                        | 2 => text )   |                         |
   +------------------------+---------------+-------------------------+
   | group                  | ( 1 => int, 2 | NAME"-group"            |
   |                        | => text )     |                         |
   +------------------------+---------------+-------------------------+
   | type                   | int           | NAME"-type"             |
   +------------------------+---------------+-------------------------+
   | tagged type            | #6.123(int)   | "tagged-"NAME"-type"    |
   +------------------------+---------------+-------------------------+
   | map                    | { 1 => int, 2 | NAME-"map"              |
   |                        | => text }     |                         |
   +------------------------+---------------+-------------------------+
   | flags                  | &( a: 1, b: 2 | NAME-"flags"            |
   |                        | )             |                         |
   +------------------------+---------------+-------------------------+

             Table 1: Type Traits & Typographical Convention

Birkholz, et al.         Expires 13 January 2022                [Page 5]
Internet-Draft                    CoRIM                        July 2021

2.2.  Prefixes and Namespaces

   The semantics of the information elements (attributes) defined for
   CoRIM, CoMID tags, and CoSWID tags are sometimes very similar, but
   often do not share the same scope or are actually quite different.
   In order to not overload the already existing semantics of the
   software-centric IANA registries of CoSWID tags with, for example,
   hardware-centric semantics of CoMID tags, new type names are
   introduced.  For example: both CoSWID tags and CoMID tags define a
   tag-id.  As CoSWID already specifies "tag-id", the tag-id in CoMID
   tags is prefixed with "comid." to disambiguate the context, resulting
   in "comid.tag-id".  This prefixing provides a well-defined scope for
   the use of the types defined in this document and guarantees
   interoperability (no type name collisions) with the CoSWID CDDL
   definition.  Effectively, the prefixes used in this specification
   enable simple hierarchical namespaces.  The prefixing introduced is
   also based on the anticipated namespace features for CDDL.

2.3.  Extensibility

   Both the CoRIM and the CoMID tag specification include extension
   points using CDDL sockets (see [RFC8610] Section 3.9).  The use of
   CDDL sockets allows for well-formed extensions to be defined in
   supplementary CDDL definitions that support additional uses of CoRIM
   and CoMID tags.

   There are two types of extensibility supported via the extension
   points defined in this document.  Both types allow for the addition
   of keys in the scope of a map.

   Custom Keys:  The CDDL definition allows for the use of negative
      integers as keys.  These keys cannot take on a well-defined global
      semantic.  They can take on custom-defined semantics in a limited
      or local scope, e.g. vendor-defined scope.

   Registered Keys:  Additional keys can be registered at IANA via
      separate specifications.

   Both types of extensibility also allow for the definition of new
   nested maps that again can include additional defined keys.

2.4.  Concise RIM Extension Points

   The following CDDL sockets (extension points) are defined in the
   CoRIM specification, which allow the addition of new information
   structures to their respective CDDL groups.

Birkholz, et al.         Expires 13 January 2022                [Page 6]
Internet-Draft                    CoRIM                        July 2021

   +======================+====================================+=======+
   |Map Name              | CDDL Socket                        |Defined|
   |                      |                                    |in     |
   +======================+====================================+=======+
   |corim-entity-map      | $$corim-entity-map-extension       |Section|
   |                      |                                    |3.1.2  |
   +----------------------+------------------------------------+-------+
   |unsigned-corim-map    | $$unsigned-corim-map-extension     |Section|
   |                      |                                    |3.2    |
   +----------------------+------------------------------------+-------+
   |concise-mid-tag       | $$comid-extension                  |Section|
   |                      |                                    |3.3    |
   +----------------------+------------------------------------+-------+
   |tag-identity-map      | $$tag-identity-map-extension       |Section|
   |                      |                                    |3.4    |
   +----------------------+------------------------------------+-------+
   |entity-map            | $$entity-map-extension             |Section|
   |                      |                                    |3.5    |
   +----------------------+------------------------------------+-------+
   |triples-map           | $$triples-map-extension            |Section|
   |                      |                                    |3.7    |
   +----------------------+------------------------------------+-------+
   |measurement-values-map| $$measurement-values-map-extension |Section|
   |                      |                                    |3.10   |
   +----------------------+------------------------------------+-------+

                 Table 2: CoMID CDDL Group Extension Points

2.5.  CDDL Generic Types

   The CDDL definitions for CoRIM and CoMID tags use the two following
   generic types.

2.5.1.  Non-Empty

   The non-empty generic type is used to express that a map with only
   optional members MUST at least include one of the optional members.

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

2.5.2.  One-Or-More

   The one-or-more generic type allows to omit an encapsulating array,
   if only one member would be present.

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

Birkholz, et al.         Expires 13 January 2022                [Page 7]
Internet-Draft                    CoRIM                        July 2021

3.  Concise RIM Data Definition

   A CoRIM is a bundle of CoMID tags and/or CoSWID tags that can
   reference each other and that includes additional metadata about that
   bundle.

   The root of the CDDL specification provided for CoRIM is the rule
   "corim" :

   start = corim

3.1.  The signed-corim Container

   A CoRIM is signed using [RFC7231].  The additional CoRIM-specific
   COSE header member label corim-meta is defined as well as the
   corresponding type corim-meta-map as its value.  This rule and its
   constraints MUST be followed when generating or validating a signed
   CoMID tag.

   signed-corim = #6.18(COSE-Sign1-corim)

   protected-signed-corim-header-map = {
     corim.alg-id => int
     corim.content-type => "application/rim+cbor"
     corim.issuer-key-id => bstr
     corim.meta => corim-meta-map
     * cose-label => cose-values
   }

   unprotected-signed-corim-header-map = {
     * cose-label => cose-values
   }

   COSE-Sign1-corim = [
     protected: bstr .cbor protected-signed-corim-header-map
     unprotected: unprotected-signed-corim-header-map
     payload: bstr .cbor unsigned-corim-map
     signature: bstr
   ]

3.1.1.  The corim-meta-map Container

   This map contains the two additionally defined attributes "corim-
   entity-map" and "validity-map" that are used to annotate a CoRIM with
   metadata.

Birkholz, et al.         Expires 13 January 2022                [Page 8]
Internet-Draft                    CoRIM                        July 2021

   corim-meta-map = {
     corim.signer => one-or-more<corim-entity-map>
     ? corim.validity => validity-map
   }

   corim.signer:  One or more entities that created and/or signed the
      issued CoRIM.

   corim.validity:  A time period defining the validity span of a CoRIM.

3.1.2.  The corim-entity-map Container

   This map is used to identify the signer of a CoRIM via a dedicated
   entity name, a corresponding role and an optional identifying URI.

   corim-entity-map = {
     corim.entity-name => $entity-name-type-choice
     ? corim.reg-id => uri
     corim.role => $corim-role-type-choice
     * $$corim-entity-map-extension
   }

   $corim-role-type-choice /= corim.manifest-creator
   $corim-role-type-choice /= corim.manifest-signer

   corim.entity-name:  The name of the organization that takes on the
      role expressed in "corim.role"

   corim.reg-id:  The registration identifier of the organization that
      has authority over the namespace for "corim.entity-name".

   corim.role:  The role type that is associated with the entity, e.g.
      the creator of the CoRIM or the signer of the CoRIM.

   $$corim-entity-map-extension:  This CDDL socket is used to add new
      information elements to the corim-entity-map container.  See
      FIXME.

3.1.3.  The validity-map Container

   The members of this map indicate the life-span or period of validity
   of a CoRIM that is baked into the protected header at the time of
   signing.

   validity-map = {
     ? corim.not-before => time
     corim.not-after => time
   }

Birkholz, et al.         Expires 13 January 2022                [Page 9]
Internet-Draft                    CoRIM                        July 2021

   corim.not-before:  The timestamp indicating the CoRIM's begin of its
      validity period.

   corim.not-after:  The timestamp indicating the CoRIM's end of its
      validity period.

3.2.  The unsigned-corim-map Container

   This map contains the payload of the COSE envelope that is used to
   sign the CoRIM.  This rule and its constraints MUST be followed when
   generating or validating an unsigned Concise RIM.

   unsigned-corim-map = {
     corim.id => $corim-id-type-choice
     corim.tags => one-or-more<$concise-tag-type-choice>
     ? corim.dependent-rims => one-or-more<corim-locator-map>
     * $$unsigned-corim-map-extension
   }

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

   $concise-tag-type-choice /= #6.TBD-SWID(bytes .cbor concise-swid-tag)
   $concise-tag-type-choice /= #6.TBD-CoMID(bytes .cbor concise-mid-tag)

   corim.id:  Typically a UUID or a text string that MUST uniquely
      identify a CoRIM in a given scope.

   corim.tags:  A collection of one or more CoMID tags and/or CoSWID
      tags.

   corim.dependent-rims:  One or more services available via the
      Internet that can supply additional, possibly dependent manifests
      (or other associated resources).

   $$unsigned-corim-map-extension:  This CDDL socket is used to add new
      information elements to the unsigned-corim-map container.  See
      FIXME.

3.2.1.  The corim-locator-map Container

   This map is used to locate and verify the integrity of resources
   provided by external services, e.g. the CoRIM provider.

   corim-locator-map = {
     corim.href => uri
     ? corim.thumbprint => hash-entry
   }

Birkholz, et al.         Expires 13 January 2022               [Page 10]
Internet-Draft                    CoRIM                        July 2021

   corim.href:  A pointer to a services that supplies dependent files or
      records.

   corim.thumbprint:  A digest of the reference resource.

3.3.  The concise-mid-tag Container

   The CDDL specification for the root concise-mid-tag map is as
   follows.  This rule and its constraints MUST be followed when
   generating or validating a CoMID tag.

   concise-mid-tag = {
     ? comid.language => language-type
     comid.tag-identity => tag-identity-map
     ? comid.entity => one-or-more<entity-map>
     ? comid.linked-tags => one-or-more<linked-tag-map>
     comid.triples => triples-map
     * $$concise-mid-tag-extension
   }

   The following describes each member of the concise-mid-tag root map.

   comid.language:  A textual language tag that conforms with the IANA
      Language Subtag Registry [IANA.language-subtag-registry].

   comid.tag-identity:  A composite identifier containing identifying
      attributes that enable global unique identification of a CoMID tag
      across versions.

   comid.entity:  A list of entities that contributed to the CoMID tag.

   comid.linked-tags:  A lost of tags that are linked to this CoMID tag.

   comid.triples:  A set of relationships in the form of triples,
      representing a graph-like and semantic reference structure between
      tags.

   $$comid-mid-tag-extension:  This CDDL socket is used to add new
      information elements to the concise-mid-tag root container.  See
      FIXME.

3.4.  The tag-identity-map Container

   The CDDL specification for the tag-identity-map includes all
   identifying attributes that enable a consumer of information to
   anticipate required capabilities to process the corresponding tag
   that map is included in.  This rule and its constraints MUST be
   followed when generating or validating a CoMID tag.

Birkholz, et al.         Expires 13 January 2022               [Page 11]
Internet-Draft                    CoRIM                        July 2021

   tag-identity-map = {
     comid.tag-id => $tag-id-type-choice
     comid.tag-version => tag-version-type
     * $$tag-identity-map-extension
   }

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

   tag-version-type = uint .default 0

   The following describes each member of the tag-identity-map
   container.

   comid.tag-id:  An identifier for a CoMID that MUST be globally
      unique.

   comid.tag-version:  An unsigned integer used as a version identifier.

   $$tag-identity-map-extension:  This CDDL socket is used to add new
      information elements to the tag-identity-map container.  See
      FIXME.

3.5.  The entity-map Container

   This Container provides qualifying attributes that provide more
   context information describing the module as well its origin and
   purpose.  This rule and its constraints MUST be followed when
   generating or validating a CoMID tag.

   entity-map = {
     comid.entity-name => $entity-name-type-choice
     ? comid.reg-id => uri
     comid.role => one-or-more<$comid-role-type-choice>
     * $$entity-map-extension
   }

   $comid-role-type-choice /= comid.tag-creator
   $comid-role-type-choice /= comid.creator
   $comid-role-type-choice /= comid.maintainer

   The following describes each member of the tag-identity-map
   container.

   comid.entity-name:  The name of an organization that performs the
      roles as indicated by comid.role.

   comid.reg-id:  The registration identifier of the organization that

Birkholz, et al.         Expires 13 January 2022               [Page 12]
Internet-Draft                    CoRIM                        July 2021

      has authority over the namespace for "comid.entity-name".

   comid.role:  The list of roles a CoMID entity is associated with.
      The entity that generates the concise-mid-tag SHOULD include a
      $comid-role-type-choice value of comid.tag-creator.

   $$entity-map-extension:  This CDDL socket is used to add new
      information elements to the entity-map container.  See FIXME.

3.6.  The linked-tag-map Container

   A list of tags that are linked to this CoMID tag.

   linked-tag-map = {
     comid.linked-tag-id => $tag-id-type-choice
     comid.tag-rel => $tag-rel-type-choice
   }

   $tag-rel-type-choice /= comid.supplements
   $tag-rel-type-choice /= comid.replaces

   The following describes each member of the linked-tag-map container.

   comid.linked-tag-id:  The tag-id of the linked tag.  A linked tag MAY
      be a CoMID tag or a CoSWID tag.

   comid.tag-rel:  The relationship type with the linked tag.  The
      relationship type MAY be "supplements" or "replaces", as well as
      other types well-defined by additional specifications.

3.7.  The triples-map Container

   A set of directed properties that associate sets of data to provide
   reference values, endorsed values, verification key material or
   identifying key material for a specific hardware module that is a
   component of a composite device.  The map provides the core element
   of CoMID tags that associate remote attestation relevant data with a
   distinct hardware component that runs an execution environment (a
   module that is either a Target Environment and/or an Attesting
   Environment).  This rule and its constraints MUST be followed when
   generating or validating a CoMID tag.

Birkholz, et al.         Expires 13 January 2022               [Page 13]
Internet-Draft                    CoRIM                        July 2021

   triples-map = non-empty<{
     ? comid.reference-triples => one-or-more<reference-triple-record>
     ? comid.endorsed-triples => one-or-more<endorsed-triple-record>
     ? comid.attest-key-triples => one-or-more<attest-key-triple-record>
     ? comid.identity-triples => one-or-more<identity-triple-record>
     * $$triples-map-extension
   }>

   The following describes each member of the triple-map container.

   comid.reference-triples:  A directed property that associates
      reference measurements with a module that is a Target Environment.

   comid.endorsed-triples:  A directed property that associates endorsed
      measurements with a module that is a Target Environment or
      Attesting Environment.

   comid.attest-key-triples:  A directed property that associates key
      material used to verify evidence generated from a module that is
      an attesting environment.

   comid.identity-triples:  A directed property that associates key
      material used to identify a module instance or a module class that
      is an identifying part of a device(-set).

   $$triples-map-extension:  This CDDL socket is used to add new
      information elements to the triples-map container.  See FIXME.

3.8.  The environment-map Container

   This map represents the module(s) that a triple-map can point
   directed properties (relationships) from in order to associate them
   with external information for remote attestation, such as reference
   values, endorsement and endorsed values, verification key material
   for evidence, or identifying key material for module
   (re-)identification.  This map can identify a single module instance
   via "comid.instance" or groups of modules via "comid.group".
   Referencing classes of modules requires the use of the more complex
   "class-map" container.  This rule and its constraints MUST be
   followed when generating or validating a CoMID tag.

Birkholz, et al.         Expires 13 January 2022               [Page 14]
Internet-Draft                    CoRIM                        July 2021

   environment-map = non-empty<{
     ? comid.class => class-map
     ? comid.instance => $instance-id-type-choice
     ? comid.group => $group-id-type-choice
   }>

   $instance-id-type-choice /= tagged-ueid-type
   $instance-id-type-choice /= tagged-uuid-type

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

   The following describes each member of the environment-map container.

   comid-class:  A composite identifier for classes of environments/
      modules.

   comid.instance:  An identifier for distinct instances of
      environments/modules that is either a UEID or a UUID.

   comid.group:  An identifier for a group of environments/modules that
      is a UUID.

3.9.  The class-map Container

   This map enables a composite identifier intended to uniquely identify
   modules that are of a distinct class of devices.  Effectively, all
   provided members in combination are a composite module class
   identifier.  This rule and its constraints MUST be followed when
   generating or validating a CoMID tag.  This rule and its constraints
   MUST be followed when generating or validating a CoMID tag.

   class-map = non-empty<{
     ? comid.class-id => $class-id-type-choice
     ? comid.vendor => tstr
     ? comid.model => tstr
     ? comid.layer => uint
     ? comid.index => uint
   }>

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

   The following describes each member of the class-map container.

Birkholz, et al.         Expires 13 January 2022               [Page 15]
Internet-Draft                    CoRIM                        July 2021

3.10.  The measurement-map and measurement-values-map Containers

   One of the targets (range) that a triple-map can point to in order to
   associate it with a module (domain) is the measurement-map.  This map
   is used to provide reference measurements values that can be compared
   with Evidence Claim values or Endorsements and endorsed values from
   other sources than the corresponding CoRIM. "measurement-map" comes
   with a measurement key that identifies the measured element with via
   a OID reference or a UUID. "measurement-values-map" contains the
   actual measurements associated with the module(s).  Byte strings with
   corresponding bit masks that highlights which bits in the byte string
   are used as reference measurements or endorsement are located in
   "raw-value-group".  The members of "measurement-values-map" provide
   well-defined and well-scoped semantics for reference measurement or
   endorsements with respect to a given module instance, class, or
   group.  This rule and its constraints MUST be followed when
   generating or validating a CoMID tag.

Birkholz, et al.         Expires 13 January 2022               [Page 16]
Internet-Draft                    CoRIM                        July 2021

   measurement-map = {
     ? comid.mkey => $measured-element-type-choice
     comid.mval => measurement-values-map
   }

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

   measurement-values-map = non-empty<{
     ? comid.ver => version-map
     ? comid.svn => svn-type-choice
     ? comid.digests => digests-type
     ? comid.flags => flags-type
     ? raw-value-group
     ? comid.mac-addr => mac-addr-type-choice
     ? comid.ip-addr =>  ip-addr-type-choice
     ? comid.serial-number => serial-number-type
     ? comid.ueid => ueid-type
     ? comid.uuid => uuid-type
     * $$measurement-values-map-extension
   }>

   flags-type = bytes .bits operational-flags

   operational-flags = &(
     not-configured: 0
     not-secure: 1
     recovery: 2
     debug: 3
   )

   serial-number-type = text

   digests-type = one-or-more<hash-entry>

   The following describes each member of the measurement-map and the
   measurement-values-map container.

   comid.mkey:  An identifier for the set of measurements expressed in
      measurement-values-map that is either an OID or a UUID.

   comid.ver:  A version number measurement.

   comid.svn:  A security related version number measurement.

   comid.digests:  A digest (typically a hash value) measurement.

   comid.flags:  Measurements that reflect operational modes that are

Birkholz, et al.         Expires 13 January 2022               [Page 17]
Internet-Draft                    CoRIM                        July 2021

      made permanent at manufacturing time such that they are not
      expected to change during normal operation of the Attester.

   raw-value-group:  A measurement in the form of a byte string that can
      come with a corresponding bit mask defining the relevance of each
      bit in the byte string as a measurement.

   comid.mac-addr:  An EUI-48 or EUI-64 MAC address measurement.

   comid.ip-addr:  An Ipv4 or Ipv6 address measurement.

   comid.serial-number:  A measurement of a serial number in text.

   comid.ueid:  A measurement of a Unique Enough Identifier (UEID).

   comid.uuid:  A measurement of a Universally Unique Identifier (UUID).

   $$measurement-values-map-extension:  This CDDL socket is used to add
      new information elements to the measurement-values-map container.
      See FIXME.

3.10.1.  The version-map Container

   This map expresses reference values about version information.

   version-map = {
     comid.version => version-type
     ? comid.version-scheme => $version-scheme
   }

   version-type = text .default '0.0.0'

   The following describes each member of the version-map container.

   comid.version:  The version in the form of a text string.

   comid-version-scheme:  The version-scheme of the text string value as
      defined in [I-D.ietf-sacm-coswid]

3.10.2.  The svn-type-choice Enumeration

   This choice defines the CBOR tagged Security Version Numbers (SVN)
   that can be used as reference values for Evidence and Endorsements.

Birkholz, et al.         Expires 13 January 2022               [Page 18]
Internet-Draft                    CoRIM                        July 2021

   svn = int
   min-svn = int
   tagged-svn = #6.TBD-SVN(svn)
   tagged-min-svn = #6.TBD-minSVN(min-svn)
   svn-type-choice = tagged-svn / tagged-min-svn

   The following describes the types in the svn-type-choice enumeration.

   tagged-svn:  A specific SVN.

   tagged-min-svn:  A lower bound for allowed SVN.

3.10.3.  The raw-value-group Container

   FIXME This group can express a single raw byte value and can come
   with an optional bit mask that defines which bits in the byte string
   is used as a reference value, by setting corresponding position in
   the bit mask to 1.

   raw-value-group = (
     comid.raw-value => raw-value-type
     ? comid.raw-value-mask => raw-value-mask-type
   )

   raw-value-type = bytes
   raw-value-mask-type = bytes

   The following describes the types in the raw-value-group Container.

   comid.raw-value:  FIXME Bit positions in raw-value-type that
      correspond to bit positions in raw-value-mask-type.

   comid.raw-value-mask:  A raw-value-mask-type bit corresponding to a
      bit in raw-value-type MUST be 1 to evaluate the corresponding raw-
      value-type bit.

3.10.4.  The ip-addr-type-choice Enumeration

   This type choice expresses IP addresses as reference values.

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

3.10.5.  The mac-addr-type-choice Enumeration

   This type choice expresses MAC addresses as reference values.

Birkholz, et al.         Expires 13 January 2022               [Page 19]
Internet-Draft                    CoRIM                        July 2021

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

3.11.  The verification-key-map Container

   One of the targets (range) that a triple-map can point to in order to
   associate it with a module (domain).  This map is used to provide the
   key material for evidence verification (effectively signature
   checking or a lightweight proof-of-possession of private signing key
   material) or for identity assertion/check (where a proof-of-
   possession implies a certain device identity).  In support of
   informed trust decisions, an optional trust anchor in the form a PKIX
   certification path that is associated with the provided key material
   can be included.  This rule and its constraints MUST be followed when
   generating or validating a CoMID tag.

   verification-key-map = {
     comid.key => pkix-base64-key-type
     ? comid.keychain => [ + pkix-base64-cert-type ]
   }

   pkix-base64-key-type = tstr
   pkix-base64-cert-type = tstr

   The following describes each member of the verification-key-map
   container.

   comid.key:  Verification key material in DER format base64 encoded.
      Typically, but not necessarily, a public key.

   comid.keychain:  One or more base64 encoded PKIX certificates.  The
      certificate containing the public key in comid.key MUST be the
      first certificate.  Additional certificates MAY follow.  Each
      subsequent certificate SHOULD certify the previous certificate.

4.  Full CDDL Definition

   This section aggregates the CDDL definitions specified in this
   document in a full CDDL definitions including:

   *  the COSE envelope for CoRIM: signed-corim

   *  the CoRIM document: unsigned-corim

   *  the CoMID document: concise-mid-tag

Birkholz, et al.         Expires 13 January 2022               [Page 20]
Internet-Draft                    CoRIM                        July 2021

   Not included in the full CDDL definition are CDDL dependencies to
   CoSWID.  The following CDDL definitions can be found in
   [I-D.ietf-sacm-coswid]:

   *  the COSE envelope for CoRIM: signed-coswid

   *  the CoSWID document: concise-swid-tag

   <CODE BEGINS>
   corim = #6.500($concise-reference-integrity-manifest-type-choice)

   $concise-reference-integrity-manifest-type-choice /= #6.501(unsigned-corim-map)
   $concise-reference-integrity-manifest-type-choice /= #6.502(signed-corim)

   signed-corim = #6.18(COSE-Sign1-corim)

   protected-signed-corim-header-map = {
     corim.alg-id => int
     corim.content-type => "application/rim+cbor"
     corim.issuer-key-id => bstr
     corim.meta => corim-meta-map
     * cose-label => cose-values
   }

   corim-meta-map = {
     corim.signer => one-or-more<corim-entity-map>
     ? corim.validity => validity-map
   }

   corim-entity-map = {
     corim.entity-name => $entity-name-type-choice
     ? corim.reg-id => uri
     corim.role => $corim-role-type-choice
     * $$corim-entity-map-extension
   }

   $corim-role-type-choice /= corim.manifest-creator
   $corim-role-type-choice /= corim.manifest-signer

   validity-map = {
     ? corim.not-before => time
     corim.not-after => time
   }

   unprotected-signed-corim-header-map = {
     * cose-label => cose-values
   }

Birkholz, et al.         Expires 13 January 2022               [Page 21]
Internet-Draft                    CoRIM                        July 2021

   COSE-Sign1-corim = [
     protected: bstr .cbor protected-signed-corim-header-map
     unprotected: unprotected-signed-corim-header-map
     payload: bstr .cbor unsigned-corim-map
     signature: bstr
   ]

   unsigned-corim-map = {
     corim.id => $corim-id-type-choice
     corim.tags => one-or-more<$concise-tag-type-choice>
     ? corim.dependent-rims => one-or-more<corim-locator-map>
     * $$unsigned-corim-map-extension
   }

   corim-locator-map = {
     corim.href => uri
     ? corim.thumbprint => hash-entry
   }

   $concise-tag-type-choice /= #6.505(bytes .cbor concise-swid-tag)
   $concise-tag-type-choice /= #6.506(bytes .cbor concise-mid-tag)

   concise-mid-tag = {
     ? comid.language => language-type
     comid.tag-identity => tag-identity-map
     ? comid.entity => one-or-more<entity-map>
     ? comid.linked-tags => one-or-more<linked-tag-map>
     comid.triples => triples-map
     * $$concise-mid-tag-extension
   }

   language-type = text

   tag-identity-map = {
     comid.tag-id => $tag-id-type-choice
     ? comid.tag-version => tag-version-type
   }

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

   tag-version-type = uint .default 0

   entity-map = {
     comid.entity-name => $entity-name-type-choice
     ? comid.reg-id => uri

Birkholz, et al.         Expires 13 January 2022               [Page 22]
Internet-Draft                    CoRIM                        July 2021

     comid.role => one-or-more<$comid-role-type-choice>
     * $$entity-map-extension
   }

   $comid-role-type-choice /= comid.tag-creator
   $comid-role-type-choice /= comid.creator
   $comid-role-type-choice /= comid.maintainer

   linked-tag-map = {
     comid.linked-tag-id => $tag-id-type-choice
     comid.tag-rel => $tag-rel-type-choice
   }

   $tag-rel-type-choice /= comid.supplements
   $tag-rel-type-choice /= comid.replaces

   triples-map = non-empty<{
     ? comid.reference-triples => one-or-more<reference-triple-record>
     ? comid.endorsed-triples => one-or-more<endorsed-triple-record>
     ? comid.attest-key-triples => one-or-more<attest-key-triple-record>
     ? comid.identity-triples => one-or-more<identity-triple-record>
     * $$triples-map-extension
   }>

   reference-triple-record = [
     environment-map ; target environment
     one-or-more<measurement-map> ; reference measurements
   ]

   endorsed-triple-record = [
     environment-map ; (target or attesting) environment
     one-or-more<measurement-map> ; endorsed measurements
   ]

   attest-key-triple-record = [
     environment-map ; attesting environment
     one-or-more<verification-key-map> ; attestation verification key(s)
   ]

   identity-triple-record = [
     environment-map ; device identifier (instance or class)
     one-or-more<verification-key-map> ; DevID, or semantically equivalent
   ]

   pkix-base64-key-type = tstr
   pkix-base64-cert-type = tstr

   verification-key-map = {

Birkholz, et al.         Expires 13 January 2022               [Page 23]
Internet-Draft                    CoRIM                        July 2021

     ; Verification key in DER format base64-encoded.
     ; Typically, but not necessarily a public key.
     comid.key => pkix-base64-key-type
     ; Optional X.509 certificate chain corresponding to the public key
     ; in comid.key, encoded as an array of one or more base64-encoded
     ; DER PKIX certificates.  The certificate containing the public key
     ; in comid.key MUST be the first certificate.  This MAY be followed
     ; by additional certificates, with each subsequent certificate
     ; being the one used to certify the previous one.
     ? comid.keychain => [ + pkix-base64-cert-type ]
   }

   environment-map = non-empty<{
     ? comid.class => class-map
     ? comid.instance => $instance-id-type-choice
     ? comid.group => $group-id-type-choice
   }>

   class-map = non-empty<{
     ; TODO(tho) add text "class-map SHOULD include class-id"
     ? comid.class-id => $class-id-type-choice
     ? comid.vendor => tstr
     ? comid.model => tstr
     ? comid.layer => uint
     ? comid.index => uint
   }>

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

   $instance-id-type-choice /= tagged-ueid-type
   $instance-id-type-choice /= tagged-uuid-type

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

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

   tagged-uuid-type = #6.37(uuid-type)

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

   impl-id-type = bytes .size 32
   tagged-impl-id-type = #6.551(impl-id-type)

   $measured-element-type-choice /= tagged-oid-type

Birkholz, et al.         Expires 13 January 2022               [Page 24]
Internet-Draft                    CoRIM                        July 2021

   $measured-element-type-choice /= tagged-uuid-type

   measurement-map = {
     ? comid.mkey => $measured-element-type-choice
     comid.mval => measurement-values-map
   }

   measurement-values-map = non-empty<{
     ? comid.ver => version-map
     ? comid.svn => svn-type-choice
     ? comid.digests => digests-type
     ? comid.flags => flags-type
     ? raw-value-group
     ? comid.mac-addr => mac-addr-type-choice
     ? comid.ip-addr =>  ip-addr-type-choice
     ? comid.serial-number => serial-number-type
     ? comid.ueid => ueid-type
     ? comid.uuid => uuid-type
     * $$measurement-values-map-extension
   }>

   version-map = {
     comid.version => version-type
     ? comid.version-scheme => $version-scheme
   }
   version-type = text .default '0.0.0'

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

   flags-type = bytes .bits operational-flags

   operational-flags = &(
     not-configured: 0
     not-secure: 1
     recovery: 2
     debug: 3
   )

   raw-value-group = (
     comid.raw-value => raw-value-type
     ? comid.raw-value-mask => raw-value-mask-type
   )

   raw-value-type = bytes

Birkholz, et al.         Expires 13 January 2022               [Page 25]
Internet-Draft                    CoRIM                        July 2021

   raw-value-mask-type = bytes

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

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

   serial-number-type = text

   digests-type = one-or-more<hash-entry>

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

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

   any-uri = uri
   label = text / int

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

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

Birkholz, et al.         Expires 13 January 2022               [Page 26]
Internet-Draft                    CoRIM                        July 2021

   )

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

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

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

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

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

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

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

Birkholz, et al.         Expires 13 January 2022               [Page 27]
Internet-Draft                    CoRIM                        July 2021

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

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

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

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

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

Birkholz, et al.         Expires 13 January 2022               [Page 28]
Internet-Draft                    CoRIM                        July 2021

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

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

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

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

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

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

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

Birkholz, et al.         Expires 13 January 2022               [Page 29]
Internet-Draft                    CoRIM                        July 2021

   }

   integer-time = #6.1(int)

   tag-id = 0
   software-name = 1
   entity = 2
   evidence = 3
   link = 4
   software-meta = 5
   payload = 6
   hash = 7
   corpus = 8
   patch = 9
   media = 10
   supplemental = 11
   tag-version = 12
   software-version = 13
   version-scheme = 14
   lang = 15
   directory = 16
   file = 17
   process = 18
   resource = 19
   size = 20
   file-version = 21
   key = 22
   location = 23
   fs-name = 24
   root = 25
   path-elements = 26
   process-name = 27
   pid = 28
   type = 29
   entity-name = 31
   reg-id = 32
   role = 33
   thumbprint = 34
   date = 35
   device-id = 36
   artifact = 37
   href = 38
   ownership = 39
   rel = 40
   media-type = 41
   use = 42
   activation-status = 43
   channel-type = 44

Birkholz, et al.         Expires 13 January 2022               [Page 30]
Internet-Draft                    CoRIM                        July 2021

   colloquial-version = 45
   description = 46
   edition = 47
   entitlement-data-required = 48
   entitlement-key = 49
   generator = 50
   persistent-id = 51
   product = 52
   product-family = 53
   revision = 54
   summary = 55
   unspsc-code = 56
   unspsc-version = 57

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

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

   shared=1
   private=2
   abandon=3

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

   optional=1
   required=2
   recommended=3

   comid.language = 0
   comid.tag-identity = 1

Birkholz, et al.         Expires 13 January 2022               [Page 31]
Internet-Draft                    CoRIM                        July 2021

   comid.entity = 2
   comid.linked-tags = 3
   comid.triples = 4

   comid.tag-id = 0
   comid.tag-version = 1

   comid.entity-name = 0
   comid.reg-id = 1
   comid.role = 2

   comid.linked-tag-id = 0
   comid.tag-rel = 1

   comid.reference-triples = 0
   comid.endorsed-triples = 1
   comid.identity-triples = 2
   comid.attest-key-triples = 3

   comid.class = 0
   comid.instance = 1
   comid.group = 2

   comid.class-id = 0
   comid.vendor = 1
   comid.model = 2
   comid.layer = 3
   comid.index = 4

   comid.mkey = 0
   comid.mval = 1

   comid.ver = 0
   comid.svn = 1
   comid.digests = 2
   comid.flags = 3
   comid.raw-value = 4
   comid.raw-value-mask = 5
   comid.mac-addr = 6
   comid.ip-addr = 7
   comid.serial-number = 8
   comid.ueid = 9
   comid.uuid = 10

   comid.key = 0
   comid.keychain = 1

   comid.version = 0

Birkholz, et al.         Expires 13 January 2022               [Page 32]
Internet-Draft                    CoRIM                        July 2021

   comid.version-scheme = 1

   comid.supplements = 0

   comid.replaces = 1

   comid.tag-creator = 0
   comid.creator = 1
   comid.maintainer = 2

   corim.id = 0
   corim.tags = 1
   corim.dependent-rims = 2

   corim.href = 0
   corim.thumbprint = 1

   corim.alg-id = 1
   corim.content-type = 3
   corim.issuer-key-id = 4
   corim.meta = 8

   corim.not-before = 0
   corim.not-after = 1

   corim.signer = 0
   corim.validity = 1

   corim.entity-name = 0
   corim.reg-id = 1
   corim.role = 2

   corim.manifest-creator = 1

   corim.manifest-signer = 2

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

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

   $entity-name-type-choice /= text

   $corim-id-type-choice /= tstr

Birkholz, et al.         Expires 13 January 2022               [Page 33]
Internet-Draft                    CoRIM                        July 2021

   $corim-id-type-choice /= uuid-type

   uuid-type = bytes .size 16

   <CODE ENDS>

5.  Privacy Considerations

   Privacy Considerations

6.  Security Considerations

   Security Considerations

7.  IANA Considerations

   See Body Section 2.

8.  References

8.1.  Normative References

   [I-D.ietf-rats-architecture]
              Birkholz, H., Thaler, D., Richardson, M., Smith, N., and
              W. Pan, "Remote Attestation Procedures Architecture", Work
              in Progress, Internet-Draft, draft-ietf-rats-architecture-
              12, 23 April 2021, <https://datatracker.ietf.org/doc/html/
              draft-ietf-rats-architecture-12>.

   [I-D.ietf-sacm-coswid]
              Birkholz, H., Fitzgerald-McKay, J., Schmidt, C., and D.
              Waltermire, "Concise Software Identification Tags", Work
              in Progress, Internet-Draft, draft-ietf-sacm-coswid-17, 22
              February 2021, <https://datatracker.ietf.org/doc/html/
              draft-ietf-sacm-coswid-17>.

   [IANA.language-subtag-registry]
              IANA, "Language Subtag Registry",
              <http://www.iana.org/assignments/language-subtag-
              registry>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/rfc/rfc2119>.

Birkholz, et al.         Expires 13 January 2022               [Page 34]
Internet-Draft                    CoRIM                        July 2021

   [RFC7231]  Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
              Protocol (HTTP/1.1): Semantics and Content", RFC 7231,
              DOI 10.17487/RFC7231, June 2014,
              <https://www.rfc-editor.org/rfc/rfc7231>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/rfc/rfc8174>.

   [RFC8610]  Birkholz, H., Vigano, C., and C. Bormann, "Concise Data
              Definition Language (CDDL): A Notational Convention to
              Express Concise Binary Object Representation (CBOR) and
              JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610,
              June 2019, <https://www.rfc-editor.org/rfc/rfc8610>.

8.2.  Informative References

   [RFC4949]  Shirey, R., "Internet Security Glossary, Version 2",
              FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007,
              <https://www.rfc-editor.org/rfc/rfc4949>.

Authors' Addresses

   Henk Birkholz
   Fraunhofer SIT
   Rheinstrasse 75
   64295 Darmstadt
   Germany

   Email: henk.birkholz@sit.fraunhofer.de

   Thomas Fossati
   Arm Limited
   United Kingdom

   Email: Thomas.Fossati@arm.com

   Yogesh Deshpande
   Arm Limited
   United Kingdom

   Email: yogesh.deshpande@arm.com

Birkholz, et al.         Expires 13 January 2022               [Page 35]
Internet-Draft                    CoRIM                        July 2021

   Ned Smith
   Intel Corporation
   United States of America

   Email: ned.smith@intel.com

   Wei Pan
   Huawei Technologies

   Email: william.panwei@huawei.com

Birkholz, et al.         Expires 13 January 2022               [Page 36]