<?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.6.24 (Ruby 2.5.1) -->


<!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-14" 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></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="2023" month="August" day="26"/>

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

    <abstract>


<t>This document specifies techniques for encrypting software, firmware
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>


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

<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. To protect firmware images the SUIT manifest
format was developed <xref target="I-D.ietf-suit-manifest"/>. It provides a bundle of
metadata about the firmware for an IoT device, including where to find
the firmware image, the devices to which it applies and a security wrapper.</t>

<t><xref target="RFC9124"/> details the information that has to be provided by the SUIT
manifest format. In addition to offering protection against modification,
via a digital signature or a message authentication code, the firmware
image may also be afforded confidentiality using encryption.</t>

<t>Encryption prevents third parties, including attackers, from gaining
access to the firmware binary. Hackers typically need intimate knowledge
of the target firmware to mount their attacks. For example,
return-oriented programming (ROP) <xref target="ROP"/> requires access to the binary
and encryption makes it much more difficult to write exploits.</t>

<t>The firmware image is encrypted using a symmetric content encryption
key, which can be established using a variety of mechanisms; this
document defines two content key distribution algorithms for use with
the IETF SUIT manifest, namely:</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 former algorithm relies on asymmetric key cryptography while the
latter uses symmetric key cryptography.</t>

<t>Our goal was to reduce the number of content key distribution algorithms
and thereby increase interoperability between different SUIT manifest
parser implementations.</t>

<t>While the original motivating use case of this document was firmware
encryption, SUIT manifests may require payloads other than firmware
images to experience 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>Hence, the term payload is used to generically refer to those objects
that may be subject to encryption.</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 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 the firmware images.
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 firmware image, does not
know the recipients. It is important to note that the distribution system is
far more than a file server.</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>

<t>Finally, 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>
</list></t>

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

<t><xref target="RFC9019"/> describes the architecture for distributing payloads and
manifests from an author to devices. It does, however, not detail the
use of payload encryption. This document enhances the architecture to
support encryption.</t>

<t><xref target="arch-fig"/> shows the distribution system, which represents the firmware
server and the device management infrastructure.</t>

<t>To apply encryption the sender (author) needs to know the recipient (device).
For AES-KW the KEK needs to be known and, in case of ES-DH, the sender needs
to be in possession of the public key of the recipient. The public key and
parameters may be in the recipient's X.509 certificate <xref target="RFC5280"/>. For
ES-DH the recipients must be provisioned with a public key (or a
certificate) for verifying the digital signature covering the manifest.</t>

<t>With encryption the author cannot just create a manifest for the firmware
image and sign it since the subsequent encryption step by the distribution
system would invalidate the signature over the manifest. (The content key
distribution information is embedded inside the COSE_Encrypt structure,
which is included in the SUIT manifest.) Hence, the author has to
collaborate with the distribution system. The varying degree of
collaboration is discussed below.</t>

<figure title="Firmware Encryption Architecture." anchor="arch-fig"><artwork><![CDATA[
                                           +----------+
                                           |  Author  |
 +----------+                              +----------+
 |  Device  |---+                               |
 |          |   |                               | Firmware +
 |          |   |                               | Manifest
 +----------+   |                               |
                |                               |
                |                               |
                |                        +--------------+
 +----------+   |  Firmware + Manifest   | Distribution |
 |  Device  |---+------------------------|    System    |
 |          |   |                        +--------------+
 |          |   |
 +----------+   |
                |
                |
 +----------+   |
 |  Device  +---+
 |          |
 |          |
 +----------+
]]></artwork></figure>

<t>The author has several deployment options, namely</t>

<t><list style="symbols">
  <t>The author, as the sender, obtains information about the recipients
and their keys from the distribution system. Then, it performs the necessary
steps to encrypt the payload. As a last step it creates one or more manifests.
The device(s) perform decryption and act as recipients.</t>
  <t>The author treats the distribution system as the initial recipient. Then,
the distribution system decrypts and re-encrypts the payload for consumption
by the device (or the devices). Delegating the task of re-encrypting
the payload to the distribution system offers flexiblity when the number
of devices that need to receive encrypted payloads changes dynamically
or when updates to KEKs or recipient public keys are necessary. As a downside,
the author needs to trust the distribution system with performing the
re-encryption of the payload.</t>
</list></t>

<t>If the author and distributor are separate entities, then the author must delegate
encryption rights to the distributor. By the principle of least privilege, this
delegation should only grant the distributor decryption and re-encryption rights.
There are two models:</t>

<t><list style="numbers">
  <t>The distributor replaces the COSE_Encrypt in the manifest and then signs the
manifest again. However, the COSE_Encrypt structure is contained within a signed
container, which presents a problem: replacing the COSE_Encrypt with a new one
will cause the digest of the manifest to change, thereby changing the signature.
This means that the distributor must be able to sign the new manifest. If this
is the case, then the distributor  gains the ability to construct and sign
manifests, which allows the distributor the authority to sign code, effectively
presenting the distributor with full control over the recipient. Because
distributors typically perform their re-encryption online in order to handle
a large number of devices in a timely fashion, it is not possible to air-gap
the distributor's signing operations. This impacts the recommendations in
Section 4.3.17 of <xref target="RFC9124"/>.</t>
  <t>The alternative is to use a two-manifest system, where the distributor
constructs a new manifest that overrides the COSE_Encrypt using the dependency
system defined in <xref target="I-D.ietf-suit-trust-domains"/>. This incurrs additional
overhead: one additional signature verification and one additional manifest,
as well as the additional machinery in the recipient needed for dependency
processing.</t>
</list></t>

<t>These two models also present different threat profiles for the distributor.
If the distributor only has encryption rights, then an attacker who breaches
the distributor can only mount a limited attack: they can encrypt a modified
binary, but the recipients will identify the attack as soon as they perform
the required image digest check and revert back to a correct image immediately.</t>

