<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.9 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc rfcedstyle="yes"?>
<?rfc toc="yes"?>
<?rfc tocindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>

<rfc ipr="pre5378Trust200902" docName="draft-moran-suit-manifest-04" category="info">

  <front>
    <title abbrev="Firmware Manifest Format">SUIT CBOR manifest serialisation format</title>

    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>Arm Limited</organization>
      <address>
        <email>Brendan.Moran@arm.com</email>
      </address>
    </author>
    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>Arm Limited</organization>
      <address>
        <email>hannes.tschofenig@arm.com</email>
      </address>
    </author>
    <author initials="H." surname="Birkholz" fullname="Henk Birkholz">
      <organization>Fraunhofer SIT</organization>
      <address>
        <email>henk.birkholz@sit.fraunhofer.de</email>
      </address>
    </author>

    <date year="2019" month="March" day="11"/>

    <area>Security</area>
    <workgroup>SUIT</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This specification describes the format of a manifest.  A manifest is
a bundle of metadata about the firmware for an IoT device, where to
find the firmware, the devices to which it applies, and cryptographic
information protecting the manifest.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>A firmware update mechanism is an essential security feature for IoT devices to deal with vulnerabilities. While the transport of firmware images to the devices themselves is important there are already various techniques available, such as the Lightweight Machine-to-Machine (LwM2M) protocol offering device management of IoT devices. Equally important is the inclusion of meta-data about the conveyed firmware image (in the form of a manifest) and the use of end-to-end security protection to detect modifications and (optionally) to make reverse engineering more difficult. End-to-end security allows the author, who builds the firmware image, to be sure that no other party (including potential adversaries) can install firmware updates on IoT devices without adequate privileges. This authorization process is ensured by the use of dedicated symmetric or asymmetric keys installed on the IoT device: for use cases where only integrity protection is required it is sufficient to install a trust anchor on the IoT device. For confidentiality protected firmware images it is additionally required to install either one or multiple symmetric or asymmetric keys on the IoT device. Starting security protection at the author is a risk mitigation technique so firmware images and manifests can be stored on untrusted respositories; it also reduces the scope of a compromise of any repository or intermediate system to be no worse than a denial of service.</t>

<t>It is assumed that the reader is familiar with the high-level firmware update architecture <xref target="Architecture"/>. This document is structured as follows: In <xref target="manifest-structure"/> we describe the main building blocks of the manifest and <xref target="manifest-cddl"/> contains the description of the CBOR of the manifest.</t>

<t>The SUIT manifest is heavily optimised for consumption by constrained devices. This means that it is not constructed as a conventional descriptive document, as described in <xref target="Behaviour"/>. This means that a user viewing the contents of the document will require tooling to view the contents in a more descriptive way.</t>

</section>
<section anchor="conventions-and-terminology" title="Conventions and Terminology">

<t>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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<t><list style="symbols">
  <t>SUIT: Sofware Update for the Internet of Things, the IETF working group for this standard.</t>
  <t>Payload: A piece of information to be delivered. Typically Firmware for the purposes of SUIT.</t>
  <t>Resource: A piece of information that is used to construct a payload.</t>
  <t>Manifest: A piece of information that describes one or more payloads, one or more resources, and the processors needed to transform resources into payloads.</t>
  <t>Update: One or more manifests that describe one or more payloads.</t>
  <t>Update Authority: The owner of a cryptographic key used to sign updates, trusted by recipient devices.</t>
  <t>Recipient: The system, typically an IoT device, that receives a manifest.</t>
  <t>Condition: A test for a property of the Recipient or its components.</t>
  <t>Directive: An action for the Recipient to perform.</t>
  <t>Command: A Condition or a Directive.</t>
</list></t>

</section>
<section anchor="suit-digest-container" title="SUIT digest container">
<t>RFC 8152 <xref target="RFC8152"/> provides containers for signature, MAC, and encryption, but no basic digest container. The container needed for a digest requires a type identifier and a container for the raw digest data. Some forms of digest may require additional parameters. These can be added following the digest. Algorithm identifiers defined in RFC 6920 <xref target="RFC6920"/> are reused for this digest container. This structure is described by the following CDDL:</t>

<figure><artwork><![CDATA[
SUIT_Digest = [
 suit-digest-algorithm-id : $suit-digest-algorithm-ids,
 suit-digest-bytes : bytes,
 ? suit-digest-parameters : any
]

; Named Information Hash Algorithm Identifiers
digest-algorithm-ids /= algorithm-id-sha256
digest-algorithm-ids /= algorithm-id-sha256-128
digest-algorithm-ids /= algorithm-id-sha256-120
digest-algorithm-ids /= algorithm-id-sha256-96
digest-algorithm-ids /= algorithm-id-sha256-64
digest-algorithm-ids /= algorithm-id-sha256-32
digest-algorithm-ids /= algorithm-id-sha384
digest-algorithm-ids /= algorithm-id-sha512
digest-algorithm-ids /= algorithm-id-sha3-224
digest-algorithm-ids /= algorithm-id-sha3-256
digest-algorithm-ids /= algorithm-id-sha3-384
digest-algorithm-ids /= algorithm-id-sha3-512
]]></artwork></figure>

</section>
<section anchor="distributing-firmware" title="Distributing firmware">
<t>Distributing firmware in a multi-party environment is a difficult operation. Each party requires a different subset of data. Some data may not be accessible to all parties. Multiple signatures may be required from parties with different authorities. This topic is covered in more depth in <xref target="Architecture"/></t>

</section>
<section anchor="workflow-of-a-device-applying-a-firmware-update" title="Workflow of a device applying a firmware update">
<t>The manifest is designed to work with a pull parser, where each section of the manifest is used in sequence. The expected workflow for a device installing an update can be broken down into 5 steps:</t>

<t><list style="numbers">
  <t>Verify the signature of the manifest</t>
  <t>Verify the applicability of the manifest</t>
  <t>Resolve dependencies</t>
  <t>Fetch payload(s)</t>
  <t>Install payload(s)</t>
</list></t>

<t>When installation is complete, similar information can be used for validating and running images in a further three steps:</t>

<t><list style="numbers">
  <t>Verify image(s)</t>
  <t>Load image(s)</t>
  <t>Run image(s)</t>
</list></t>

<t>When multiple manifests are used for an update, each manifest’s steps occur in a lockstep fashion; all manifests have dependency resolution performed before any manifest performs a payload fetch, etc.</t>

</section>
<section anchor="suit-manifest-goals" title="SUIT manifest goals">
<t>The manifest described in this document is intended to simplify the construction of constrained device firmware update solutions. It is also intended to allow update authors to describe complex update processes for complex devices.</t>

<t>Manifests implemented as descriptive documents require changes to the parser and the information model whenever a new feature is added. This is particularly accentuated when the parser is a fixed-function minimal parser (or a pull parser) such as the type that is typically used in a bootloader or in a constrained client. The issue is not as significant in devices that can use general purpose parsers.</t>

<t>The manifest detailed in this document aims to address these and more problems by changing the processing model from a piece of software that loads a manifest, interprets the data, then performs some actions, into a model in which the software performs exactly the operations stated in the manifest, in order. This allows the manifest to encode data in a way that matches precisely with what the parser expects. It also makes inflexible code, like a bootloader, more flexible in what it can do; because the manifest defines part of the “program,” the manifest’s execution defines part of the behaviour of the system. Further detail on this approach is covered in <xref target="Behaviour"/></t>

<t>The SUIT manifest can be used for a variety of purposes throughout its lifecycle. The manifest allows:</t>

<t><list style="numbers">
  <t>the Firmware Author to reason about releasing a firmware.</t>
  <t>the Network Operator to reason about compatibility of a firmware.</t>
  <t>the Device Operator to reason about the impact of a firmware.</t>
  <t>the Device Operator to manage distribution of firmware to devices.</t>
  <t>the Plant Manager to reason about timing and acceptance of firmware updates.</t>
  <t>the device to reason about the authority &amp; authenticity of a firmware prior to installation.</t>
  <t>the device to reason about the applicability of a firmware.</t>
  <t>the device to reason about the installation of a firmware.</t>
  <t>the device to reason about the authenticity of a firmware at boot.</t>
</list></t>

<t>Each of these uses happens at a different stage of the manifest lifecycle, so each has different requirements.</t>

<t>To verify authenticity at boot time, only the smallest portion of the manifest is required. This core part of the manifest describes only the fully installed firmware and any of its dependencies.</t>

</section>
<section anchor="suit-manifest-design-overview" title="SUIT manifest design overview">
<t>In order to provide flexible behaviour to constrained devices, while still allowing more powerful devices to use their full capabilities, the SUIT manifest takes a new approach, encoding the required behaviour of a Recipient device, instead of just presenting the information used to determine that behaviour. This gives benefits equivalent to those provided by a scripting language or byte code, with two substantial differences. First, the language is extremely high level, consisting of only the operations that a device may perform during update and secure boot of a firmware image. The language specifies behaviours in a linearised form, without branches or loops. Conditional processing is supported, and parallel and out-of-order processing may be performed by sufficiently capable devices.</t>

<t>By structuring the data in this way, the manifest processor becomes a very simple engine that uses a pull parser to interpret the manifest. This pull parser invokes a series of command handlers that evaluate a Condition or execute a Directive. Most data is structured in a highly regular pattern, which simplifies the parser.</t>

<t>The results of this allow a Recipient with minimal functionality to perform complex updates with reduced overhead. Conditional execution of commands allows a simple device to perform important decisions at validation-time, such as which differential update to download for a given current version, or which hash to check, based on the installation address.</t>

<t>Dependency handling is vastly simplified as well. Dependencies function like subroutines of the language. When a manifest has a dependency, it can invoke that dependency’s commands and modify their behaviour by setting parameters. Because some parameters come with security implications, the dependencies also have a mechanism to reject modifications to parameters on a fine-grained level.</t>

<t>Developing a robust permissions system works in this model too. The Recipient can use a simple ACL that is a table of Identities and Component Identifier permissions to ensure that only manifests authenticated by the appropriate identity have access to define a component.</t>

<t>Capability reporting is similarly simplified. A Recipient can report the Commands and Parameters that it supports. This is sufficiently precise for a manifest author to create a manifest that the Recipient can accept.</t>

<t>The simplicity of design in the Recipient due to all of these benefits allows even a highly constrained platform to use advanced update capabilities.</t>

<section anchor="severable-elements" title="Severable Elements">
<t>Because the manifest can be used by different actors at different times, some parts of the manifest can be removed without affecting later stages of the lifecycle. This is called “Severing.” Severing of information is achieved by separating that information from the signed container so that removing it does not affect the signature. This means that ensuring authenticity of severable parts of the manifest is a requirement for the signed portion of the manifest. Severing some parts makes it possible to discard parts of the manifest that are no longer necessary. This is important because it allows the storage used by the manifest to be greatly reduced. For example, no text size limits are needed if text is removed from the manifest prior to delivery to a constrained device.</t>

<t>Elements are made severable by removing them from the manifest, encoding them in a bstr, and placing a SUIT_Digest of the bstr in the manifest so that they can still be authenticated. The SUIT_Digest typically consumes 4 bytes more than the size of the raw digest, therefore elements smaller than (Digest Bits)/8 + 4 SHOULD never be severable. Elements larger than (Digest Bits)/8 + 4 MAY be severable, while elements that are much larger than (Digest Bits)/8 + 4 SHOULD be severable.</t>

</section>
<section anchor="conventions" title="Conventions">
<t>The map indices in this encoding are reset to 1 for each map within the structure. This is to keep the indices as small as possible. The goal is to keep the index objects to single bytes (CBOR positive integers 1-23).</t>

<t>Wherever enumerations are used, they are started at 1. This allows detection of several common software errors that are caused by uninitialised variables. Positive numbers in enumerations are reserved for IANA registration. Negative numbers are used to identify application-specific implementations.</t>

<t>CDDL names are hyphenated and CDDL structures follow the convention adopted in COSE <xref target="RFC8152"/>: SUIT_Structure_Name.</t>

</section>
<section anchor="payloads" title="Payloads">
<t>Payloads can take many forms, for example, binary, hex, s-record, elf, binary diff, PEM certificate, CBOR Web Token, serialised configuration. These payloads fall into two broad categories: those that require installation-time unpacking and those that do not. Binary, PEM certificate, and CBOR Web Token do not require installation-time unpacking. Hex, s-record, elf, and serialised configuration require installation-time unpacking.</t>

<t>Some payloads cannot be directly converted to a writable binary stream. Hex, s-record, and elf may contain gaps and they have no guarantee of monotonic increase of address, which makes pre-processing them into a binary stream difficult on constrained platforms. Serialised configuration may be unpacked into a configuration database, which makes it impossible to preprocess into a binary stream, suitable for direct writing.</t>

<t>Where a specialised unpacking algorithm is needed, a digest is not always calculable over an installed payload. For example, an elf, s-record or hex file may contain gaps that can contain any data, while not changing whether or not an installed payload is valid. Serialised configuration may update only some device data rather than all of it. This means that the digest cannot always be calculated over an installed payload when a specialised installer is used.</t>

<t>This presents two problems for the manifest: first, it must indicate that a specialised installer is needed and, second, it cannot provide a hash of the payload that is checkable after installation. These two problems are resolved in two ways:</t>

<t><list style="numbers">
  <t>Payloads that need a specialised installer must indicate this in suit-payload-info-unpack.</t>
  <t>Payloads that need specialised verification must indicate this in the SUIT_Payload section or SUIT_Parameter_Image_Digest by indicating a SUIT_Digest algorithm that correctly validates their information.</t>
</list></t>

</section>
</section>
<section anchor="manifest-structure" title="Manifest Structure">
<t>The manifest is divided into several sections in a hierarchy as follows:</t>

