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


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

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

<rfc ipr="trust200902" docName="draft-ietf-suit-firmware-encryption-22" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Encrypted Payloads in SUIT Manifests">Encrypted Payloads in SUIT Manifests</title>

    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization abbrev="H-BRS">University of Applied Sciences Bonn-Rhein-Sieg</organization>
      <address>
        <email>Hannes.Tschofenig@gmx.net</email>
      </address>
    </author>
    <author initials="R." surname="Housley" fullname="Russ Housley">
      <organization abbrev="Vigil Security">Vigil Security, LLC</organization>
      <address>
        <email>housley@vigilsec.com</email>
      </address>
    </author>
    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>Arm Limited</organization>
      <address>
        <email>Brendan.Moran@arm.com</email>
      </address>
    </author>
    <author initials="D." surname="Brown" fullname="David Brown">
      <organization>Linaro</organization>
      <address>
        <email>david.brown@linaro.org</email>
      </address>
    </author>
    <author initials="K." surname="Takayama" fullname="Ken Takayama">
      <organization>SECOM CO., LTD.</organization>
      <address>
        <email>ken.takayama.ietf@gmail.com</email>
      </address>
    </author>

    <date year="2024" month="December" day="07"/>

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

    <abstract>


<?line 95?>

<t>This document specifies techniques for encrypting software, firmware,
machine learning models, and personalization data by utilizing the IETF
SUIT manifest. Key agreement is provided by ephemeral-static (ES)
Diffie-Hellman (DH) and AES Key Wrap (AES-KW). ES-DH uses public key
cryptography while AES-KW uses a pre-shared key. Encryption of the
plaintext is accomplished with conventional symmetric key cryptography.</t>



    </abstract>



  </front>

  <middle>


<?line 104?>

<section anchor="introduction"><name>Introduction</name>

<t>Vulnerabilities in Internet of Things (IoT) devices have highlighted the need for a reliable and secure firmware update mechanism, especially for constrained devices. To protect firmware images, the SUIT manifest format was developed <xref target="I-D.ietf-suit-manifest"/>. A manifest is a bundle of metadata about the firmware for an IoT device, where to find the firmware, and the devices to which it applies. <xref target="RFC9124"/> outlines the necessary information a SUIT manifest has to provide. In addition to protecting against modification via digital signatures or message authentication codes, the format can also offer confidentiality.</t>

<t>Encryption prevents third parties, including attackers, from accessing the payload. Attackers often require detailed knowledge of a binary, such as a firmware image, to launch successful attacks. For instance, return-oriented programming (ROP) <xref target="ROP"/> requires access to the binary, and encryption makes writing exploits significantly more difficult. Beyond ensuring the confidentiality of the binary itself, protecting the confidentiality of the source code will also be necessary to prevent reverse engineering and reproduction of the firmware.</t>

<t>While the initial motivation for this document was firmware encryption, the use of SUIT manifests has expanded to cover other scenarios requiring integrity and confidentiality protection, such as:</t>

<t><list style="symbols">
  <t>software packages,</t>
  <t>personalization data,</t>
  <t>configuration data, and</t>
  <t>machine learning models.</t>
</list></t>

<t>Thus, the term "payload" is used generically to refer to all these objects.</t>

<t>The payload is encrypted using a symmetric content encryption key, which can be established through various mechanisms. This document defines two content key distribution methods for use with the IETF SUIT manifest:</t>

<t><list style="symbols">
  <t>Ephemeral-Static (ES) Diffie-Hellman (DH), and</t>
  <t>AES Key Wrap (AES-KW).</t>
</list></t>

<t>The first method relies on asymmetric cryptography, while the second uses symmetric cryptography.</t>

<t>Our design aims to reduce the number of content key distribution methods for payload encryption, thereby increasing interoperability between different SUIT manifest parser implementations.</t>

<t>The goal of this specification is to protect payloads both during end-to-end transport (from the distribution system to the device) and at rest when stored on the device. Constrained devices often employ eXecute In Place (XIP), a method of executing code directly from flash memory rather than loading it into RAM. Many of these devices lack hardware-based, on-the-fly decryption for code stored in flash memory, which may require decrypting and storing firmware images in on-chip flash before execution. However, we expect hardware-based, on-the-fly decryption to become more common in the future, enhancing confidentiality at rest.</t>

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

<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>This document assumes familiarity with the IETF SUIT manifest <xref target="I-D.ietf-suit-manifest"/>,
the SUIT information model <xref target="RFC9124"/>, and the SUIT architecture <xref target="RFC9019"/>.</t>

<t>The following abbreviations are used in this document:</t>

<t><list style="symbols">
  <t>Key Wrap (KW), defined in <xref target="RFC3394"/> (for use with AES)</t>
  <t>Key-Encryption Key (KEK) <xref target="RFC3394"/></t>
  <t>Content-Encryption Key (CEK) <xref target="RFC5652"/></t>
  <t>Ephemeral-Static (ES) Diffie-Hellman (DH) <xref target="RFC9052"/></t>
  <t>Authenticated Encryption with Associated Data (AEAD)</t>
  <t>Execute in Place (XIP)</t>
</list></t>

<t>The terms sender and recipient have the following meaning:</t>

<t><list style="symbols">
  <t>Sender: Entity that sends an encrypted payload.</t>
  <t>Recipient: Entity that receives an encrypted payload.</t>
</list></t>

<t>Additionally, we introduce the term "distribution system" (or distributor)
to refer to an entity that knows the recipients of payloads. It is important
to note that the distribution system is far more than a file server. For
use of encryption, the distribution system either knows the public key
of the recipient (for ES-DH), or the KEK (for AES-KW).</t>

<t>The author, which is responsible for creating the payload, does not
know the recipients. The author may, for example, be a developer building
a firmware image.</t>

<t>The author and the distribution system are logical roles. In some
deployments these roles are separated in different physical entities
and in others they are co-located.</t>

</section>
<section anchor="arch"><name>Architecture</name>

<t><xref target="RFC9019"/> outlines the architecture for distributing payloads and manifests from an author to devices. However, it does not cover payload encryption in detail. This document extends that architecture to support encryption, as illustrated in <xref target="arch-fig"/>.</t>

<t>To encrypt a payload, it is essential to know the recipient. For AES-KW, the Key Encryption Key (KEK) must be known, and for ES-DH, the sender needs access to the recipient's public key. This public key and its associated parameters may be found in the recipient's X.509 certificate <xref target="RFC5280"/>. For authentication and integrity protection, recipients must be provisioned with a trust anchor when the manifest is protected by a digital signature. If a MAC is used for manifest protection, a symmetric key must be shared between the recipient and the sender.</t>

<t>With encryption, the author cannot simply create and sign a manifest for the payload, as the recipients are often unknown. Therefore, the author must collaborate with the distribution system. The degree of this collaboration is discussed below.</t>

<t>The primary purpose of encryption is to protect against adversaries along the path between the distribution system and the device. There is also a risk that adversaries may extract the decrypted firmware image from the device itself. Consequently, the device must be safeguarded against physical attacks, though such countermeasures are typically beyond the scope of IETF specifications.</t>

<t>Note: It is assumed that the communication between the author and the distribution system is secure. For example, the author might upload the manifest and firmware image to the distribution system using a secure HTTPS REST API.</t>

<figure title="Architecture for the distribution of Encrypted Payloads." anchor="arch-fig"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="472" viewBox="0 0 472 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,32 L 8,96" fill="none" stroke="black"/>
<path d="M 8,160 L 8,224" fill="none" stroke="black"/>
<path d="M 8,288 L 8,352" fill="none" stroke="black"/>
<path d="M 96,32 L 96,96" fill="none" stroke="black"/>
<path d="M 96,160 L 96,224" fill="none" stroke="black"/>
<path d="M 96,288 L 96,352" fill="none" stroke="black"/>
<path d="M 128,64 L 128,320" fill="none" stroke="black"/>
<path d="M 328,160 L 328,208" fill="none" stroke="black"/>
<path d="M 344,48 L 344,80" fill="none" stroke="black"/>
<path d="M 384,88 L 384,152" fill="none" stroke="black"/>
<path d="M 432,48 L 432,80" fill="none" stroke="black"/>
<path d="M 448,160 L 448,208" fill="none" stroke="black"/>
<path d="M 8,32 L 96,32" fill="none" stroke="black"/>
<path d="M 344,48 L 432,48" fill="none" stroke="black"/>
<path d="M 104,64 L 128,64" fill="none" stroke="black"/>
<path d="M 344,80 L 432,80" fill="none" stroke="black"/>
<path d="M 8,96 L 96,96" fill="none" stroke="black"/>
<path d="M 8,160 L 96,160" fill="none" stroke="black"/>
<path d="M 328,160 L 448,160" fill="none" stroke="black"/>
<path d="M 104,192 L 320,192" fill="none" stroke="black"/>
<path d="M 328,208 L 448,208" fill="none" stroke="black"/>
<path d="M 8,224 L 96,224" fill="none" stroke="black"/>
<path d="M 8,288 L 96,288" fill="none" stroke="black"/>
<path d="M 104,320 L 128,320" fill="none" stroke="black"/>
<path d="M 8,352 L 96,352" fill="none" stroke="black"/>
<polygon class="arrowhead" points="392,152 380,146.4 380,157.6 " fill="black" transform="rotate(90,384,152)"/>
<polygon class="arrowhead" points="112,320 100,314.4 100,325.6 " fill="black" transform="rotate(180,104,320)"/>
<polygon class="arrowhead" points="112,192 100,186.4 100,197.6 " fill="black" transform="rotate(180,104,192)"/>
<polygon class="arrowhead" points="112,64 100,58.4 100,69.6 " fill="black" transform="rotate(180,104,64)"/>
<g class="text">
<text x="52" y="52">Device</text>
<text x="48" y="68">1</text>
<text x="388" y="68">Author</text>
<text x="424" y="116">Payload</text>
<text x="464" y="116">+</text>
<text x="428" y="132">Manifest</text>
<text x="52" y="180">Device</text>
<text x="176" y="180">Payload</text>
<text x="216" y="180">+</text>
<text x="260" y="180">Manifest</text>
<text x="388" y="180">Distribution</text>
<text x="48" y="196">2</text>
<text x="388" y="196">System</text>
<text x="56" y="260">...</text>
<text x="52" y="308">Device</text>
<text x="48" y="324">n</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
 +----------+
 |  Device  |                              +----------+
 |    1     |<--+                          |  Author  |
 |          |   |                          +----------+
 +----------+   |                               |
                |                               | Payload +
                |                               | Manifest
                |                               v
 +----------+   |                        +--------------+
 |  Device  |   |  Payload + Manifest    | Distribution |
 |    2     |<--+------------------------|    System    |
 |          |   |                        +--------------+
 +----------+   |
                |
      ...       |
                |
 +----------+   |
 |  Device  |   |
 |    n     |<--+
 |          |
 +----------+
]]></artwork></artset></figure>

<t>When the author delegates encryption rights to the distributor, two models are possible:</t>

<t><list style="numbers" type="1">
  <t>Replacing the COSE_Encrypt and Re-signing the Manifest:
The distributor replaces the COSE_Encrypt structure in the manifest and then signs the manifest again. However, since the COSE_Encrypt structure is within a signed container, this presents a challenge: replacing COSE_Encrypt alters the digest of the manifest, thereby invalidating the signature. As a result, the distributor must be able to sign the new manifest. If this is the case, the distributor gains the authority to construct and sign manifests, effectively allowing them to sign code and giving them full control over the recipient. Distributors typically perform re-encryption online to manage large numbers of devices efficiently, which prevents air-gapping the signing operations. This has implications for the recommendations in <xref section="4.3.17" sectionFormat="of" target="RFC9124"/>. Despite these issues, this model represents the current standard practice for IoT firmware updates.</t>
  <t>Two-Layer Manifest System:
The distributor creates a new manifest that overrides the COSE_Encrypt using the dependency system defined in <xref target="I-D.ietf-suit-trust-domains"/>. This method introduces additional overhead, including one more signature verification, one extra manifest, and the need for extra mechanisms on the recipient side to handle dependency processing. While this adds complexity, it also enhances security.</t>
</list></t>

<t>These two models offer different threat profiles for the distributor. If the distributor is limited to encryption rights, an attacker who breaches the distributor can only launch a limited attack by encrypting a modified binary. However, recipients will detect the attack during the image digest check and immediately revert to the correct image.</t>

<t>It is RECOMMENDED that distributors adopt the two-layer manifest approach to distribute content encryption keys without re-signing the manifest, despite the added complexity and the increased number of signature verifications required on the recipient side.</t>

</section>
<section anchor="parameters"><name>Encryption Extensions</name>

<t>This specification introduces a new extension to the SUIT_Parameters structure.</t>

<t>The SUIT_Encryption_Info structure (referred to as suit-parameter-encryption-info
in <xref target="parameter-fig"/>) contains the content key distribution information. The
details of the SUIT_Encryption_Info structure are provided in <xref target="AES-KW"/> (for
AES-KW) and <xref target="ES-DH"/> (for ES-DH).</t>

<t>Once a CEK is available, the steps outlined in <xref target="content-enc"/> apply to both
content key distribution methods described in this section.</t>

<t>The SUIT_Encryption_Info structure is carried within either the
suit-directive-override-parameters or suit-directive-set-parameters used in
the "Directive Write" and "Directive Copy" operations. An implementation
conforming to this specification must support these two parameters.</t>

<t>Interoperability requirements for content key distribution methods vary:
since a device will typically support only one of the two specified methods,
the distribution system needs to know which method is supported. Limiting a
constrained device to a single content key distribution method also helps
reduce code size.</t>

<figure title="CDDL of the SUIT_Parameters Extension." anchor="parameter-fig"><artwork><![CDATA[
SUIT_Parameters //= (suit-parameter-encryption-info
    => bstr .cbor SUIT_Encryption_Info)

suit-parameter-encryption-info = TBD19
]]></artwork></figure>

<t>RFC Editor's Note (TBD19): The value for the suit-parameter-encryption-info
parameter is set to 19, as the proposed value.</t>

</section>
<section anchor="extended-directives"><name>Extended Directives</name>

<t>This specification extends the following directives:</t>

<t><list style="symbols">
  <t>Directive Write (suit-directive-write): Used to decrypt the content specified
by suit-parameter-content using suit-parameter-encryption-info.</t>
  <t>Directive Copy (suit-directive-copy): Used to decrypt the content of the
component specified by suit-parameter-source-component using suit-parameter-encryption-info.</t>
</list></t>

<t>Examples of these two directives are provided below, focusing on the essential
aspects. A complete example for AES Key Wrap with the Fetch and Copy directives
can be found in <xref target="example-AES-KW-copy"/>, while an example illustrating the
Write directive is shown in <xref target="example-AES-KW-write"/>.</t>

<t><xref target="encryption-info-consumed-with-write"/> illustrates the Directive Write. The
encrypted payload specified by parameter-content, represented as h'EA1...CED'
in the example, is decrypted using the SUIT_Encryption_Info structure referenced
by parameter-encryption-info, i.e., h'D86...1F0'. The resulting plaintext payload
is then stored in component #0.</t>

<figure title="Example showing the extended suit-directive-write." anchor="encryption-info-consumed-with-write"><artwork><![CDATA[
/ directive-override-parameters / 20, {
  / parameter-content / 18: h'EA1...CED',
  / parameter-encryption-info / TBD19: h'D86...1F0'
},
/ directive-write / 18, 15
]]></artwork></figure>

<t>RFC Editor's Note (TBD19): The value for the parameter-encryption-info
parameter is set to 19, as the proposed value.</t>

<t><xref target="encryption-info-consumed-with-copy"/> illustrates the Directive Copy.
In this example the encrypted payload is found at the URI indicated
by the parameter-uri, i.e., "http://example.com/encrypted.bin". The
encrypted payload will be downloaded and stored in component #1.
Then, the information in the SUIT_Encryption_Info structure referred
to by parameter-encryption-info, i.e., h'D86...1F0', will be used to
decrypt the content in component #1 and the resulting plaintext
payload will be stored into component #0.</t>

<figure title="Example showing the extended suit-directive-copy." anchor="encryption-info-consumed-with-copy"><artwork><![CDATA[
/ directive-set-component-index / 12, 1,
/ directive-override-parameters / 20, {
  / parameter-uri / 21: "http://example.com/encrypted.bin",
},
/ directive-fetch / 21, 15,
/ directive-set-component-index / 12, 0,
/ directive-override-parameters / 20, {
  / parameter-encryption-info / TBD19: h'D86...1F0',
  / parameter-source-component / 22: 1
},
/ directive-copy / 22, 15
]]></artwork></figure>