<t>It is RECOMMENDED that distributors are implemented using a two-manifest
system in order to distribute content encryption keys without requiring
re-signing of the manifest, despite the increase in complexity and greater
number of signature verifications that this imposes on the recipient.</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 (called suit-parameter-encryption-info in
<xref target="parameter-fig"/>) contains the content key distribution information. The
content of the SUIT_Encryption_Info structure is explained in <xref target="AES-KW"/>
(for AES-KW) and in <xref target="ES-DH"/> (for ES-DH).</t>

<t>The SUIT_Encryption_Info structure is either carried inside the
suit-directive-override-parameters or the suit-directive-set-parameters
parameters used in the "Directive Write" and "Directive Copy" directives.
An implementation claiming conformance with this specification
must implement support for these two parameters. Since a device will
typically only support one of the content key distribution algorithms,
the distribution system needs to know about the properties of the
deployed devices. Mandating only a single content key distribution
algorithm for a constrained device also reduces the 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   = [TBD1: Proposed 19]
]]></artwork></figure>

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

<t>This specification extends these directives:</t>

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

<t>Examples of the two directives are shown below.</t>

<t><xref target="encryption-info-consumed-with-write"/> illustrates the Directive Write.
The encrypted payload specified with parameter-content, namely
h'EA1...CED' in the example, is decrypted using the SUIT_Encryption_Info
structure referred to by parameter-encryption-info, i.e. h'D86...1F0'.
The resulting plaintext payload is stored into 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 / 19: h'D86...1F0'
},
/ directive-write / 18, 15
]]></artwork></figure>

<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 of the
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-source-component / 22: 1,
  / parameter-encryption-info / 19: h'D86...1F0'
},
/ directive-copy / 22, 15
]]></artwork></figure>

<t>The payload to be encrypted may be detached and, in that case, it is
not covered by a digital signature or a MAC of 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.) 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 authenticate the payload in the detached payload case a SUIT Digest
Container with the digest of the encrypted and/or plaintext payload
MUST be included in the manifest.</t>

<t>Another attack concerns battery exhaustion. An attacker may swap
detached payloads and thereby force the device to process a wrong
payload. While this attack will be detected the device has performed
energy-expensive flash operations already. These operations may reduce
the lifetime of devices when they are battery powered.</t>

<t>Including the digest of the encrypted payload allows the device to
detect a battery exhaustion attack before energy consuming decryption
and flash operations took place. Including the digest of the plaintext
payload is adequate when battery exhaustion attacks are not a concern.</t>

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

<t>The sub-sections below describe two content key distribution algorithms,
namely AES Key Wrap (AES-KW) and Ephemeral-Static Diffie-Hellman (ES-DH).
Other algorithms are supported by COSE and may be supported via enhancements
to this specification.</t>

<t>When an encrypted firmware image is sent to multiple recipients, there
are different deployment options. To explain these options we use the
following notation:</t>

<t><list style="symbols">
  <t>KEK(R1,S) refers to a KEK shared between recipient R1 and the sender S.
The KEK, as a concept, is used by AES Key Wrap.</t>
  <t>CEK(R1,S) refers to a CEK shared between R1 and S.</t>
  <t>CEK(<em>,S) or KEK(</em>,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.</t>
  <t>ENC(plaintext, k) refers to the encryption of plaintext with a key k.</t>
  <t>KEK_i or CEK_i refers to the i-th instance of the KEK or CEK, respectively.</t>
</list></t>

<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 is described in RFC 3394 <xref target="RFC3394"/>, and
can be 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 Section 8.5.2 of <xref target="RFC9052"/> and in Section 6.2.1 of
<xref target="RFC9053"/>. The encrypted CEK is carried in the COSE_recipient structure
alongside the information needed for AES-KW. The COSE_recipient structure,
which is a substructure of the COSE_Encrypt structure, contains the CEK
encrypted by the KEK.</t>

<t>The COSE_Encrypt structure conveys information for encrypting the payload,
which includes information like the algorithm and the IV, even though the
payload may not embedded in the COSE_Encrypt.ciphertext if it is
conveyed as detached content.</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 authorized recipients have access to the KEK, a single
COSE_recipient structure contains the encrypted CEK. The sender executes
the following steps:</t>
</list></t>

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

<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[
      Generate CEK
      for i=1 to n {
         Fetch KEK_i(Ri, S)
         ENC(CEK, KEK_i)
      }
      ENC(payload,CEK)
]]></artwork></figure>

<t><list style="symbols">
  <t>The third option is to use different CEKs encrypted with KEKs of
authorized recipients. Assume there are n recipients with their unique KEKs -
KEK_1(R1, S),..., KEK_n(Rn, S). The sender needs to make the following steps:</t>
</list></t>

<figure><artwork><![CDATA[
      for i=1 to n {
         Fetch KEK_i(Ri, S)
         Generate CEK_i
         ENC(CEK_i, KEK_i)
         ENC(payload,CEK_i)
      }
]]></artwork></figure>

<t>This approach is appropriate when no benefits can be gained from encrypting
and transmitting payloads only once.</t>

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

<t>The CDDL for the COSE_Encrypt_Tagged structure 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[
outer_header_map_protected = empty_or_serialized_map
outer_header_map_unprotected = header_map

SUIT_Encryption_Info_AESKW = [
  protected   : bstr .cbor outer_header_map_protected,
  unprotected : outer_header_map_unprotected,
  ciphertext  : bstr / nil,
  recipients  : [ + COSE_recipient_AESKW .within COSE_recipient ]
]

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 recipient public key
  * label => values   ; extension point
}
]]></artwork></figure>

<t>Note that the AES-KW algorithm, as defined in Section 2.2.3.1 of <xref 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>