<t><list style="numbers">
  <t>The outer wrapper
  <list style="numbers">
      <t>The authentication wrapper</t>
      <t>The manifest
      <list style="numbers">
          <t>Critical Information</t>
          <t>List of dependencies</t>
          <t>List of payloads</t>
          <t>List of payloads in dependencies</t>
          <t>Common list of conditions, directives</t>
          <t>Dependency resolution Reference or list of conditions, directives</t>
          <t>Payload fetch Reference or list of conditions, directives</t>
          <t>Installation Reference or list of conditions, directives</t>
          <t>Verification conditions/directives</t>
          <t>Load conditions/directives</t>
          <t>Run conditions/directives</t>
          <t>Text / Reference</t>
          <t>COSWID / Reference</t>
        </list></t>
      <t>Dependency resolution conditions/directives</t>
      <t>Payload fetch conditions/directives</t>
      <t>Installation conditions/directives</t>
      <t>Text</t>
      <t>COSWID / Reference</t>
      <t>Intermediate Certificate(s) / CWTs</t>
      <t>Small Payload(s)</t>
    </list></t>
</list></t>

<section anchor="outer-wrapper" title="Outer wrapper">
<t>This object is a container for the other pieces of the manifest to provide a common mechanism to find each of the parts. All elements of the outer wrapper are contained in bstr objects. Wherever the manifest references an object in the outer wrapper, the bstr is included in the digest calculation.</t>

<t>The CDDL that describes the wrapper is below</t>

<figure><artwork><![CDATA[
SUIT_Outer_Wrapper = {
    suit-authentication-wrapper => bstr .cbor
                                   SUIT_Authentication_Wrapper / nil,
    suit-manifest               => bstr .cbor Manifest,
    suit-dependency-resolution  => bstr .cbor SUIT_Command_Sequence,
    suit-payload-fetch          => bstr .cbor SUIT_Command_Sequence,
    suit-install                => bstr .cbor SUIT_Command_Sequence,
    suit-text-external          => bstr .cbor SUIT_Text_Info,
    suit-coswid-external        => bstr .cbor COSWID
}
suit-authentication-wrapper = 1
suit-manifest = 2
suit-dependency-resolution = 7
suit-payload-fetch = 8
suit-install = 9
suit-text = 13
suit-coswid = 14

SUIT_Authentication_Wrapper = [ * (COSE_Mac_Tagged / COSE_Sign_Tagged /
                                   COSE_Mac0_Tagged / COSE_Sign1_Tagged)]
]]></artwork></figure>

<t>All elements of the outer wrapper must be wrapped in a bstr to minimize the complexity of the code that evaluates the cryptographic integrity of the element and to ensure correct serialisation for integrity and authenticity checks.</t>

<t>The suit-authentication-wrapper contains a list of 1 or more cryptographic authentication wrappers for the core part of the manifest. These are implemented as  COSE_Mac_Tagged or COSE_Sign_Tagged blocks. The Manifest is authenticated by these blocks in “detached payload” mode. The COSE_Mac_Tagged and COSE_Sign_Tagged blocks are described in RFC 8152 <xref target="RFC8152"/> and are beyond the scope of this document. The suit-authentication-wrapper MUST come first in the SUIT_Outer_Wrapper, regardless of canonical encoding of CBOR. All validators MUST reject any SUIT_Outer_Wrapper that begins with any element other than a suit-authentication-wrapper.</t>

<t>A manifest that has not had authentication information added MUST still contain the suit-authentication-wrapper element, but the content MUST be null.</t>

<t>suit-manifest contains a Manifest structure, which describes the payload(s) to be installed and any dependencies on other manifests.</t>

<t>Each of suit-dependency-resolution, suit-payload-fetch, and suit-payload-installation contain the severable contents of the identically named portions of the manifest, described in <xref target="secmanifest"/>.</t>

<t>suit-text contains all the human-readable information that describes any and all parts of the manifest, its payload(s) and its resource(s).</t>

<t>suit-coswid contains a Concise Software Identifier. This may be discarded by the recipient if not needed.</t>

</section>
<section anchor="secmanifest" title="Manifest">

<t>The manifest describes the critical metadata for the referenced payload(s). In addition, it contains:</t>

<t><list style="numbers">
  <t>a version number for the manifest structure itself</t>
  <t>a sequence number</t>
  <t>a list of dependencies</t>
  <t>a list of components affected</t>
  <t>a list of components affected by dependencies</t>
  <t>a reference for each of the severable blocks.</t>
  <t>a list of actions that the recipient should perform.</t>
</list></t>

<t>The following CDDL fragment defines the manifest.</t>

<figure><artwork><![CDATA[
SUIT_Manifest = {
    suit-manifest-version         => 1,
    suit-manifest-sequence-number => uint,
    ? suit-dependencies           => [ + SUIT_Dependency ],
    ? suit-components             => [ + SUIT_Component ],
    ? suit-dependency-components  => [ + SUIT_Component_Reference ],
    ? suit-common                 => bstr .cbor SUIT_Command_Sequence,
    ? suit-dependency-resolution  => Digest / bstr .cbor SUIT_Command_Sequence,
    ? suit-payload-fetch          => Digest / bstr .cbor SUIT_Command_Sequence,
    ? suit-install                => Digest / bstr .cbor SUIT_Command_Sequence
    ? suit-validate               => bstr .cbor SUIT_Command_Sequence
    ? suit-load                   => bstr .cbor SUIT_Command_Sequence
    ? suit-run                    => bstr .cbor SUIT_Command_Sequence
    ? suit-text-info              => Digest / bstr .cbor SUIT_Text_Map
    ? suit-coswid                 => Digest / bstr .cbor COSWID
}

suit-manifest-version = 1
suit-manifest-sequence-number = 2
suit-dependencies = 3
suit-components = 4
suit-dependency-components = 5
suit-common = 6
suit-dependency-resolution = 7
suit-payload-fetch = 8
suit-install = 9
suit-validate = 10
suit-load = 11
suit-run = 12
suit-text-info = 13
suit-coswid = 14
]]></artwork></figure>

<t>Several fields in the Manifest can be either a CBOR structure or a SUIT_Digest. In each of these cases, the SUIT_Digest provides for a severable field. Severable fields are RECOMMENDED to implement. In particular, text SHOULD be severable, since most useful text elements occupy more space than a SUIT_Digest, but are not needed by recipient devices. Because SUIT_Digest is a CBOR Array and each severable element is a CBOR bstr, it is straight-forward for a recipient to determine whether an element has been severed.</t>

<t>The suit-manifest-version indicates the version of serialisation used to encode the manifest. Version 1 is the version described in this document. suit-manifest-version is MANDATORY.</t>

<t>The suit-manifest-sequence-number is a monotonically increasing anti-rollback counter. It also helps devices to determine which in a set of manifests is the “root” manifest in a given update. Each manifest MUST have a sequence number higher than each of its dependencies. Each recipient MUST reject any manifest that has a sequence number lower than its current sequence number. It MAY be convenient to use a UTC timestamp in seconds as the sequence number. suit-manifest-sequence-number is MANDATORY.</t>

<t>suit-dependencies is a list of SUIT_Dependency blocks that specify manifests that must be present before the current manifest can be processed. suit-dependencies is OPTIONAL.</t>

<t>In order to distinguish between components that are affected by the current manifest and components that are affected by a dependency, they are kept in separate lists. Components affected by the current manifest include the digest and size of the result. Components affected by a manifest only include the component identifier and the index of the manifest that fully defines the component.</t>

<t>suit-components is a list of SUIT_Component blocks that specify the vital information about the content a component identifier should contain following the update. These are the component identifiers that will be affected by the content of the current manifest. suit-components is OPTIONAL, but at least one manifest MUST contain a suit-components block.</t>

<t>suit-dependency-components is a list of SUIT_Component_Reference blocks that specify component identifiers that will be affected by the content of a dependency of the current manifest. suit-dependency-components is OPTIONAL.</t>

<t>suit-common is a SUIT_Command_Sequence to execute prior to executing any other command sequence. Typical actions in suit-common include setting expected device identity and image digests when they are conditional (see <xref target="secconditional"/> for more information on conditional sequences). suit-common is OPTIONAL.</t>

<t>suit-dependency-resolution is a SUIT_Command_Sequence to execute in order to perform dependency resolution. Typical actions include configuring URIs of dependency manifests, fetching dependency manifests, and validating dependency manifests’ contents. suit-dependency-resolution is MANDATORY when suit-dependencies is present.</t>

<t>suit-payload-fetch is a SUIT_Command_Sequence to execute in order to obtain a payload. Some manifests may include these actions in the suit-install section instead if they operate in a streaming installation mode. This is particularly relevant for constrained devices without any temporary storage for staging the update. suit-payload-fetch is OPTIONAL.</t>

<t>suit-install is a SUIT_Command_Sequence to execute in order to install a payload. Typical actions include verifying a payload stored in temporary storage, copying a staged payload from temporary storage, and unpacking a payload. suit-install is OPTIONAL.</t>

<t>suit-validate is a SUIT_Command_Sequence to execute in order to validate that the result of applying the update is correct. Typical actions involve image validation and manifest validation. suit-validate is MANDATORY. If the manifest contains dependencies, one process-dependency invocation per dependency or one process-dependency invocation targeting all dependencies SHOULD be present in validate.</t>

<t>suit-load is a SUIT_Command_Sequence to execute in order to prepare a payload for execution. Typical actions include copying an image from permanent storage into RAM, optionally including actions such as decryption or decompression. suit-load is OPTIONAL.</t>

<t>suit-run is a SUIT_Command_Sequence to execute in order to run an image. suit-run typically contains a single instruction: either the “run” directive for the bootable manifest or the “process dependencies” directive for any dependents of the bootable manifest. suit-run is OPTIONAL. Only one manifest in an update may contain the “run” directive.</t>

<t>suit-text-info is a digest that uniquely identifies the content of the Text that is packaged in the OuterWrapper. text is OPTIONAL.</t>

<t>suit-coswid is a digest that uniquely identifies the content of the concise-software-identifier that is packaged in the OuterWrapper. coswid is OPTIONAL.</t>

</section>
<section anchor="suitdependency" title="SUIT_Dependency">

<t>SUIT_Dependency specifies a manifest that describes a dependency of the current manifest.</t>

<t>The following CDDL describes the SUIT_Dependency structure.</t>

<figure><artwork><![CDATA[
SUIT_Dependency = {
    suit-dependency-digest => SUIT_Digest,
    suit-dependency-prefix => SUIT_Component_Identifier,
}
]]></artwork></figure>

<t>The suit-dependency-digest specifies the dependency manifest uniquely by identifying a particular Manifest structure. The digest is calculated over the Manifest structure instead of the COSE Sig_structure or Mac_structure. This means that a digest may need to be calculated more than once, however this is necessary to ensure that removing a signature from a manifest does not break dependencies due to missing ‘body_protected’ and ‘body_signed’ elements. This is also necessary to support the trusted intermediary use case, where an intermediary re-signs the Manifest, removing the original signature, potentially with a different algorithm, or trading COSE_Sign for COSE_Mac.</t>

<t>The suit-dependency-prefix element contains a SUIT_Component_Identifier. This specifies the scope at which the dependency operates. This allows the dependency to be forwarded on to a component that is capable of parsing its own manifests. It also allows one manifest to be deployed to multiple dependent devices without those devices needing consistent component hierarchy. This element is OPTIONAL.</t>

</section>
<section anchor="suitcomponent" title="SUIT_Component">

<t>The SUIT_Component describes an image that is uniquely defined by the current manifest. It consists of three elemnts: the component identifier that represents a component that will be affected by this manifest. This excludes components that are affected by dependencies. The following CDDL describes the SUIT_Component.</t>

<figure><artwork><![CDATA[
SUIT_Component = {
    suit-component-identifier => SUIT_Component_Identifier,
    ? suit-component-size => uint,
    ? suit-component-digest => Digest,
}
]]></artwork></figure>

<t>Because suit-component-size and suit-component-digest can be dependent on installation offset, they cannot be exclusively contained in SUIT_Component. However, since these are security critical parameters, these parameters are updated to match the contents of suit-components prior to processing suit-common. If absent, these are set to Zero and NULL, respectively. This enforces that the manifest defining a component is the only manifest that can describe its contents.</t>

</section>
<section anchor="suitcomponentreference" title="SUIT_Component_Reference">

<t>The SUIT_Component_Reference describes an image that is defined by another manifest. This is useful for overriding the behaviour of another manifest, for example by directing the recipient to look at a different URI for the image or by changing the expected format, such as when a gateway performs decryption on behalf of a constrained device. The following CDDL describes the SUIT_Component_Reference.</t>

<figure><artwork><![CDATA[
SUIT_Component_Reference = {
    suit-component-identifier => SUIT_Component_Identifier,
    suit-component-dependency-index => uint
}
]]></artwork></figure>

</section>
<section anchor="secparameters" title="Manifest Parameters">

<t>Many conditions and directives require additional information. That information is contained within parameters that can be set in a consistent way. Parameters MUST only be:</t>

<figure><artwork><![CDATA[
1. Integers
2. Byte strings
3. Booleans
]]></artwork></figure>

<t>This allows reduction of manifest size and replacement of parameters from one manifest to the next. Byte strings MAY contain CBOR-encoded objects.</t>

<t>The defined manifest parameters are described below.</t>

<texttable>
      <ttcol align='left'>Parameter Code</ttcol>
      <ttcol align='left'>CBOR Type</ttcol>
      <ttcol align='left'>Default</ttcol>
      <ttcol align='left'>Scope</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>1</c>
      <c>boolean</c>
      <c>1</c>
      <c>Global</c>
      <c>Strict Order</c>
      <c>Requires that the manifest is processed in a strictly linear fashion. Set to 0 to enable parallel handling of manifest directives.</c>
      <c>2</c>
      <c>boolean</c>
      <c>0</c>
      <c>Global</c>
      <c>Coerce Condition Failure</c>
      <c>Coerces the success code of a command segment to success even when aborted due to a condition failure.</c>
      <c>3</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Global</c>
      <c>Vendor ID</c>
      <c>A RFC4122 UUID representing the vendor of the device or component</c>
      <c>4</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Global</c>
      <c>Class ID</c>
      <c>A RFC4122 UUID representing the class of the device or component</c>
      <c>5</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Global</c>
      <c>Device ID</c>
      <c>A RFC4122 UUID representing the device or component</c>
      <c>6</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Dependency</c>
      <c>URI List</c>
      <c>A CBOR encoded list of ranked URIs</c>
      <c>7</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Dependency</c>
      <c>Encryption Info</c>
      <c>A COSE object defining the encryption mode of the target</c>
      <c>8</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component</c>
      <c>Compression Info</c>
      <c>A SUIT_Compression_Info object</c>
      <c>9</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component</c>
      <c>Unpack Info</c>
      <c>A SUIT_Unpack_Info object</c>
      <c>10</c>
      <c>int/bstr</c>
      <c>nil</c>
      <c>Component</c>
      <c>Source Component</c>
      <c>A SUIT_Component_Identifier or Component Index</c>
      <c>11</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Dependency</c>
      <c>Image Digest</c>
      <c>A SUIT_Digest</c>
      <c>12</c>
      <c>bstr</c>
      <c>nil</c>
      <c>Component/Dependency</c>
      <c>Image Size</c>
      <c>Integer size</c>
      <c>nint</c>
      <c>int/bstr</c>
      <c>nil</c>
      <c>Custom</c>
      <c>Custom Parameter</c>
      <c>Application-defined parameter</c>