<t>RFC Editor's Note (TBD19): The value for the suit-parameter-encryption-info
parameter is set to 19, as the proposed value.</t>

<t>The payload to be encrypted may be detached and, in that case, it is
not covered by the digital signature or the MAC protecting the manifest.
(To be more precise, the suit-authentication-wrapper found in the envelope
contains a digest of the manifest in the SUIT Digest Container.)</t>

<t>The lack of authentication and integrity protection of the payload is
particularly a concern when a cipher without integrity protection is
used.</t>

<t>To provide authentication and integrity protection of the payload
in the detached payload case a SUIT Digest Container with the hash
of the encrypted and/or plaintext payload MUST be included in the
manifest. See suit-parameter-image-digest parameter in <xref section="8.4.8.6" sectionFormat="of" target="I-D.ietf-suit-manifest"/>.</t>

<t>Once a CEK is available, the steps described in <xref target="content-enc"/> are applicable.
These steps apply to both content key distribution methods.</t>

</section>
<section anchor="content-key-distribution"><name>Content Key Distribution</name>

<t>The following sub-sections describe two content key distribution methods:
AES Key Wrap (AES-KW) and Ephemeral-Static Diffie-Hellman (ES-DH). While
many other methods are specified in the literature and supported by COSE,
AES-KW and ES-DH were chosen for their widespread use in the market today.
They were selected for their maturity, differing security properties, and
strong interoperability.</t>

<t>Both content key distribution methods require the CEKs to be randomly
generated. The guidelines for random number generation in <xref target="RFC8937"/>
MUST be followed.</t>

<t>When sending an encrypted payload to multiple recipients, various
deployment options are available. The following notation is used to
explain these options:</t>

<figure><artwork><![CDATA[
  - KEK[R1, S] refers to a KEK shared between recipient R1 and
    the sender S.
  - CEK[R1, S] refers to a CEK shared between R1 and S.
  - CEK[*, S] or KEK[*, S] are used when a single CEK or a single
    KEK is shared with all authorized recipients by a given sender
    S in a certain context.
  - ENC(plaintext, k) refers to the encryption of plaintext with
    a key k.
]]></artwork></figure>

<section anchor="AES-KW"><name>Content Key Distribution with AES Key Wrap</name>

<section anchor="introduction-1"><name>Introduction</name>

<t>The AES Key Wrap (AES-KW) algorithm, as described in <xref target="RFC3394"/>,
is used to encrypt a randomly generated content-encryption key (CEK)
with a pre-shared key-encryption key (KEK). The COSE conventions for using
AES-KW are specified in <xref section="8.5.2" sectionFormat="of" target="RFC9052"/> and in <xref section="6.2.1" sectionFormat="of" target="RFC9053"/>. The encrypted CEK is carried within the COSE_recipient structure
, which includes the necessary information for AES-KW. The COSE_recipient structure,
a substructure of COSE_Encrypt, contains the CEK
encrypted by the KEK.</t>

<t>To ensure high security when using AES Key Wrap, it is important that the
KEK is of high entropy and that implementations protect the KEK
from disclosure. A compromised KEK could expose all data encrypted with it,
including binaries and configuration data.</t>

<t>The COSE_Encrypt structure conveys the information needed to encrypt the payload,
including details such as the algorithm and IV. Even though the payload may
be conveyed as detached content, the encryption information is still embedded
in the COSE_Encrypt.ciphertext structure.</t>

</section>
<section anchor="deployment-options"><name>Deployment Options</name>

<t>There are three deployment options for use with AES Key Wrap for payload
encryption:</t>

<t><list style="symbols">
  <t>If all recipients (typically of the same product family) share the same KEK,
a single COSE_recipient structure contains the encrypted CEK. The sender executes
the following steps:</t>
</list></t>

<figure><artwork><![CDATA[
     1. Fetch KEK[*, S]
     2. Generate CEK
     3. ENC(CEK, KEK)
     4. ENC(payload, CEK)
]]></artwork></figure>

<t>This deployment option is strongly discouraged. An attacker gaining access to
the KEK will be able to encrypt and send payloads to all recipients configured
to use this KEK.</t>

<t><list style="symbols">
  <t>If recipients have different KEKs, then multiple COSE_recipient structures
are included but only a single CEK is used. Each COSE_recipient structure
contains the CEK encrypted with the KEKs appropriate for a given recipient.
The benefit of this approach is that the payload is encrypted only once with
a CEK while there is no sharing of the KEK across recipients. Hence, authorized
recipients still use their individual KEK to decrypt the CEK and to subsequently
obtain the plaintext. The steps taken by the sender are:</t>
</list></t>

<figure><artwork><![CDATA[
    1.  Generate CEK
    2.  for i=1 to n
        {
    2a.    Fetch KEK[Ri, S]
    2b.    ENC(CEK, KEK[Ri, S])
        }
    3.  ENC(payload, CEK)
]]></artwork></figure>

<t><list style="symbols">
  <t>The third option is to use different CEKs encrypted with KEKs of
authorized recipients. This approach is appropriate when no benefits can
be gained from encrypting and transmitting payloads only once. Assume there
are n recipients with their unique KEKs - KEK[R1, S], ..., KEK[Rn, S] and
unique CEKs. The sender needs to execute the following steps:</t>
</list></t>

<figure><artwork><![CDATA[
    1.  for i=1 to n
        {
    1a.    Fetch KEK[Ri, S]
    1b.    Generate CEK[Ri, S]
    1c.    ENC(CEK[Ri, S], KEK[Ri, S])
    1d.    ENC(payload, CEK[Ri, S])
    2.  }
]]></artwork></figure>

</section>
<section anchor="cddl"><name>CDDL</name>

<t>The CDDL for the AES-KW binary is shown in <xref target="cddl-aeskw"/>.
empty_or_serialized_map and header_map are structures defined in <xref target="RFC9052"/>.</t>

<figure title="CDDL for AES-KW-based Content Key Distribution" anchor="cddl-aeskw"><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

SUIT_Encryption_Info_AESKW = #6.96([
  protected   : outer_header_map_protected,
  unprotected : outer_header_map_unprotected,
  ciphertext  : bstr / nil,
  recipients  : [ + COSE_recipient_AESKW ]
])

outer_header_map_protected = empty_or_serialized_map
outer_header_map_unprotected = header_map

COSE_recipient_AESKW = [
  protected   : bstr .size 0 / bstr .cbor empty_map,
  unprotected : recipient_header_unpr_map_aeskw,
  ciphertext  : bstr        ; CEK encrypted with KEK
]

empty_map = {}

recipient_header_unpr_map_aeskw =
{
    1 => int,     ; algorithm identifier
  ? 4 => bstr,    ; identifier of the KEK pre-shared with the \
                                                            recipient
  * label => values   ; extension point
}
]]></artwork></figure>

<t>Note that the AES-KW algorithm, as defined in <xref section="2.2.3.1" sectionFormat="of" target="RFC3394"/>,
does not have public parameters that vary on a per-invocation basis. Hence,
the protected header in the COSE_recipient structure is a byte string
of zero length.</t>

</section>
</section>
<section anchor="ES-DH"><name>Content Key Distribution with Ephemeral-Static Diffie-Hellman</name>

<section anchor="introduction-2"><name>Introduction</name>

<t>Ephemeral-Static Diffie-Hellman (ES-DH) is a public key encryption scheme
that enables encryption using the recipient's public key. There are several
variations of this scheme; this document adopts the version specified in
<xref section="8.5.5" sectionFormat="of" target="RFC9052"/>.</t>

<t>The structure is composed of two layers:</t>

<t><list style="symbols">
  <t>Layer 0: Contains content encrypted with a Content Encryption Key (CEK).
The content may be provided separately.</t>
  <t>Layer 1: Uses the AES Key Wrap (AES-KW) algorithm to encrypt the randomly
generated CEK with a Key Encryption Key (KEK) derived via ES-DH. The
resulting symmetric key is processed through an HKDF-based key derivation
function <xref target="RFC5869"/>.</t>
</list></t>

<t>This two-layer structure combines ES-DH with AES-KW and HKDF, referred to
as ECDH-ES + AES-KW. An example can be found in <xref target="esdh-aesgcm-example"/>.</t>

<t>Another variant of the ES-DH algorithm, called ECDH-ES + HKDF, does not
utilize AES Key Wrap. However, this version is not covered in this document.</t>

</section>
<section anchor="deployment-options-1"><name>Deployment Options</name>

<t>This approach supports only two deployment options, as it assumes that each
recipient is always equipped with a device-specific public/private key pair.</t>

<t><list style="symbols">
  <t>When a sender transmits a payload to multiple recipients, all recipients
receive the same encrypted payload, meaning the same CEK is used to encrypt
the content. For each recipient, a separate COSE_recipient structure is used,
which contains the CEK encrypted with the recipient-specific KEK. To derive
the KEK, each COSE_recipient structure includes a COSE_recipient_inner
structure that carries the sender's ephemeral key and an identifier for the
recipient's public key.</t>
</list></t>

<t>The steps taken by the sender are:</t>

<figure><artwork><![CDATA[
    1.  Generate CEK
    2.  for i=1 to n
        {
    2a.     Generate KEK[Ri, S] using ES-DH
    2b.     ENC(CEK, KEK[Ri, S])
        }
    3.  ENC(payload,CEK)
]]></artwork></figure>

<t><list style="symbols">
  <t>The alternative is to encrypt the payload with a unique CEK for each
recipient, resulting in multiple manifests. This approach is useful when payloads contain
device-specific information. In this case, the encryption operation becomes
ENC(payload_i, CEK[Ri, S]) where each recipient Ri receives a unique CEK. Assume
that KEK[R1, S],..., KEK[Rn, S] have been generated for the recipients using ES-DH.
The sender must then follow these steps:</t>
</list></t>

<figure><artwork><![CDATA[
    1.  for i=1 to n
        {
    1a.     Generate KEK[Ri, S] using ES-DH
    1b.     Generate CEK[Ri, S]
    1c.     ENC(CEK[Ri, S], KEK[Ri, S])
    1d.     ENC(payload, CEK[Ri, S])
        }
]]></artwork></figure>

</section>
<section anchor="cddl-1"><name>CDDL</name>

<t>The CDDL for the ECDH-ES+AES-KW binary is provided in <xref target="cddl-esdh"/>.
Only the essential parameters are included. The structures empty_or_serialized_map
and header_map are defined in <xref target="RFC9052"/>.</t>

<figure title="CDDL for ES-DH-based Content Key Distribution" anchor="cddl-esdh"><artwork><![CDATA[
SUIT_Encryption_Info_ESDH = #6.96([
  protected   : outer_header_map_protected,
  unprotected : outer_header_map_unprotected,
  ciphertext  : bstr / nil,
  recipients  : [ + COSE_recipient_ESDH ]
])

outer_header_map_protected = empty_or_serialized_map
outer_header_map_unprotected = header_map

COSE_recipient_ESDH = [
  protected   : bstr .cbor recipient_header_map_esdh,
  unprotected : recipient_header_unpr_map_esdh,
  ciphertext  : bstr        ; CEK encrypted with KEK
]

recipient_header_map_esdh =
{
    1 => int,         ; algorithm identifier
  * label => values   ; extension point
}

recipient_header_unpr_map_esdh =
{
  ? 4 => bstr,        ; identifier of the recipient public key
   -1 => COSE_Key,    ; ephemeral public key for the sender
  * label => values   ; extension point
}
]]></artwork></figure>

<t>See <xref target="content-enc"/> for a description on how to encrypt the payload.</t>

</section>
<section anchor="context-information-structure"><name>Context Information Structure</name>

<t>The context information structure ensures that the derived keying material
is "bound" to the specific context of the transaction. This specification
reuses the structure defined in <xref section="5.2" sectionFormat="of" target="RFC9053"/>, with modifications
to fit the current use case.</t>

<t>The following elements are bound to the context:</t>

<t><list style="symbols">
  <t>the protocol employing the key-derivation method,</t>
  <t>information about the utilized AES Key Wrap algorithm, and the key length.</t>
  <t>the protected header field, which contains the content key encryption algorithm.</t>
</list></t>

<t>The sender and recipient identities are left empty.</t>

<t>The following fields in <xref target="cddl-context-info"/> require an explanation:</t>

<t><list style="symbols">
  <t>The COSE_KDF_Context.AlgorithmID field MUST contain the identifier for the
AES Key Wrap algorithm being used. This specification uses the following
values: A128KW (value -3), A192KW (value -4), or A256KW (value -5)</t>
  <t>The COSE_KDF_Context.SuppPubInfo.keyDataLength field MUST specify the key
length, in bits, corresponding to the algorithm in the AlgorithmID field.
For A128KW the value is 128, for A192KW the value is 192, and for A256KW
the value 256.</t>
  <t>The COSE_KDF_Context.SuppPubInfo.other field captures the protocol that
uses the ES-DH content key distribution algorithm. It MUST be set to
the constant string "SUIT Payload Encryption".</t>
  <t>The COSE_KDF_Context.SuppPubInfo.protected field MUST contain the serialized
content of the recipient_header_map_esdh field, which contains (among other
elements) the identifier of the content key distribution method.</t>
</list></t>

<figure title="CDDL for COSE_KDF_Context Structure" anchor="cddl-context-info"><sourcecode type="CDDL"><![CDATA[
COSE_KDF_Context = [
    AlgorithmID : int,
    PartyUInfo : [ PartyInfoSender ],
    PartyVInfo : [ PartyInfoRecipient ],
    SuppPubInfo : [
        keyDataLength : uint,
        protected : bstr,
        other: 'SUIT Payload Encryption'
    ],
    ? SuppPrivInfo : bstr
]

PartyInfoSender = (
    identity : nil,
    nonce : nil,
    other : nil
)

PartyInfoRecipient = (
    identity : nil,
    nonce : nil,
    other : nil
)
]]></sourcecode></figure>

<t>The HKDF-based key derivation function MAY contain a salt value,
as described in <xref section="5.1" sectionFormat="of" target="RFC9053"/>. This optional value
influences the key generation process, though this specification
does not require the use of a salt.  If the salt is public and
included in the message, the "salt" algorithm header parameter
MUST be used. The salt adds extra randomness to the KDF context.
When the salt is transmitted via the "salt" algorithm header
parameter, the receiver MUST be capable of processing it and MUST
pass it into the key derivation function. For more details on salt
usage, refer to <xref target="RFC5869"/> and NIST SP800-56 <xref target="SP800-56"/>.</t>

<t>Profiles of this specification MAY define an extended version of
the context information structure or MAY employ a different context
information structure.</t>

</section>
</section>
</section>
<section anchor="content-enc"><name>Content Encryption</name>

<t>This section summarizes the steps involved in content encryption,
applicable to both content key distribution methods.</t>

<t>When using AEAD ciphers, such as AES-GCM or ChaCha20/Poly1305, the
COSE specification requires a consistent byte stream to create the
authenticated data structure. This structure is illustrated in
<xref target="cddl-enc-aeskw"/> and defined in <xref section="5.3" sectionFormat="of" target="RFC9052"/>.</t>

<figure title="CDDL for Enc_structure Data Structure" anchor="cddl-enc-aeskw"><artwork><![CDATA[
 Enc_structure = [
   context : "Encrypt",
   protected : empty_or_serialized_map,
   external_aad : bstr
 ]
]]></artwork></figure>

<t>This Enc_structure must be populated as follows:</t>

<t><list style="symbols">
  <t>The protected field in the Enc_structure from <xref target="cddl-enc-aeskw"/> refers
to the content of the protected field in the COSE_Encrypt structure.</t>
  <t>The value of external_aad MUST be set to a zero-length byte string,
 represented as h'' in diagnostic notation and encoded as 0x40.</t>
</list></t>

<t>Some ciphers, such as AES-CTR and AES-CBC, provide confidentiality
without integrity protection (see <xref target="RFC9459"/>). For these ciphers,
the Enc_structure shown in <xref target="cddl-enc-aeskw"/> cannot be used, as
the Additional Authenticated Data (AAD) byte string is only
applicable to AEAD ciphers. Therefore, the AAD structure is not
passed to the API for these ciphers, and the protected header in
the SUIT_Encryption_Info structure MUST be a zero-length byte string.</t>

<t>AES-CTR and AES-CBC are discussed in separate sub-sections below and
<xref target="aes-ctr-fig"/> and <xref target="aes-cbc-fig"/> use the following abbreviations:</t>

<t><list style="symbols">
  <t>Pi = Plaintext blocks</t>
  <t>Ci = Ciphertext blocks</t>
  <t>E = Encryption function</t>
  <t>k = Symmetric key</t>
  <t>⊕ = XOR operation</t>
</list></t>

<section anchor="aes-gcm"><name>AES-GCM</name>