<t>For use with AEAD ciphers the COSE specification requires a consistent byte
stream for the authenticated data structure to be created. This structure
is shown in <xref target="cddl-enc-aeskw"/> and defined in Section 5.3 of <xref 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 needs to be populated as follows:</t>

<t>The protected field in the Enc_structure from <xref target="cddl-enc-aeskw"/> refers
to the content of the protected field from the COSE_Encrypt structure.
It is important to note that there are two protected fields shown
in <xref target="cddl-aeskw"/>:</t>

<t><list style="symbols">
  <t>one in the COSE_Encrypt structure, and</t>
  <t>a second one in the COSE_recipient structure.</t>
</list></t>

<t>The value of the external_aad MUST be set to a null value (major type 7,
value 22).</t>

<t>For use with ciphers that do not provide integrity protection, such as
AES-CTR and AES-CBC (see <xref target="I-D.ietf-cose-aes-ctr-and-cbc"/> ),
Enc_structure shown in <xref target="cddl-enc-aeskw"/> MUST NOT be used
because the Enc_structure represents the Additional Authenticated Data
(AAD) byte string consumable only by AEAD ciphers. The protected header
in the SUIT_Encryption_Info_AESKW structure MUST be a zero-length byte string.</t>

</section>
<section anchor="example"><name>Example</name>

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

<t><list style="symbols">
  <t>Algorithm for payload encryption: AES-GCM-128</t>
  <t>Algorithm id for key wrap: A128KW</t>
  <t>IV: h'11D40BB56C3836AD44B39835B3ABC7FC'</t>
  <t>KEK: "aaaaaaaaaaaaaaaa"</t>
  <t>KID: "kid-1"</t>
  <t>Plaintext firmware (txt): "This is a real firmware image."
(in hex): 546869732069732061207265616C206669726D7761726520696D6167652E</t>
</list></t>

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

<figure><artwork><![CDATA[
D8608443A10101A1054C26682306D4FB28CA01B43B80F68340A2012204456B69642D
315818AF09622B4F40F17930129D18D0CEA46F159C49E7F68B644D
]]></artwork></figure>

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

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

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

<figure><artwork><![CDATA[
CE9AB65E7591EE38669C4CCA7A58FA324C1A0DBFDBC2C7C057376AFB805D
660048310E8DAB045A2BE0A93F014FC9
]]></artwork></figure>

</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 scheme that provides public key
encryption given a recipient's public key. There are multiple variants
of this scheme; this document re-uses the variant specified in Section 8.5.5
of <xref target="RFC9052"/>.</t>

<t>The following two layer structure is used:</t>

<t><list style="symbols">
  <t>Layer 0: Has a content encrypted with the CEK. The content may be detached.</t>
  <t>Layer 1: Uses the AES Key Wrap algorithm to encrypt the randomly generated
CEK with the KEK derived with ES-DH whereby the resulting symmetric
key is fed into the HKDF-based key derivation function.</t>
</list></t>

<t>As a result, the two layers combine ES-DH with AES-KW and HKDF. An example is
given in <xref target="esdh-example"/>.</t>

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

<t>There are two deployment options with this approach. We assume that recipients
are always configured with a device-unique public / private key pair.</t>

<t><list style="symbols">
  <t>A sender wants to transmit a payload to multiple recipients. All recipients
shall receive the same encrypted payload, i.e. the same CEK is used.
One COSE_recipient structure per recipient is used and it contains the
CEK encrypted with the KEK. To generate the KEK each COSE_recipient structure
contains a COSE_recipient_inner structure to carry the sender's emphemeral key
and an identifier for the recipients public key.</t>
</list></t>

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

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

<t><list style="symbols">
  <t>The alternative is to encrypt a payload with a different CEK for each
recipient. Assume there are KEK_1(R1, S),..., KEK_n(Rn, S) have been generated
for the different recipients using ES-DH. The following steps needs to be made
by the sender:</t>
</list></t>

<figure><artwork><![CDATA[
      for i=1 to n {
         Generate KEK_i(Ri, S) using ES-DH
         Generate CEK_i
         ENC(CEK_i, KEK_i)
         ENC(payload,CEK_i)
      }
]]></artwork></figure>

<t>This results in n-manifests. This approach is useful when payloads contain
information unique to a device. The encryption operation effectively becomes
ENC(payload_i,CEK_i).</t>

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

<t>The CDDL for the COSE_Encrypt_Tagged structure is shown in <xref target="cddl-esdh"/>.
Only the minimum number of parameters are shown. empty_or_serialized_map
and header_map are structures defined in <xref target="RFC9052"/>.</t>