</texttable>

<t>Each parameter contains a Skip/Append flag. Append is an advanced feature that is not available on highly constrained platforms. The mechanism for setting the Append flag is TBD.</t>

<t>CBOR-encoded object parameters are still wrapped in a bstr. This is because it allows a parser that is aggregating parameters to reference the object with a single pointer and traverse it without understanding the contents. This is important for modularisation and division of responsibility within a pull parser. The same consideration does not apply to Conditions and Directives because those elements are invoked with their arguments immediately</t>

<section anchor="suitparameterstrictorder" title="SUIT_Parameter_Strict_Order">

<t>The Strict Order Parameter allows a manifest to govern when directives can be executed out-of-order. This allows for systems that have a sensitivity to order of updates to choose the order in which they are executed. It also allows for more advanced systems to parallelise their handling of updates. Strict Order defaults to True. It MAY be set to False when the order of operations does not matter. When arriving at the end of a command sequence, ALL commands MUST have completed, regardless of the state of SUIT_Parameter_Strict_Order. If SUIT_Parameter_Strict_Order is returned to True, ALL preceding commands MUST complete before the next command is executed.</t>

</section>
<section anchor="suitparametercoerceconditionfailure" title="SUIT_Parameter_Coerce_Condition_Failure">

<t>When executing a command sequence inside SUIT_Run_Sequence and a condition failure occurs, the manifest processor aborts the sequence. If Coerce Condition Failure is True, it returns Success. Otherwise, it returns the original condition failure. SUIT_Parameter_Coerce_Condition_Failure is scoped to the enclosing SUIT_Directive_Run_Sequence. Its value is discarded when SUIT_Directive_Run_Sequence terminates.</t>

</section>
</section>
<section anchor="suitparameterencryptioninfo" title="SUIT_Parameter_Encryption_Info">

<t>Encryption Info defines the mechanism that Fetch or Copy should use to decrypt the data they transfer. SUIT_Parameter_Encryption_Info is encoded as a COSE_Encrypt_Tagged or a COSE_Encrypt0_Tagged, wrapped in a bstr</t>

</section>
<section anchor="suitparametercompressioninfo" title="SUIT_Parameter_Compression_Info">

<t>Compression Info defines any information that is required for a device to perform decompression operations. Typically, this includes the algorithm identifier.</t>

<t>SUIT_Parameter_Compression_Info is defined by the following CDDL:</t>

<figure><artwork type="CDDL"><![CDATA[
SUIT_Compression_Info = {
    suit-compression-algorithm => SUIT_Compression_Algorithms
    ? suit-compression-parameters => bstr
}
suit-compression-algorithm = 1
suit-compression-parameters = 2

SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma

SUIT_Compression_Algorithm_gzip = 1
SUIT_Compression_Algorithm_bzip2 = 2
SUIT_Compression_Algorithm_deflate = 3
SUIT_Compression_Algorithm_lz4 = 4
SUIT_Compression_Algorithm_lzma = 7
]]></artwork></figure>

</section>
<section anchor="suitparameterunpackinfo" title="SUIT_Parameter_Unpack_Info">

<t>SUIT_Unpack_Info defines the information required for a device to interpret a packed format, such as elf, hex, or binary diff. SUIT_Unpack_Info is defined by the following CDDL:</t>

<figure><artwork type="CDDL"><![CDATA[
SUIT_Unpack_Info = {
    suit-unpack-algorithm => SUIT_Unpack_Algorithms
    ? suit-unpack-parameters => bstr
}
suit-unpack-algorithm  = 1
suit-unpack-parameters = 2

SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta
SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex
SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf

SUIT_Unpack_Algorithm_Delta = 1
SUIT_Unpack_Algorithm_Hex = 2
SUIT_Unpack_Algorithm_Elf = 3
]]></artwork></figure>

</section>
<section anchor="suitparameters-cddl" title="SUIT_Parameters CDDL">

<t>The following CDDL describes all SUIT_Parameters.</t>

<figure><artwork type="CDDL"><![CDATA[
SUIT_Parameters //= SUIT_Parameter_Strict_Order
SUIT_Parameters //= SUIT_Parameter_Coerce_Condition_Failure
SUIT_Parameters //= SUIT_Parameter_Vendor_ID
SUIT_Parameters //= SUIT_Parameter_Class_ID
SUIT_Parameters //= SUIT_Parameter_Device_ID
SUIT_Parameters //= SUIT_Parameter_URI_List
SUIT_Parameters //= SUIT_Parameter_Encryption_Info
SUIT_Parameters //= SUIT_Parameter_Compression_Info
SUIT_Parameters //= SUIT_Parameter_Unpack_Info
SUIT_Parameters //= SUIT_Parameter_Source_Component
SUIT_Parameters //= SUIT_Parameter_Image_Digest
SUIT_Parameters //= SUIT_Parameter_Image_Size
SUIT_Parameters //= SUIT_Parameter_Custom

SUIT_Parameter_Strict_Order = (1 => bool)
SUIT_Parameter_Coerce_Condition_Failure = (2 => bool)
SUIT_Parameter_Vendor_ID = (3 => bstr)
SUIT_Parameter_Class_ID = (4 => bstr)
SUIT_Parameter_Device_ID = (5 => bstr)
SUIT_Parameter_URI_List = (6 => bstr .cbor SUIT_URI_List)
SUIT_Parameter_Encryption_Info = (7 => bstr .cbor SUIT_Encryption_Info)
SUIT_Parameter_Compression_Info = (8 => bstr .cbor SUIT_Compression_Info)
SUIT_Parameter_Unpack_Info = (9 => bstr .cbor SUIT_Unpack_Info)
SUIT_Parameter_Source_Component = (10 => bstr .cbor SUIT_Component_Identifier)
SUIT_Parameter_Image_Digest = (11 => bstr .cbor SUIT_Digest)
SUIT_Parameter_Image_Size = (12 => uint)
SUIT_Parameter_Custom = (nint => int/bool/bstr)

SUIT_URI_List = [ + [priority: int, uri: tstr] ]

SUIT_Encryption_Info= COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged
SUIT_Compression_Info = {
    suit-compression-algorithm => SUIT_Compression_Algorithms
    ? suit-compression-parameters => bstr
}
suit-compression-algorithm = 1
suit-compression-parameters = 2

SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_deflate
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_LZ4
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma

SUIT_Compression_Algorithm_gzip = 1
SUIT_Compression_Algorithm_bzip2 = 2
SUIT_Compression_Algorithm_deflate = 3
SUIT_Compression_Algorithm_lz4 = 4
SUIT_Compression_Algorithm_lzma = 7

SUIT_Unpack_Info = {
    suit-unpack-algorithm => SUIT_Unpack_Algorithms
    ? suit-unpack-parameters => bstr
}
suit-unpack-algorithm  = 1
suit-unpack-parameters = 2

SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Delta
SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Hex
SUIT_Unpack_Algorithms //= SUIT_Unpack_Algorithm_Elf

SUIT_Unpack_Algorithm_Delta = 1
SUIT_Unpack_Algorithm_Hex = 2
SUIT_Unpack_Algorithm_Elf = 3
]]></artwork></figure>

</section>
<section anchor="suitcommandsequence" title="SUIT_Command_Sequence">

<t>A SUIT_Command_Sequence defines a series of actions that the recipient MUST take to accomplish a particular goal. These goals are defined in the manifest and include:</t>

<t><list style="numbers">
  <t>Dependency Resolution</t>
  <t>Payload Fetch</t>
  <t>Payload Installation</t>
  <t>Image Validation</t>
  <t>Image Loading</t>
  <t>Run or Boot</t>
</list></t>

<t>Each of these follows exactly the same structure to ensure that the parser is as simple as possible.</t>

<t>Lists of commands are constructed from two kinds of element:</t>

<t><list style="numbers">
  <t>Conditions that MUST be true–any failure is treated as a failure of the update/load/boot</t>
  <t>Directives that MUST be executed.</t>
</list></t>

<t>The lists of commands are logically structured into sequences of zero or more conditions followed by zero or more directives. The <spanx style="strong">logical</spanx> structure is described by the following CDDL:</t>

<figure><artwork><![CDATA[
Command_Sequence = {
    conditions => [ * Condition],
    directives => [ * Directive]
}
]]></artwork></figure>

<t>This introduces significant complexity in the parser, however, so the structure is flattened to make parsing simpler:</t>

<figure><artwork><![CDATA[
SUIT_Command_Sequence = [ + (SUIT_Condition/SUIT_Directive) ]
]]></artwork></figure>

<t>Each condition and directive is composed of:</t>

<t><list style="numbers">
  <t>A command code identifier</t>
  <t>An argument block</t>
</list></t>

<t>Argument blocks are defined for each type of command.</t>

<t>Many conditions and directives apply to a given component, and these generally grouped together. Therefore, a special command to set the current component index is provided with a matching command to set the current manifest index. This index is a numeric index into the component ID tables defined at the beginning of the document. For the purpose of setting the index, the two component ID tables are considered to be concatenated together.</t>

<t>To facilitate optional conditions, a special directive is provided. It runs a new list of conditions/directives that are contained as an argument to the directive. It also contains a flag that indicates whether or not a failure of a condition should indicate a failure of the update/boot.</t>

</section>
<section anchor="suitcondition" title="SUIT_Condition">

<t>Conditions are used to define mandatory properties of a system in order for an update to be applied. They can be pre-conditions or post-conditons of any directive or series of directives, depending on where they are placed in the list. Conditions include:</t>

<texttable>
      <ttcol align='left'>Condition Code</ttcol>
      <ttcol align='left'>Condition Name</ttcol>
      <ttcol align='left'>Argument Type</ttcol>
      <c>1</c>
      <c>Vendor Identifier</c>
      <c>RFC4122 UUID wrapped in a bstr</c>
      <c>2</c>
      <c>Class Identifier</c>
      <c>RFC4122 UUID wrapped in a bstr</c>
      <c>3</c>
      <c>Device Identifier</c>
      <c>RFC4122 UUID wrapped in a bstr</c>
      <c>4</c>
      <c>Image Match</c>
      <c>SUIT_Digest</c>
      <c>5</c>
      <c>Image Not Match</c>
      <c>SUIT_Digest</c>
      <c>6</c>
      <c>Use Before</c>
      <c>Unsigned Integer timestamp</c>
      <c>7</c>
      <c>Minimum Battery</c>
      <c>Unsigned Integer</c>
      <c>8</c>
      <c>Update Authorised</c>
      <c>Integer</c>
      <c>9</c>
      <c>Version</c>
      <c>List of Integers</c>
      <c>10</c>
      <c>Component Offset</c>
      <c>Unsigned Integer</c>
      <c>nint</c>
      <c>Custom Condition</c>
      <c>bstr</c>
</texttable>

<t>Each condition MUST report a success code on completion. If a condition reports failure, then the current sequence of commands MUST terminate. If a recipient encounters an unknown Condition Code, it MUST report a failure.</t>

<t>Positive Condition numbers are reserved for IANA registration. Negative numbers are reserved for proprietary, application-specific directives.</t>

<section anchor="id-conditions" title="ID Conditions">

<t>There are three identifier-based conditions: SUIT_Condition_Vendor_Identifier, SUIT_Condition_Class_Identifier, and SUIT_Condition_Device_Identifier. Each of these conditions present a RFC 4122 <xref target="RFC4122"/> UUID that MUST be matched by the installing device in order to consider the manifest valid.</t>

<t>These conditions MAY be used with or without an argument. If an argument is supplied, then it must be the RFC 4122 <xref target="RFC4122"/> UUID that must be matched for the condition to succeed. If no argument is supplied, then the recipient uses the ID parameter that has already been set using the Set Parameters directive. If no ID has been set, this condition fails. SUIT_Condition_Class_Identifier and SUIT_Condition_Vendor_Identifier are MANDATORY to implement. SUIT_Condition_Device_Identifier is OPTIONAL to implement.</t>

</section>
<section anchor="suitconditionimagematch" title="SUIT_Condition_Image_Match">

<t>Verify that the current component matches the supplied digest. If no digest is specified, then the digest is verified against the digest specified in the Components list. If no digest is specified and the component is not present in the Components list, the condition fails. SUIT_Condition_Image_Match is MANDATORY to implement.</t>

</section>
<section anchor="suitconditionimagenotmatch" title="SUIT_Condition_Image_Not_Match">

<t>Verify that the current component does not match the supplied digest. If no digest is specified, then the digest is compared against the digest specified in the Components list. If no digest is specified and the component is not present in the Components list, the condition fails. SUIT_Condition_Image_Not_Match is OPTIONAL to implement.</t>

</section>
<section anchor="suitconditionusebefore" title="SUIT_Condition_Use_Before">

<t>Verify that the current time is BEFORE the specified time. SUIT_Condition_Use_Before is used to specify the last time at which an update should be installed. One argument is required, encoded as a POSIX timestamp, that is seconds after 1970-01-01 00:00:00. Timestamp conditions MUST be evaluated in 64 bits, regardless of encoded CBOR size. SUIT_Condition_Use_Before is OPTIONAL to implement.</t>