<section anchor="introduction-3"><name>Introduction</name>

<t>AES-GCM is an AEAD cipher and provides confidentiality and integrity protection.</t>

<t>Examples in this section use the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm for payload encryption: AES-GCM-128
  <list style="symbols">
      <t>k: h'15F785B5C931414411B4B71373A9C0F7'</t>
      <t>IV: h'F14AAB9D81D51F7AD943FE87AF4F70CD'</t>
    </list></t>
  <t>Plaintext: "This is a real firmware image."
  <list style="symbols">
      <t>in hex: 546869732069732061207265616C206669726D7761726520696D6167652E</t>
    </list></t>
</list></t>

</section>
<section anchor="aes-kw-aes-gcm-example"><name>AES-KW + AES-GCM Example</name>

<t>This example uses the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm id for key wrap: A128KW</t>
  <t>KEK COSE_Key (Secret Key):
  <list style="symbols">
      <t>kty: Symmetric</t>
      <t>k: 'aaaaaaaaaaaaaaaa'</t>
      <t>kid: 'kid-1'</t>
    </list></t>
</list></t>

<t>The COSE_Encrypt structure, in hex format, is (with a line break inserted):</t>

<figure><artwork><![CDATA[
D8608443A10101A1054CF14AAB9D81D51F7AD943FE87F6818340A2012204
456B69642D31581875603FFC9518D794713C8CA8A115A7FB32565A6D5953
4D62
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="aeskw-aesgcm-example"/>.</t>

<figure title="COSE_Encrypt Example for AES Key Wrap" anchor="aeskw-aesgcm-example"><artwork><![CDATA[
96([
  / protected: / << {
    / alg / 1: 1 / A128GCM /
  } >>,
  / unprotected: / {
    / IV / 5: h'F14AAB9D81D51F7AD943FE87'
  },
  / payload: / null / detached ciphertext /,
  / recipients: / [
    [
      / protected: / h'',
      / unprotected: / {
        / alg / 1: -3 / A128KW /,
        / kid / 4: 'kid-1'
      },
      / payload: /
        h'75603FFC9518D794713C8CA8A115A7FB32565A6D59534D62'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

<t>The encrypted payload (with a line feed added) was:</t>

<figure><artwork><![CDATA[
758C4B7BBAE2C4C1D462423E0F0DC3164FFA7B85BB94D4BD6D7ED26AB32F
EB063385D4D3465927EC82CB5E198A59
]]></artwork></figure>

</section>
<section anchor="ecdh-esaes-kw-aes-gcm-example"><name>ECDH-ES+AES-KW + AES-GCM Example</name>

<t>This example uses the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm for content key distribution: ECDH-ES + A128KW</t>
  <t>KEK COSE_Key (Receiver's Private Key):
  <list style="symbols">
      <t>kty: EC2</t>
      <t>crv: P-256</t>
      <t>x: h'5886CD61DD875862E5AAA820E7A15274C968A9BC96048DDCACE32F50C3651BA3'</t>
      <t>y: h'9EED8125E932CD60C0EAD3650D0A485CF726D378D1B016ED4298B2961E258F1B'</t>
      <t>d: h'60FE6DD6D85D5740A5349B6F91267EEAC5BA81B8CB53EE249E4B4EB102C476B3'</t>
      <t>kid: 'kid-2'</t>
    </list></t>
  <t>KDF Context
  <list style="symbols">
      <t>Algorithm ID: -3 (A128KW)</t>
      <t>SuppPubInfo
      <list style="symbols">
          <t>keyDataLength: 128</t>
          <t>protected: { / alg / 1: -29 / ECDH-ES+A128KW / }</t>
          <t>other: 'SUIT Payload Encryption'</t>
        </list></t>
    </list></t>
</list></t>

<t>The COSE_Encrypt structure, in hex format, is (with a line break inserted):</t>

<figure><artwork><![CDATA[
D8608443A10101A1054CF14AAB9D81D51F7AD943FE87F6818344A101381C
A120A40102200121582073024F415AA51529A66CCEFD88F3F62A734492FF
45F6AD37FD2888E73EAF19DA2258204005B48A6FD091AA6ABFE3CFBEEDE8
8B347E521D43405FDBD7D2CFF0EBC21B265818A06B8E6550F308712B1DF0
44B21B7D11D9B22792F1DE0997
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="esdh-aesgcm-example"/>.</t>

<figure title="COSE_Encrypt Example for ES-DH" anchor="esdh-aesgcm-example"><artwork><![CDATA[
96([
  / protected: / << {
    / alg / 1: 1 / A128GCM /
  } >>,
  / unprotected: / {
    / IV / 5: h'F14AAB9D81D51F7AD943FE87'
  },
  / payload: / null / detached ciphertext /,
  / recipients: / [
    [
      / protected: / << {
        / alg / 1: -29 / ECDH-ES + A128KW /
      } >>,
      / unprotected: / {
        / ephemeral key / -1: {
          / kty / 1: 2 / EC2 /,
          / crv / -1: 1 / P-256 /,
          / x / -2: h'73024F415AA51529A66CCEFD88F3F62A
                      734492FF45F6AD37FD2888E73EAF19DA',
          / y / -3: h'4005B48A6FD091AA6ABFE3CFBEEDE88B
                      347E521D43405FDBD7D2CFF0EBC21B26'
        }
      },
      / payload:
        / h'A06B8E6550F308712B1DF044B21B7D11D9B22792F1DE0997'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

<t>The encrypted payload (with a line feed added) was:</t>

<figure><artwork><![CDATA[
758C4B7BBAE2C4C1D462423E0F0DC3164FFA7B85BB94D4BD6D7ED26AB32F
EB063385D4D3465927EC82CB5E198A59
]]></artwork></figure>

</section>
</section>
<section anchor="aes-ctr"><name>AES-CTR</name>

<section anchor="introduction-4"><name>Introduction</name>

<t>AES-CTR is a non-AEAD cipher that provides confidentiality but lacks integrity protection.
Unlike AES-CBC, AES-CTR uses an IV per block, as shown in <xref target="aes-ctr-fig"/>.
Hence, when an image is encrypted using AES-CTR-128 or AES-CTR-256, the IV MUST
start with zero (0) and MUST be incremented by one for each 16-byte plaintext block
within the entire slot.</t>

<t>In our example, we assume the slot size of a specific flash controller on an IoT device
is 64 KiB, the sector size 4096 bytes (4 KiB) and an AES plaintext block size of 16 bytes,
the IVs range from 0 to 255 in the first sector, and 16 * 256 IVs are required for the
remaining sectors in the slot.</t>

<figure title="AES-CTR Operation" anchor="aes-ctr-fig"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="224" viewBox="0 0 224 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 32,96 L 32,176" fill="none" stroke="black"/>
<path d="M 64,48 L 64,88" fill="none" stroke="black"/>
<path d="M 64,224 L 64,240" fill="none" stroke="black"/>
<path d="M 96,96 L 96,176" fill="none" stroke="black"/>
<path d="M 152,96 L 152,176" fill="none" stroke="black"/>
<path d="M 184,48 L 184,88" fill="none" stroke="black"/>
<path d="M 184,224 L 184,240" fill="none" stroke="black"/>
<path d="M 216,96 L 216,176" fill="none" stroke="black"/>
<path d="M 32,96 L 96,96" fill="none" stroke="black"/>
<path d="M 152,96 L 216,96" fill="none" stroke="black"/>
<path d="M 32,176 L 96,176" fill="none" stroke="black"/>
<path d="M 152,176 L 216,176" fill="none" stroke="black"/>
<path d="M 40,208 L 56,208" fill="none" stroke="black"/>
<path d="M 152,208 L 168,208" fill="none" stroke="black"/>
<g class="text">
<text x="64" y="36">IV1</text>
<text x="184" y="36">IV2</text>
<text x="16" y="148">k--</text>
<text x="56" y="148">E</text>
<text x="136" y="148">k--</text>
<text x="176" y="148">E</text>
<text x="64" y="196">|</text>
<text x="184" y="196">|</text>
<text x="28" y="212">P1</text>
<text x="64" y="212">⊕</text>
<text x="140" y="212">P2</text>
<text x="176" y="212">⊕</text>
<text x="68" y="260">C1</text>
<text x="188" y="260">C2</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
         IV1            IV2
          |              |
          |              |
          |              |
      +-------+      +-------+
      |       |      |       |
      |       |      |       |
   k--|  E    |   k--|  E    |
      |       |      |       |
      +-------+      +-------+
          |              |
     P1---⊕        P2---⊕
          |              |
          |              |
          C1             C2
]]></artwork></artset></figure>

<t>Note: The abbreviations shown in <xref target="aes-ctr-fig"/> are described
in <xref target="content-enc"/>.</t>

<t>Examples in this section use the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm for payload encryption: AES-CTR-128
  <list style="symbols">
      <t>k: h'261DE6165070FB8951EC5D7B92A065FE'</t>
      <t>IV: h'DAE613B2E0DC55F4322BE38BDBA9DC68'</t>
    </list></t>
  <t>Plaintext: "This is a real firmware image."
  <list style="symbols">
      <t>in hex: 546869732069732061207265616C206669726D7761726520696D6167652E</t>
    </list></t>
</list></t>

</section>
<section anchor="aes-kw-aes-ctr-example"><name>AES-KW + AES-CTR Example</name>

<t>This example uses the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm id for key wrap: A128KW</t>
  <t>KEK COSE_Key (Secret Key):
  <list style="symbols">
      <t>kty: Symmetric</t>
      <t>k: 'aaaaaaaaaaaaaaaa'</t>
      <t>kid: 'kid-1'</t>
    </list></t>
</list></t>

<t>The COSE_Encrypt structure, in hex format, is (with a line break inserted):</t>

<figure><artwork><![CDATA[
D8608440A20139FFFD0550DAE613B2E0DC55F4322BE38BDBA9DC68F68183
40A2012204456B69642D315818CE34035CE5C2E2666E46D4C131FC561DD1
90A6D26CFA1990
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="aeskw-aesctr-example"/>.</t>

<figure title="COSE_Encrypt Example for AES Key Wrap" anchor="aeskw-aesctr-example"><artwork><![CDATA[
96([
  / protected: / h'',
  / unprotected: / {
    / alg / 1: -65534 / A128CTR /,
    / IV / 5: h'DAE613B2E0DC55F4322BE38BDBA9DC68'
  },
  / payload: / null / detached ciphertext /,
  / recipients: / [
    [
      / protected: / h'',
      / unprotected: / {
        / alg / 1: -3 / A128KW /,
        / kid / 4: 'kid-1'
      },
      / payload: /
        h'CE34035CE5C2E2666E46D4C131FC561DD190A6D26CFA1990'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

<t>The encrypted payload (with a line feed added) was:</t>

<figure><artwork><![CDATA[
2BB8DB522AE978246CC775C3B0241BD4B0333FFDD2DB70C7EE7A4966E3B7
]]></artwork></figure>

</section>
<section anchor="ecdh-esaes-kw-aes-ctr-example"><name>ECDH-ES+AES-KW + AES-CTR Example</name>

<t>This example uses the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm for content key distribution: ECDH-ES + A128KW</t>
  <t>KEK COSE_Key (Receiver's Private Key):
  <list style="symbols">
      <t>kty: EC2</t>
      <t>crv: P-256</t>
      <t>x: h'5886CD61DD875862E5AAA820E7A15274C968A9BC96048DDCACE32F50C3651BA3'</t>
      <t>y: h'9EED8125E932CD60C0EAD3650D0A485CF726D378D1B016ED4298B2961E258F1B'</t>
      <t>d: h'60FE6DD6D85D5740A5349B6F91267EEAC5BA81B8CB53EE249E4B4EB102C476B3'</t>
      <t>kid: 'kid-2'</t>
    </list></t>
  <t>KDF Context
  <list style="symbols">
      <t>Algorithm ID: -3 (A128KW)</t>
      <t>SuppPubInfo
      <list style="symbols">
          <t>keyDataLength: 128</t>
          <t>protected: { / alg / 1: -29 / ECDH-ES+A128KW / }</t>
          <t>other: 'SUIT Payload Encryption'</t>
        </list></t>
    </list></t>
</list></t>

<t>The COSE_Encrypt structure, in hex format, is (with a line break inserted):</t>

<figure><artwork><![CDATA[
D8608440A20139FFFD0550DAE613B2E0DC55F4322BE38BDBA9DC68F68183
44A101381CA120A401022001215820EE0718F6B019C29CC611C18CEDE221
4066DDCEDC2F0DBEF873CB224C715C1174225820279F2A88E4AB9E2ED30C
0FCB69515B31B5D36725BFDB9AE02032ED4D5AB52CB85818E28B4502E4F5
151884A995405579006E9465C3E94E3E0808
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="esdh-aesctr-example"/>.</t>

<figure title="COSE_Encrypt Example for ES-DH" anchor="esdh-aesctr-example"><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

96([
  / protected: / h'',
  / unprotected: / {
    / alg / 1: -65534 / A128CTR /,
    / IV / 5: h'DAE613B2E0DC55F4322BE38BDBA9DC68'
  },
  / payload: / null / detached ciphertext /,
  / recipients: / [
    [
      / protected: / << {
        / alg / 1: -29 / ECDH-ES + A128KW /
      } >>,
      / unprotected: / {
        / ephemeral key / -1: {
          / kty / 1: 2 / EC2 /,
          / crv / -1: 1 / P-256 /,
          / x / -2: h'EE0718F6B019C29CC611C18CEDE22140
                      66DDCEDC2F0DBEF873CB224C715C1174',
          / y / -3: h'279F2A88E4AB9E2ED30C0FCB69515B31
                      B5D36725BFDB9AE02032ED4D5AB52CB8'
        }
      },
      / payload: / h'\
                    E28B4502E4F5151884A995405579006E9465C3E94E3E0808'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

<t>The encrypted payload (with a line feed added) was:</t>

<figure><artwork><![CDATA[
2BB8DB522AE978246CC775C3B0241BD4B0333FFDD2DB70C7EE7A4966E3B7
]]></artwork></figure>

</section>
</section>
<section anchor="aes-cbc"><name>AES-CBC</name>

<section anchor="introduction-5"><name>Introduction</name>

<t>AES-CBC is a non-AEAD cipher that provides confidentiality but does not offer
integrity protection.
In AES-CBC, a single IV is used to  encrypt the firmware belonging to a single sector,
as  individual AES blocks are chained together, as illustrated  in <xref target="aes-cbc-fig"/>. The
numbering  of sectors in a slot start with zero (0) and increase by one with
every sector till the end of the slot is reached. The IV follows this numbering.</t>

<t>For example, let us assume the slot size of a specific flash controller on an IoT device
is 64 KiB, the sector size 4096 bytes (4 KiB) and AES-128-CBC uses an AES-block size of
128 bit (16 bytes). Hence, sector 0 needs 4096/16=256 AES-128-CBC operations using IV 0.
If the firmware image occupies the entire slot, it will contain 16 sectors, corresponding
to IVs ranging from 0 to 15.</t>

<figure title="AES-CBC Operation" anchor="aes-cbc-fig"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="224" viewBox="0 0 224 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 32,112 L 32,192" fill="none" stroke="black"/>
<path d="M 64,80 L 64,104" fill="none" stroke="black"/>
<path d="M 64,200 L 64,256" fill="none" stroke="black"/>
<path d="M 96,112 L 96,192" fill="none" stroke="black"/>
<path d="M 112,72 L 112,224" fill="none" stroke="black"/>
<path d="M 152,112 L 152,192" fill="none" stroke="black"/>
<path d="M 184,80 L 184,104" fill="none" stroke="black"/>
<path d="M 184,200 L 184,256" fill="none" stroke="black"/>
<path d="M 216,112 L 216,192" fill="none" stroke="black"/>
<path d="M 40,64 L 56,64" fill="none" stroke="black"/>
<path d="M 104,64 L 168,64" fill="none" stroke="black"/>
<path d="M 32,112 L 96,112" fill="none" stroke="black"/>
<path d="M 152,112 L 216,112" fill="none" stroke="black"/>
<path d="M 32,192 L 96,192" fill="none" stroke="black"/>
<path d="M 152,192 L 216,192" fill="none" stroke="black"/>
<path d="M 64,224 L 112,224" fill="none" stroke="black"/>
<g class="text">
<text x="60" y="36">P1</text>
<text x="188" y="36">P2</text>
<text x="64" y="52">|</text>
<text x="184" y="52">|</text>
<text x="28" y="68">IV</text>
<text x="64" y="68">⊕</text>
<text x="176" y="68">⊕</text>
<text x="16" y="164">k--</text>
<text x="56" y="164">E</text>
<text x="136" y="164">k--</text>
<text x="176" y="164">E</text>
<text x="68" y="276">C1</text>
<text x="188" y="276">C2</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
       P1              P2
        |              |
   IV---⊕    +--------⊕
        |     |        |
        |     |        |
    +-------+ |    +-------+
    |       | |    |       |
    |       | |    |       |
 k--|  E    | | k--|  E    |
    |       | |    |       |
    +-------+ |    +-------+
        |     |        |
        +-----+        |
        |              |
        |              |
        C1             C2
]]></artwork></artset></figure>

<t>Note: The abbreviations shown in <xref target="aes-cbc-fig"/> are described
in <xref target="content-enc"/>.</t>

<t>Examples in this section use the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm for payload encryption: AES-CBC-128
  <list style="symbols">
      <t>k: h'627FCF0EA82C967D5ED8981EB325F303'</t>
      <t>IV: h'93702C81590F845D9EC866CCAC767BD1'</t>
    </list></t>
  <t>Plaintext: "This is a real firmware image."
  <list style="symbols">
      <t>in hex: 546869732069732061207265616C206669726D7761726520696D6167652E</t>
    </list></t>
</list></t>

</section>
<section anchor="aes-kw-aes-cbc-example"><name>AES-KW + AES-CBC Example</name>

<t>This example uses the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm id for key wrap: A128KW</t>
  <t>KEK COSE_Key (Secret Key):
  <list style="symbols">
      <t>kty: Symmetric</t>
      <t>k: 'aaaaaaaaaaaaaaaa'</t>
      <t>kid: 'kid-1'</t>
    </list></t>
</list></t>

<t>The COSE_Encrypt structure, in hex format, is (with a line break inserted):</t>

<figure><artwork><![CDATA[
D8608440A20139FFFA055093702C81590F845D9EC866CCAC767BD1F68183
40A2012204456B69642D315818E198FF269626EC43299D33586FC7B2646B
13292261160422
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="aeskw-aescbc-example"/>.</t>

<figure title="COSE_Encrypt Example for AES Key Wrap" anchor="aeskw-aescbc-example"><artwork><![CDATA[
96([
  / protected: / h'',
  / unprotected: / {
    / alg / 1: -65531 / A128CBC /,
    / IV / 5: h'93702C81590F845D9EC866CCAC767BD1'
  },
  / payload: / null / detached ciphertext /,
  / recipients: / [
    [
      / protected: / h'',
      / unprotected: / {
        / alg / 1: -3 / A128KW /,
        / kid / 4: 'kid-1'
      },
      / payload: /
        h'E198FF269626EC43299D33586FC7B2646B13292261160422'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

<t>The encrypted payload (with a line feed added) was:</t>

<figure><artwork><![CDATA[
9C09156CF4ACE0401086D98586E0B09FA5B5CF78F2BCCBF6C914DDB42BF0
E21E
]]></artwork></figure>

</section>
<section anchor="ecdh-esaes-kw-aes-cbc-example"><name>ECDH-ES+AES-KW + AES-CBC Example</name>

<t>This example uses the following parameters:</t>

<t><list style="symbols">
  <t>Algorithm for content key distribution: ECDH-ES + A128KW</t>
  <t>KEK COSE_Key (Receiver's Private Key):
  <list style="symbols">
      <t>kty: EC2</t>
      <t>crv: P-256</t>
      <t>x: h'5886CD61DD875862E5AAA820E7A15274C968A9BC96048DDCACE32F50C3651BA3'</t>
      <t>y: h'9EED8125E932CD60C0EAD3650D0A485CF726D378D1B016ED4298B2961E258F1B'</t>
      <t>d: h'60FE6DD6D85D5740A5349B6F91267EEAC5BA81B8CB53EE249E4B4EB102C476B3'</t>
      <t>kid: 'kid-2'</t>
    </list></t>
  <t>KDF Context
  <list style="symbols">
      <t>Algorithm ID: -3 (A128KW)</t>
      <t>SuppPubInfo
      <list style="symbols">
          <t>keyDataLength: 128</t>
          <t>protected: { / alg / 1: -29 / ECDH-ES+A128KW / }</t>
          <t>other: 'SUIT Payload Encryption'</t>
        </list></t>
    </list></t>
</list></t>

<t>The COSE_Encrypt structure, in hex format, is (with a line break inserted):</t>

<figure><artwork><![CDATA[
D8608440A20139FFFA055093702C81590F845D9EC866CCAC767BD1F68183
44A101381CA120A40102200121582084C1768A1AFA92BAF27C3289A3FAF7
5E7511B27C654947BBD391E8A12EB8295B225820F32B0AECA4F8B6C51C15
5037B1FB726CAE3D0C77976864EF725DB2B30ABCE6F6581804928D52CD34
AC8CA0427CEED6D7C5D06A21B5F4F79CAA18
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="esdh-aescbc-example"/>.</t>

<figure title="COSE_Encrypt Example for ES-DH" anchor="esdh-aescbc-example"><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

96([
  / protected: / h'',
  / unprotected: / {
    / alg / 1: -65531 / A128CBC /,
    / IV / 5: h'93702C81590F845D9EC866CCAC767BD1'
  },
  / payload: / null / detached ciphertext /,
  / recipients: / [
    [
      / protected: / << {
        / alg / 1: -29 / ECDH-ES + A128KW /
      } >>,
      / unprotected: / {
        / ephemeral key / -1: {
          / kty / 1: 2 / EC2 /,
          / crv / -1: 1 / P-256 /,
          / x / -2: h'84C1768A1AFA92BAF27C3289A3FAF75E
                      7511B27C654947BBD391E8A12EB8295B',
          / y / -3: h'F32B0AECA4F8B6C51C155037B1FB726C
                      AE3D0C77976864EF725DB2B30ABCE6F6'
        }
      },
      / payload: / h'\
                    04928D52CD34AC8CA0427CEED6D7C5D06A21B5F4F79CAA18'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

<t>The encrypted payload (with a line feed added) was:</t>

<figure><artwork><![CDATA[
9C09156CF4ACE0401086D98586E0B09FA5B5CF78F2BCCBF6C914DDB42BF0
E21E
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="integrity-check-on-encrypted-and-decrypted-payloads"><name>Integrity Check on Encrypted and Decrypted Payloads</name>

<t>In addition to suit-condition-image-match (see <xref section="8.4.9.2" sectionFormat="of" target="I-D.ietf-suit-manifest"/>),
AEAD algorithms used for content encryption provides another way
to validate the integrity of components.
This section provides a guideline to construct secure but not redundant
SUIT Manifest for encrypted payloads.</t>

<section anchor="validating-payload-integrity"><name>Validating Payload Integrity</name>

<t>This sub-section explains three ways to validate the integrity
of payloads.</t>

<section anchor="image-match-after-decryption"><name>Image Match after Decryption</name>

<t>The suit-condition-image-match on the plaintext payload is used after decryption.
An example command sequence is shown in <xref target="_figure-image-match-after-decryption"/>.</t>

<figure title="Check Image Match After Decryption" anchor="_figure-image-match-after-decryption"><artwork><![CDATA[
/ directive-set-component-index / 12, 1,
/ directive-override-parameters / 20, {
  / parameter-uri / 21: "http://example.com/encrypted.bin"
},
/ directive-fetch / 21, 15,

/ directive-set-component-index / 12, 0,
/ directive-override-parameters / 20, {
  / parameter-image-digest / 3: << {
    / algorithm-id: / -16 / SHA256 /,
    / digest-bytes: / h'3B1...92A' / digest of plaintext payload /
  } >>,
  / parameter-image-size / 14: 30 / size of plaintext payload /,
  / parameter-encryption-info / TBD19: h'369...50F',
  / parameter-source-component / 22: 1
},
/ directive-copy / 22, 15,
/ condition-image-match / 3, 15 / check decrypted payload integrity /,
]]></artwork></figure>

<t>RFC Editor's Note (TBD19): The value for the suit-parameter-encryption-info
parameter is set to 19, as the proposed value.</t>

</section>
<section anchor="image-match-before-decryption"><name>Image Match before Decryption</name>

<t>The suit-condition-image-match can also be applied on encrypted payloads
before decryption takes place. An example command sequence is shown in
<xref target="_figure-image-match-before-decryption"/>.</t>

<t>This option mitigates battery exhaustion attacks discussed in <xref target="sec-cons"/>.</t>

<figure title="Check Image Match Before Decryption" anchor="_figure-image-match-before-decryption"><artwork><![CDATA[
/ directive-set-component-index / 12, 1,
/ directive-override-parameters / 20, {
  / parameter-image-digest / 3: << {
    / algorithm-id: / -16 / SHA256 /,
    / digest-bytes: / h'8B4...D34' / digest of encrypted payload /
  } >>,
  / parameter-image-size / 14: 30 / size of encrypted payload /,
  / parameter-uri / 21: "http://example.com/encrypted.bin"
},
/ directive-fetch / 21, 15,
/ condition-image-match / 3, 15 / check decrypted payload integrity /,

/ directive-set-component-index / 12, 0,
/ directive-override-parameters / 20, {
  / parameter-encryption-info / TBD19: h'D86...1F0',
  / parameter-source-component / 22: 1
},
/ directive-copy / 22, 15,
]]></artwork></figure>

<t>RFC Editor's Note (TBD19): The value for the suit-parameter-encryption-info
parameter is set to 19, as the proposed value.</t>

</section>
<section anchor="checking-authentication-tag-while-decrypting"><name>Checking Authentication Tag while Decrypting</name>

<t>AEAD algorithms, such as AES-GCM and ChaCha20/Poly1305, verify the integrity of
the encrypted concent.</t>

</section>
</section>
<section anchor="payload-integrity-validation"><name>Payload Integrity Validation</name>

<t>This subsection offers guidelines for validating the integrity of payloads within
the SUIT manifest. The decision tree in <xref target="payload-integrity-decision-tree"/>
illustrates the process for establishing payload integrity.</t>

<figure title="Decision Tree: Validating the Payload" anchor="payload-integrity-decision-tree"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="408" viewBox="0 0 408 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,32 L 8,64" fill="none" stroke="black"/>
<path d="M 8,352 L 8,368" fill="none" stroke="black"/>
<path d="M 24,64 L 24,328" fill="none" stroke="black"/>
<path d="M 64,240 L 64,272" fill="none" stroke="black"/>
<path d="M 80,272 L 80,328" fill="none" stroke="black"/>
<path d="M 96,352 L 96,368" fill="none" stroke="black"/>
<path d="M 136,128 L 136,176" fill="none" stroke="black"/>
<path d="M 136,352 L 136,368" fill="none" stroke="black"/>
<path d="M 152,176 L 152,232" fill="none" stroke="black"/>
<path d="M 192,272 L 192,328" fill="none" stroke="black"/>
<path d="M 208,240 L 208,272" fill="none" stroke="black"/>
<path d="M 248,352 L 248,368" fill="none" stroke="black"/>
<path d="M 288,352 L 288,368" fill="none" stroke="black"/>
<path d="M 384,64 L 384,120" fill="none" stroke="black"/>
<path d="M 384,176 L 384,328" fill="none" stroke="black"/>
<path d="M 400,32 L 400,64" fill="none" stroke="black"/>
<path d="M 400,128 L 400,176" fill="none" stroke="black"/>
<path d="M 400,352 L 400,368" fill="none" stroke="black"/>
<path d="M 8,32 L 400,32" fill="none" stroke="black"/>
<path d="M 8,64 L 400,64" fill="none" stroke="black"/>
<path d="M 136,128 L 400,128" fill="none" stroke="black"/>
<path d="M 136,176 L 400,176" fill="none" stroke="black"/>
<path d="M 64,240 L 208,240" fill="none" stroke="black"/>
<path d="M 64,272 L 208,272" fill="none" stroke="black"/>
<path d="M 24,336 L 80,336" fill="none" stroke="black"/>
<path d="M 152,336 L 232,336" fill="none" stroke="black"/>
<path d="M 304,336 L 384,336" fill="none" stroke="black"/>
<path d="M 24,384 L 80,384" fill="none" stroke="black"/>
<path d="M 152,384 L 232,384" fill="none" stroke="black"/>
<path d="M 304,384 L 384,384" fill="none" stroke="black"/>
<path d="M 24,336 C 15.16936,336 8,343.16936 8,352" fill="none" stroke="black"/>
<path d="M 80,336 C 88.83064,336 96,343.16936 96,352" fill="none" stroke="black"/>
<path d="M 152,336 C 143.16936,336 136,343.16936 136,352" fill="none" stroke="black"/>
<path d="M 232,336 C 240.83064,336 248,343.16936 248,352" fill="none" stroke="black"/>
<path d="M 304,336 C 295.16936,336 288,343.16936 288,352" fill="none" stroke="black"/>
<path d="M 384,336 C 392.83064,336 400,343.16936 400,352" fill="none" stroke="black"/>
<path d="M 24,384 C 15.16936,384 8,376.83064 8,368" fill="none" stroke="black"/>
<path d="M 80,384 C 88.83064,384 96,376.83064 96,368" fill="none" stroke="black"/>
<path d="M 152,384 C 143.16936,384 136,376.83064 136,368" fill="none" stroke="black"/>
<path d="M 232,384 C 240.83064,384 248,376.83064 248,368" fill="none" stroke="black"/>
<path d="M 304,384 C 295.16936,384 288,376.83064 288,368" fill="none" stroke="black"/>
<path d="M 384,384 C 392.83064,384 400,376.83064 400,368" fill="none" stroke="black"/>
<polygon class="arrowhead" points="392,328 380,322.4 380,333.6 " fill="black" transform="rotate(90,384,328)"/>
<polygon class="arrowhead" points="392,120 380,114.4 380,125.6 " fill="black" transform="rotate(90,384,120)"/>
<polygon class="arrowhead" points="200,328 188,322.4 188,333.6 " fill="black" transform="rotate(90,192,328)"/>
<polygon class="arrowhead" points="160,232 148,226.4 148,237.6 " fill="black" transform="rotate(90,152,232)"/>
<polygon class="arrowhead" points="88,328 76,322.4 76,333.6 " fill="black" transform="rotate(90,80,328)"/>
<polygon class="arrowhead" points="32,328 20,322.4 20,333.6 " fill="black" transform="rotate(90,24,328)"/>
<g class="text">
<text x="136" y="52">Q1.</text>
<text x="184" y="52">Payload</text>
<text x="252" y="52">Delivery</text>
<text x="44" y="100">in</text>
<text x="88" y="100">Content</text>
<text x="348" y="100">others</text>
<text x="200" y="148">Q2.</text>
<text x="252" y="148">Mitigate</text>
<text x="320" y="148">Battery</text>
<text x="236" y="164">Exhaustion</text>
<text x="312" y="164">Attacks</text>
<text x="172" y="212">No</text>
<text x="360" y="212">Yes</text>
<text x="88" y="260">Q3.</text>
<text x="124" y="260">AEAD</text>
<text x="172" y="260">cipher</text>
<text x="104" y="308">Yes</text>
<text x="172" y="308">No</text>
<text x="48" y="356">NOT</text>
<text x="192" y="356">AFTER</text>
<text x="340" y="356">BEFORE</text>
<text x="52" y="372">Required</text>
<text x="188" y="372">Decryption</text>
<text x="340" y="372">Decryption</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
+------------------------------------------------+
|              Q1. Payload Delivery              |
+-+--------------------------------------------+-+
  |                                            |
  | in Content                          others |
  |                                            v
  |             +--------------------------------+
  |             |      Q2. Mitigate Battery      |
  |             |       Exhaustion Attacks       |
  |             +-+----------------------------+-+
  |               |                            |
  |               | No                     Yes |
  |               v                            |
  |    +-----------------+                     |
  |    | Q3. AEAD cipher |                     |
  |    +-+-------------+-+                     |
  |      |             |                       |
  |      | Yes      No |                       |
  v      v             v                       v
 .+------+.      .-----+-----.      .----------+.
|   NOT    |    |    AFTER    |    |   BEFORE    |
| Required |    | Decryption  |    | Decryption  |
 '--------'      '-----------'      '-----------'
]]></artwork></artset></figure>

<t>There are three questions to ask:</t>

<t><list style="symbols">
  <t>Q1. How does the recipient receive the encrypted payload?
If the encrypted payload is part of an integrated payload, its integrity is already validated by the suit-authentication-wrapper. Hence, no additional integrity check is necessary.</t>
  <t>Q2. Does the sender wish to mitigate battery exhaustion attacks?
If so, the encrypted payload must be validated before decryption.</t>
  <t>Q3. Is the payload encrypted with an AEAD cipher?
If yes, no additional integrity check is required, as the recipient verifies
the payload's integrity during decryption. If no, integrity validation can
occur either before or after decryption; however, validating integrity before
decryption is RECOMMENDED.</t>
</list></t>

</section>
</section>
<section anchor="flash"><name>Firmware Updates on IoT Devices with Flash Memory</name>

<t>Embedded devices come in many forms, and the market is both large and fragmented.
As a result, some implementations and deployments may adopt firmware update
procedures that differ from the descriptions provided here. On a positive note,
the SUIT manifest accommodates various deployment scenarios, thanks to the
"scripting" functionality offered by its commands.</t>

<t>This section specifically addresses firmware images on microcontrollers and does
not pertain to generic software, configuration data, or machine learning models.
The differences arise from two main aspects:</t>

<t><list style="symbols">
  <t>Use of Flash Memory: Flash memory in microcontrollers is a type of non-volatile
memory that erases data in larger units called blocks, pages, or sectors, and
rewrites data at the byte level (often 4 bytes) or larger units. Furthermore,
flash memory is segmented into different regions, storing the bootloader, various
versions of firmware images (in designated slots), and configuration data. An
example layout of a microcontroller flash area is illustrated in <xref target="image-layout"/>.</t>
  <t>Microcontroller Design: Code on microcontrollers typically cannot be executed
from arbitrary locations in flash memory without additional software development
and design efforts. Consequently, developers often compile firmware so that the
bootloader can execute code from a specific location in flash memory, commonly
referred to as the "primary slot."</t>
</list></t>

<t>Once the encrypted firmware image is transferred to the device, it is usually
stored in a dedicated area known as the "secondary slot."</t>

<t>During the next boot, the bootloader detects the new firmware image and begins
decrypting it sector by sector, swapping it with the image located in the primary
slot. This method of swapping the newly downloaded image with the previously
valid one requires two slots, allowing for a rollback if the new firmware fails
to boot, thereby enhancing the robustness of the firmware update process.</t>

<t>The swap occurs only after verifying the signature on the plaintext. It is
important to note that the plaintext firmware image is available in the primary
slot only after the swap is completed, unless "dummy decrypt" is used to compute
the hash over the plaintext prior to executing the decryption during the swap.
In this context, dummy decryption refers to decrypting the firmware image in the
secondary slot sector by sector while computing a rolling hash over the resulting
plaintext (also sector by sector) without performing the swap operation. Although
performance optimizations, such as conveying hashes for each sector in the manifest
rather than a hash of the entire firmware image, are possible, these optimizations
are not detailed in this specification.</t>

<t>Without hardware-based, on-the-fly decryption, the image in the primary slot is
available in cleartext and may need to be re-encrypted before copying it to the
secondary slot. This step might be necessary if the secondary slot has different
access permissions or is located in off-chip flash memory, which tends to be more
vulnerable to physical attacks.</t>

<figure title="Example Flash Area Layout" anchor="image-layout"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="424" viewBox="0 0 424 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,32 L 8,528" fill="none" stroke="black"/>
<path d="M 416,32 L 416,528" fill="none" stroke="black"/>
<path d="M 8,32 L 416,32" fill="none" stroke="black"/>
<path d="M 8,64 L 416,64" fill="none" stroke="black"/>
<path d="M 8,256 L 416,256" fill="none" stroke="black"/>
<path d="M 8,448 L 416,448" fill="none" stroke="black"/>
<path d="M 8,496 L 416,496" fill="none" stroke="black"/>
<path d="M 8,528 L 416,528" fill="none" stroke="black"/>
<g class="text">
<text x="60" y="52">Bootloader</text>
<text x="48" y="84">Primary</text>
<text x="100" y="84">Slot</text>
<text x="360" y="100">(sector</text>
<text x="404" y="100">1)</text>
<text x="212" y="116">..................................................</text>
<text x="360" y="148">(sector</text>
<text x="404" y="148">2)</text>
<text x="212" y="164">..................................................</text>
<text x="360" y="196">(sector</text>
<text x="404" y="196">3)</text>
<text x="212" y="212">..................................................</text>
<text x="360" y="244">(sector</text>
<text x="404" y="244">4)</text>
<text x="56" y="276">Secondary</text>
<text x="116" y="276">Slot</text>
<text x="360" y="292">(sector</text>
<text x="404" y="292">1)</text>
<text x="212" y="308">..................................................</text>
<text x="360" y="340">(sector</text>
<text x="404" y="340">2)</text>
<text x="212" y="356">..................................................</text>
<text x="360" y="388">(sector</text>
<text x="404" y="388">3)</text>
<text x="212" y="404">..................................................</text>
<text x="360" y="436">(sector</text>
<text x="404" y="436">4)</text>
<text x="36" y="468">Swap</text>
<text x="76" y="468">Area</text>
<text x="72" y="516">Configuration</text>
<text x="148" y="516">Data</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
+--------------------------------------------------+
| Bootloader                                       |
+--------------------------------------------------+
| Primary Slot                                     |
|                                        (sector 1)|
|..................................................|
|                                                  |
|                                        (sector 2)|
|..................................................|
|                                                  |
|                                        (sector 3)|
|..................................................|
|                                                  |
|                                        (sector 4)|
+--------------------------------------------------+
| Secondary Slot                                   |
|                                        (sector 1)|
|..................................................|
|                                                  |
|                                        (sector 2)|
|..................................................|
|                                                  |
|                                        (sector 3)|
|..................................................|
|                                                  |
|                                        (sector 4)|
+--------------------------------------------------+
| Swap Area                                        |
|                                                  |
+--------------------------------------------------+
| Configuration Data                               |
+--------------------------------------------------+
]]></artwork></artset></figure>

<t>The ability to resume an interrupted firmware update is often essential
for unattended devices, including low-end, constrained IoT devices. To
meet this requirement, a firmware image must be divided into sectors, with
each sector encrypted individually using a cipher that does not increase
the size of the resulting ciphertext (i.e., by avoiding the addition of
an authentication tag after each encrypted block).</t>

<t>If an update is aborted while the bootloader is decrypting the newly received
image and swapping the sectors, the bootloader can restart from where it
left off. This technique enhances robustness and performance.</t>

<t>For this purpose, ciphers without integrity protection are employed to
encrypt the firmware image. It is crucial that integrity protection for the
firmware image is provided, and the suit-parameter-image-digest, defined in
<xref section="8.4.8.6" sectionFormat="of" target="I-D.ietf-suit-manifest"/>, MUST be utilized.</t>

<t><xref target="RFC9459"/> specifies the AES Counter (AES-CTR) mode and AES Cipher Block
Chaining (AES-CBC) ciphers, both of which do not provide integrity protection.
These ciphers are suitable for firmware encryption in IoT devices. However,
for many other scenarios involving software packages, configuration information,
or personalization data, the use of AEAD ciphers is RECOMMENDED.</t>

<t>The following subsections offer additional information on the selection of
initialization vectors (IVs) for use with AES-CBC and AES-CTR in the context
of firmware encryption. An IV MUST NOT be reused when the same key is employed.
In this application, the IVs are not random but are instead based on the
slot/sector combination in flash memory. The discussion assumes that the
block size of AES is significantly smaller than the sector size. Typically,
flash memory sectors are measured in KiB, necessitating the decryption of
multiple AES blocks to complete the decryption of an entire sector.</t>

</section>
<section anchor="complete-examples"><name>Complete Examples</name>

<t>The following manifests illustrate how to deliver an encrypted payload along
with its encryption information to devices.</t>

<t>In the AES-KW examples, HMAC-256 MACs are included, utilizing the following
secret key:</t>

<figure><artwork><![CDATA[
  'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
  (616161... in hex, and its length is 32)
]]></artwork></figure>

<t>ES-DH examples are signed using the following ECDSA secp256r1 key:</t>

<figure><artwork><![CDATA[
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgApZYjZCUGLM50VBC
CjYStX+09jGmnyJPrpDLTz/hiXOhRANCAASEloEarguqq9JhVxie7NomvqqL8Rtv
P+bitWWchdvArTsfKktsCYExwKNtrNHXi9OB3N+wnAUtszmR23M4tKiW
-----END PRIVATE KEY-----
]]></artwork></figure>

<t>The corresponding public key can be used to verify these examples:</t>

<figure><artwork><![CDATA[
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhJaBGq4LqqvSYVcYnuzaJr6qi/Eb
bz/m4rVlnIXbwK07HypLbAmBMcCjbazR14vTgdzfsJwFLbM5kdtzOLSolg==
-----END PUBLIC KEY-----
]]></artwork></figure>

<t>Each example uses SHA-256 as the digest function.</t>

<section anchor="example-AES-KW-write"><name>AES Key Wrap Example with Write Directive</name>

<t>The following SUIT manifest instructs a parser to authenticate the manifest
using COSE_Mac0 with HMAC256. It also directs the parser to write and decrypt
the encrypted payload into a component using the suit-directive-write directive.</t>

<t>The SUIT manifest in diagnostic notation (with line breaks added for clarity) is displayed below:</t>

<figure><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

/  1/ / SUIT_Envelope_Tagged / 107({
/  2/   / authentication-wrapper / 2: << [
/  3/     << [
/  4/       / digest-algorithm-id: / -16 / SHA256 /,
/  5/       / digest-bytes: / h'037A5C325CE14078A0AADF007428EAC6
/  6/                           59361AD9402A732410BDA542FAE94E2C'
/  7/     ] >>,
/  8/     << / COSE_Mac0_Tagged / 17([
/  9/       / protected: / << {
/ 10/         / algorithm-id / 1: 5 / HMAC256 /
/ 11/       } >>,
/ 12/       / unprotected: / {},
/ 13/       / payload: / null,
/ 14/       / tag: / h'8D92599011C451A4C5FB69709FA6CA6C
/ 15/                  0F846D692BDBB3F624EC91F82F9F620A'
/ 16/     ]) >>
/ 17/   ] >>,
/ 18/   / manifest / 3: << {
/ 19/     / manifest-version / 1: 1,
/ 20/     / manifest-sequence-number / 2: 1,
/ 21/     / common / 3: << {
/ 22/       / components / 2: [
/ 23/         ['plaintext-firmware']
/ 24/       ]
/ 25/     } >>,
/ 26/     / install / 20: << [
/ 27/       / fetch encrypted firmware /
/ 28/       / directive-override-parameters / 20, {
/ 29/         / parameter-content / 18:
/ 30/           h'758C4B7BBAE2C4C1D462423E0F0DC3164FFA7B85BB94D4
/ 31/             BD6D7ED26AB32FEB063385D4D3465927EC82CB5E198A59',
/ 32/         / parameter-encryption-info / 19: << 96([
/ 33/           / protected: / << {
/ 34/             / alg / 1: 1 / A128GCM /
/ 35/           } >>,
/ 36/           / unprotected: / {
/ 37/             / IV / 5: h'F14AAB9D81D51F7AD943FE87'
/ 38/           },
/ 39/           / payload: / null / detached ciphertext /,
/ 40/           / recipients: / [
/ 41/             [
/ 42/               / protected: / h'',
/ 43/               / unprotected: / {
/ 44/                 / alg / 1: -3 / A128KW /,
/ 45/                 / kid / 4: 'kid-1'
/ 46/               },
/ 47/               / payload: /
/ 48/               h'\
                    75603FFC9518D794713C8CA8A115A7FB32565A6D59534D62'
/ 49/                 / CEK encrypted with KEK /
/ 50/             ]
/ 51/           ]
/ 52/         ]) >>
/ 53/       },
/ 54/ 
/ 55/       / decrypt encrypted firmware /
/ 56/       / directive-write / 18, 15
/ 57/         / consumes the SUIT_Encryption_Info above /
/ 58/     ] >>
/ 59/   } >>
/ 60/ })
]]></artwork></figure>

<t>In hex format, the SUIT manifest is:</t>

<figure><artwork><![CDATA[
D86BA2025853825824822F5820037A5C325CE14078A0AADF007428EAC659
361AD9402A732410BDA542FAE94E2C582AD18443A10105A0F658208D9259
9011C451A4C5FB69709FA6CA6C0F846D692BDBB3F624EC91F82F9F620A03
5898A4010102010357A102818152706C61696E746578742D6669726D7761
72651458778414A212582E758C4B7BBAE2C4C1D462423E0F0DC3164FFA7B
85BB94D4BD6D7ED26AB32FEB063385D4D3465927EC82CB5E198A5913583E
D8608443A10101A1054CF14AAB9D81D51F7AD943FE87F6818340A2012204
456B69642D31581875603FFC9518D794713C8CA8A115A7FB32565A6D5953
4D62120F
]]></artwork></figure>

</section>
<section anchor="example-AES-KW-copy"><name>AES Key Wrap Example with Fetch + Copy Directives</name>

<t>The following SUIT manifest instructs a parser to fetch and store the
encrypted payload. Subsequently, the payload is decrypted and copied into
another component using the suit-directive-copy directive. This approach
is particularly effective for constrained devices with execute-in-place
(XIP) flash memory.</t>

<t>The SUIT manifest in diagnostic notation (with line breaks added for
clarity) is displayed below:</t>

<figure><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

/  1/ / SUIT_Envelope_Tagged / 107({
/  2/   / authentication-wrapper / 2: << [
/  3/     << [
/  4/       / digest-algorithm-id: / -16 / SHA256 /,
/  5/       / digest-bytes: / h'8814BC46089ACA6A863A7BA8393F9747
/  6/                           589940EFA40641335EF86155598F06C3'
/  7/     ] >>,
/  8/     << / COSE_Mac0_Tagged / 17([
/  9/       / protected: / << {
/ 10/         / algorithm-id / 1: 5 / HMAC256 /
/ 11/       } >>,
/ 12/       / unprotected: / {},
/ 13/       / payload: / null,
/ 14/       / tag: / h'B68572F6F0494FEAF390CE44B462F2A7
/ 15/                  BDF73EF5DFE9FB8E12585A12F8F641AD'
/ 16/     ]) >>
/ 17/   ] >>,
/ 18/   / manifest / 3: << {
/ 19/     / manifest-version / 1: 1,
/ 20/     / manifest-sequence-number / 2: 1,
/ 21/     / common / 3: << {
/ 22/       / components / 2: [
/ 23/         ['plaintext-firmware'],
/ 24/         ['encrypted-firmware']
/ 25/       ]
/ 26/     } >>,
/ 27/     / install / 20: << [
/ 28/       / fetch encrypted firmware /
/ 29/       / directive-set-component-index / 12, 1
/ 30/         / ['encrypted-firmware'] /,
/ 31/       / directive-override-parameters / 20, {
/ 32/         / parameter-image-size / 14: 46,
/ 33/         / parameter-uri / 21:
/ 34/           "https://example.com/encrypted-firmware"
/ 35/       },
/ 36/       / directive-fetch / 21, 15,
/ 37/ 
/ 38/       / decrypt encrypted firmware /
/ 39/       / directive-set-component-index / 12, 0
/ 40/         / ['plaintext-firmware'] /,
/ 41/       / directive-override-parameters / 20, {
/ 42/         / parameter-encryption-info / 19: << 96([
/ 43/           / protected: / << {
/ 44/             / alg / 1: 1 / A128GCM /
/ 45/           } >>,
/ 46/           / unprotected: / {
/ 47/             / IV / 5: h'F14AAB9D81D51F7AD943FE87'
/ 48/           },
/ 49/           / payload: / null / detached ciphertext /,
/ 50/           / recipients: / [
/ 51/             [
/ 52/               / protected: / h'',
/ 53/               / unprotected: / {
/ 54/                 / alg / 1: -3 / A128KW /,
/ 55/                 / kid / 4: 'kid-1'
/ 56/               },
/ 57/               / payload: /
/ 58/               h'\
                    75603FFC9518D794713C8CA8A115A7FB32565A6D59534D62'
/ 59/                 / CEK encrypted with KEK /
/ 60/             ]
/ 61/           ]
/ 62/         ]) >>,
/ 63/         / parameter-source-component / 22: 1
/ 64/           / ['encrypted-firmware'] /
/ 65/       },
/ 66/       / directive-copy / 22, 15
/ 67/         / consumes the SUIT_Encryption_Info above /
/ 68/     ] >>
/ 69/   } >>
/ 70/ })
]]></artwork></figure>

<t>The default storage area is defined by the component identifier (see
<xref section="8.4.5.1" sectionFormat="of" target="I-D.ietf-suit-manifest"/>). In this example,
the component identifier for component #0 is ['plaintext-firmware']
and the file path "/plaintext-firmware" is the expected location.</t>

<t>While parsing the manifest, the behavior of SUIT manifest processor would be</t>

<t><list style="symbols">
  <t>[L2-L17] authenticates the manifest part on [L18-L68]</t>
  <t>[L22-L25] gets two component identifiers; ['plaintext-firmware'] for component #0, and ['encrypted-firmware'] for component # 1 respectively</t>
  <t>[L29] sets current component index # 1 (the lasting directives target ['encrypted-firmware'])</t>
  <t>[L33-L34] sets source uri parameter "https://example.com/encrypted-firmware"</t>
  <t>[L36] fetches content from source uri into ['encrypted-firmware']</t>
  <t>[L39] sets current component index # 0 (the lasting directives target ['plaintext-firmware'])</t>
  <t>[L42-L62] sets SUIT encryption info parameter</t>
  <t>[L63-L64] sets source component index parameter # 1</t>
  <t>[L66] decrypts component # 1 (source component index) and stores the result into component # 0 (current component index)</t>
</list></t>

<t>The following attributes and features from the SUIT manifest specification are used:</t>

<texttable>
      <ttcol align='left'>Attribute Name</ttcol>
      <ttcol align='left'>Abb.</ttcol>
      <ttcol align='left'>Manifest Ref.</ttcol>
      <c>component identifier</c>
      <c>CI</c>
      <c>Sec. 8.4.5.1</c>
      <c>(destination) component index</c>
      <c>dst-CI</c>
      <c>Sec. 8.4.10.1</c>
      <c>(destination) component slot OPTIONAL param</c>
      <c>dst-CS</c>
      <c>Sec. 8.4.8.8</c>
      <c>(source) uri OPTIONAL parameter</c>
      <c>src-URI</c>
      <c>Sec. 8.4.8.10</c>
      <c>source component index OPTIONAL parameter</c>
      <c>src-CI</c>
      <c>Sec. 8.4.8.11</c>
</texttable>

<t>The resulting state of SUIT manifest processor is shown in the following table:</t>

<texttable>
      <ttcol align='left'>Abbreviation</ttcol>
      <ttcol align='left'>Plaintext</ttcol>
      <ttcol align='left'>Ciphertext</ttcol>
      <c>CI</c>
      <c>['plaintext-firmware']</c>
      <c>['encrypted-firmware']</c>
      <c>dst-CI</c>
      <c>0</c>
      <c>1</c>
      <c>dst-CS</c>
      <c>N/A</c>
      <c>N/A</c>
      <c>src-URI</c>
      <c>N/A</c>
      <c>"https://example.com/encrypted-firmware"</c>
      <c>src-CI</c>
      <c>1</c>
      <c>N/A</c>
</texttable>

<t>In hex format, the SUIT manifest shown above is:</t>

<figure><artwork><![CDATA[
D86BA2025853825824822F58208814BC46089ACA6A863A7BA8393F974758
9940EFA40641335EF86155598F06C3582AD18443A10105A0F65820B68572
F6F0494FEAF390CE44B462F2A7BDF73EF5DFE9FB8E12585A12F8F641AD03
58B2A40101020103582BA102828152706C61696E746578742D6669726D77
6172658152656E637279707465642D6669726D7761726514587C8C0C0114
A20E182E15782668747470733A2F2F6578616D706C652E636F6D2F656E63
7279707465642D6669726D77617265150F0C0014A213583ED8608443A101
01A1054CF14AAB9D81D51F7AD943FE87F6818340A2012204456B69642D31
581875603FFC9518D794713C8CA8A115A7FB32565A6D59534D621601160F
]]></artwork></figure>

<t>The previous example does not utilize storage slots. However, it is possible to
implement this functionality for devices that support slots in flash memory. In
the enhanced example below, we reference the slots using [h'00'] and [h'01']. In
this context, the component identifier [h'00'] designates component slot #0.</t>

<figure><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

/  1/ / SUIT_Envelope_Tagged / 107({
/  2/   / authentication-wrapper / 2: << [
/  3/     << [
/  4/       / digest-algorithm-id: / -16 / SHA256 /,
/  5/       / digest-bytes: / h'A6D2C13A0DEFD57A09FA65C24206A9A8
/  6/                           747261E6EA017532B3DAB0419C42A2FC'
/  7/     ] >>,
/  8/     << / COSE_Mac0_Tagged / 17([
/  9/       / protected: / << {
/ 10/         / algorithm-id / 1: 5 / HMAC256 /
/ 11/       } >>,
/ 12/       / unprotected: / {},
/ 13/       / payload: / null,
/ 14/       / tag: / h'DB350AC9603B0BBA3895B85019699363
/ 15/                  3F314A9066634B31BF62E596FD870434'
/ 16/     ]) >>
/ 17/   ] >>,
/ 18/   / manifest / 3: << {
/ 19/     / manifest-version / 1: 1,
/ 20/     / manifest-sequence-number / 2: 1,
/ 21/     / common / 3: << {
/ 22/       / components / 2: [
/ 23/         [h'00'],
/ 24/         [h'01']
/ 25/       ]
/ 26/     } >>,
/ 27/     / install / 20: << [
/ 28/       / fetch encrypted firmware /
/ 29/       / directive-set-component-index / 12, 1 / [h'01'] /,
/ 30/       / directive-override-parameters / 20, {
/ 31/         / parameter-image-size / 14: 46,
/ 32/         / parameter-uri / 21:
/ 33/           "https://example.com/encrypted-firmware"
/ 34/       },
/ 35/       / directive-fetch / 21, 15,
/ 36/ 
/ 37/       / decrypt encrypted firmware /
/ 38/       / directive-set-component-index / 12, 0 / ['00'] /,
/ 39/       / directive-override-parameters / 20, {
/ 40/         / parameter-encryption-info / 19: << 96([
/ 41/           / protected: / << {
/ 42/             / alg / 1: 1 / A128GCM /
/ 43/           } >>,
/ 44/           / unprotected: / {
/ 45/             / IV / 5: h'F14AAB9D81D51F7AD943FE87'
/ 46/           },
/ 47/           / payload: / null / detached ciphertext /,
/ 48/           / recipients: / [
/ 49/             [
/ 50/               / protected: / h'',
/ 51/               / unprotected: / {
/ 52/                 / alg / 1: -3 / A128KW /,
/ 53/                 / kid / 4: 'kid-1'
/ 54/               },
/ 55/               / payload: /
/ 56/               h'\
                    75603FFC9518D794713C8CA8A115A7FB32565A6D59534D62'
/ 57/                 / CEK encrypted with KEK /
/ 58/             ]
/ 59/           ]
/ 60/         ]) >>,
/ 61/         / parameter-source-component / 22: 1 / [h'01'] /
/ 62/       },
/ 63/       / directive-copy / 22, 15
/ 64/         / consumes the SUIT_Encryption_Info above /
/ 65/     ] >>
/ 66/   } >>
/ 67/ })
]]></artwork></figure>

</section>
<section anchor="example-ES-DH-write"><name>ES-DH Example with Write + Copy Directives</name>

<t>The following SUIT manifest instructs a parser to authenticate the manifest
using COSE_Sign1 with ES256. It also directs the parser to write and decrypt
the encrypted payload into a component via the suit-directive-write directive.</t>

<t>The SUIT manifest in diagnostic notation (formatted with line breaks for clarity)
is presented below:</t>

<figure><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

/  1/ / SUIT_Envelope_Tagged / 107({
/  2/   / authentication-wrapper / 2: << [
/  3/     << [
/  4/       / digest-algorithm-id: / -16 / SHA256 /,
/  5/       / digest-bytes: / h'1DB69EF1477E9942815F29F78E09957B
/  6/                           26B4ADD03902BDB3D1EDF3DA2075F593'
/  7/     ] >>,
/  8/     << / COSE_Sign1_Tagged / 18([
/  9/       / protected: / << {
/ 10/         / algorithm-id / 1: -7 / ES256 /
/ 11/       } >>,
/ 12/       / unprotected: / {},
/ 13/       / payload: / null,
/ 14/       / signature: / h'CB4EADA6BEC17EEB22EB836FB2BF9136
/ 15/                        A6EF733C11DAC955F543BBDCAA373B85
/ 16/                        9321BC77969917E4C70F049527607F4C
/ 17/                        32752D53E01346E96BFF4880B437DF64'
/ 18/     ]) >>
/ 19/   ] >>,
/ 20/   / manifest / 3: << {
/ 21/     / manifest-version / 1: 1,
/ 22/     / manifest-sequence-number / 2: 1,
/ 23/     / common / 3: << {
/ 24/       / components / 2: [
/ 25/         ['decrypted-firmware']
/ 26/       ]
/ 27/     } >>,
/ 28/     / install / 20: << [
/ 29/       / directive-set-component-index / 12, 0
/ 30/         / ['plaintext-firmware'] /,
/ 31/       / directive-override-parameters / 20, {
/ 32/         / parameter-content / 18:
/ 33/           h'758C4B7BBAE2C4C1D462423E0F0DC3164FFA7B85BB94D4
/ 34/             BD6D7ED26AB32FEB063385D4D3465927EC82CB5E198A59',
/ 35/         / parameter-encryption-info / 19: << 96([
/ 36/           / protected: / << {
/ 37/             / alg / 1: 1 / A128GCM /
/ 38/           } >>,
/ 39/           / unprotected: / {
/ 40/             / IV / 5: h'F14AAB9D81D51F7AD943FE87'
/ 41/           },
/ 42/           / payload: / null / detached ciphertext /,
/ 43/           / recipients: / [
/ 44/             [
/ 45/               / protected: / << {
/ 46/                 / alg / 1: -29 / ECDH-ES + A128KW /
/ 47/               } >>,
/ 48/               / unprotected: / {
/ 49/                 / ephemeral key / -1: {
/ 50/                   / kty / 1: 2 / EC2 /,
/ 51/                   / crv / -1: 1 / P-256 /,
/ 52/                   / x / -2: h'73024F415AA51529A66CCEFD88F3F62A
/ 53/                               734492FF45F6AD37FD2888E73EAF19DA\
                                                                   ',
/ 54/                   / y / -3: h'4005B48A6FD091AA6ABFE3CFBEEDE88B
/ 55/                               347E521D43405FDBD7D2CFF0EBC21B26'
/ 56/                 },
/ 57/                 / kid / 4: 'kid-2'
/ 58/               },
/ 59/               / payload: /
/ 60/               h'\
                    A06B8E6550F308712B1DF044B21B7D11D9B22792F1DE0997'
/ 61/                 / CEK encrypted with KEK /
/ 62/             ]
/ 63/           ]
/ 64/         ]) >>
/ 65/       },
/ 66/       / directive-write / 18, 15
/ 67/         / consumes the SUIT_Encryption_Info above /
/ 68/     ] >>
/ 69/   } >>
/ 70/ })
]]></artwork></figure>

<t>In hex format, the SUIT manifest is this:</t>

<figure><artwork><![CDATA[
D86BA2025873825824822F58201DB69EF1477E9942815F29F78E09957B26
B4ADD03902BDB3D1EDF3DA2075F593584AD28443A10126A0F65840CB4EAD
A6BEC17EEB22EB836FB2BF9136A6EF733C11DAC955F543BBDCAA373B8593
21BC77969917E4C70F049527607F4C32752D53E01346E96BFF4880B437DF
640358E8A4010102010357A1028181526465637279707465642D6669726D
776172651458C7860C0014A212582E758C4B7BBAE2C4C1D462423E0F0DC3
164FFA7B85BB94D4BD6D7ED26AB32FEB063385D4D3465927EC82CB5E198A
5913588CD8608443A10101A1054CF14AAB9D81D51F7AD943FE87F6818344
A101381CA220A40102200121582073024F415AA51529A66CCEFD88F3F62A
734492FF45F6AD37FD2888E73EAF19DA2258204005B48A6FD091AA6ABFE3
CFBEEDE88B347E521D43405FDBD7D2CFF0EBC21B2604456B69642D325818
A06B8E6550F308712B1DF044B21B7D11D9B22792F1DE0997120F
]]></artwork></figure>

</section>
<section anchor="example-ES-DH-dependency"><name>ES-DH Example with Dependency</name>

<t>The following SUIT manifest requests a parser to resolve the dependency.</t>

<t>The dependent manifest is signed with another key:</t>

<figure><artwork><![CDATA[
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIIQa67e56m8CYL5zVaJFiLl30j0qxb8ray2DeUMqH+qYoAoGCCqGSM49
AwEHoUQDQgAEDpCKqPBm2x8ITgw2UsY5Ur2Z8qW9si+eATZ6rQOrpot32hvYrE8M
tJC6IQZIv3mrFk1JrTVR1x0xSydJ7kLSmg==
-----END EC PRIVATE KEY-----
]]></artwork></figure>

<t>The dependency manifest is embedded as an integrated-dependency
and referred to by the "#dependency-manifest" URI.</t>

<t>The SUIT manifest in diagnostic notation (with line breaks added for
readability) is shown here:</t>

<figure><artwork><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

/  1/ / SUIT_Envelope_Tagged / 107({
/  2/   / authentication-wrapper / 2: << [
/  3/     << [
/  4/       / digest-algorithm-id: / -16 / SHA256 /,
/  5/       / digest-bytes: / h'A00CB6C85515C1EF471B50B542FACDD8
/  6/                           8B71B3C7EA2A43DE13D32C4A99056FE9'
/  7/     ] >>,
/  8/     << / COSE_Sign1_Tagged / 18([
/  9/       / protected: / << {
/ 10/         / algorithm-id / 1: -7 / ES256 /
/ 11/       } >>,
/ 12/       / unprotected: / {},
/ 13/       / payload: / null,
/ 14/       / signature: / h'421B30FE76DA848616D72FC1115EA610
/ 15/                        5578CB95DF9C6BEAD931105C9D555CF8
/ 16/                        CD38C8FD68ACE43445D8D2CAE6391A99
/ 17/                        5A212487D92F8DAD789F65511AC61778'
/ 18/     ]) >>
/ 19/   ] >>,
/ 20/   / manifest / 3: << {
/ 21/     / manifest-version / 1: 1,
/ 22/     / manifest-sequence-number / 2: 1,
/ 23/     / common / 3: << {
/ 24/       / dependencies / 1: {
/ 25/         / component-index / 1: {
/ 26/           / dependency-prefix / 1: [
/ 27/              'dependency-manifest.suit'
/ 28/           ]
/ 29/         }
/ 30/       },
/ 31/       / components / 2: [
/ 32/         ['decrypted-firmware']
/ 33/       ]
/ 34/     } >>,
/ 35/     / manifest-component-id / 5: [
/ 36/       'dependent-manifest.suit'
/ 37/     ],
/ 38/     / install / 20: << [
/ 39/       / NOTE: set SUIT_Encryption_Info /
/ 40/       / directive-set-component-index / 12, 0
/ 41/         / ['decrypted-firmware'] /,
/ 42/       / directive-override-parameters / 20, {
/ 43/         / parameter-content / 18:
/ 44/           h'758C4B7BBAE2C4C1D462423E0F0DC3164FFA7B85BB94D4
/ 45/             BD6D7ED26AB32FEB063385D4D3465927EC82CB5E198A59',
/ 46/         / parameter-encryption-info / 19: << 96([
/ 47/           / protected: / << {
/ 48/             / alg / 1: 1 / A128GCM /
/ 49/           } >>,
/ 50/           / unprotected: / {
/ 51/             / IV / 5: h'F14AAB9D81D51F7AD943FE87'
/ 52/           },
/ 53/           / payload: / null / detached ciphertext /,
/ 54/           / recipients: / [
/ 55/             [
/ 56/               / protected: / << {
/ 57/                 / alg / 1: -29 / ECDH-ES + A128KW /
/ 58/               } >>,
/ 59/               / unprotected: / {
/ 60/                 / ephemeral key / -1: {
/ 61/                   / kty / 1: 2 / EC2 /,
/ 62/                   / crv / -1: 1 / P-256 /,
/ 63/                   / x / -2: h'73024F415AA51529A66CCEFD88F3F62A
/ 64/                               734492FF45F6AD37FD2888E73EAF19DA\
                                                                   ',
/ 65/                   / y / -3: h'4005B48A6FD091AA6ABFE3CFBEEDE88B
/ 66/                               347E521D43405FDBD7D2CFF0EBC21B26'
/ 67/                 },
/ 68/                 / kid / 4: 'kid-2'
/ 69/               },
/ 70/               / payload: /
/ 71/               h'\
                    A06B8E6550F308712B1DF044B21B7D11D9B22792F1DE0997'
/ 72/                 / CEK encrypted with KEK /
/ 73/             ]
/ 74/           ]
/ 75/         ]) >>
/ 76/       },
/ 77/ 
/ 78/       / NOTE: call dependency-manifest /
/ 79/       / directive-set-component-index / 12, 1
/ 80/         / ['dependenty-manifest.suit'] /,
/ 81/       / directive-override-parameters / 20, {
/ 82/         / parameter-image-digest / 3: << [
/ 83/           / algorithm-id / -16 / SHA256 /,
/ 84/           / digest-bytes / h'4B15C90FBD776A820E7E733DF040D90B
/ 85/                              356B5C75982ECAECE8673818179BDF16'
/ 86/         ] >>,
/ 87/         / parameter-image-size / 14: 247,
/ 88/         / parameter-uri / 21: "#dependency-manifest"
/ 89/       },
/ 90/       / directive-fetch / 21, 15,
/ 91/       / condition-dependency-integrity / 7, 15,
/ 92/       / directive-process-dependency / 11, 15
/ 93/     ] >>
/ 94/   } >>,
/ 95/   "#dependency-manifest": <<
/ 96/     / SUIT_Envelope_Tagged / 107({
/ 97/       / authentication-wrapper / 2: << [
/ 98/         << [
/ 99/           / digest-algorithm-id: / -16 / SHA256 /,
/100/           / digest-bytes: / h'4B15C90FBD776A820E7E733DF040D90B
/101/                               356B5C75982ECAECE8673818179BDF16'
/102/         ] >>,
/103/         << / COSE_Sign1_Tagged / 18([
/104/           / protected: / << {
/105/             / algorithm-id / 1: -7 / ES256 /
/106/           } >>,
/107/           / unprotected: / {},
/108/           / payload: / null,
/109/           / signature: / h'2B1B9C4E44E52863A78F73DA2A935823
/110/                            B28AEAE6A85CADAC4C4E3AABAAD56CBC
/111/                            E5A47D288F86B54D0186657E972E748B
/112/                            48CDB1D420FBAC1285DCC978382F62CC'
/113/         ]) >>
/114/       ] >>,
/115/       / manifest / 3: << {
/116/         / manifest-version / 1: 1,
/117/         / manifest-sequence-number / 2: 1,
/118/         / common / 3: << {
/119/           / components / 2: [
/120/             ['decrypted-firmware']
/121/           ],
/122/           / shared-sequence / 4: << [
/123/             / directive-set-componnt-index / 12, 0
/124/               / ['decrypted-firmware'] /,
/125/             / directive-override-parameters / 20, {
/126/               / parameter-image-digest / 3: << [
/127/                 / algorithm-id / -16 / SHA256 /,
/128/                 / digest-bytes /
/129/                   h'36921488FE6680712F734E11F58D87EE
/130/                     B66D4B21A8A1AD3441060814DA16D50F'
/131/               ] >>,
/132/               / parameter-image-size / 14: 30
/133/             }
/134/           ] >>
/135/         } >>,
/136/         / manifest-component-id / 5: [
/137/           'dependency-manifest.suit'
/138/         ],
/139/         / validate / 7: << [
/140/           / condition-image-match / 3, 15
/141/         ] >>,
/142/         / install / 20: << [
/143/           / directive-set-component-index / 12, 0
/144/             / ['decrypted-firmware'] /,
/145/           / directive-write / 18, 15
/146/             / consumes the SUIT_Encryption_Info in dependent /,
/147/           / condition-image-match / 3, 15
/148/             / check the integrity of the decrypted payload /
/149/         ] >>
/150/       } >>
/151/     })
/152/   >>
/153/ })
]]></artwork></figure>

<t>In hex format, the SUIT manifest is this:</t>

<figure><artwork><![CDATA[
D86BA3025873825824822F5820A00CB6C85515C1EF471B50B542FACDD88B
71B3C7EA2A43DE13D32C4A99056FE9584AD28443A10126A0F65840421B30
FE76DA848616D72FC1115EA6105578CB95DF9C6BEAD931105C9D555CF8CD
38C8FD68ACE43445D8D2CAE6391A995A212487D92F8DAD789F65511AC617
780359016CA501010201035837A201A101A101815818646570656E64656E
63792D6D616E69666573742E73756974028181526465637279707465642D
6669726D77617265058157646570656E64656E742D6D616E69666573742E
737569741459010F8E0C0014A212582E758C4B7BBAE2C4C1D462423E0F0D
C3164FFA7B85BB94D4BD6D7ED26AB32FEB063385D4D3465927EC82CB5E19
8A5913588CD8608443A10101A1054CF14AAB9D81D51F7AD943FE87F68183
44A101381CA220A40102200121582073024F415AA51529A66CCEFD88F3F6
2A734492FF45F6AD37FD2888E73EAF19DA2258204005B48A6FD091AA6ABF
E3CFBEEDE88B347E521D43405FDBD7D2CFF0EBC21B2604456B69642D3258
18A06B8E6550F308712B1DF044B21B7D11D9B22792F1DE09970C0114A303
5824822F58204B15C90FBD776A820E7E733DF040D90B356B5C75982ECAEC
E8673818179BDF160E18F7157423646570656E64656E63792D6D616E6966
657374150F070F0B0F7423646570656E64656E63792D6D616E6966657374
58F7D86BA2025873825824822F58204B15C90FBD776A820E7E733DF040D9
0B356B5C75982ECAECE8673818179BDF16584AD28443A10126A0F658402B
1B9C4E44E52863A78F73DA2A935823B28AEAE6A85CADAC4C4E3AABAAD56C
BCE5A47D288F86B54D0186657E972E748B48CDB1D420FBAC1285DCC97838
2F62CC03587BA601010201035849A2028181526465637279707465642D66
69726D7761726504582F840C0014A2035824822F582036921488FE668071
2F734E11F58D87EEB66D4B21A8A1AD3441060814DA16D50F0E181E058158
18646570656E64656E63792D6D616E69666573742E73756974074382030F
1447860C00120F030F
]]></artwork></figure>

</section>
</section>
<section anchor="operational-considerations"><name>Operational Considerations</name>

<t>The algorithms outlined in this document assume that the party
responsible for payload encryption:</t>

<t><list style="symbols">
  <t>shares a key-encryption key (KEK) with the recipient
(for use with the AES Key Wrap scheme), or</t>
  <t>possesses the  recipient's public key (for use with ES-DH).</t>
</list></t>

<t>Both scenarios necessitate initial communication to distribute
these keys among the involved parties. This interaction can be
facilitated by a device management protocol, as described in
<xref target="RFC9019"/>, or may occur earlier in the device lifecycle, such
as during manufacturing or commissioning. In addition to the
keying material, key identifiers and algorithm information must
also be provisioned. This specification does not impose any
requirements on the structure of the key identifier.</t>

<t>In certain situations, third-party companies analyze binaries for
known security vulnerabilities. However, encrypted payloads hinder
this type of analysis. Consequently, these third-party companies
must either be granted access to the plaintext binary before
encryption or be authorized recipients of the encrypted payloads.
In either case, it is essential to explicitly consider these
third parties in the software supply chain when binary analysis
is required.</t>

</section>
<section anchor="sec-cons"><name>Security Considerations</name>

<t>This entire document focuses on security.</t>

<t>It is considered best security practice to use different keys for
different purposes. For instance, the key-encryption key (KEK)
utilized in an AES-KW-based content key distribution method for
encryption should be distinct from the long-term symmetric key
employed for authentication in a communication security protocol.</t>

<t>To further minimize the attack surface, it may be advantageous to
use different long-term keys for encrypting various types of
payloads. For example, KEK_1 could be used with an AES-KW content
key distribution method to encrypt a firmware image, while KEK_2
would encrypt configuration data.</t>

<t>A significant portion of this document addresses content key
distribution, employing two methods: AES Key Wrap (AES-KW) and
Ephemeral-Static Diffie-Hellman (ES-DH). The table below
summarizes the main properties related to their deployment:</t>

<texttable>
      <ttcol align='left'>Number of Long-Term Keys</ttcol>
      <ttcol align='left'>Number of Content Encryption Keys (CEKs)</ttcol>
      <ttcol align='left'>Use Case</ttcol>
      <ttcol align='left'>Recommended?</ttcol>
      <c>Same key<br />for all<br />devices</c>
      <c>Single<br />CEK per<br />payload<br />shared<br />with all<br />devies</c>
      <c>Legacy<br />Usage</c>
      <c>No, bad<br />practice</c>
      <c>One key<br />per device</c>
      <c>Single<br />CEK per<br />payload<br />shared<br />with all<br />devies</c>
      <c>Efficient<br />Payload<br />Distribution</c>
      <c>Yes</c>
      <c>One Key<br />per device</c>
      <c>One CEK<br />per payload<br />encryption<br />transaction<br />per device</c>
      <c>Point-to-<br />Point Payload<br />Distribution</c>
      <c>Yes</c>
</texttable>

<t>The use of firmware encryption in IoT devices introduces the
risk of a battery exhaustion attack. This attack exploits the
high energy cost of flash memory operations. To execute this
attack, the adversary must be able to swap detached payloads
and trick the device into processing an incorrect payload.
Payload swapping is feasible only if there is no communication
security protocol between the device and the distribution
system or if the distribution system itself has been compromised.</t>

<t>While the security features provided by the manifest can detect
this attack and prevent the device from booting with an
incorrectly supplied payload, the energy-intensive flash
operations will have already occurred. As a result, these
operations can diminish the lifespan of the devices, making
battery-powered IoT devices particularly susceptible to such
attacks. For further discussion on IoT devices using flash memory,
see <xref target="flash"/>.</t>

<t>Including the digest of the encrypted payload in the manifest
enables the device to detect a battery exhaustion attack before
energy-consuming decryption and flash memory copy or swap
operations take place.</t>

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

<t>IANA is asked to add the following value to the SUIT Parameters
registry established by <xref section="11.5" sectionFormat="of" target="I-D.ietf-suit-manifest"/>:</t>

<figure><artwork><![CDATA[
Label      Name                 Reference
-----------------------------------------
TBD19      Encryption Info      Section 4
]]></artwork></figure>

<t>RFC Editor's Note (TBD19): The value for the Encryption Info
parameter is set to 19, as the proposed value.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



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

<reference anchor="RFC3394">
  <front>
    <title>Advanced Encryption Standard (AES) Key Wrap Algorithm</title>
    <author fullname="J. Schaad" initials="J." surname="Schaad"/>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <date month="September" year="2002"/>
  </front>
  <seriesInfo name="RFC" value="3394"/>
  <seriesInfo name="DOI" value="10.17487/RFC3394"/>
</reference>

<reference anchor="RFC9052">
  <front>
    <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
    <author fullname="J. Schaad" initials="J." surname="Schaad"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
      <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="96"/>
  <seriesInfo name="RFC" value="9052"/>
  <seriesInfo name="DOI" value="10.17487/RFC9052"/>
</reference>

<reference anchor="RFC9053">
  <front>
    <title>CBOR Object Signing and Encryption (COSE): Initial Algorithms</title>
    <author fullname="J. Schaad" initials="J." surname="Schaad"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines a set of algorithms that can be used with the CBOR Object Signing and Encryption (COSE) protocol (RFC 9052).</t>
      <t>This document, along with RFC 9052, obsoletes RFC 8152.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9053"/>
  <seriesInfo name="DOI" value="10.17487/RFC9053"/>
</reference>

<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>


<reference anchor="I-D.ietf-suit-manifest">
   <front>
      <title>A Concise Binary Object Representation (CBOR)-based Serialization Format for the Software Updates for Internet of Things (SUIT) Manifest</title>
      <author fullname="Brendan Moran" initials="B." surname="Moran">
         <organization>Arm Limited</organization>
      </author>
      <author fullname="Hannes Tschofenig" initials="H." surname="Tschofenig">
         </author>
      <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
         <organization>Fraunhofer SIT</organization>
      </author>
      <author fullname="Koen Zandberg" initials="K." surname="Zandberg">
         <organization>Inria</organization>
      </author>
      <author fullname="Øyvind Rønningstad" initials="O." surname="Rønningstad">
         <organization>Nordic Semiconductor</organization>
      </author>
      <date day="4" month="December" year="2024"/>
      <abstract>
	 <t>   This specification describes the format of a manifest.  A manifest is
   a bundle of metadata about code/data obtained by a recipient (chiefly
   the firmware for an Internet of Things (IoT) device), where to find
   the code/data, the devices to which it applies, and cryptographic
   information protecting the manifest.  Software updates and Trusted
   Invocation both tend to use sequences of common operations, so the
   manifest encodes those sequences of operations, rather than declaring
   the metadata.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-suit-manifest-31"/>
   
</reference>

<reference anchor="RFC9459">
  <front>
    <title>CBOR Object Signing and Encryption (COSE): AES-CTR and AES-CBC</title>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <date month="September" year="2023"/>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR) data format is designed for small code size and small message size. CBOR Object Signing and Encryption (COSE) is specified in RFC 9052 to provide basic security services using the CBOR data format. This document specifies the conventions for using AES-CTR and AES-CBC as content encryption algorithms with COSE.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9459"/>
  <seriesInfo name="DOI" value="10.17487/RFC9459"/>
</reference>


<reference anchor="I-D.ietf-suit-trust-domains">
   <front>
      <title>SUIT Manifest Extensions for Multiple Trust Domains</title>
      <author fullname="Brendan Moran" initials="B." surname="Moran">
         <organization>Arm Limited</organization>
      </author>
      <author fullname="Ken Takayama" initials="K." surname="Takayama">
         <organization>SECOM CO., LTD.</organization>
      </author>
      <date day="4" month="December" year="2024"/>
      <abstract>
	 <t>   This specification describes extensions to the SUIT Manifest format
   for use in deployments with multiple trust domains.  A device has
   more than one trust domain when it enables delegation of different
   rights to mutually distrusting entities for use for different
   purposes or Components in the context of firmware or software update.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-suit-trust-domains-09"/>
   
</reference>




    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC9019">
  <front>
    <title>A Firmware Update Architecture for Internet of Things</title>
    <author fullname="B. Moran" initials="B." surname="Moran"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <author fullname="D. Brown" initials="D." surname="Brown"/>
    <author fullname="M. Meriac" initials="M." surname="Meriac"/>
    <date month="April" year="2021"/>
    <abstract>
      <t>Vulnerabilities in Internet of Things (IoT) devices have raised the need for a reliable and secure firmware update mechanism suitable for devices with resource constraints. Incorporating such an update mechanism is a fundamental requirement for fixing vulnerabilities, but it also enables other important capabilities such as updating configuration settings and adding new functionality.</t>
      <t>In addition to the definition of terminology and an architecture, this document provides the motivation for the standardization of a manifest format as a transport-agnostic means for describing and protecting firmware updates.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9019"/>
  <seriesInfo name="DOI" value="10.17487/RFC9019"/>
</reference>

<reference anchor="RFC9124">
  <front>
    <title>A Manifest Information Model for Firmware Updates in Internet of Things (IoT) Devices</title>
    <author fullname="B. Moran" initials="B." surname="Moran"/>
    <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
    <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
    <date month="January" year="2022"/>
    <abstract>
      <t>Vulnerabilities with Internet of Things (IoT) devices have raised the need for a reliable and secure firmware update mechanism that is also suitable for constrained devices. Ensuring that devices function and remain secure over their service lifetime requires such an update mechanism to fix vulnerabilities, update configuration settings, and add new functionality.</t>
      <t>One component of such a firmware update is a concise and machine-processable metadata document, or manifest, that describes the firmware image(s) and offers appropriate protection. This document describes the information that must be present in the manifest.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9124"/>
  <seriesInfo name="DOI" value="10.17487/RFC9124"/>
</reference>

<reference anchor="RFC5869">
  <front>
    <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
    <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
    <author fullname="P. Eronen" initials="P." surname="Eronen"/>
    <date month="May" year="2010"/>
    <abstract>
      <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5869"/>
  <seriesInfo name="DOI" value="10.17487/RFC5869"/>
</reference>

<reference anchor="RFC8937">
  <front>
    <title>Randomness Improvements for Security Protocols</title>
    <author fullname="C. Cremers" initials="C." surname="Cremers"/>
    <author fullname="L. Garratt" initials="L." surname="Garratt"/>
    <author fullname="S. Smyshlyaev" initials="S." surname="Smyshlyaev"/>
    <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
    <author fullname="C. Wood" initials="C." surname="Wood"/>
    <date month="October" year="2020"/>
    <abstract>
      <t>Randomness is a crucial ingredient for Transport Layer Security (TLS) and related security protocols. Weak or predictable "cryptographically secure" pseudorandom number generators (CSPRNGs) can be abused or exploited for malicious purposes. An initial entropy source that seeds a CSPRNG might be weak or broken as well, which can also lead to critical and systemic security problems. This document describes a way for security protocol implementations to augment their CSPRNGs using long-term private keys. This improves randomness from broken or otherwise subverted CSPRNGs.</t>
      <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8937"/>
  <seriesInfo name="DOI" value="10.17487/RFC8937"/>
</reference>

<reference anchor="RFC5652">
  <front>
    <title>Cryptographic Message Syntax (CMS)</title>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <date month="September" year="2009"/>
    <abstract>
      <t>This document describes the Cryptographic Message Syntax (CMS). This syntax is used to digitally sign, digest, authenticate, or encrypt arbitrary message content. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="70"/>
  <seriesInfo name="RFC" value="5652"/>
  <seriesInfo name="DOI" value="10.17487/RFC5652"/>
</reference>

<reference anchor="RFC5280">
  <front>
    <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
    <author fullname="D. Cooper" initials="D." surname="Cooper"/>
    <author fullname="S. Santesson" initials="S." surname="Santesson"/>
    <author fullname="S. Farrell" initials="S." surname="Farrell"/>
    <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <author fullname="W. Polk" initials="W." surname="Polk"/>
    <date month="May" year="2008"/>
    <abstract>
      <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5280"/>
  <seriesInfo name="DOI" value="10.17487/RFC5280"/>
</reference>


<reference anchor="iana-suit" target="TBD">
  <front>
    <title>IANA SUIT Manifest Registry</title>
    <author >
      <organization>Internet Assigned Numbers Authority</organization>
    </author>
    <date year="2023"/>
  </front>
</reference>
<reference anchor="ROP" target="https://en.wikipedia.org/wiki/Return-oriented_programming">
  <front>
    <title>Return-Oriented Programming</title>
    <author >
      <organization>Wikipedia</organization>
    </author>
    <date year="2023" month="March"/>
  </front>
</reference>
<reference anchor="SP800-56" target="http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar3.pdf">
  <front>
    <title>Recommendation for Pair-Wise Key Establishment Schemes Using Discrete Logarithm Cryptography, NIST Special Publication 800-56A Revision 3</title>
    <author >
      <organization>NIST</organization>
    </author>
    <date year="2018" month="April"/>
  </front>
</reference>


    </references>

</references>


<?line 2175?>

<section anchor="full-cddl"><name>Full CDDL</name>

<t>The following CDDL must be appended to the SUIT Manifest CDDL. The SUIT CDDL is defined in
Appendix A of <xref target="I-D.ietf-suit-manifest"/></t>

<figure><sourcecode type="CDDL"><![CDATA[
SUIT_Encryption_Info = #6.96(COSE_Encrypt)

$$SUIT_Parameters //= (suit-parameter-encryption-info =>
    bstr .cbor SUIT_Encryption_Info)

suit-parameter-encryption-info = 19
]]></sourcecode></figure>

</section>
<section numbered="no" anchor="acknowledgements"><name>Acknowledgements</name>

<t>We would like to thank Henk Birkholz for his feedback on the CDDL description in this document.
Additionally, we would like to thank Michael Richardson, Dick Brooks, Øyvind Rønningstad, Dave Thaler, Laurence
Lundblade, Christian Amsüss, Ruud Derwig, Martin Thomson. Kris Kwiatkowski, Suresh Krishnan and Carsten Bormann for their review feedback.</t>

<t>We would like to thank the IESG, in particular Deb Cooley, Éric Vyncke and Roman Danyliw, for their help to improve the quality of this document.</t>

</section>


  </back>

<!-- ##markdown-source:
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
vwFBLSGr7QW0XcgKdDf0Etdx9LGleyPDDI0YCK8dwipGMdByH9gA4B3HRozs
Fd1ztwPIdjsltYDsXa/pbcSfKCcniPS9vIY2Alb+Km5D9whYIdtAl8Vq1LJY
7WNpTbe3m2V1PHhtCoMLECuyWNk6Y+l623m6fVybb/V2M2a7Wa+ea6OJK9ka
9uKiRWmLHaunGrKikedKE9M9Ql96bdr+EELeY7EvXvQZoS92T5b9NTfL/u7F
pvswJSv7243DejUS24efGkY2E21svYeigkZgTrfOIM6WmE5rMbnbUBNM5au9
ugJMpEWpQ1RVAQjGxexGZCkRfQ1rhz72aNW4jzyTBi9hwOJstqXMSKKurBlP
JlHwXZKcnn6XuqPMcede9OMz59fv0z+M82czS/+z/sv7c69M78w4e/v8lydf
//JjERQyq8ZBD/NqFG+/o8QQ8TJ6+surcG6+907fXN6ab6sfnbel+Sfvlx/8
Kv86C978yS2/e1kui5VlXt38WCbe84Pe6g+Re/rdn05vrHk5vjb+UL75/rXx
Xn9/djf9w+j62dm8mRiicx0N10d5RupWZaISQVo1y2UoJ8fcDdX82dxP8tFX
dSPp9vhIe/v69AsGDmFpDp767aj2ZsHUXv9Qk6C5Ugfs70aeA3gmMpKxPTJC
Rw8p1DGK4/3mSi+EL6xolARmYFtxYliAKSI78H3dcceJ//eqJrEBH1r6OBm5
ceDZzGnCHAMFNZwkcA19t5rEcUZeFPpOPPYjoMpAPSwDyErkx47jRGNvt5ok
ii0v8sax6wVRArjddmIPEHuQuBaQAd/frSZxkHTa3igGJO7FQTzyfGATHMMI
IiC0I+9/rppEohvMK0eDfWgpShRVSq264M1acreCu5aA3HLetJmggf887kB0
Q1QXP1a0LOznXUOxgkXAVaXJp7ZmpEvzo2pBtmp+ahXIO0WfIeV/Z2P/lY2Z
Mjm/qY2Qa1xtLlHoI8gibe3WKqmmSIaIsZZhJ0d+3FBDPCCOqGGT6d4irl4w
u3rfYxfdEiHRVkI1FROfoYRqazE+QwmlKjgeZMNtGzy7lCctsXSXDbchqgog
bIcSdRkujfYY91NCNRUanzZtmg+LeWoZmztinlpH9VOn4N+9j916gPsooToU
A2JrO3QDHdu7qSHYpYTqkvi3K6Ha4r5ovVUJ5Xbqjx6ohHI7FT/qz19PCeV2
0v8HKqHcndwZ/txHCeV2wBjTpWyA0BYllLsBUfT9qMtRQVVCjTaA5ksqoUad
jg07lFCjFpAhcRw1YIaeKCcnWKCRPAi2cBYRO1Iccxg1wxydWgc/wIb/jOBk
r2VSkXS4zWtwmuZ9hmHF2xmi3CqyjcjNa2HTFnO+KaZ4LRyqiiqMoQ5BQvH1
cYj+xIFn6skILqWFIKDHvo53wdunkLUcN3SikeN7ZgLscJR47shCFdPID+Ox
QVfBUy6UYGi90a7lKz5lpj2i9l53e6Vud6fsi5/6DTDyO9mbTZcxv8ETimLe
yhhKpW5tJL/qZG949IfyNa7O4GpT32ooP31bKD+pQzqB7sUhbGATmdxsj5zs
K+5v95CVfWXPxSO/E6b2ysyGrm8HxpN7QqOhd5LDB4KjoZsb4GjoVmOpu2Ro
Q2/dqw4OAwTLDk5tpyxt6E0nODGxFlvYJVMbesvjbVOuNvTWwbVka8D8oR/Z
iW0DYaO4DW88Qj13gDpu04IejE6DmPwJTS9IQB4OPCcK4gDYbTuxgFsMgthx
ozDCHnYfX+IE9ghZg7EHh2jHuuG5rjNK/JGZjGwkzYbRyeHIH9uLYiBhtglQ
FETAtTlxFPkjz/JMYFYidPQ2DOWkOaExaqWDgAdDUfF0ydyG0WDzt8vdhjHq
bLhV9jaMBqbblL8No3WUHQKrYbYOa5vQapjNGHWcgNmyHVdX0HgqZ8zYFIYP
DNNqw3kXjd0UGA1zg2vcKTYa5saFuiehNcwuoWAvuTU2NA7afYiuYXZyd03S
i806bNHIp1mubxo2XIHEdT0dODK4hXZiGGPHi71RksCn1pZ7GLpujJwbOmoC
l23bgFF0z7DjwHBj4PAQ+NsZImuAt7rSRWynyhaeodU6/E/4rMnZsfulOmYI
xGZ1X6BOnYjR9L7YpfsxVO8LAmfV8eJYFmFGmi3Pup2vsSb3bOHzlDEHFiPY
hqrtEBvYzHXSpYcx2p4V91SuGJupTnbdlKYOY5e91mg7Y9zHZksVWIWNhw04
euDubWgxWJFqKkoneSpeMKVO2CacRfH6qNoNDmO1auMTf8AP6dMR/kGnw55b
X8KcbHWZk/ep/oGG7VbtbzMnM9V3b7vue592O4p7uxXYu1XUvZGnW46vG24U
OGoMpTXC2MGA2WjRsAy8FpqWRzrFL6JhOem5FsiQsRvDrBPXd5GoWyMbiLo1
clx/ZO+ySffaIY86hmGO2mNQvObGAD0xAlwKmLw+9pL7m7J7mxrC+6sDeyKN
4+eYsnu2/fmm7B6m1/xcU3ZPVYU81JTdM7yHKhRYhCxcJozPre/RPlGgzeX3
2mw+BtyORwAncJhtUGlDY49BC4XSoo9FqI/v8xn7CqY9Hm33L9m9kN7mStoL
2YYQzLC3m2HfzY73wmgft72dl+4xZhqv/ygMXBUd2D7uwy4Pk17rNtsw2TE6
zLBrSXHZcvva3FCvzQ7t43kQDoyEUAaC5/3OVEFMI9vCaejjHhBh4QgDO4KP
ahcM7aUoM5vOqMQ28KKlKOLKS6UJvrHSivVqxos8sRjmaTFZU0QzK2GjFB5O
yxXVycZSGiwEGgMVBCGsLQq89jwx6uitcZ3dKfYG0ikfPk2eHtVFnqU+nWql
NOoHiepQMtNrNUHl9BEWk8dRMBwb67cxHqHu6XGlVvpo9kmuJ6wkWYi1ouoC
TXW1HCT+VOOIZJ71QtY5w/CSiidaoQiSiioQwUJBMrrkbAOWeSImoVzlVBIO
d5Zq0aUsOxQrPXLQu0gn6LpABWKx4hoPGEd6D8wKnQNK2MWkmPXRB2OaVRMY
WxblwoJauuFjyS0qOnXHqk9rWVrOMKybZ/Xgvc6Ah5jcTbDEL9YWPuhhj6wS
Mwy4hsms2F8sARIvZAsPKFGVrAAniuhes6LEwKlkJexUn1ViqrMxUbCNhLVG
oR6sewfDY7TOecaKc+FQ2VSU4m0kuqlL2c2xuhr0S4AoC+tVskoVRRNRaW3G
sDVnJIoCTbJylcLWwEmvRbFlAP5yOiAgJxkWGC5KypPO7kDOwMJPZc5KL8PC
qTZ7lcFOI3Mo6vTiSeZqKbDN4KJKu0J+uuRx+au7ZcZKKsEwVQ6f4oVt5Auu
su6pYeUm4AeznNyXYBMvy5RChHghYl54vq5YTUu44zWRZa5iqulE36MKDk7q
12yq2LfqstHthbAyW3z4SVrJ4vaymiIrAI4VuHKsbjXhqIgtijaglFdEAKqs
i4a5EvAjrPPG6n3x+YutosAoDgNTXoLqTJxIE+1pH76Cs0L7bMW9zHCarISV
RHcX8AuikaI+WAYurOwe75BCsKpVffZLutETqtCMCEZWhGZIgcClfsbLA8I5
j6lsN4hliwkruL0VTR70RBE93CTAGzx5NStUJozO2FwiJrphGRwn95FSuq2u
eEY2ap0vJqs61xTW2BrAXZ5r1d0cvi8Z9oTvRY1CRKOtwo84pxaOVDaHoS7m
7lVoF+uSwGUOuHWO4jsVlqRy1nDgJeAfBkWIxxAipzcA0oAHMV0HpttobnA9
XbHVkggBVrpBjL5mV6yiSmcScmnzRcY9tAz9bMAK+LawAnPMNVBUDuObTBiv
c5cR0nnpxnaJzz4vb4nDmAc9lhBPNG7W/MOSfrRVgVoYTsOcIbz0WotCT6cl
o30KFCC41RPs87J4lNDptuDzrU6aNPWQrZNSnB30EmH+HZyhA95Ei2HL82zw
JJvNgExoh5x+Us07ViORwhIPesAwzFNEISKnHwAHwADwI3THy2xGhI6hphyz
o+DccC08z9QLpn4sLv7lvDz+12d4wG/ggOmvp3jI7SYRWzj9XusG6vaHUfK0
OtI2fj5qbwGWIrhCm+86fj5qrzOEcaoK+2/143slS3tQPrUv18+W5pTF6YzX
TaSNoks9m9HvIl8NNAGQmWVsk5On6BpJv/NLRL8zVSz9yi6M0gn0wTbuWXaZ
TthAbytMq7N7n18Ufe2c9y9xK8355aKeMtqGOE+jfvyl5pwAvE9yAVevlM9j
9fKLYX/kHzaXIub8dPecsQlMVjZRJ5s1IXoFFL5iDGS7x4/aqwLo/GBVDNic
8S9t68y3z5kJCLyk6P6yp8jUlsV0zXIcAVUv8+qaOBo4xRUg5ztAtFcpcCqU
sJBQvahQwPA+cghFvuKfX+WXmG0kKy+RYahWNAu12GUhhBsqtCyqFBBiBH6S
uuzzesVo/UCOQdRYTlnWJqoWXPv6CKrAk6YCzbtWWWYKBucGU0rYiDtAFQUn
K1nl4aDHd7quRIzZoLKUiUnFAjiZnBipkurwLoomxaTikk2SCRNe3WZZg30X
WV1VBA+f3lWrbI5MXH6x8Vrjb2GDs9mFdgUM/zn2imwkkP284rzTD7IEs5yJ
zEUpqgYLt26pi0QhBvYRdoKzs/xIqUJyCRzwYqVOn/gMLMiM+8MpLJaS5buJ
BVCR6cvrQ+lz3hPBgQzcwIRh3QoEiINeDQrQ22wGi7tB0RYdwrkYhJyhFqAM
yjIi9gXvqXxKi8iRI6mYtIlCUgU8dq3z5TXA5+k1FQLlgD1YApdfNot/Nytt
VGuQLOHWCLhjIhftEWdCBEOkVI4tmveLJTxQr0AfoSXTPnygh58+caFG1CdX
ijlu490Fs12nVQD593zGqTY/LSqlime76yor0gSdEVPYU97XumQsJTZV7zCl
s8C6tnBZGmexSq9JYuFVtb/StNPgRdChxKDHCHDVNeMngBVqpa+8SWfrTEhB
pEN/Je1xKDxe4i2BJVXIwcDZM/iu8zcbxtDZlby51sA/S4H9YQi0M/Hqa5G0
jYdj3OcH0HAYGz7roGZsNDJ60I+Ypy01Pxi5kICIXpSPK6CjgBUPqZOjE+LU
2Ibw6uDtPpE7FhlGUfzG6vWFZvh9UR8U2bgCWWPqho4HpgmQgdW48ajG6EMZ
xfEzkLYu4PfBZDqdgbiltaN6qI3EyUsy3kwbByUz0mJTxmbSc/pSSceNKpCA
OsjfawEe1ocP246Lnxb1cdDrtCV9o33lDn33kJwt+MujXu9//S9q/Uqx5h5/
ox22Kqe3HWq/+VfycTsHINOGk3PY9a4xoft9/cAhKLq9YIK6h1k2ZcohgOQP
Jxoz2mfTbx4tike00h8ynnl7ll/zS5AurrUnGfwnzMvrq2L2K4ECZS3Msime
o1Ci0DYzRZMk+Q3BA04/kMXCUU1x2z3c8xzEd7gar/HfclqhOBIjfQ3LorgG
jPpf//fdTQ7Y4fV//T8LVDPBXQScHyMef3OVzlCD8ixd87vzbL2Yns/SKUhU
0VWJwisKaPPqv/7fCrp6vV5PtTgrb/PLPgAQYOEF9FHMKywk/hSaa09v83R1
XdxW13lfO0PKdkUvrhYpw1FRWgKtXGghaqkWC3FVQE7BlJHZrdyo4Y4txg08
Tc6+7eOu1dQApnYOeKyYZbBd//W/UbL+/m4xuWZE/XWBclWcLu5m+W1fGfgq
my2x7xypNQ9z+2XN0ku2xUGY1f8PWCpSqC9ZAQA=

-->

</rfc>