<figure title="CDDL for ES-DH-based Content Key Distribution" anchor="cddl-esdh"><artwork><![CDATA[
outer_header_map_protected = empty_or_serialized_map
outer_header_map_unprotected = header_map

SUIT_Encryption_Info_ESDH = [
  protected   : bstr .cbor outer_header_map_protected,
  unprotected : outer_header_map_unprotected,
  ciphertext  : bstr / nil,
  recipients  : [ + COSE_recipient_ESDH .within COSE_recipient ]
]

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

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

<t>The context information structure is used to ensure that the derived keying material
is "bound" to the context of the transaction. This specification re-uses the structure
defined in Section 5.2 of RFC 9053 and tailors it accordingly.</t>

<t>The following information 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 algorithm identifier
for AES Key Wrap algorithm utilized. This specification uses the following
values: A128KW (value -4), A192KW (value -4), or A256KW (value -5)</t>
  <t>The COSE_KDF_Context.SuppPubInfo.keyDataLength field MUST contain the key length
of the algorithm in the COSE_KDF_Context.AlgorithmID field expressed as the number
of bits. 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 in
which the ES-DH content key distribution algorithm is used and 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_pr_map field, which contains (among other fields)
the content key distribution algorithm identifier.</t>
</list></t>

<figure title="CDDL for COSE_KDF_Context Structure" anchor="cddl-context-info"><artwork><![CDATA[
PartyInfoSender = (
    identity : nil,
    nonce : nil,
    other : nil
)

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

COSE_KDF_Context = [
    AlgorithmID : int,
    PartyUInfo : [ PartyInfoSender ],
    PartyVInfo : [ PartyInfoRecipient ],
    SuppPubInfo : [
        keyDataLength : uint,
        protected : bstr .cbor recipient_header_pr_map,
        other: bstr "SUIT Payload Encryption"
    ],
    SuppPrivInfo : bstr .size 0
]
]]></artwork></figure>

<t>The HKDF-based key derivation function MAY contain a salt value,
as described in Section 5.1 of <xref target="RFC9053"/>. This optional value is used to
influence the key generation process. This specification does not mandate the
use of a salt value. If the salt is public and carried in the message, then
the "salt" algorithm header parameter MUST be used. The purpose of the salt
value is to provide extra randomness in the KDF context. If the salt sent
in the "salt" algorithm header parameter, then the receiver MUST be able to
process a salt and MUST pass it into the key derivation function.
For more information about the salt value, see <xref target="RFC5869"/> and NIST
SP800-56 <xref target="SP800-56"/>.</t>

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

<t>For use with ciphers that do not provide integrity protection, such as
AES-CTR and AES-CBC (see <xref target="I-D.ietf-cose-aes-ctr-and-cbc"/>), the 
Enc_structure MUST NOT be used and the protected header in the
SUIT_Encryption_Info_ESDH structure MUST be a zero-length byte string.</t>

</section>
<section anchor="example-1"><name>Example</name>

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

<t><list style="symbols">
  <t>Algorithm for payload encryption: AES-GCM-128</t>
  <t>IV: h'3517CE3E78AC2BF3D1CDFDAF955E8600'</t>
  <t>Algorithm for content key distribution: ECDH-ES + A128KW</t>
  <t>KID: "kid-2"</t>
  <t>Plaintext: "This is a real firmware image."</t>
  <t>Firmware (hex):
546869732069732061207265616C206669726D7761726520696D6167652E</t>
</list></t>

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

<figure><artwork><![CDATA[
D8608443A10101A105503517CE3E78AC2BF3D1CDFDAF955E8600F6818344
A101381CA220A401022001215820AAE9A733DEF11E9160A66BD81CC8215F
045ACAC3F8490C7749D58A627323624A22582008A7B88B7F00762BA0919C
A065ABF45C2A303B483E86D674E50B015122F8E51504456B69642D325818
0A44E77C3DBBB0780F2DB42C64FD325D18FBE13A25A9369D
]]></artwork></figure>

<t>The resulting COSE_Encrypt structure in a diagnostic format is shown in
<xref target="esdh-example"/>. Note that the COSE_Encrypt structure also needs to
protected by a COSE_Sign1, which is not shown below.</t>

<figure title="COSE_Encrypt Example for ES-DH" anchor="esdh-example"><artwork><![CDATA[
/ SUIT_Envelope_Tagged / 107({
  / authentication-wrapper / 2: << [
    << [
      / digest-algorithm-id: / -16 / SHA256 /,
      / digest-bytes: / h'4C56CA660A5D1414BC04C835025D52CC
                          A9AE6101202E127329AD2465B38A1C89'
    ] >>,
    << / COSE_Sign1_Tagged / 18([
      / protected: / << {
        / algorithm-id / 1: -7 / ES256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / signature: /
        h'ACC8962628B78BF30DD74BDEEA9305D7
          3BFA302D82B280A7E2FCE8331C363F27
          9ECCABE920DA97F9074DF5B3B2AAD170
          9D844B8DE1D33F80FA99AC806B9778D0'
    ]) >>
  ] >>,
  / manifest / 3: << {
    / manifest-version / 1: 1,
    / manifest-sequence-number / 2: 1,
    / common / 3: << {
      / components / 2: [
        ['decrypted-firmware']
      ]
    } >>,
    / install / 17: << [
      / directive-set-component-index / 12, 0
        / ['plaintext-firmware'] /,
      / directive-override-parameters / 20, {
        / parameter-content / 18:
          h'B94272BD7C7E9A144D12CF46D9CEE6318753574A6F7808
            29B87911BE1CF2B24477BA4E7D1337541F308010088920',
        / parameter-encryption-info / 19: << 96([
          / protected: / << {
            / alg / 1: 1 / AES-GCM-128 /
          } >>,
          / unprotected: / {
            / IV / 5: h'3517CE3E78AC2BF3D1CDFDAF955E8600'
          },
          / 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'AAE9A733DEF11E9160A66BD81CC8215F
                              045ACAC3F8490C7749D58A627323624A',
                  / y / -3: h'08A7B88B7F00762BA0919CA065ABF45C
                              2A303B483E86D674E50B015122F8E515'
                },
                / kid / 4: 'kid-2'
              },
              / payload: /
                h'0A44E77C3DBBB0780F2DB42C64FD325D18FBE13A25A9369D'
                / CEK encrypted with KEK /
            ]
          ]
        ]) >>
      },
      / directive-write / 18, 15
        / consumes the SUIT_Encryption_Info above /
    ] >>
  } >>
})
]]></artwork></figure>

<t>The encrypted firmware (with a line feed added) was:
~~~
B94272BD7C7E9A144D12CF46D9CEE6318753574A6F780829B87911BE1CF2
B24477BA4E7D1337541F308010088920
~~~</t>

</section>
</section>
</section>
<section anchor="firmware-updates-on-iot-devices-with-flash-memory"><name>Firmware Updates on IoT Devices with Flash Memory</name>