</section>
<section anchor="suitconditionminimumbattery" title="SUIT_Condition_Minimum_Battery">

<t>SUIT_Condition_Minimum_Battery provides a mechanism to test a device’s battery level before installing an update. This condition is for use in primary-cell applications, where the battery is only ever discharged. For batteries that are charged, SUIT_Directive_Wait_Event is more appropriate, since it defines a “wait” until the battery level is sufficient to install the update. SUIT_Condition_Minimum_Battery is specified in mWh. SUIT_Condition_Minimum_Battery is OPTIONAL to implement.</t>

</section>
<section anchor="suitconditionupdateauthorised" title="SUIT_Condition_Update_Authorised">

<t>Request Authorisation from the application and fail if not authorised. This can allow a user to decline an update. Argument is an integer priority level. Priorities are application defined. SUIT_Condition_Update_Authorised is OPTIONAL to implement.</t>

</section>
<section anchor="suitconditionversion" title="SUIT_Condition_Version">

<t>SUIT_Condition_Version allows comparing versions of firmware. Verifying image digests is preferred to version checks because digests are more precise. The image can be compared as:</t>

<t><list style="symbols">
  <t>Greater</t>
  <t>Greater or Equal</t>
  <t>Equal</t>
  <t>Lesser or Equal</t>
  <t>Lesser</t>
</list></t>

<t>Versions are encoded as a CBOR list of integers. Comparisons are done on each integer in sequence.</t>

<t>The following CDDL describes SUIT_Condition_Version_Argument</t>

<figure><artwork><![CDATA[
SUIT_Condition_Version_Argument = [
    suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Types,
    suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value
]
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser
SUIT_Condition_Version_Comparison_Greater = 1
SUIT_Condition_Version_Comparison_Greater_Equal = 2
SUIT_Condition_Version_Comparison_Equal = 3
SUIT_Condition_Version_Comparison_Lesser_Equal = 4
SUIT_Condition_Version_Comparison_Lesser = 5

SUIT_Condition_Version_Comparison_Value = [+int]
]]></artwork></figure>

<t>While the exact encoding of versions is application-defined, semantic versions map directly:</t>

<t><list style="symbols">
  <t>1.2.3 = [1,2,3]</t>
  <t>1.2-rc3 = [1,2,-1,3]</t>
  <t>1.2-beta = [1,2,-2]</t>
  <t>1.2-alpha = [1,2,-3]</t>
  <t>1.2-alpha4 = [1,2,-3,4]</t>
</list></t>

<t>SUIT_Condition_Version is OPTIONAL to implement.</t>

</section>
<section anchor="suitconditioncustom" title="SUIT_Condition_Custom">

<t>SUIT_Condition_Custom describes any proprietary, application specific condition. This is encoded as a negative integer, chosen by the firmware developer, and a bstr that encodes the parameters passed to the system that evaluates the condition matching that integer.
SUIT_Condition_Custom is OPTIONAL to implement.</t>

</section>
<section anchor="identifiers" title="Identifiers">

<t>Many conditions use identifiers to determine whether a manifest matches a given recipient or not. These identifiers are defined to be RFC 4122 <xref target="RFC4122"/> UUIDs. These UUIDs are explicitly NOT human-readable. They are for machine-based matching only.</t>

<t>A device may match any number of UUIDs for vendor or class identifier. This may be relevant to physical or software modules. For example, a device that has an OS and one or more applications might list one Vendor ID for the OS and one or more additional Vendor IDs for the applications. This device might also have a Class ID that must be matched for the OS and one or more Class IDs for the applications.</t>

<t>A more complete example:
A device has the following physical components:
1. A host MCU
2. A WiFi module</t>

<t>This same device has three software modules:
1. An operating system
2. A WiFi module interface driver
3. An application</t>

<t>Suppose that the WiFi module’s firmware has a proprietary update mechanism and doesn’t support manifest processing. This device can report four class IDs:</t>

<t><list style="numbers">
  <t>hardware model/revision</t>
  <t>OS</t>
  <t>WiFi module model/revision</t>
  <t>Application</t>
</list></t>

<t>This allows the OS, WiFi module, and application to be updated independently. To combat possible incompatibilities, the OS class ID can be changed each time the OS has a change to its API.</t>

<t>This approach allows a vendor to target, for example, all devices with a particular WiFi module with an update, which is a very powerful mechanism, particularly when used for security updates.</t>

<section anchor="creating-uuids" title="Creating UUIDs:">

<t>UUIDs MUST be created according to RFC 4122 <xref target="RFC4122"/>. UUIDs SHOULD use versions 3, 4, or 5, as described in RFC4122. Versions 1 and 2 do not provide a tangible benefit over version 4 for this application.</t>

<t>The RECOMMENDED method to create a vendor ID is:
Vendor ID = UUID5(DNS_PREFIX, vendor domain name)</t>

<t>The RECOMMENDED method to create a class ID is:
Class ID = UUID5(Vendor ID, Class-Specific-Information)</t>

<t>Class-specific information is composed of a variety of data, for example:</t>

<t><list style="symbols">
  <t>Model number</t>
  <t>Hardware revision</t>
  <t>Bootloader version (for immutable bootloaders)</t>
</list></t>

</section>
</section>
<section anchor="suitcondition-cddl" title="SUIT_Condition CDDL">

<t>The following CDDL describes SUIT_Condition:</t>

<figure><artwork><![CDATA[
SUIT_Condition //= (nint => bstr)
SUIT_Condition //= SUIT_Condition_Vendor_Identifier
SUIT_Condition //= SUIT_Condition_Class_Identifier
SUIT_Condition //= SUIT_Condition_Device_Identifier
SUIT_Condition //= SUIT_Condition_Image_Match
SUIT_Condition //= SUIT_Condition_Image_Not_Match
SUIT_Condition //= SUIT_Condition_Use_Before
SUIT_Condition //= SUIT_Condition_Minimum_Battery
SUIT_Condition //= SUIT_Condition_Update_Authorised
SUIT_Condition //= SUIT_Condition_Version
SUIT_Condition //= SUIT_Condition_Component_Offset
SUIT_Condition //= SUIT_Condition_Custom

SUIT_Condition_Vendor_Identifier = (1 => bstr .size 16)
SUIT_Condition_Class_Identifier = (2 => bstr .size 16)
SUIT_Condition_Device_Identifier = (3 => bstr .size 16)
SUIT_Condition_Image_Match = (4 => SUIT_Digest)
SUIT_Condition_Image_Not_Match = (5 => SUIT_Digest)
SUIT_Condition_Use_Before = (6 => uint)
SUIT_Condition_Minimum_Battery = (7 => uint)
SUIT_Condition_Update_Authorised = (8 => int)
SUIT_Condition_Version = (9 => SUIT_Condition_Version_Argument)
SUIT_Condition_Component_Offset = (10 => uint)
SUIT_Condition_Custom = (nint => bstr)

SUIT_Condition_Version_Argument = [
    suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Types,
    suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value
]
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser

SUIT_Condition_Version_Comparison_Greater = 1
SUIT_Condition_Version_Comparison_Greater_Equal = 2
SUIT_Condition_Version_Comparison_Equal = 3
SUIT_Condition_Version_Comparison_Lesser_Equal = 4
SUIT_Condition_Version_Comparison_Lesser = 5

SUIT_Condition_Version_Comparison_Value = [+int]
]]></artwork></figure>

</section>
</section>
<section anchor="suitdirective" title="SUIT_Directive">

<t>Directives are used to define the behaviour of the recipient. Directives include:</t>

<texttable>
      <ttcol align='left'>Directive Code</ttcol>
      <ttcol align='left'>Directive Name</ttcol>
      <c>11</c>
      <c>Set Component Index</c>
      <c>12</c>
      <c>Set Manifest Index</c>
      <c>13</c>
      <c>Run Sequence</c>
      <c>14</c>
      <c>Run Sequence Conditional</c>
      <c>15</c>
      <c>Process Dependency</c>
      <c>16</c>
      <c>Set Parameters</c>
      <c>17</c>
      <c>Reserved</c>
      <c>18</c>
      <c>Reserved</c>
      <c>19</c>
      <c>Override Parameters</c>
      <c>20</c>
      <c>Fetch</c>
      <c>21</c>
      <c>Copy</c>
      <c>22</c>
      <c>Run</c>
      <c>23</c>
      <c>Wait</c>
</texttable>

<t>When a Recipient executes a Directive, it MUST report a success code. If the Directive reports failure, then the current Command Sequence MUST terminate.</t>

<section anchor="suitdirectivesetcomponentindex" title="SUIT_Directive_Set_Component_Index">

<t>Set Component Index defines the component to which successive directives and conditions will apply. The supplied argument MUST be either a boolean or an unsigned integer index into the concatenation of suit-components and suit-dependency-components. If the following directives apply to ALL components, then the boolean value “True” is used instead of an index. True does not apply to dependency components. If the following directives apply to NO components, then the boolean value “False” is used. When SUIT_Directive_Set_Manifest_Index is used, SUIT_Directive_Set_Component_Index = False is implied. When SUIT_Directive_Set_Component_Index is used, SUIT_Directive_Set_Manifest_Index = False is implied.</t>

<t>The following CDDL describes the argument to SUIT_Directive_Set_Component_Index.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Set_Component_Index_Argument = uint/bool
]]></artwork></figure>

</section>
<section anchor="suitdirectivesetmanifestindex" title="SUIT_Directive_Set_Manifest_Index">

<t>Set Manifest Index defines the manifest to which successive directives and conditions will apply. The supplied argument MUST be either a boolean or an unsigned integer index into the dependencies. If the following directives apply to ALL dependencies, then the boolean value “True” is used instead of an index. If the following directives apply to NO dependencies, then the boolean value “False” is used. When SUIT_Directive_Set_Component_Index is used, SUIT_Directive_Set_Manifest_Index = False is implied. When SUIT_Directive_Set_Manifest_Index is used, SUIT_Directive_Set_Component_Index = False is implied.</t>

<t>Typical operations that require SUIT_Directive_Set_Manifest_Index include setting a source URI, invoking “Fetch,” or invoking “Process Dependency” for an individual dependency.</t>

<t>The following CDDL describes the argument to SUIT_Directive_Set_Manifest_Index.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Set_Manifest_Index_Argument = uint/bool
]]></artwork></figure>

</section>
<section anchor="suitdirectiverunsequence" title="SUIT_Directive_Run_Sequence">

<t>To enable conditional commands, and to allow several strictly ordered sequences to be executed out-of-order, SUIT_Run_Sequence allows the manifest processor to execute its argument as a SUIT_Command_Sequence. The argument must be wrapped in a bstr.</t>

<t>When a sequence is executed, any failure of a condition causes immediate termination of the sequence.</t>

<t>The following CDDL describes the SUIT_Run_Sequence argument.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Run_Sequence_Argument = bstr .cbor SUIT_Command_Sequence
]]></artwork></figure>

<t>When SUIT_Directive_Run_Sequence completes, it forwards the last status code that occurred in the sequence. If the Coerce on Condition Failure parameter is true, then SUIT_Directive_Run_Sequence only fails when a directive in the argument sequence fails.</t>

<t>SUIT_Parameter_Coerce_Condition_Failure defaults to False when SUIT_Directive_Run_Sequence begins. Its value is discarded when SUIT_Directive_Run_Sequence terminates.</t>

</section>
<section anchor="suitdirectiverunsequenceconditional" title="SUIT_Directive_Run_Sequence_Conditional">

<t>This command is exactly the same as SUIT_Directive_Run_Sequence, except that it initialises Coerce on Condition Failure to True.</t>

<t>SUIT_Parameter_Coerce_Condition_Failure defaults to True when SUIT_Directive_Run_Sequence_Conditional begins. Its value is discarded when SUIT_Directive_Run_Sequence_Conditional terminates.</t>

</section>
<section anchor="suitdirectiveprocessdependency" title="SUIT_Directive_Process_Dependency">

<t>Execute the commands in the common section of the current dependency, followed by the commands in the equivalent section of the current dependency. For example, if the current section is “fetch payload,” this will execute “common” in the current dependency, then “fetch payload” in the current dependency. Once this is complete, the command following SUIT_Directive_Process_Dependency will be processed.</t>

<t>If the current dependency is False, this directive has no effect. If the current dependency is True, then this directive applies to all dependencies. If the current section is “common,” this directive MUST have no effect.</t>

<t>When SUIT_Process_Dependency completes, it forwards the last status code that occurred in the dependency.</t>

<t>The argument to SUIT_Directive_Process_Dependency is defined in the following CDDL.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Process_Dependency_Argument = nil
]]></artwork></figure>

</section>
<section anchor="suitdirectivesetparameters" title="SUIT_Directive_Set_Parameters">

<t>SUIT_Directive_Set_Parameters allows the manifest to configure behaviour of future directives by changing parameters that are read by those directives. When dependencies are used, SUIT_Directive_Set_Parameters also allows a manifest to modify the behaviour of its dependencies.</t>

<t>Available parameters are defined in <xref target="secparameters"/>.</t>

<t>If a parameter is already set, SUIT_Directive_Set_Parameters will skip setting the parameter to its argument. This provides the core of the override mechanism, allowing dependent manifests to change the behaviour of a manifest.</t>

<t>The argument to SUIT_Directive_Set_Parameters is defined in the following CDDL.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Set_Parameters_Argument = {+ SUIT_Parameters}
]]></artwork></figure>

<t>N.B.: A directive code is reserved for an optimisation: a way to set a parameter to the contents of another parameter, optionally with another component ID.</t>

</section>
<section anchor="suitdirectivesetparameterstateappend" title="SUIT_Directive_Set_Parameter_State_Append">

<t>This command is reserved for future use. It will provide a mechanism to override the “set if unset” logic of SUIT_Directive_Set_Parameters on a per-parameter basis. This will allow certain parameters to be treated as lists, rather than fixed values. This enables a feature for an advanced device to fail over from URIs defined in one manifest to those defined in another.</t>

</section>
<section anchor="suitdirectiveoverrideparameters" title="SUIT_Directive_Override_Parameters">

<t>SUIT_Directive_Override_Parameters replaces any listed parameters that are already set with the values that are provided in its argument. This allows a manifest to prevent replacement of critical parameters.</t>