<t>Flash memory on microcontrollers is a type of non-volatile memory that erases
data in units called blocks, pages or sectors and re-writes data at byte level
(often 4-bytes).
Flash memory is furthermore segmented into different memory regions, which store
the bootloader, different versions of firmware images (in so-called slots),
and configuration data. <xref target="image-layout"/> shows an example layout of a
microcontroller flash area. The primary slot contains the firmware image to be
executed by the bootloader, which is a common deployment on devices that do
not offer the concept of position independent code.</t>

<t>When the encrypted firmware image has been transferred to the device, it will
typically be stored in a staging area, in the secondary slot in our example.</t>

<t>At the next boot, the bootloader will recognize a new firmware image in the
secondary slot and will start decrypting the downloaded image sector-by-sector
and will swap it with the image found in the primary slot.</t>

<t>The swap should only take place after the signature on the plaintext is verified.
Note that the plaintext firmware image is available in the primary slot only after
the swap has been completed, unless "dummy decrypt" is used to compute the hash
over the plaintext prior to executing the decrypt operation during a swap.
Dummy decryption here refers to the decryption of the firmware image found in
the secondary slot sector-by-sector and computing a rolling hash over the resulting
plaintext firmware image (also sector-by-sector) without performing the swap operation.
While there are performance optimizations possible, such as conveying hashes for
each sector in the manifest rather than a hash of the entire firmware image,
such optimizations are not described in this specification.</t>

<t>This approach of swapping the newly downloaded image with the previously valid
image is often referred as A/B approach. A/B refers to the two slots involved.
Two slots are used to allow the update to be reversed in case the newly obtained
firmware image fails to boot. This approach adds robustness to the firmware
update procedure.</t>

<t>Since the image in primary slot is available in cleartext it may need to
re-encrypted it before copying it to the secondary slot. This may be necessary
when the secondary slot has different access permissions or when the staging
area is located in off-chip flash memory and is therefore more vulnerable to
physical attacks. Note that this description assumes that the processor does
not execute encrypted memory by using on-the-fly decryption in hardware.</t>

<figure title="Example Flash Area Layout" anchor="image-layout"><artwork><![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></figure>

<t>The ability to restart an interrupted firmware update is often a requirement
for low-end IoT devices. To fulfill this requirement it is necessary to chunk
a firmware image into sectors and to encrypt each sector individually
using a cipher that does not increase the size of the resulting ciphertext
(i.e., by not adding an authentication tag after each encrypted block).</t>

<t>When an update gets aborted while the bootloader is decrypting the newly obtained
image and swapping the sectors, the bootloader can restart where it left off. This
technique offers robustness and better performance.</t>

<t>For this purpose ciphers without integrity protection are used to encrypt the
firmware image. Integrity protection of the firmware image MUST be
provided and the suit-parameter-image-digest, defined in Section 8.4.8.6 of
<xref target="I-D.ietf-suit-manifest"/>, MUST be used.</t>

<t><xref target="I-D.ietf-cose-aes-ctr-and-cbc"/> registers AES Counter (AES-CTR) mode and
AES Cipher Block Chaining (AES-CBC) ciphers that do not offer integrity protection.
These ciphers are useful for use cases that require firmware encryption on IoT
devices. For many other use cases where software packages, configuration information
or personalization data needs to be encrypted, the use of Authenticated Encryption
with Associated Data (AEAD) ciphers is RECOMMENDED.</t>

<t>The following sub-sections provide further information about the initialization vector
(IV) selection for use with AES-CBC and AES-CTR in the firmware encryption context. An
IV MUST NOT be re-used when the same key is used. For this application, the IVs are
not random but rather based on the slot/sector-combination in flash memory. The
text below assumes that the block-size of AES is (much) smaller than sector size. The
typical sector-size of flash memory is in the order of KiB. Hence, multiple AES blocks
need to be decrypted until an entire sector is completed.</t>

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

<t>In AES-CBC a single IV is used for encryption of firmware belonging to a single sector
since individual AES blocks are chained toghether, as shown in <xref target="aes-cbc-fig"/>. The
numbering  of sectors in a slot MUST start with zero (0) and MUST 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 fills the entire slot then that slot contains 16 sectors, i.e. IVs
ranging from 0 to 15.</t>

<figure title="AES-CBC Operation" anchor="aes-cbc-fig"><artwork><![CDATA[
       P1              P2
        |              |
   IV--(+)    +-------(+)
        |     |        |
        |     |        |
    +-------+ |    +-------+
    |       | |    |       |
    |       | |    |       |
 k--|  E    | | k--|  E    |
    |       | |    |       |
    +-------+ |    +-------+
        |     |        |
        +-----+        |
        |              |
        |              |
        C1             C2

Legend: 
  Pi = Plaintext blocks
  Ci = Ciphertext blocks
  E = Encryption function
  k = Symmetric key
  (+) = XOR operation
]]></artwork></figure>

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

<t>Unlike AES-CBC, AES-CTR uses an IV per AES operation, 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>Using the previous example with a slot size of 64 KiB, the sector size 4096 bytes and
the AES plaintext block size of 16 byte requires IVs from 0 to 255 in the first sector
and 16 * 256 IVs for the remaining sectors in the slot.</t>

<figure title="AES-CTR Operation" anchor="aes-ctr-fig"><artwork><![CDATA[
         IV1            IV2
          |              |
          |              |
          |              |
      +-------+      +-------+
      |       |      |       |
      |       |      |       |
   k--|  E    |   k--|  E    |
      |       |      |       |
      +-------+      +-------+
          |              |
     P1--(+)        P2--(+)
          |              |
          |              |
          C1             C2

Legend: 
  See previous diagram.
]]></artwork></figure>

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

<t>The following manifests examplify how to deliver encrypted firmware and its
encryption info to devices.</t>

<t>The 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 requests a parser to write and to decrypt the
encrypted payload into a component with the suit-directive-write
directive.</t>

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

<figure><artwork><![CDATA[
/ SUIT_Envelope_Tagged / 107({
  / authentication-wrapper / 2: << [
    << [
      / digest-algorithm-id: / -16 / SHA256 /,
      / digest-bytes: / h'5DEFDDB7F175FA20778FFE24BE7B9C36
                          9BD8ED06AA4654F28794CD134CDBA932'
    ] >>,
    << / COSE_Sign1_Tagged / 18([
      / protected: / << {
        / algorithm-id / 1: -7 / ES256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / signature: / h'4C4A5FB50738699649BA439237D20ADC
                       ADD6EC634A800A8E093733FC1C64984B
                       F2BFEC583C124B5546BF0CDAC543AB09
                       95589543B434951A29A40000EC56CBE7'
    ]) >>
  ] >>,
  / manifest / 3: << {
    / manifest-version / 1: 1,
    / manifest-sequence-number / 2: 1,
    / common / 3: << {
      / components / 2: [
        ['plaintext-firmware'],
      ]
    } >>,
    / install / 17: << [
      / fetch encrypted firmware /
      / directive-override-parameters / 20, {
        / parameter-content / 18:
          h'CE9AB65E7591EE38669C4CCA7A58FA324C1A0DBFDBC2C7
            C057376AFB805D660048310E8DAB045A2BE0A93F014FC9',
        / parameter-encryption-info / 19: << 96([
          / protected: / << {
            / alg / 1: 1 / AES-GCM-128 /
          } >>,
          / unprotected: / {
            / IV / 5: h'11D40BB56C3836AD44B39835B3ABC7FC'
          },
          / payload: / null / detached ciphertext /,
          / recipients: / [
            [
              / protected: / << {
              } >>,
              / unprotected: / {
                / alg / 1: -3 / A128KW /,
                / kid / 4: 'kid-1'
              },
              / payload: /
                h'E01F4443C88CA89DF93A9C7E6D79D1C9BC330757C7D2D75A'
                / CEK encrypted with KEK /
            ]
          ]
        ]) >>
      },

      / decrypt encrypted firmware /
      / directive-write / 18, 15
        / consumes the SUIT_Encryption_Info above /
    ] >>
  } >>
})
]]></artwork></figure>

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

<figure><artwork><![CDATA[
D86BA2025873825824822F58205DEFDDB7F175FA20778FFE24BE7B9C369B
D8ED06AA4654F28794CD134CDBA932584AD28443A10126A0F658404C4A5F
B50738699649BA439237D20ADCADD6EC634A800A8E093733FC1C64984BF2
BFEC583C124B5546BF0CDAC543AB0995589543B434951A29A40000EC56CB
E703589DA4010102010357A102818152706C61696E746578742D6669726D
7761726511587C8414A212582ECE9AB65E7591EE38669C4CCA7A58FA324C
1A0DBFDBC2C7C057376AFB805D660048310E8DAB045A2BE0A93F014FC913
5843D8608443A10101A1055011D40BB56C3836AD44B39835B3ABC7FCF681
8341A0A2012204456B69642D315818E01F4443C88CA89DF93A9C7E6D79D1
C9BC330757C7D2D75A120F
]]></artwork></figure>

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

<t>The following SUIT manifest requests a parser to fetch the encrypted
payload and to stores it. Then, the payload is decrypt and stored into
another component with the suit-directive-copy directive. This approach
works well on constrained devices with execute-in-place flash memory.</t>

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

<figure><artwork><![CDATA[
/ SUIT_Envelope_Tagged / 107({
  / authentication-wrapper / 2: << [
    << [
      / digest-algorithm-id: / -16 / SHA256 /,
      / digest-bytes: / h'C6A66263CCF4C6FF5992AE4074B30DDD
                          34520AA099F6BAD96B2F60FE79F07EC4'
    ] >>,
    << / COSE_Sign1_Tagged / 18([
      / protected: / << {
        / algorithm-id / 1: -7 / ES256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / signature: / h'DA08C3A6455FF30865A97A7F4FBC3BA1
                       5F954E39B57167DEA9FE16EBA12CFE33
                       D58790DB64CB70A08F89513B15CFF995
                       1222868195224E1AB87D46FA37F58864'
    ]) >>
  ] >>,
  / manifest / 3: << {
    / manifest-version / 1: 1,
    / manifest-sequence-number / 2: 1,
    / common / 3: << {
      / components / 2: [
        ['plaintext-firmware'],
        ['encrypted-firmware']
      ]
    } >>,
    / install / 17: << [
      / fetch encrypted firmware /
      / directive-set-component-index / 12, 1
        / ['encrypted-firmware'] /,
      / directive-override-parameters / 20, {
        / parameter-image-size / 14: 46,
        / parameter-uri / 21: "https://example.com/encrypted-firmware"
      },
      / directive-fetch / 21, 15,

      / decrypt encrypted firmware /
      / directive-set-component-index / 12, 0
        / ['plaintext-firmware'] /,
      / directive-override-parameters / 20, {
        / parameter-encryption-info / 19: << 96([
          / protected: / << {
            / alg / 1: 1 / AES-GCM-128 /
          } >>,
          / unprotected: / {
            / IV / 5: h'11D40BB56C3836AD44B39835B3ABC7FC'
          },
          / payload: / null / detached ciphertext /,
          / recipients: / [
            [
              / protected: / << {
              } >>,
              / unprotected: / {
                / alg / 1: -3 / A128KW /,
                / kid / 4: 'kid-1'
              },
              / payload: /
                h'E01F4443C88CA89DF93A9C7E6D79D1C9BC330757C7D2D75A'
                / CEK encrypted with KEK /
            ]
          ]
        ]) >>,
        / parameter-source-component / 22: 1 / ['encrypted-firmware'] /
      },
      / directive-copy / 22, 15
        / consumes the SUIT_Encryption_Info above /
    ] >>
  } >>
})
]]></artwork></figure>

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

<figure><artwork><![CDATA[
D86BA2025873825824822F5820C6A66263CCF4C6FF5992AE4074B30DDD34
520AA099F6BAD96B2F60FE79F07EC4584AD28443A10126A0F65840DA08C3
A6455FF30865A97A7F4FBC3BA15F954E39B57167DEA9FE16EBA12CFE33D5
8790DB64CB70A08F89513B15CFF9951222868195224E1AB87D46FA37F588
640358E5A40101020103582BA102828152706C61696E746578742D666972
6D776172658152656E637279707465642D6669726D776172651158AF900C
0114A20E182E15782668747470733A2F2F6578616D706C652E636F6D2F65
6E637279707465642D6669726D77617265150F0C0014A2135843D8608443
A10101A1055011D40BB56C3836AD44B39835B3ABC7FCF6818341A0A20122
04456B69642D315818E01F4443C88CA89DF93A9C7E6D79D1C9BC330757C7
D2D75A1601160F14A2035824822F582036921488FE6680712F734E11F58D
87EEB66D4B21A8A1AD3441060814DA16D50F0E181E030F
]]></artwork></figure>

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

<t>The algorithms described in this document assume that the party
performing 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>is in possession of the public key of the recipient
(for use with ES-DH).</t>
</list></t>

<t>Both cases require some upfront communication interaction
to distribute these keys to the involved communication parties.
This interaction may be provided by an device management protocol,
as described in <xref target="RFC9019"/>, or may be executed earlier in
the lifecycle of the device, for example during manufacturing
or during commissioning. In addition to the keying material
key identifiers and algorithm information needs to be provisioned.
This specification places no requirements on the structure of the
key identifier.</t>

<t>To provide high security for AES Key Wrap it is important that the
KEK is of high entropy, and that implementations protect the KEK
from disclosure. Compromise of the KEK may result in the disclosure
of all key data protected with that KEK.</t>

<t>Since the CEK is randomly generated, it must be ensured that the
guidelines for random number generation in <xref target="RFC8937"/> are followed.</t>

<t>In some cases third party companies analyse binaries for known
security vulnerabilities. With encrypted payloads this type of
analysis is prevented. Consequently, these third party companies
either need to be given access to the plaintext binary before
encryption or they need to become authorized recipients of the
encrypted payloads. In either case, it is necessary to explicitly
consider those third parties in the software supply chain when such a binary analysis
is desired.</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 Section 11.5 of <xref target="I-D.ietf-suit-manifest"/>:</t>

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

<t>[Editor's Note: TBD1: Proposed 19]</t>

</section>


  </middle>

  <back>


    <references title='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'>
         <organization>Arm Limited</organization>
      </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='27' month='February' year='2023'/>
      <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 IoT device), where to find the that 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-22'/>
   
</reference>


<reference anchor='I-D.ietf-cose-aes-ctr-and-cbc'>
   <front>
      <title>CBOR Object Signing and Encryption (COSE): AES-CTR and AES-CBC</title>
      <author fullname='Russ Housley' initials='R.' surname='Housley'>
         <organization>Vigil Security, LLC</organization>
      </author>
      <author fullname='Hannes Tschofenig' initials='H.' surname='Tschofenig'>
         <organization>Arm Limited</organization>
      </author>
      <date day='25' month='May' 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='Internet-Draft' value='draft-ietf-cose-aes-ctr-and-cbc-06'/>
   
</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='7' month='July' year='2023'/>
      <abstract>
	 <t>   This specification describes extensions to the SUIT Manifest format
   (as defined in [I-D.ietf-suit-manifest]) 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-04'/>
   
</reference>




    </references>

    <references title='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='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='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="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>


<section 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, Øyvind Rønningstad, Dave Thaler, Laurence
Lundblade, and Carsten Bormann for their review feedback. Finally, we would like to thank Dick Brooks for
making us aware of the challenges firmware encryption imposes on binary analysis.</t>

</section>
<section anchor="full-cddl"><name>A. 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[
; Define SUIT_Encryption_Info_* as a subset of COSE_Encrypt

SUIT_Encryption_Info_Value = #6.96(
    SUIT_Encryption_Info_AESKW .within COSE_Encrypt /
    SUIT_Encryption_Info_ESDH .within COSE_Encrypt)

SUIT_Encryption_Info_AESKW = [
  protected   : bstr .cbor outer_header_map_protected,
  unprotected : outer_header_map_unprotected,
  ciphertext  : bstr / nil,
  recipients  : [ + COSE_recipient_AESKW .within COSE_recipient ]
]

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 recipient public key
  * label => values   ; extension point
}

SUIT_Encryption_Info_ESDH = [
  protected   : bstr .cbor outer_header_map_protected,
  unprotected : outer_header_map_unprotected,
  ciphertext  : bstr / nil,
  recipients  : [ + COSE_recipient_ESDH .within COSE_recipient ]
]

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 =
{
   -1 => COSE_Key,    ; ephemeral public key for the sender
  ? 4 => bstr,        ; identifier of the recipient public key
  * label => values   ; extension point
}

; common definitions
outer_header_map_protected =
{
    1 => int,         ; algorithm identifier
  * label => values   ; extension point
}

outer_header_map_unprotected =
{
    5 => bstr,        ; IV
  * label => values   ; extension point
}


; Extends SUIT Manifest

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

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

</section>


  </back>

<!-- ##markdown-source:
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
zrloYZFezSPcPqpGZh0tJFY1mfJFdRKenNeAQ5JbScpjdlOjVUCYJsUKIi5V
Bjtyjk1ap5a6kw2VSuICo+jj2SiAFawsIErPdA6r9LHwVZEyzxXAJAtTMb7q
2Wk5pO9DAugDPM0hddmjQohQe9EkblixCrpjwlJq6AxTp4VIcmIJWe6r5fQ7
FPEBDKVXjjXRul6PdplSD0PeddoPNYuDGuYHTEASH7myk2ONhnIQR7I8HOfU
7TzFyLPduVX+n5UfgJFj7ums+skA0qpqL6MsAkUm7QL1lcMxMCmtT9CZeGAH
B7VM3htMdbocREW3bRVI4783blnjfeOZbPWKcv4rPTl/X68fPTnGH5RqDF+r
jX4tN7rjierkCT95YnRo++1f+dOv5bZ3PL2u1+HrSD21vz6k57tndfc6n8iW
+yAgPutJUN6gwMMdfBFdAQmeCXztTSyeWpWcFCOEV/FBYPJGzJMRPLBu7lQJ
2/joGh5dqKoZ6jAk7vdT8bfXbw0Wl4vUKHakLBzFN1+r19XpRiUk8ds3CdX/
lu+eaPmpyBAIBHMHkTvqYXeywkLe2QnILWnyVurx2j9utH0mPjkW5f3IwpH4
FYhWyVNiipjNfQfLnMj7VmUsWDJOVVoAyJKiyVZQiLaAFRx9F48mb6LNb/SN
cMrbr+O2MgOgxB4fwO1IQ8XnCMjKVHQ/kq2Zeo+oUBjG4bXbllqTF1qWISig
7Vd4SIzb6NoTS6kCW7JIcfctLoRspYTn5+8tPnQXeXzZM0Pe5a/q+a/l9r9W
29/5vMR6xA7Wc3//983vjrW9cTV/pq9ehT9/OTDv5UQXkYW1mM4MVlyjyiiK
bItRAM1XGQWYW6yYCX0T5LaKr4tJSBLBcx5zjFRhdZwFHWrZkQHARV7yUikn
Pi6VaueITsRRg1OZhfgqiew7G81MRsHwAmvgTFdAB5mLfNPky9PWDUZfn78S
b96ev/ffjcTz0Xf060Ht5fnXz/yrkf9y8PLrweanry9etvrw/esgkJ9vR88G
Xzu34e35wP/rX6/81X989+N/BN98/eJl23mPimrw43cXxd+eOP0fv14mm7+8
yVbDF+9+OZ3Hf3s9f+u/Cnz/YrRIR2F2tf7pp/5f5u9/jqPuq3R589NPL3pv
i5uD2psnoNp8++10Prvxs3f55fPrIg++G/18+/xVkb169re4/3rQfPXkNvG/
KfJflm+95stW8Tz+Vi4NLLAdC7Py3+my7XyVJuSZsY7tVy4Soag/pY3kBvS7
4fjN4MV5YINxfH07uv3u2fP0P85/+dEJ/L9+dy4/D/2/TocAuNH8L+Hg659a
L3766ebiu/fT75L1L+Ffss5P8eloclCb/HK6bGXvF8n53ya3z53us83qxcRf
Dl5Ogx8n4S9v3dbNu6vZL5f5X27HLyYv29ez4pfXLy7SxdXTpzYgqjOTcKA7
BkpnXC6e+ZSeKI/yypufSoWnWF6a89AjWxLwNbLmLsmPj2T3dVkGmS883SYb
OndoYuCYGY00hAVzspzvKOfkOOnNs6r877ohkhyAoajc8ap9OZWMu4Oa/qF0
jXfpxjnrKIS6+UgmwJmTKTknwLGDE68Tky7TY3NsAt0ZBn1+n6cX2sPReDgc
dMdutz32Pafb7Y3HI681GHUH/aDZuSP3sz8Y9kZDp+P7rU67NfZ63X4rGLpN
+M/A7ze9f4nTC3TAo+W3x4O20232Ov1+p9Uf+K1m32t2h57jD/emx/rDYWcU
dJotv+c4fm/k9JvdZnMcuAF00WsN9rUbe4PxKGj3moEL+9ButzqDsRMM/aDd
avoDp7+vXb/d7vXhnUGr2eq3Xd/r+y0H/kZ4QAX28490uGHXEQO1QZ91uoFv
Ht0hhk8tovjHH1f4vNqVpR0tF7K8r47lH/64wkPKuuphfnfHFb746MF9ZWHN
m3vKw+6ESRUuO/Liv7x8rBngH5cXb4hQCvkHUupvmT1Pnlf7ZGqxrSOwX7F0
JnUA0tNr90BI4CnQVs/zxnga9D4B2x/U7haj7V7LH3rqwKvX8Z1xB35zWCzV
9sul++QPJt3fKWjuFii1UddpwgtDOkbrOh78v9nuwiS9nttz217X6QQdt9Pv
jLqwsm6v2/KG6sRwTR0Zdl0AWdBruS3fcxFwo/tZZ21/3d/72KXbrAHsmruO
EN/HiPAIca3XbMHg25W6uVD33bRV2yYu13PGdiXi/do233n0hG5sN0p3vq11
053vX6R0s6gs5a2bK+/U1VqYfo7VF8jPLoM/1k1hioxLd7Rjvl8o7xe+X02n
a7KNkl7O0Tyo3abZNV5TCvyeA1p4sz3FK2b28Q+ZDQjSr86p36XQ0j9C8+f0
3j+u5h90/E7H6zSDYNwKOuNxu9/3/FHL6QLeO8Ph8A7Nv9lq42l54BBjYHvD
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
WGSxX0KCvLqvN1D9pJL4/wD2c7ng49MAAA==

-->

</rfc>