<t>Available parameters are defined in <xref target="secparameters"/>.</t>

<t>The argument to SUIT_Directive_Override_Parameters is defined in the following CDDL.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Override_Parameters_Argument = {+ SUIT_Parameters}
]]></artwork></figure>

</section>
<section anchor="suitdirectivefetch" title="SUIT_Directive_Fetch">

<t>SUIT_Directive_Fetch instructs the manifest processor to obtain one or more manifests or payloads, as specified by the manifest index and component index, respectively.</t>

<t>SUIT_Directive_Fetch can target one or more manifests and one or more payloads. SUIT_Directive_Fetch retrieves each component and each manifest listed in component-index and manifest-index, respectively. If component-index or manifest-index is True, instead of an integer, then all current manifest components/manifests are fetched. The current manifest’s dependent-components are not automatically fetched. In order to pre-fetch these, they MUST be specified in a component-index integer.</t>

<t>SUIT_Directive_Fetch typically takes no arguments unless one is needed to modify fetch behaviour. If an argument is needed, it must be wrapped in a bstr.</t>

<t>SUIT_Directive_Fetch reads the URI List parameter to find the source of the fetch it performs.</t>

<t>The behaviour of SUIT_Directive_Fetch can be modified by setting one or more of SUIT_Parameter_Encryption_Info, SUIT_Parameter_Compression_Info, SUIT_Parameter_Unpack_Info. These three parameters each activate and configure a processing step that can be applied to the data that is transferred during SUIT_Directive_Fetch.</t>

<t>The argument to SUIT_Directive_Fetch is defined in the following CDDL.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Fetch_Argument = nil/bstr
]]></artwork></figure>

</section>
<section anchor="suitdirectivecopy" title="SUIT_Directive_Copy">

<t>SUIT_Directive_Copy instructs the manifest processor to obtain one or more payloads, as specified by the component index. SUIT_Directive_Copy retrieves each component listed in component-index, respectively. If component-index is True, instead of an integer, then all current manifest components are copied. The current manifest’s dependent-components are not automatically copied. In order to copy these, they MUST be specified in a component-index integer.</t>

<t>The behaviour of SUIT_Directive_Copy can be modified by setting one or more of SUIT_Parameter_Encryption_Info, SUIT_Parameter_Compression_Info, SUIT_Parameter_Unpack_Info. These three parameters each activate and configure a processing step that can be applied to the data that is transferred during SUIT_Directive_Copy.</t>

<t><spanx style="strong">N.B.</spanx> Fetch and Copy are very similar. Merging them into one command may be appropriate.</t>

<t>SUIT_Directive_Copy reads its source from SUIT_Parameter_Source_Component.</t>

<t>The argument to SUIT_Directive_Copy is defined in the following CDDL.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Copy_Argument = nil
]]></artwork></figure>

</section>
<section anchor="suitdirectiverun" title="SUIT_Directive_Run">

<t>SUIT_Directive_Run directs the manifest processor to transfer execution to the current Component Index. When this is invoked, the manifest processor MAY be unloaded and execution continues in the Component Index. Arguments provided to Run are forwarded to the executable code located in Component Index, in an application-specific way. For example, this could form the Linux Kernel Command Line if booting a linux device.</t>

<t>If the executable code at Component Index is constructed in such a way that it does not unload the manifest processor, then the manifest processor may resume execution after the executable completes. This allows the manifest processor to invoke suitable helpers and to verify them with image conditions.</t>

<t>The argument to SUIT_Directive_Run is defined in the following CDDL.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Run_Argument = nil/bstr
]]></artwork></figure>

</section>
<section anchor="suitdirectivewait" title="SUIT_Directive_Wait">

<t>SUIT_Directive_Wait directs the manifest processor to pause until a specified event occurs. Some possible events include:</t>

<t><list style="numbers">
  <t>Authorisation</t>
  <t>External Power</t>
  <t>Network availability</t>
  <t>Other Device Firmware Version</t>
  <t>Time</t>
  <t>Time of Day</t>
  <t>Day of Week</t>
</list></t>

<t>The following CDDL defines the encoding of these events.</t>

<figure><artwork><![CDATA[
SUIT_Directive_Wait_Argument = {
    SUIT_Wait_Events
}
SUIT_Wait_Events //= (1 => SUIT_Wait_Event_Argument_Authorisation)
SUIT_Wait_Events //= (2 => SUIT_Wait_Event_Argument_Power)
SUIT_Wait_Events //= (3 => SUIT_Wait_Event_Argument_Network)
SUIT_Wait_Events //= (4 => SUIT_Wait_Event_Argument_Other_Device_Version)
SUIT_Wait_Events //= (5 => SUIT_Wait_Event_Argument_Time)
SUIT_Wait_Events //= (6 => SUIT_Wait_Event_Argument_Time_Of_Day)
SUIT_Wait_Events //= (7 => SUIT_Wait_Event_Argument_Day_Of_Week)


SUIT_Wait_Event_Argument_Authorisation = int ; priority
SUIT_Wait_Event_Argument_Power = int ; Power Level
SUIT_Wait_Event_Argument_Network = int ; Network State
SUIT_Wait_Event_Argument_Other_Device_Version = [
    other-device: bstr,
    other-device-version: [+int]
]
SUIT_Wait_Event_Argument_Time = uint ; Timestamp
SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00)
SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday


]]></artwork></figure>

</section>
<section anchor="suitdirective-cddl" title="SUIT_Directive CDDL">

<t>The following CDDL describes SUIT_Directive:</t>

<figure><artwork><![CDATA[
SUIT_Directive //= SUIT_Directive_Set_Component_Index
SUIT_Directive //= SUIT_Directive_Set_Manifest_Index
SUIT_Directive //= SUIT_Directive_Run_Sequence
SUIT_Directive //= SUIT_Directive_Run_Sequence_Conditional
SUIT_Directive //= SUIT_Directive_Process_Dependency
SUIT_Directive //= SUIT_Directive_Set_Parameters
SUIT_Directive //= SUIT_Directive_Override_Parameters
SUIT_Directive //= SUIT_Directive_Fetch
SUIT_Directive //= SUIT_Directive_Copy
SUIT_Directive //= SUIT_Directive_Run
SUIT_Directive //= SUIT_Directive_Wait

SUIT_Directive_Set_Component_Index = (11 => uint/bool)
SUIT_Directive_Set_Manifest_Index = (12 => uint/bool)
SUIT_Directive_Run_Sequence = (13 => bstr .cbor SUIT_Command_Sequence)
SUIT_Directive_Run_Sequence_Conditional = (14 => bstr .cbor SUIT_Command_Sequence)
SUIT_Directive_Process_Dependency = (15 => nil)
SUIT_Directive_Set_Parameters = (16 => {+ SUIT_Parameters})
SUIT_Directive_Override_Parameters = (19 => {+ SUIT_Parameters})
SUIT_Directive_Fetch = (20 => nil/bstr)
SUIT_Directive_Copy = (21 => nil/bstr)
SUIT_Directive_Run = (22 => nil/bstr)
SUIT_Directive_Wait = (23 => { + SUIT_Wait_Events })

SUIT_Wait_Events //= (1 => SUIT_Wait_Event_Argument_Authorisation)
SUIT_Wait_Events //= (2 => SUIT_Wait_Event_Argument_Power)
SUIT_Wait_Events //= (3 => SUIT_Wait_Event_Argument_Network)
SUIT_Wait_Events //= (4 => SUIT_Wait_Event_Argument_Other_Device_Version)
SUIT_Wait_Events //= (5 => SUIT_Wait_Event_Argument_Time)
SUIT_Wait_Events //= (6 => SUIT_Wait_Event_Argument_Time_Of_Day)
SUIT_Wait_Events //= (7 => SUIT_Wait_Event_Argument_Day_Of_Week)


SUIT_Wait_Event_Argument_Authorisation = int ; priority
SUIT_Wait_Event_Argument_Power = int ; Power Level
SUIT_Wait_Event_Argument_Network = int ; Network State
SUIT_Wait_Event_Argument_Other_Device_Version = [
    other-device: bstr,
    other-device-version: [+int]
]
SUIT_Wait_Event_Argument_Time = uint ; Timestamp
SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00)
SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday

]]></artwork></figure>

</section>
</section>
</section>
<section anchor="dependency-processing" title="Dependency processing">

<t>Dependencies need careful handling on constrained systems. A dependency tree that is too deep can cause recursive handling to overflow stack space. Systems that parse all dependencies into an object tree can easily fill up available memory. Too many dependencies can overrun available storage space.</t>

<t>The dependency handling system in this document is designed to address as many of these problems as possible.</t>

<t>Dependencies MAY be addressed in one of three ways:</t>

<t><list style="numbers">
  <t>Iterate by component</t>
  <t>Iterate by manifest</t>
  <t>Out-of-order</t>
</list></t>

<t>Because each manifest has a list of components and a list of components defined by its dependencies, it is possible for the manifest processor to handle one component at a time, traversing the manifest tree once for each listed component. This, however consumes significant processing power.</t>

<t>Alternatively, it is possible for a device with sufficient memory to accumulate all parameters for all listed component IDs. This will naturally consume more memory, but it allows the device to process the manifests in a single pass.</t>

<t>It is expected that the simplest and most power sensitive devices will use option 2, with a fixed maximum number of components.</t>

<t>Advanced devices may make use of the Strict Order parameter and enable parallel processing of some segments, or it may reorder some segments. To perform parallel processing, once the Strict Order parameter is set to False, the device may fork a process for each command until the Strict Order parameter is returned to True or the command sequence ends. Then, it joins all forked processes before continuing processing of commands. To perform out-of-order processing, a similar approach is used, except the device consumes all commands after the Strict Order parameter is set to False, then it sorts these commands into its prefered order, invokes them all, then continues processing.</t>

</section>
<section anchor="access-control-lists" title="Access Control Lists">

<t>To manage permissions in the manifest, there are three models that can be used.</t>

<t>First, the simplest model requires that all manifests are authenticated by a single trusted key. This mode has the advantage that only a root manifest needs to be authenticated, since all of its dependencies have digests included in the root manifest.</t>

<t>This simplest model can be extended by adding key delegation without much increase in complexity.</t>

<t>A second model requires an ACL to be presented to the device, authenticated by a trusted party or stored on the device. This ACL grants access rights for specific component IDs or component ID prefixes to the listed identities or identity groups. Any identity may verify an image digest, but fetching into or fetching from a component ID requires approval from the ACL.</t>

<t>A third model allows a device to provide even more fine-grained controls: The ACL lists the component ID or component ID prefix that an identity may use, and also lists the commands that the identity may use in combination with that component ID.</t>

</section>
<section anchor="secconditional" title="Creating conditional sequences">

<t>For some use cases, it is important to provide a sequence that can fail without terminating an update. For example, a dual-image XIP MCU may require an update that can be placed at one of two offsets. This has two implications, first, the digest of each offset will be different. Second, the image fetched for each offset will have a different URI. Conditional sequences allow this to be resolved in a simple way.</t>

<t>The following JSON representation of a manifest demonstrates how this would be represented. It assumes that the bootloader and manifest processor take care of A/B switching and that the manifest is not aware of this distinction.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version" : 1,
    "sequence-number" : 7,
    "components" : [
        {
            "component-identifier" : [0],
            "component-size" : [32567],
        },
    ],
    "common" : [
        "set-component-index" : 0,
        "do-sequence" : [
            "condition-component-offset" : "<offset A>",
            "set-parameters": {
                "component-digest" : "<SHA256 A>"
            }
        ],
        "do-sequence" : [
            "condition-component-offset" : "<offset B>",
            "set-parameters": {
                "component-digest" : "<SHA256 A>"
            }
        ]
    ],
    "fetch" : [
        "set-component-index" : 0,
        "do-sequence" : [
            "condition-component-offset" : "<offset A>",
            "set-parameters": {
                "uri-list" : [[0, "<uri-A>"]]
            }
        ],
        "do-sequence" : [
            "condition-component-offset" : "<offset B>",
            "set-parameters": {
                "uri-list" : [[0, "<uri-B>"]]
            }
        ],
        "fetch" : null
    ]
}
]]></artwork></figure>

</section>
<section anchor="manifest-cddl" title="Full CDDL">

<t>In order to create a valid SUIT Manifest document the structure of the corresponding CBOR message MUST adhere to the following CDDL data definition.</t>

<figure><artwork type="CDDL"><![CDATA[
SUIT_Outer_Wrapper = {
    suit-authentication-wrapper => bstr .cbor SUIT_Authentication_Wrapper / nil,
    suit-manifest               => bstr .cbor SUIT_Manifest,
    suit-dependency-resolution  => bstr .cbor SUIT_Command_Sequence,
    suit-payload-fetch          => bstr .cbor SUIT_Command_Sequence,
    suit-install                => bstr .cbor SUIT_Command_Sequence,
    suit-text                   => bstr .cbor SUIT_Text_Map,
    suit-coswid                 => bstr .cbor concise-software-identity
}
suit-authentication-wrapper = 1
suit-manifest = 2
suit-dependency-resolution = 7
suit-payload-fetch = 8
suit-install = 9
suit-text = 13
suit-coswid = 14

SUIT_Authentication_Wrapper = [ * (
    COSE_Mac_Tagged /
    COSE_Sign_Tagged /
    COSE_Mac0_Tagged /
    COSE_Sign1_Tagged)]


COSE_Mac_Tagged = any
COSE_Sign_Tagged = any
COSE_Mac0_Tagged = any
COSE_Sign1_Tagged = any
COSE_Encrypt_Tagged = any
COSE_Encrypt0_Tagged = any

SUIT_Digest = [
  suit-digest-algorithm-id : $suit-digest-algorithm-ids,
  suit-digest-bytes : bytes,
  ? suit-digest-parameters : any
]

; Named Information Hash Algorithm Identifiers
suit-digest-algorithm-ids /= algorithm-id-sha256
suit-digest-algorithm-ids /= algorithm-id-sha256-128
suit-digest-algorithm-ids /= algorithm-id-sha256-120
suit-digest-algorithm-ids /= algorithm-id-sha256-96
suit-digest-algorithm-ids /= algorithm-id-sha256-64
suit-digest-algorithm-ids /= algorithm-id-sha256-32
suit-digest-algorithm-ids /= algorithm-id-sha384
suit-digest-algorithm-ids /= algorithm-id-sha512
suit-digest-algorithm-ids /= algorithm-id-sha3-224
suit-digest-algorithm-ids /= algorithm-id-sha3-256
suit-digest-algorithm-ids /= algorithm-id-sha3-384
suit-digest-algorithm-ids /= algorithm-id-sha3-512

SUIT_Manifest = {
    suit-manifest-version         => 1,
    suit-manifest-sequence-number => uint,
    ? suit-dependencies           => [ + SUIT_Dependency ],
    ? suit-components             => [ + SUIT_Component ],
    ? suit-dependency-components  => [ + SUIT_Component_Reference ],
    ? suit-common                 => bstr .cbor SUIT_Command_Sequence,
    ? suit-dependency-resolution  => SUIT_Digest / bstr .cbor SUIT_Command_Sequence,
    ? suit-payload-fetch          => SUIT_Digest / bstr .cbor SUIT_Command_Sequence,
    ? suit-install                => SUIT_Digest / bstr .cbor SUIT_Command_Sequence
    ? suit-validate               => bstr .cbor SUIT_Command_Sequence
    ? suit-load                   => bstr .cbor SUIT_Command_Sequence
    ? suit-run                    => bstr .cbor SUIT_Command_Sequence
    ? suit-text-info              => SUIT_Digest / bstr .cbor SUIT_Text_Map
    ? suit-coswid                 => SUIT_Digest / bstr .cbor concise-software-identity
}

suit-manifest-version = 1
suit-manifest-sequence-number = 2
suit-dependencies = 3
suit-components = 4
suit-dependency-components = 5
suit-common = 6
suit-dependency-resolution = 7
suit-payload-fetch = 8
suit-install = 9
suit-validate = 10
suit-load = 11
suit-run = 12
suit-text-info = 13
suit-coswid = 14

concise-software-identity = any

SUIT_Dependency = {
    suit-dependency-digest => SUIT_Digest,
    suit-dependency-prefix => SUIT_Component_Identifier,
}

suit-dependency-digest = 1
suit-dependency-prefix = 2

SUIT_Component_Identifier =  [* bstr]

SUIT_Component = {
    suit-component-identifier => SUIT_Component_Identifier,
    ? suit-component-size => uint,
    ? suit-component-digest => SUIT_Digest,
}

suit-component-identifier = 1
suit-component-size = 2
suit-component-digest = 3

SUIT_Component_Reference = {
    suit-component-identifier => SUIT_Component_Identifier,
    suit-component-dependency-index => uint
}

suit-component-dependency-index = 2

SUIT_Command_Sequence = [ + { SUIT_Condition // SUIT_Directive // SUIT_Command_Custom} ]

SUIT_Command_Custom = (nint => bstr)

SUIT_Condition //= (1 => RFC4122_UUID) ; SUIT_Condition_Vendor_Identifier
SUIT_Condition //= (2 => RFC4122_UUID) ; SUIT_Condition_Class_Identifier
SUIT_Condition //= (3 => RFC4122_UUID) ; SUIT_Condition_Device_Identifier
SUIT_Condition //= (4 => SUIT_Digest) ; SUIT_Condition_Image_Match
SUIT_Condition //= (5 => SUIT_Digest) ; SUIT_Condition_Image_Not_Match
SUIT_Condition //= (6 => uint) ; SUIT_Condition_Use_Before
SUIT_Condition //= (7 => uint) ; SUIT_Condition_Minimum_Battery
SUIT_Condition //= (8 => int) ;  SUIT_Condition_Update_Authorised
SUIT_Condition //= (9 => SUIT_Condition_Version_Argument) ; SUIT_Condition_Version
SUIT_Condition //= (10 => uint) ; SUIT_Condition_Component_Offset
SUIT_Condition //= (nint => bstr) ; SUIT_Condition_Custom

RFC4122_UUID = bstr .size 16

SUIT_Condition_Version_Argument = [
    suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Types,
    suit-condition-version-comparison: SUIT_Condition_Version_Comparison_Value
]
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Greater_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser_Equal
SUIT_Condition_Version_Comparison_Types /= SUIT_Condition_Version_Comparison_Lesser

SUIT_Condition_Version_Comparison_Greater = 1
SUIT_Condition_Version_Comparison_Greater_Equal = 2
SUIT_Condition_Version_Comparison_Equal = 3
SUIT_Condition_Version_Comparison_Lesser_Equal = 4
SUIT_Condition_Version_Comparison_Lesser = 5

SUIT_Condition_Version_Comparison_Value = [+int]

SUIT_Directive //= (11 => uint/bool) ; SUIT_Directive_Set_Component_Index
SUIT_Directive //= (12 => uint/bool) ; SUIT_Directive_Set_Manifest_Index
SUIT_Directive //= (13 => bstr .cbor SUIT_Command_Sequence) ; SUIT_Directive_Run_Sequence
SUIT_Directive //= (14 => bstr .cbor SUIT_Command_Sequence) ; SUIT_Directive_Run_Sequence_Conditional
SUIT_Directive //= (15 => nil) ; SUIT_Directive_Process_Dependency
SUIT_Directive //= (16 => {+ SUIT_Parameters}) ; SUIT_Directive_Set_Parameters
SUIT_Directive //= (19 => {+ SUIT_Parameters}) ; SUIT_Directive_Override_Parameters
SUIT_Directive //= (20 => nil/bstr) ; SUIT_Directive_Fetch
SUIT_Directive //= (21 => nil/bstr) ; SUIT_Directive_Copy
SUIT_Directive //= (22 => nil/bstr) ; SUIT_Directive_Run
SUIT_Directive //= (23 => { + SUIT_Wait_Events }) ; SUIT_Directive_Wait

SUIT_Wait_Events //= (1 => SUIT_Wait_Event_Argument_Authorisation)
SUIT_Wait_Events //= (2 => SUIT_Wait_Event_Argument_Power)
SUIT_Wait_Events //= (3 => SUIT_Wait_Event_Argument_Network)
SUIT_Wait_Events //= (4 => SUIT_Wait_Event_Argument_Other_Device_Version)
SUIT_Wait_Events //= (5 => SUIT_Wait_Event_Argument_Time)
SUIT_Wait_Events //= (6 => SUIT_Wait_Event_Argument_Time_Of_Day)
SUIT_Wait_Events //= (7 => SUIT_Wait_Event_Argument_Day_Of_Week)


SUIT_Wait_Event_Argument_Authorisation = int ; priority
SUIT_Wait_Event_Argument_Power = int ; Power Level
SUIT_Wait_Event_Argument_Network = int ; Network State
SUIT_Wait_Event_Argument_Other_Device_Version = [
    other-device: bstr,
    other-device-version: [+int]
]
SUIT_Wait_Event_Argument_Time = uint ; Timestamp
SUIT_Wait_Event_Argument_Time_Of_Day = uint ; Time of Day (seconds since 00:00:00)
SUIT_Wait_Event_Argument_Day_Of_Week = uint ; Days since Sunday

SUIT_Parameters //= (1 => bool) ; SUIT_Parameter_Strict_Order
SUIT_Parameters //= (2 => bool) ; SUIT_Parameter_Coerce_Condition_Failure
SUIT_Parameters //= (3 => bstr) ; SUIT_Parameter_Vendor_ID
SUIT_Parameters //= (4 => bstr) ; SUIT_Parameter_Class_ID
SUIT_Parameters //= (5 => bstr) ; SUIT_Parameter_Device_ID
SUIT_Parameters //= (6 => bstr .cbor SUIT_URI_List) ; SUIT_Parameter_URI_List
SUIT_Parameters //= (7 => bstr .cbor SUIT_Encryption_Info) ; SUIT_Parameter_Encryption_Info
SUIT_Parameters //= (8 => bstr .cbor SUIT_Compression_Info) ; SUIT_Parameter_Compression_Info
SUIT_Parameters //= (9 => bstr .cbor SUIT_Unpack_Info) ; SUIT_Parameter_Unpack_Info
SUIT_Parameters //= (10 => bstr .cbor SUIT_Component_Identifier) ; SUIT_Parameter_Source_Component
SUIT_Parameters //= (11 => bstr .cbor SUIT_Digest) ; SUIT_Parameter_Image_Digest
SUIT_Parameters //= (12 => uint) ; SUIT_Parameter_Image_Size
SUIT_Parameters //= (nint => int/bool/bstr) ; SUIT_Parameter_Custom

SUIT_URI_List = [ + [priority: int, uri: tstr] ]

SUIT_Encryption_Info = COSE_Encrypt_Tagged/COSE_Encrypt0_Tagged
SUIT_Compression_Info = {
    suit-compression-algorithm => SUIT_Compression_Algorithms
    ? suit-compression-parameters => bstr
}
suit-compression-algorithm = 1
suit-compression-parameters = 2

SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_gzip
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_bzip2
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lz4
SUIT_Compression_Algorithms /= SUIT_Compression_Algorithm_lzma

SUIT_Compression_Algorithm_gzip = 1
SUIT_Compression_Algorithm_bzip2 = 2
SUIT_Compression_Algorithm_deflate = 3
SUIT_Compression_Algorithm_lz4 = 4
SUIT_Compression_Algorithm_lzma = 7

SUIT_Unpack_Info = {
    suit-unpack-algorithm => SUIT_Unpack_Algorithms
    ? suit-unpack-parameters => bstr
}
suit-unpack-algorithm  = 1
suit-unpack-parameters = 2

SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Delta
SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Hex
SUIT_Unpack_Algorithms /= SUIT_Unpack_Algorithm_Elf

SUIT_Unpack_Algorithm_Delta = 1
SUIT_Unpack_Algorithm_Hex = 2
SUIT_Unpack_Algorithm_Elf = 3

SUIT_Text_Map = {int => tstr}
]]></artwork></figure>

</section>
<section anchor="examples" title="Examples">

<t>The following examples demonstrate a small subset of the functionality of the manifest. However, despite this, even a simple manifest processor can execute most of these manifests.</t>

<t>None of these examples include authentication. This is provided via RFC 8152 <xref target="RFC8152"/>, and is omitted for clarity.</t>

<section anchor="example-0" title="Example 0:">

<t>Secure boot only.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 1,
    "components": [
        {
            "id": ["Flash",78848],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        }
    ],
    "run-image": [
        {"directive-set-component": 0},
        {"condition-image": null},
        {"directive-run": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a4010102010481a3018245466c61736843003401021987'
        h'd0038201582000112233445566778899aabbccddeeff0123456789abcdef'
        h'fedcba98765432100c4a83a10b00a104f6a116f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 1
        / components / 4 : [
            {
                / component-identifier / 1 : [h'466c617368', h'003401'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff0123456789abcdef'
                    h'fedcba9876543210'],
            }
        ],
        / run-image / 12 : [
            {/ set-component-index / 11 : 0}
            {/ condition-image / 4 : None}
            {/ run / 22 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 79</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f6025849a4010102010481a3018245466c61736843003401021987d00382015820
00112233445566778899aabbccddeeff0123456789abcdeffedcba98765432100c4a83
a10b00a104f6a116f6
]]></artwork></figure>

</section>
<section anchor="example-1" title="Example 1:">

<t>Simultaneous download and installation of payload.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 2,
    "components": [
        {
            "id": ["Flash",78848],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        }
    ],
    "apply-image": [
        {"directive-set-component": 0},
        {"directive-set-var": {
            "uris": [[ 0, "http://example.com/file.bin"]]
        }},
        {"directive-fetch": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a4010102020481a3018245466c61736843003401021987'
        h'd0038201582000112233445566778899aabbccddeeff0123456789abcdef'
        h'fedcba987654321009582d83a10b00a110a1065820818200781b68747470'
        h'3a2f2f6578616d706c652e636f6d2f66696c652e62696ea114f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 2
        / components / 4 : [
            {
                / component-identifier / 1 : [h'466c617368', h'003401'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            }
        ],
        / apply-image / 9 : [
            {/ set-component-index / 11 : 0}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781b687474703a2f2f6578616d706c'
                    h'652e636f6d2f66696c652e62696e' /
                        [[0, 'http://example.com/file.bin']] /
            }},
            {/ fetch / 20 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 115</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f602586da4010102020481a3018245466c61736843003401021987d00382015820
00112233445566778899aabbccddeeff0123456789abcdeffedcba987654321009582d
83a10b00a110a1065820818200781b687474703a2f2f6578616d706c652e636f6d2f66
696c652e62696ea114f6
]]></artwork></figure>

</section>
<section anchor="example-2" title="Example 2:">

<t>Compatibility test, simultaneous download and installation, and secure boot.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 3,
    "components": [
        {
            "id": [
                "Flash",
                78848
            ],
            "digest": "00112233445566778899aabbccddeeff"
                "0123456789abcdeffedcba9876543210",
            "size": 34768
        }
    ],
    "common": [
        {"condition-vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe"},
        {"condition-class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45"}
    ],
    "apply-image": [
        {"directive-set-component": 0},
        {"directive-set-var": {
            "uris": [[ 0, "http://example.com/file.bin" ]]
        }},
        {"directive-fetch": null}
    ],
    "run-image": [
        {"directive-set-component": 0},
        {"condition-image": null},
        {"directive-run": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a6010102030481a3018245466c61736843003401021987'
        h'd0038201582000112233445566778899aabbccddeeff0123456789abcdef'
        h'fedcba987654321006582782a10150fa6b4a53d5ad5fdfbe9de663e4d41f'
        h'fea102501492af1425695e48bf429b2d51f2ab4509582d83a10b00a110a1'
        h'065820818200781b687474703a2f2f6578616d706c652e636f6d2f66696c'
        h'652e62696ea114f60c4a83a10b00a104f6a116f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 3
        / components / 4 : [
            {
                / component-identifier / 1 : [h'466c617368', h'003401'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            }
        ],
        / common / 6 : [
            {/ vendor-id / 1 : h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' \
                fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe},
            {/ class-id / 2 : h'1492af1425695e48bf429b2d51f2ab45' \
                1492af14-2569-5e48-bf42-9b2d51f2ab45}
        ],
        / apply-image / 9 : [
            {/ set-component-index / 11 : 0}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781b687474703a2f2f6578616d706c65'
                    h'2e636f6d2f66696c652e62696e' /
                    [[0, 'http://example.com/file.bin']] /
            }},
            {/ fetch / 20 : None}
        ],
        / run-image / 12 : [
            {/ set-component-index / 11 : 0}
            {/ condition-image / 4 : None}
            {/ run / 22 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 169</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f60258a3a6010102030481a3018245466c61736843003401021987d00382015820
00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210065827
82a10150fa6b4a53d5ad5fdfbe9de663e4d41ffea102501492af1425695e48bf429b2d
51f2ab4509582d83a10b00a110a1065820818200781b687474703a2f2f6578616d706c
652e636f6d2f66696c652e62696ea114f60c4a83a10b00a104f6a116f6
]]></artwork></figure>

</section>
<section anchor="example-3" title="Example 3:">

<t>Compatibility test, simultaneous download and installation, load from external storage, and secure boot.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 4,
    "components": [
        {
            "id": ["Flash",78848],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        },
        {
            "id": ["RAM",1024],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        }
    ],
    "common": [
        {"condition-vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe"},
        {"condition-class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45"}
    ],
    "apply-image": [
        {"directive-set-component": 0},
        {"directive-set-var": {
            "uris": [[0, "http://example.com/file.bin"]]
        }},
        {"directive-fetch": null}
    ],
    "run-image": [
        {"directive-set-component": 0},
        {"condition-image": null},
        {"directive-set-component": 1},
        {"directive-set-var": {
            "source-index": 0
        }},
        {"directive-fetch": null},
        {"condition-image": null},
        {"directive-run": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a6010102040482a3018245466c61736843003401021987'
        h'd0038201582000112233445566778899aabbccddeeff0123456789abcdef'
        h'fedcba9876543210a301824352414d420004021987d00382015820001122'
        h'33445566778899aabbccddeeff0123456789abcdeffedcba987654321006'
        h'582782a10150fa6b4a53d5ad5fdfbe9de663e4d41ffea102501492af1425'
        h'695e48bf429b2d51f2ab4509582d83a10b00a110a1065820818200781b68'
        h'7474703a2f2f6578616d706c652e636f6d2f66696c652e62696ea114f60c'
        h'581887a10b00a104f6a10b01a110a10a00a114f6a104f6a116f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 4
        / components / 4 : [
            {
                / component-identifier / 1 : [h'466c617368', h'003401'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            },
            {
                / component-identifier / 1 : [h'52414d', h'0004'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            }
        ],
        / common / 6 : [
            {/ vendor-id / 1 : h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' \
                fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe}
            {/ class-id / 2 : h'1492af1425695e48bf429b2d51f2ab45' \
                1492af14-2569-5e48-bf42-9b2d51f2ab45}
        ],
        / apply-image / 9 : [
            {/ set-component-index / 11 : 0}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781b687474703a2f2f6578616d706c65'
                             h'2e636f6d2f66696c652e62696e' /
                    [[0, 'http://example.com/file.bin']] /
            }},
            {/ fetch / 20 : None}
        ],
        / run-image / 12 : [
            {/ set-component-index / 11 : 0}
            {/ condition-image / 4 : None}
            {/ set-component-index / 11 : 1}
            {/ set-vars / 16 : {
                / source-component / 10 : 0
            }},
            {/ fetch / 20 : None}
            {/ condition-image / 4 : None}
            {/ run / 22 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 235</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f60258e5a6010102040482a3018245466c61736843003401021987d00382015820
00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210a30182
4352414d420004021987d0038201582000112233445566778899aabbccddeeff012345
6789abcdeffedcba987654321006582782a10150fa6b4a53d5ad5fdfbe9de663e4d41f
fea102501492af1425695e48bf429b2d51f2ab4509582d83a10b00a110a10658208182
00781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696ea114f60c58
1887a10b00a104f6a10b01a110a10a00a114f6a104f6a116f6
]]></artwork></figure>

</section>
<section anchor="example-4" title="Example 4:">

<t>Compatibility test, simultaneous download and installation, load and decompress from external storage, and secure boot.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 5,
    "components": [
        {
            "id": ["Flash",78848],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        },
        {
            "id": ["RAM",1024],
            "digest": "0123456789abcdeffedcba9876543210"
                      "00112233445566778899aabbccddeeff",
            "size": 34768
        }
    ],
    "common": [
        {"condition-vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe"},
        {"condition-class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45"}
    ],
    "apply-image": [
        {"directive-set-component": 0},
        {"directive-set-var": {
            "uris": [[ 0, "http://example.com/file.bin" ]]
        }},
        {"directive-fetch": null}
    ],
    "load-image": [
        {"directive-set-component": 0},
        {"condition-image": null},
        {"directive-set-component": 1},
        {"directive-set-var": {
            "source-index": 0,
            "compression-info": {
                "algorithm": "gzip"
            }
        }},
        {"directive-copy": null}
    ],
    "run-image": [
        {"condition-image": null},
        {"directive-run": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a7010102050482a3018245466c61736843003401021987'
        h'd0038201582000112233445566778899aabbccddeeff0123456789abcdef'
        h'fedcba9876543210a301824352414d420004021987d00382015820012345'
        h'6789abcdeffedcba987654321000112233445566778899aabbccddeeff06'
        h'582782a10150fa6b4a53d5ad5fdfbe9de663e4d41ffea102501492af1425'
        h'695e48bf429b2d51f2ab4509582d83a10b00a110a1065820818200781b68'
        h'7474703a2f2f6578616d706c652e636f6d2f66696c652e62696ea114f60b'
        h'5585a10b00a104f6a10b01a110a20841f60a00a115f60c4782a104f6a116'
        h'f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 5
        / components / 4 : [
            {
                / component-identifier / 1 : [h'466c617368', h'003401'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            },
            {
                / component-identifier / 1 : [h'52414d', h'0004'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'0123456789abcdeffedcba9876543210'
                    h'00112233445566778899aabbccddeeff'
                ],
            }
        ],
        / common / 6 : [
            {/ vendor-id / 1 : h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' \
                fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe},
            {/ class-id / 2 : h'1492af1425695e48bf429b2d51f2ab45' \
                1492af14-2569-5e48-bf42-9b2d51f2ab45}
        ],
        / apply-image / 9 : [
            {/ set-component-index / 11 : 0}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781b687474703a2f2f6578616d706c65'
                             h'2e636f6d2f66696c652e62696e' /
                    [[0, 'http://example.com/file.bin']] /
            }},
            {/ fetch / 20 : None}
        ],
        / load-image / 11 : [
            {/ set-component-index / 11 : 0}
            {/ condition-image / 4 : None}
            {/ set-component-index / 11 : 1}
            {/ set-vars / 16 : {
                / unknown / 8 : b'\xf6'
                / source-component / 10 : 0
            }},
            {/ copy / 21 : None}
        ],
        / run-image / 12 : [
            {/ condition-image / 4 : None}
            {/ run / 22 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 240</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f60258eaa7010102050482a3018245466c61736843003401021987d00382015820
00112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210a30182
4352414d420004021987d003820158200123456789abcdeffedcba9876543210001122
33445566778899aabbccddeeff06582782a10150fa6b4a53d5ad5fdfbe9de663e4d41f
fea102501492af1425695e48bf429b2d51f2ab4509582d83a10b00a110a10658208182
00781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62696ea114f60b55
85a10b00a104f6a10b01a110a20841f60a00a115f60c4782a104f6a116f6
]]></artwork></figure>

</section>
<section anchor="example-5" title="Example 5:">

<t>Compatibility test, download, installation, and secure boot.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 6,
    "components": [
        {
            "id": [ "ext-Flash", 78848 ],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        },
        {
            "id": ["Flash",1024],
            "digest": "0123456789abcdeffedcba9876543210"
                      "00112233445566778899aabbccddeeff",
            "size": 34768
        }
    ],
    "common": [
        {"condition-vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe"},
        {"condition-class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45"}
    ],
    "apply-image": [
        {"directive-set-component": 0},
        {"directive-set-var": {
            "uris": [[0, "http://example.com/file.bin"]]
        }},
        {"directive-fetch": null}
    ],
    "load-image": [
        {"directive-run-conditional": [
            {"directive-set-component": 1},
            {"condition-not-image": null},
            {"directive-set-component": 0},
            {"condition-image": null},
            {"directive-set-component": 1},
            {"directive-set-var": {
                "source-index": 0
            }},
            {"directive-fetch": null}
        ]}
    ],
    "run-image": [
        {"directive-set-component": 1},
        {"condition-image": null},
        {"directive-run": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a7010102060482a30182496578742d466c617368430034'
        h'01021987d0038201582000112233445566778899aabbccddeeff01234567'
        h'89abcdeffedcba9876543210a3018245466c617368420004021987d00382'
        h'0158200123456789abcdeffedcba987654321000112233445566778899aa'
        h'bbccddeeff06582782a10150fa6b4a53d5ad5fdfbe9de663e4d41ffea102'
        h'501492af1425695e48bf429b2d51f2ab4509582d83a10b00a110a1065820'
        h'818200781b687474703a2f2f6578616d706c652e636f6d2f66696c652e62'
        h'696ea114f60b581d81a10e581887a10b01a105f6a10b00a104f6a10b01a1'
        h'10a10a00a114f60c4a83a10b01a104f6a116f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 6
        / components / 4 : [
            {
                / component-identifier / 1 : [
                    h'6578742d466c617368',
                    h'003401'
                ],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            }
            {
                / component-identifier / 1 : [h'466c617368', h'0004'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'0123456789abcdeffedcba9876543210'
                    h'00112233445566778899aabbccddeeff'
                ],
            }
        ],
        / common / 6 : [
            {/ vendor-id / 1 : h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' \
                fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe}
            {/ class-id / 2 : h'1492af1425695e48bf429b2d51f2ab45' \
                1492af14-2569-5e48-bf42-9b2d51f2ab45}
        ],
        / apply-image / 9 : [
            {/ set-component-index / 11 : 0}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781b687474703a2f2f6578616d706c65'
                             h'2e636f6d2f66696c652e62696e' /
                    [[0, 'http://example.com/file.bin']] /
            }},
            {/ fetch / 20 : None}
        ],
        / load-image / 11 : [
            / conditional-sequence / 14 : [
                {/ set-component-index / 11 : 1}
                {/ condition-not-image / 5 : None}
                {/ set-component-index / 11 : 0}
                {/ condition-image / 4 : None}
                {/ set-component-index / 11 : 1}
                {/ set-vars / 16 : {
                    / source-component / 10 : 0
                }},
                {/ fetch / 20 : None}
            ],
        ],
        / run-image / 12 : [
            {/ set-component-index / 11 : 1}
            {/ condition-image / 4 : None}
            {/ run / 22 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 258</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f60258fca7010102060482a30182496578742d466c61736843003401021987d003
8201582000112233445566778899aabbccddeeff0123456789abcdeffedcba98765432
10a3018245466c617368420004021987d003820158200123456789abcdeffedcba9876
54321000112233445566778899aabbccddeeff06582782a10150fa6b4a53d5ad5fdfbe
9de663e4d41ffea102501492af1425695e48bf429b2d51f2ab4509582d83a10b00a110
a1065820818200781b687474703a2f2f6578616d706c652e636f6d2f66696c652e6269
6ea114f60b581d81a10e581887a10b01a105f6a10b00a104f6a10b01a110a10a00a114
f60c4a83a10b01a104f6a116f6
]]></artwork></figure>

</section>
<section anchor="example-6" title="Example 6:">

<t>Compatibility test, 2 images, simultaneous download and installation, and secure boot.</t>

<t>The following JSON shows the intended behaviour of the manifest.</t>

<figure><artwork type="JSON"><![CDATA[
{
    "structure-version": 1,
    "sequence-number": 7,
    "components": [
        {
            "id": ["Flash",78848],
            "digest": "00112233445566778899aabbccddeeff"
                      "0123456789abcdeffedcba9876543210",
            "size": 34768
        },
        {
            "id": ["Flash",132096],
            "digest": "0123456789abcdeffedcba9876543210"
                      "00112233445566778899aabbccddeeff",
            "size": 76834
        }
    ],
    "common": [
        {"condition-vendor-id": "fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe"},
        {"condition-class-id": "1492af14-2569-5e48-bf42-9b2d51f2ab45"}
    ],
    "apply-image": [
        {"directive-set-component": 0},
        {"directive-set-var": {
            "uris": [[ 0, "http://example.com/file1.bin" ]]
        }},
        {"directive-set-component": 1},
        {"directive-set-var": {
            "uris": [[ 0, "http://example.com/file2.bin" ]]
        }},
        {"directive-set-component": true},
        {"directive-fetch": null}
    ],
    "run-image": [
        {"directive-set-component": true},
        {"condition-image": null},
        {"directive-set-component": 0},
        {"directive-run": null}
    ]
}
]]></artwork></figure>

<t>Converted into the SUIT manifest, this produces:</t>

<figure><artwork><![CDATA[
{
    / auth object / 1 : None
    / manifest / 2 : h'a6010102070482a3018245466c61736843003401021987'
        h'd0038201582000112233445566778899aabbccddeeff0123456789abcdef'
        h'fedcba9876543210a3018245466c61736843000402021a00012c22038201'
        h'58200123456789abcdeffedcba987654321000112233445566778899aabb'
        h'ccddeeff06582782a10150fa6b4a53d5ad5fdfbe9de663e4d41ffea10250'
        h'1492af1425695e48bf429b2d51f2ab4509585b86a10b00a110a106582181'
        h'8200781c687474703a2f2f6578616d706c652e636f6d2f66696c65312e62'
        h'696ea10b01a110a1065821818200781c687474703a2f2f6578616d706c65'
        h'2e636f6d2f66696c65322e62696ea10bf5a114f60c4d84a10bf5a104f6a1'
        h'0b00a116f6' \
    {
        / structure-version / 1 : 1
        / sequence-number / 2 : 7
        / components / 4 : [
            {
                / component-identifier / 1 : [h'466c617368', h'003401'],
                / component-size / 3 : 34768
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'00112233445566778899aabbccddeeff'
                    h'0123456789abcdeffedcba9876543210'
                ],
            }
            {
                / component-identifier / 1 : [h'466c617368', h'000402'],
                / component-size / 3 : 76834
                / component-digest / 2 : [
                    / sha-256 / 1,
                    h'0123456789abcdeffedcba9876543210'
                    h'00112233445566778899aabbccddeeff'
                ],
            }
        ],
        / common / 6 : [
            {/ vendor-id / 1 : h'fa6b4a53d5ad5fdfbe9de663e4d41ffe' \
                fa6b4a53-d5ad-5fdf-be9d-e663e4d41ffe}
            {/ class-id / 2 : h'1492af1425695e48bf429b2d51f2ab45' \
                1492af14-2569-5e48-bf42-9b2d51f2ab45}
        ],
        / apply-image / 9 : [
            {/ set-component-index / 11 : 0}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781c687474703a2f2f6578616d706c'
                             h'652e636f6d2f66696c65312e62696e' /
                                [[0, 'http://example.com/file1.bin']] /
            }},
            {/ set-component-index / 11 : 1}
            {/ set-vars / 16 : {
                / uris / 6 : h'818200781c687474703a2f2f6578616d706c
                             h'652e636f6d2f66696c65322e62696e' /
                                [[0, 'http://example.com/file2.bin']] /
            }},
            {/ set-component-index / 11 : True}
            {/ fetch / 20 : None}
        ],
        / run-image / 12 : [
            {/ set-component-index / 11 : True}
            {/ condition-image / 4 : None}
            {/ set-component-index / 11 : 0}
            {/ run / 22 : None}
        ],
    }
}
]]></artwork></figure>

<t>Total size of outer wrapper without COSE authentication object: 275</t>

<t>Outer:</t>

<figure><artwork><![CDATA[
a201f60259010ca6010102070482a3018245466c61736843003401021987d003820158
2000112233445566778899aabbccddeeff0123456789abcdeffedcba9876543210a301
8245466c61736843000402021a00012c2203820158200123456789abcdeffedcba9876
54321000112233445566778899aabbccddeeff06582782a10150fa6b4a53d5ad5fdfbe
9de663e4d41ffea102501492af1425695e48bf429b2d51f2ab4509585b86a10b00a110
a1065821818200781c687474703a2f2f6578616d706c652e636f6d2f66696c65312e62
696ea10b01a110a1065821818200781c687474703a2f2f6578616d706c652e636f6d2f
66696c65322e62696ea10bf5a114f60c4d84a10bf5a104f6a10b00a116f6
]]></artwork></figure>

</section>
</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>Several registries will be required for:</t>

<t><list style="symbols">
  <t>standard Commands</t>
  <t>standard Parameters</t>
  <t>standard Algorithm identifiers</t>
  <t>standard text values</t>
</list></t>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>This document is about a manifest format describing and protecting firmware images and as such it is part of a larger solution for offering a standardized way of delivering firmware updates to IoT devices. A more detailed discussion about security can be found in the architecture document <xref target="Architecture"/> and in <xref target="Information"/>.</t>

</section>
<section anchor="mailing-list-information" title="Mailing List Information">

<t>The discussion list for this document is located at the e-mail
address <eref target="mailto:suit@ietf.org">suit@ietf.org</eref>. Information on the group and information on how to
subscribe to the list is at <eref target="https://www1.ietf.org/mailman/listinfo/suit">https://www1.ietf.org/mailman/listinfo/suit</eref></t>

<t>Archives of the list can be found at:
<eref target="https://www.ietf.org/mail-archive/web/suit/current/index.html">https://www.ietf.org/mail-archive/web/suit/current/index.html</eref></t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>We would like to thank the following persons for their support in designing this mechanism:</t>

<t><list style="symbols">
  <t>Milosch Meriac</t>
  <t>Geraint Luff</t>
  <t>Dan Ros</t>
  <t>John-Paul Stanford</t>
  <t>Hugo Vincent</t>
  <t>Carsten Bormann</t>
  <t>Øyvind Rønningstad</t>
  <t>Frank Audun Kvamtrø</t>
  <t>Krzysztof Chruściński</t>
  <t>Andrzej Puzdrowski</t>
  <t>Michael Richardson</t>
  <t>David Brown</t>
  <t>Emmanuel Baccelli</t>
</list></t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC4122" target='https://www.rfc-editor.org/info/rfc4122'>
<front>
<title>A Universally Unique IDentifier (UUID) URN Namespace</title>
<author initials='P.' surname='Leach' fullname='P. Leach'><organization /></author>
<author initials='M.' surname='Mealling' fullname='M. Mealling'><organization /></author>
<author initials='R.' surname='Salz' fullname='R. Salz'><organization /></author>
<date year='2005' month='July' />
<abstract><t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier).  A UUID is 128 bits long, and can guarantee uniqueness across space and time.  UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t><t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group).  Information from earlier versions of the DCE specification have been incorporated into this document.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4122'/>
<seriesInfo name='DOI' value='10.17487/RFC4122'/>
</reference>



<reference  anchor="RFC8152" target='https://www.rfc-editor.org/info/rfc8152'>
<front>
<title>CBOR Object Signing and Encryption (COSE)</title>
<author initials='J.' surname='Schaad' fullname='J. Schaad'><organization /></author>
<date year='2017' month='July' />
<abstract><t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size.  There is a need for the ability to have basic security services defined 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></abstract>
</front>
<seriesInfo name='RFC' value='8152'/>
<seriesInfo name='DOI' value='10.17487/RFC8152'/>
</reference>



<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<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>




    </references>

    <references title='Informative References'>





<reference  anchor="RFC6920" target='https://www.rfc-editor.org/info/rfc6920'>
<front>
<title>Naming Things with Hashes</title>
<author initials='S.' surname='Farrell' fullname='S. Farrell'><organization /></author>
<author initials='D.' surname='Kutscher' fullname='D. Kutscher'><organization /></author>
<author initials='C.' surname='Dannewitz' fullname='C. Dannewitz'><organization /></author>
<author initials='B.' surname='Ohlman' fullname='B. Ohlman'><organization /></author>
<author initials='A.' surname='Keranen' fullname='A. Keranen'><organization /></author>
<author initials='P.' surname='Hallam-Baker' fullname='P. Hallam-Baker'><organization /></author>
<date year='2013' month='April' />
<abstract><t>This document defines a set of ways to identify a thing (a digital object in this case) using the output from a hash function.  It specifies a new URI scheme for this purpose, a way to map these to HTTP URLs, and binary and human-speakable formats for these names. The various formats are designed to support, but not require, a strong link to the referenced object, such that the referenced object may be authenticated to the same degree as the reference to it.  The reason for this work is to standardise current uses of hash outputs in URLs and to support new information-centric applications and other uses of hash outputs in protocols.</t></abstract>
</front>
<seriesInfo name='RFC' value='6920'/>
<seriesInfo name='DOI' value='10.17487/RFC6920'/>
</reference>


<reference anchor="Architecture" target="https://tools.ietf.org/html/draft-ietf-suit-architecture-02">
  <front>
    <title>A Firmware Update Architecture for Internet of Things Devices</title>
    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>ARM Limited</organization>
    </author>
    <date year="2019" month="January"/>
  </front>
  <format type="HTML" target="https://tools.ietf.org/html/draft-ietf-suit-architecture-02"/>
</reference>
<reference anchor="Information" target="https://tools.ietf.org/html/draft-ietf-suit-information-model-02">
  <front>
    <title>Firmware Updates for Internet of Things Devices - An Information Model for Manifests</title>
    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>ARM Limited</organization>
    </author>
    <date year="2019" month="January"/>
  </front>
  <format type="HTML" target="https://tools.ietf.org/html/draft-ietf-suit-information-model-02"/>
</reference>
<reference anchor="Behaviour" target="https://datatracker.ietf.org/doc/draft-moran-suit-behavioural-manifest/">
  <front>
    <title>An Information Model for Behavioural Description of Firmware Update and Related Operations</title>
    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>ARM Limited</organization>
    </author>
    <date year="2019" month="March"/>
  </front>
  <format type="HTML" target="https://datatracker.ietf.org/doc/draft-moran-suit-behavioural-manifest/"/>
</reference>


    </references>



  </back>

<!-- ##markdown-source:
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
xIVE+TrxAV41F5M/EoMRLq5LytWBOn4tA0OBdWiE9SsHGw9oowzKwldvCJ+I
FSgMd20Y+3COOdmFmYBvbGy0Kq3aOrDpCMz3trCW272sSyFEY3GKco5VM4HR
K/VmLVPQhh3DUg0ntmpLrJRA6cTu14Xk9Lb8j4G1kfGBkSPL6gWm3n/5+B2Z
UsMf02ep7IFYmckfwesXdbX1/eLOTCgJWo3p1DZ6ZQf2KSbyjws4EVTnBk24
do1AwDCbVem4PDgdgExoKAvnS3dImcmwZ0RKsuHmSZndqUySrHqoFpVGd3cT
uV7RqU8xL8lEt4TN0SDtxbr4ZLZbJBz4iWt99QbX46639s3BwA0C9nNIMEL0
3OZCMh36zARBs9egGVWy7VAmGbKkgshovEHQ2IV3acWxqKnWfgDE01UZJh9T
oiRS+4B0H/Ihg5lfE8EEoeH0h+dafppEWmxjgkGFGiD9pmB1L4lLT3Jt2tRV
vlePCzwpdSbL1cpfKY+BWgRMjY9pZcyG9/x8tRSHRgoeDmaWNEEarkkE/5vw
MfJIlIH4HW8yEzZVrUzUwWWCVcvplslbSfJAKKLkDsW7wvAY+73wgCIyDnuc
ctMvYocdmLoMZTikfR8B6oZ+je0K09ZQJaYkgyui4mR6KuEdCM3wWR+Rhtxq
HXDRXuR0u/Di7KYBPqQAAkstH9KiDu8++f7N2Q+vnz57/s89/TbO55iKBMuV
3dtoDINyOIShkDqCGbPHRLD/RniRvlPvGQbil4ZRaWSJMd4juKoISQMld+Ta
8Q4mEqv3Es+n1tz6NvxOz7Y5sd+S6xZ6MDmAvktlH+fzJScEHZsvuPRunTXb
JP7Cb3HSJoOS359xNXZcyv0v1pkoNmhTN31s0KRhzNigjWvA2PRrq4Rf38JR
H6//uK7C3KD7hp5rk91g3c8Ge2D83NnKvUmTdgmgaaQyARTkEE9pioZHdWRq
GsBMBMXKZk2zlhtS0d3Otc9oeEXTTb/btKCxFqvaOApuDbpwPPu7FaAaYNH6
cVMfqGEUbV+rcKdREmv0TM1dqeGFjZRonVwzRsENTbjVb93qt/6i+q1bBdcm
Ci6T4FptSUHguE23OOtV9USKnmuF53Rt3d/MQ3V/sw/Q/S0wrm7o64Y+Ftbx
SpIxjeSFyQkoz9FfDR3fTWDA8KD2xLoCAaIN0RXtB0nM7iT1Hh5J/9a5Ixje
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
4qNYF3PS2dcqViVoP8gNLqV5dBtcC55XTEtZP4mYd3LFEcNMk+7heRgefVZ2
yKATrEkuJsIN+ClrLMjXRem23awOHqoTnD5D4ToN/drKaIvqyt+6dp5c9JA2
465xzrJFYs1utgyh29nSZTgyiT6bncLr8KdvCZne1z/z19Wmg1kzXw+rXb1M
671Q1ws04KbLb5+JQqA+kqJxs3tA5TpgLN3/HGuvj2v3huOcBAotC2t+6u6i
R4eIrf9D+Gsty224u1t3JdUn2gMnX/4Yvq/1vGFSZsfJS2oEnGGq/HvhH2tT
2SzJO/t6relpk9Tv7Pm1pqONEsI3s3w3O1qTJb6Z9Luri5Wp451k4M32qxPJ
O6nBm003SCtvc4VD88bQmySZ3yyTeBvadGajd3OKt2DJBsnpfdxu6UOy1bt4
ZBK2SZL42zTlt2nKb9OUf4Fpytv84hve7Xrmt46IaHi8t/e0PkpiU1f4Zv/r
Aio29Yhf3fO62AvHVb7Z0WaRGCs86NuhujriYoU/fbO7DaM46g73zY46Azvq
TvjNpl2xHnXH/NaNam+4ylW/2Y0TH3LrwN/W060D/60D/1/Lgb9GxJxT6d07
bkY3dIg8I4fI9tajFa27MsC297Tf4J5tTyrxPWlverCiqYh4HS0PV7RUma6j
6VHbjfju9fMz9NNs6U5ftfd2v623WkKRlk5rX7T3fdxxd3vJSFr3z/+kvfcH
rXCwmUzaQGHfduDkXteU65qRNqStJQPpGGLYNkRNqLadslDNrzs6HDVEyHrz
NyDntTdW6VF5wN0ubHaLnilGicrmJ6XBJ9hNL1wW6UlYoSbOqGRq6AINW0yg
u23Gz6AVaZpqLXlrrUWeXkvbGvtkWdfYaXvH3CnbpHbyjlFcfV1bJ57asjkP
R2BqeX12/ku6uEHzMTQf3aD97JeDG7WeR6sWT6tzRbvOJbiyXNtHcTKdsep8
f9VnsBxXbOuaM+nugzo98XFuSS9a0E1atGOatOpGska3FsFa2hrcagxqdqb+
Bm6XWRVt3eo7lfy2aPN0Nu2YHk/C7nzbcHbL2zp2tN5qfML9EWqGxMe4Zj1l
59+y7tIqTsGl67mKTrBztMqUyzE6mmnWvSU7jEaYOUUfGmf+8DuOvephqNwi
rTjpeI99vI1XbYtDK0X7SQJ0ij8y4XQm3GEQBN+bGDnKnqKz1vIivvuOrSNv
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
Zmnw/wMW5iY+e5wBAA==

-->

</rfc>

