<?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.4 (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-19" 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="2024" month="March" day="02"/>

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

    <abstract>


<?line 93?>

<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 102?>

<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, including where to find the payload, 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,
confidentiality may also be afforded.</t>

<t>Encryption prevents third parties, including attackers, from gaining
access to the payload. Attackers typically need intimate knowledge
of a binary, such as a firmware image, 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.
Beside confidentiality of the binary, confidentiality of the sources
(e.g. in case of open source software) may be required as well to prevent
reverse engineering and/or reproduction of the binary firmware.</t>

<t>While the original motivating use case of this document was firmware
encryption, the use of SUIT manifests has been extended to other use cases
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>Hence, we use the term payload to generically refer to all those objects.</t>

<t>The payload is encrypted using a symmetric content encryption
key, which can be established using a variety of mechanisms; this
document defines two content key distribution methods 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 method relies on asymmetric key cryptography while the
latter uses symmetric key cryptography.</t>

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

<t>The goal of this specification is to protect payloads during end-to-end
transport, and at rest when stored on a device. Constrained devices often
make use of XIP, which is a method of executing code
directly from flash memory rather than copying it into RAM. Since many of
these devices today do not offer hardware-based, on-the-fly decryption of
code stored in flash memory, it may be necessary to decrypt and store
firmware images in on-chip flash before code can be executed. We do, however,
expect that hardware-based, on-the-fly decryption will become more common in
the future, which will improve 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 authors 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"/> 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 and <xref target="arch-fig"/> shows it graphically.</t>

<t>To encrypt a payload it is necessary to know the recipient.
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
authentication of the sender and for integrity protection the recipients
must be provisioned with a trust anchor when a manifest is protected using
a digital signature. When a MAC is used to protect the manifest then a
symmetric key must be shared by the recipient and the sender.</t>

<t>With encryption, the author cannot just create a manifest for the payload
and sign it, since it typically does not know the recipients. Hence, the
author has to collaborate with the distribution system. The varying degree
of collaboration is discussed below.</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>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. There are proprietary as well as
standardized device management solutions available providing this functionality,
as discussed in <xref target="RFC9019"/>. 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. The
author typically uses REST APIs or web user interfaces to interact with the
distribution system. 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 flexibility 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 delegates encryption rights to the distributor two models are possible:</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"/>. This model nevertheless represent the current
state of firmware updates for IoT devices.</t>
  <t>The distributor uses a two-layer manifest system. More precisely, 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 incurs additional
overhead: one additional signature verification and one additional manifest,
as well as the additional machinery in the recipient needed for dependency
processing. This extra complexity offers extra security.</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 implement the two-layer manifest
approach 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>Once a CEK is available, the steps described in <xref target="content-enc"/> are applicable.
These steps apply to both content key distribution methods described in this
section.</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 methods,
the distribution system needs to know which of two specified methods
wis supported. Mandating only a single content key distribution
method 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 = 19
]]></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 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 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 / 19: h'D86...1F0',
  / parameter-source-component / 22: 1
},
/ directive-copy / 22, 15
]]></artwork></figure>

<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 Section
8.4.8.6 of <xref 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 sub-sections below describe two content key distribution methods,
namely AES Key Wrap (AES-KW) and Ephemeral-Static Diffie-Hellman (ES-DH).
Many other methods are specified in the literature, and even supported
by COSE. AES-KW and ES-DH cover the popular methods used in the market
today and they were selected due to their maturity, different
security properties, and because of their interoperability properties.</t>

<t>The two 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 an encrypted payload is sent to multiple recipients, there
are different deployment options. To explain these options we use the
following notation:</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 is described in <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>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 data protected with that KEK, including binaries, and configuration data.</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 be 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 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[
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 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>

</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,
and it is called ECDH-ES + AES-KW.
An example is given in <xref target="esdh-aesgcm-example"/>.</t>

<t>There exists another version of ES-DH algorithm, namely ECDH-ES + HKDF, which
does not use AES Key Wrap. It is not specified in this document.</t>

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

<t>There are only two deployment options with this approach since 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 and all recipients
receive the same encrypted payload, i.e. the same CEK is used to encrypt the payload.
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 ephemeral key
and an identifier for the recipients 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 a payload with a different CEK for each
recipient. This results in n-manifests. This approach is useful when payloads contain
information unique to a device. The encryption operation then effectively becomes
ENC(payload_i, CEK(Ri, S)). Assume that KEK(R1, S),..., KEK(Rn, S) have been generated
for the different recipients using ES-DH. The following steps need to be made
by the sender:</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 shown in <xref target="cddl-esdh"/>.
Only the minimum number of parameters is 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[
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 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 <xref target="RFC9053"/> 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 -3), 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_map_esdh field, which contains (among other fields)
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 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
is to provide extra randomness in the KDF context. If the salt is sent
in the 'salt' algorithm header parameter, then the receiver MUST be able to
process the salt and MUST pass it into the key derivation function.
For more information about the salt, 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>

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

<t>This section summarizes the steps taken for content encryption, which
applies to both content key distribution methods.</t>

<t>For use with AEAD ciphers, such as AES-GCM and ChaCha20/Poly1305,
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 is 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><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 from the COSE_Encrypt structure.</t>
  <t>The value of the external_aad MUST be set to a zero-length byte string,
i.e., h'' in diagnostic notation and encoded as 0x40.</t>
</list></t>

<t>Some ciphers provide confidentiality witout integrity protection, such
as AES-CTR and AES-CBC (see <xref target="RFC9459"/>). For these ciphers the
Enc_structure, shown in <xref target="cddl-enc-aeskw"/>, MUST NOT be used because
the Additional Authenticated Data (AAD) byte string is only consumable
by AEAD ciphers. Hence, the AAD structure is not supplied to the 
API of those ciphers and the protected header in the SUIT_Encryption_Info
structure MUST be a zero-length byte string.</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[
D8608443A10101A10550F14AAB9D81D51F7AD943FE87AF4F70CDF6818340
A2012204456B69642D31581875603FFC9518D794713C8CA8A115A7FB3256
5A6D59534D62
]]></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 / AES-GCM-128 /
  } >>,
  / unprotected: / {
    / IV / 5: h'F14AAB9D81D51F7AD943FE87AF4F70CD'
  },
  / 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[
2F59C3A34D9570FB99A5382E66466A3221A8AD85CE508BA306FB431A60EF
A5AAAA078355070205A4B196832DF17F
]]></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: 1 (A128GCM)</t>
      <t>SuppPubInfo
      <list style="symbols">
          <t>keyDataLength: 128</t>
          <t>protected = &lt;&lt; { / alg / 1: -29 / ECDH-ES+A128KW / } &gt;&gt;</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[
D8608443A10101A10550F14AAB9D81D51F7AD943FE87AF4F70CDF6818344
A101381CA120A40102200121582038876D8B4552E6BC9484A3F06E3646B3
0AEFF51B95583CFFA0B5776D5273494222582034577AB5DD17276BB6BF15
AA465310371557AFF61FAC5BA5A1EFF46698DD8B7B5818C36BF2E8843246
F0E148DBA607375204A040D8B19629B2B5
]]></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 / AES-GCM-128 /
  } >>,
  / unprotected: / {
    / IV / 5: h'F14AAB9D81D51F7AD943FE87AF4F70CD'
  },
  / 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'38876D8B4552E6BC9484A3F06E3646B3
                      0AEFF51B95583CFFA0B5776D52734942',
          / y / -3: h'34577AB5DD17276BB6BF15AA46531037
                      1557AFF61FAC5BA5A1EFF46698DD8B7B'
        }
      },
      / payload:
        / h'C36BF2E8843246F0E148DBA607375204A040D8B19629B2B5'
        / CEK encrypted with KEK /
    ]
  ]
])
]]></artwork></figure>

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

<figure><artwork><![CDATA[
2F59C3A34D9570FB99A5382E66466A3221A8AD85CE508BA306FB431A60EF
A5AAAA078355070205A4B196832DF17F
]]></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, provides confidentiality but no integrity protection.
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"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="248" viewBox="0 0 248 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 56,96 L 56,176" fill="none" stroke="black"/>
<path d="M 88,48 L 88,88" fill="none" stroke="black"/>
<path d="M 88,184 L 88,240" fill="none" stroke="black"/>
<path d="M 120,96 L 120,176" fill="none" stroke="black"/>
<path d="M 176,96 L 176,176" fill="none" stroke="black"/>
<path d="M 208,48 L 208,88" fill="none" stroke="black"/>
<path d="M 208,184 L 208,240" fill="none" stroke="black"/>
<path d="M 240,96 L 240,176" fill="none" stroke="black"/>
<path d="M 56,96 L 120,96" fill="none" stroke="black"/>
<path d="M 176,96 L 240,96" fill="none" stroke="black"/>
<path d="M 56,176 L 120,176" fill="none" stroke="black"/>
<path d="M 176,176 L 240,176" fill="none" stroke="black"/>
<path d="M 64,208 L 96,208" fill="none" stroke="black"/>
<path d="M 184,208 L 216,208" fill="none" stroke="black"/>
<g class="text">
<text x="88" y="36">IV1</text>
<text x="208" y="36">IV2</text>
<text x="40" y="148">k--</text>
<text x="80" y="148">E</text>
<text x="160" y="148">k--</text>
<text x="200" y="148">E</text>
<text x="52" y="212">P1</text>
<text x="172" y="212">P2</text>
<text x="92" y="260">C1</text>
<text x="212" y="260">C2</text>
<text x="32" y="292">Legend:</text>
<text x="32" y="308">See</text>
<text x="84" y="308">previous</text>
<text x="156" y="308">diagram.</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
         IV1            IV2
          |              |
          |              |
          |              |
      +-------+      +-------+
      |       |      |       |
      |       |      |       |
   k--|  E    |   k--|  E    |
      |       |      |       |
      +-------+      +-------+
          |              |
     P1--(+)        P2--(+)
          |              |
          |              |
          C1             C2

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

<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 = &lt;&lt; { / alg / 1: -3 / A128KW / } &gt;&gt;</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
44A101381CA120A40102200121582050364E4DF3F5E8749D98E4378C04FA
FE643B6ACEE7138382D83F768C7186FB8522582099E6C96BEF3952B12EF8
3921B1749475D767284AA42D74D8923C137B01EDF5A05818E8599DCEE494
4EECA9781D3ECDE3D9C34E1C9FCE8906617F
]]></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[
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'50364E4DF3F5E8749D98E4378C04FAFE643B6ACEE7138382D83F768C7186FB85',
          / y / -3: h'99E6C96BEF3952B12EF83921B1749475D767284AA42D74D8923C137B01EDF5A0'
        }
      },
      / payload: / h'E8599DCEE4944EECA9781D3ECDE3D9C34E1C9FCE8906617F'
        / 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, provides confidentiality but no integrity protection.
In AES-CBC, a single IV is used for encryption of firmware belonging to a single sector,
since individual AES blocks are chained together, 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"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="232" viewBox="0 0 232 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 40,112 L 40,192" fill="none" stroke="black"/>
<path d="M 72,48 L 72,104" fill="none" stroke="black"/>
<path d="M 72,200 L 72,256" fill="none" stroke="black"/>
<path d="M 104,112 L 104,192" fill="none" stroke="black"/>
<path d="M 120,64 L 120,224" fill="none" stroke="black"/>
<path d="M 160,112 L 160,192" fill="none" stroke="black"/>
<path d="M 192,48 L 192,104" fill="none" stroke="black"/>
<path d="M 192,200 L 192,256" fill="none" stroke="black"/>
<path d="M 224,112 L 224,192" fill="none" stroke="black"/>
<path d="M 48,64 L 80,64" fill="none" stroke="black"/>
<path d="M 120,64 L 200,64" fill="none" stroke="black"/>
<path d="M 40,112 L 104,112" fill="none" stroke="black"/>
<path d="M 160,112 L 224,112" fill="none" stroke="black"/>
<path d="M 40,192 L 104,192" fill="none" stroke="black"/>
<path d="M 160,192 L 224,192" fill="none" stroke="black"/>
<path d="M 72,224 L 120,224" fill="none" stroke="black"/>
<path d="M 24,384 L 40,384" fill="none" stroke="black"/>
<g class="text">
<text x="68" y="36">P1</text>
<text x="196" y="36">P2</text>
<text x="36" y="68">IV</text>
<text x="24" y="164">k--</text>
<text x="64" y="164">E</text>
<text x="144" y="164">k--</text>
<text x="184" y="164">E</text>
<text x="76" y="276">C1</text>
<text x="196" y="276">C2</text>
<text x="32" y="308">Legend:</text>
<text x="28" y="324">Pi</text>
<text x="48" y="324">=</text>
<text x="96" y="324">Plaintext</text>
<text x="164" y="324">blocks</text>
<text x="28" y="340">Ci</text>
<text x="48" y="340">=</text>
<text x="100" y="340">Ciphertext</text>
<text x="172" y="340">blocks</text>
<text x="24" y="356">E</text>
<text x="40" y="356">=</text>
<text x="92" y="356">Encryption</text>
<text x="172" y="356">function</text>
<text x="24" y="372">k</text>
<text x="40" y="372">=</text>
<text x="88" y="372">Symmetric</text>
<text x="144" y="372">key</text>
<text x="56" y="388">=</text>
<text x="80" y="388">XOR</text>
<text x="136" y="388">operation</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![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></artset></figure>

<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'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: -65531 (A128CBC)</t>
      <t>SuppPubInfo
      <list style="symbols">
          <t>keyDataLength: 128</t>
          <t>protected = h''</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
44A101381CA120A401022001215820BC6A2DCD5025C8C0F7A5D120EB3E45
8CA722F8FB94BD56A24709CB15A869748922582010136574F673511540FE
2A8589A7EDA372CB7B1AF94A8E1B4B94F6BDBD98AA185818AC8CDFB54264
22298FCF235EB5F24D9E4C44C1689167473A
]]></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[
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'BC6A2DCD5025C8C0F7A5D120EB3E458CA722F8FB94BD56A24709CB15A8697489',
          / y / -3: h'10136574F673511540FE2A8589A7EDA372CB7B1AF94A8E1B4B94F6BDBD98AA18'
        }
      },
      / payload: / h'AC8CDFB5426422298FCF235EB5F24D9E4C44C1689167473A'
        / 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 (Section 8.4.9.2 of 
<xref 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 / 19: h'369...50F',
  / parameter-source-component / 22: 1
},
/ directive-copy / 22, 15,
/ condition-image-match / 3, 15 / integrity check on decrypted payload /,
]]></artwork></figure>

</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 / integrity check on encrypted payload /,

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

</section>
<section anchor="checking-authentication-tag-while-decryption"><name>Checking Authentication Tag while Decryption</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-in-suit-manifest"><name>Payload Integrity in SUIT Manifest</name>

<t>This sub-section provides a guideline to decide
how to validate the integrity of the payloads with SUIT Manifest.
<xref target="payload-integrity-classification-tree"/> illustrates a classification tree
to decide how to establish payload integrity.</t>

<figure title="Classification Tree: Appropriate Location of Image Match" anchor="payload-integrity-classification-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 conditions:</t>

<t><list style="symbols">
  <t>Q1. How does the recipient get the encrypted payload?
If the encrypted payload is an integrated payload,
its integrity is already validated with the suit-authentication-wrapper,
so additional integrity check is not required.</t>
  <t>Q2. Does the sender want to mitigate battery exhaustion attacks?
If yes, the encrypted payload has to be validated before decryption.</t>
  <t>Q3. Is the payload encrypted with an AEAD cipher?
If yes, the additional integrity check is not required because the recipient validates
the integrity of the payload while decrypting it. If no, validating its integrity
must take place either before or after decryption.</t>
</list></t>

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

<t>There are many flavors of embedded devices, the market is large and fragmented.
Hence, it is likely that some implementations and deployments implement their
firmware update procedure differently than described below. On a positive note,
the SUIT manifest allows different deployment scenarios to be supported easily
thanks to the "scripting" functionality offered by the commands.</t>

<t>This section is specific to firmware images on microcontrollers and does
not apply to generic software, configuration data, and machine learning models. 
The differences are the result of two aspects:</t>

<t><list style="symbols">
  <t>Use of flash memory: Flash memory on microcontrollers is a type of non-volatile
memory that erases data in larger units called blocks, pages, or sectors and
re-writes data at the byte level (often 4-bytes) or larger units. 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.</t>
  <t>Microcontroller Design: Code on microcontrollers typically cannot be executed
from an arbitrary place in flash memory without extra software
development and design efforts. Hence, developers often compile firmware such
that the bootloader can execute the code from a specific location in flash
memory. Often, the location where the to-be-booted firmware image is found is
called "primary slot".</t>
</list></t>

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

<t>At the next boot, the bootloader will recognize a new firmware image and will
start decrypting the downloaded image sector-by-sector and will swap it with
the image found in the primary slot. This approach of swapping the newly
downloaded image with the previously valid image requires two slots to allow
the update to be reversed in case the newly obtained firmware image fails to
boot. This adds robustness to the firmware update procedure.</t>

<t>The swap will 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>Without hardware-based, on-the-fly decryption the image in the primary
slot is available in cleartext. It may need to be re-encrypted before copying it
to the secondary slot. This may be necessary when the secondary slot has different
access permissions or when it is located in off-chip flash memory. Off-chip flash
memory 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 restart an interrupted firmware update is often a requirement
for unattended devices and the same is true for low-end, constrained 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="RFC9459"/> 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
need to be encrypted, the use of 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 the 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>
<section anchor="complete-examples"><name>Complete Examples</name>

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

<t>HMAC-256 MAC are added in AES-KW examples using 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 requests a parser
to authenticate the manifest with COSE_Mac0 HMAC256, to write and 
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'536EC695E423342FF57FA89B3E3C12C0
                          F9257992F7D96F017281782D2DF1C50F'
    ] >>,
    << / COSE_Mac0_Tagged / 17([
      / protected: / << {
        / algorithm-id / 1: 5 / HMAC256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / tag: / h'3B70571169B0FEE5E6220BF86E5E973F
                 7F32875495908EDAA91EC994BCA44B29'
    ]) >>
  ] >>,
  / 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'2F59C3A34D9570FB99A5382E66466A3221A8AD85CE508B
            A306FB431A60EFA5AAAA078355070205A4B196832DF17F',
        / parameter-encryption-info / 19: << 96([
          / protected: / << {
            / alg / 1: 1 / AES-GCM-128 /
          } >>,
          / unprotected: / {
            / IV / 5: h'F14AAB9D81D51F7AD943FE87AF4F70CD'
          },
          / payload: / null / detached ciphertext /,
          / recipients: / [
            [
              / protected: / << {
              } >>,
              / unprotected: / {
                / alg / 1: -3 / A128KW /,
                / kid / 4: 'kid-1'
              },
              / payload: /
                h'75603FFC9518D794713C8CA8A115A7FB32565A6D59534D62'
                / 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[
D86BA2025853825824822F5820536EC695E423342FF57FA89B3E3C12C0F9
257992F7D96F017281782D2DF1C50F582AD18443A10105A0F658203B7057
1169B0FEE5E6220BF86E5E973F7F32875495908EDAA91EC994BCA44B2903
589DA4010102010357A102818152706C61696E746578742D6669726D7761
726511587C8414A212582E2F59C3A34D9570FB99A5382E66466A3221A8AD
85CE508BA306FB431A60EFA5AAAA078355070205A4B196832DF17F135843
D8608443A10101A10550F14AAB9D81D51F7AD943FE87AF4F70CDF6818341
A0A2012204456B69642D31581875603FFC9518D794713C8CA8A115A7FB32
565A6D59534D62120F
]]></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 store it. Then, the payload is decrypted and stored into
another component with the suit-directive-copy directive. This approach
works well on constrained devices with XIP 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'AAB6A7868C4E43D5983BDE019EF22779
                          21F6F8EF1FCAF9403CA97255BED2CD30'
    ] >>,
    << / COSE_Mac0_Tagged / 17([
      / protected: / << {
        / algorithm-id / 1: 5 / HMAC256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / tag: / h'93B4B774A5D0421ED6FB5EBF890A284C
                 DAC7816CBC048BF47EE7FA7FF3BC02C3'
    ]) >>
  ] >>,
  / 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'F14AAB9D81D51F7AD943FE87AF4F70CD'
          },
          / payload: / null / detached ciphertext /,
          / recipients: / [
            [
              / protected: / << {
              } >>,
              / unprotected: / {
                / alg / 1: -3 / A128KW /,
                / kid / 4: 'kid-1'
              },
              / payload: /
                h'75603FFC9518D794713C8CA8A115A7FB32565A6D59534D62'
                / 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[
D86BA2025853825824822F5820AAB6A7868C4E43D5983BDE019EF2277921
F6F8EF1FCAF9403CA97255BED2CD30582AD18443A10105A0F6582093B4B7
74A5D0421ED6FB5EBF890A284CDAC7816CBC048BF47EE7FA7FF3BC02C303
58B7A40101020103582BA102828152706C61696E746578742D6669726D77
6172658152656E637279707465642D6669726D776172651158818C0C0114
A20E182E15782668747470733A2F2F6578616D706C652E636F6D2F656E63
7279707465642D6669726D77617265150F0C0014A2135843D8608443A101
01A10550F14AAB9D81D51F7AD943FE87AF4F70CDF6818341A0A201220445
6B69642D31581875603FFC9518D794713C8CA8A115A7FB32565A6D59534D
621601160F
]]></artwork></figure>

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

<t>The following SUIT manifest requests a parser to authenticate
the manifest with COSE_Sign1 ES256,
to write and 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'CEF034223D7F2C39D676876995B4ED4E
                          8221AC5BF184B6606EE62C41C149C266'
    ] >>,
    << / COSE_Sign1_Tagged / 18([
      / protected: / << {
        / algorithm-id / 1: -7 / ES256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / signature: /
        h'65E59AAB8A35BDE9547458316D1C769F
          FB2CEA304C9FB6151E5C8A88A002A292
          C5B8C63C81B5AC0AE31948B610834E12
          CBDBB2753EA221544B6733076A92EE20'
    ]) >>
  ] >>,
  / 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'344FA2D5AD2F43F6F363DA6FF2C337FE69E33E3D63714D
            23985BF02499EB0E8B231D45C378245DA3611C160CC511',
        / parameter-encryption-info / 19: << 96([
          / protected: / << {
            / alg / 1: 1 / AES-GCM-128 /
          } >>,
          / unprotected: / {
            / 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'FF6E266DABAF51B7207569E31CF72646
                              183E94CEE64FCDC8695AD9A505AEFDEA',
                  / y / -3: h'5FBC4A29844450B3AC22AB30C7F7004B
                              B59D8BD60D7997734A9FA0124B650895'
                },
                / kid / 4: 'kid-2'
              },
              / payload: /
                h'B0E21628283F3E409F8158D8FFCA567F340E379AC39E49C9'
                / CEK encrypted with KEK /
            ]
          ]
        ]) >>
      },
      / 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[
D86BA2025873825824822F5820CEF034223D7F2C39D676876995B4ED4E82
21AC5BF184B6606EE62C41C149C266584AD28443A10126A0F6584065E59A
AB8A35BDE9547458316D1C769FFB2CEA304C9FB6151E5C8A88A002A292C5
B8C63C81B5AC0AE31948B610834E12CBDBB2753EA221544B6733076A92EE
200358ECA4010102010357A1028181526465637279707465642D6669726D
776172651158CB860C0014A212582E344FA2D5AD2F43F6F363DA6FF2C337
FE69E33E3D63714D23985BF02499EB0E8B231D45C378245DA3611C160CC5
11135890D8608443A10101A10550DAE613B2E0DC55F4322BE38BDBA9DC68
F6818344A101381CA220A401022001215820FF6E266DABAF51B7207569E3
1CF72646183E94CEE64FCDC8695AD9A505AEFDEA2258205FBC4A29844450
B3AC22AB30C7F7004BB59D8BD60D7997734A9FA0124B65089504456B6964
2D325818B0E21628283F3E409F8158D8FFCA567F340E379AC39E49C9120F
]]></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:
~~~
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIIQa67e56m8CYL5zVaJFiLl30j0qxb8ray2DeUMqH+qYoAoGCCqGSM49
AwEHoUQDQgAEDpCKqPBm2x8ITgw2UsY5Ur2Z8qW9si+eATZ6rQOrpot32hvYrE8M
tJC6IQZIv3mrFk1JrTVR1x0xSydJ7kLSmg==
-----END EC PRIVATE KEY-----
~~~</t>

<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[
/ SUIT_Envelope_Tagged / 107({
  / authentication-wrapper / 2: << [
    << [
      / digest-algorithm-id: / -16 / SHA256 /,
      / digest-bytes: / h'6A1D9F42E7B4047D2F54046019AE3ED4
                          3A8ACC467AC16576B17D6F8E633042D2'
    ] >>,
    << / COSE_Sign1_Tagged / 18([
      / protected: / << {
        / algorithm-id / 1: -7 / ES256 /
      } >>,
      / unprotected: / {},
      / payload: / null,
      / signature: /
        h'DF493BDBF167EFFB40593C5910D33B66
          429721467DF05800EA66A88B91729CD5
          1007981F151FC324745FF43E6F75AAF5
          197DD5EC4AA6BCEFCE43E4B1E35C948E'
    ]) >>
  ] >>,
  / manifest / 3: << {
    / manifest-version / 1: 1,
    / manifest-sequence-number / 2: 1,
    / common / 3: << {
      / dependencies / 1: {
        / component-index / 1: {
          / dependency-prefix / 1: [
             'dependency-manifest.suit'
          ]
        }
      },
      / components / 2: [
        ['decrypted-firmware']
      ]
    } >>,
    / manifest-component-id / 5: [
      'dependent-manifest.suit'
    ],
    / install / 17: << [
      / NOTE: set SUIT_Encryption_Info /
      / directive-set-component-index / 12, 0
        / ['decrypted-firmware'] /,
      / directive-override-parameters / 20, {
        / parameter-content / 18:
          h'344FA2D5AD2F43F6F363DA6FF2C337FE69E33E3D63714D
            23985BF02499EB0E8B231D45C378245DA3611C160CC511',
        / parameter-encryption-info / 19: << 96([
          / protected: / << {
            / alg / 1: 1 / AES-GCM-128 /
          } >>,
          / unprotected: / {
            / 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'FF6E266DABAF51B7207569E31CF72646
                              183E94CEE64FCDC8695AD9A505AEFDEA',
                  / y / -3: h'5FBC4A29844450B3AC22AB30C7F7004B
                              B59D8BD60D7997734A9FA0124B650895'
                },
                / kid / 4: 'kid-2'
              },
              / payload: /
                h'B0E21628283F3E409F8158D8FFCA567F340E379AC39E49C9'
                / CEK encrypted with KEK /
            ]
          ]
        ]) >>
      },

      / NOTE: call dependency-manifest /
      / directive-set-component-index / 12, 1
        / ['dependenty-manifest.suit'] /,
      / directive-override-parameters / 20, {
        / parameter-image-digest / 3: << [
          / algorithm-id / -16 / SHA256 /,
          / digest-bytes / h'1051324059C5193317CAC9A099BBC0B6
                             AFB56184C04277F566A3A4131F4A1C25'
        ] >>,
        / parameter-image-size / 14: 247,
        / parameter-uri / 21: "#dependency-manifest"
      },
      / directive-fetch / 21, 15,
      / condition-dependency-integrity / 7, 15,
      / directive-process-dependency / 11, 15
    ] >>
  } >>,
  "#dependency-manifest": <<
    / SUIT_Envelope_Tagged / 107({
      / authentication-wrapper / 2: << [
        << [
          / digest-algorithm-id: / -16 / SHA256 /,
          / digest-bytes: / h'1051324059C5193317CAC9A099BBC0B6
                              AFB56184C04277F566A3A4131F4A1C25'
        ] >>,
        << / COSE_Sign1_Tagged / 18([
          / protected: / << {
            / algorithm-id / 1: -7 / ES256 /
          } >>,
          / unprotected: / {},
          / payload: / null,
          / signature: /
            h'55990F3745DC4F200FF946643A6DE30D
              DCE57B080B7D68DE9896D8190B9A63E2
              D60E7C3D9693B67221AA6D07BBF0AB45
              314C236827A242C22B5E688DDC467269'
        ]) >>
      ] >>,
      / manifest / 3: << {
        / manifest-version / 1: 1,
        / manifest-sequence-number / 2: 1,
        / common / 3: << {
          / components / 2: [
            ['decrypted-firmware']
          ],
          / shared-sequence / 4: << [
            / directive-set-componnt-index / 12, 0
              / ['decrypted-firmware'] /,
            / directive-override-parameters / 20, {
              / parameter-image-digest / 3: << [
                / algorithm-id / -16 / SHA256 /,
                / digest-bytes / h'36921488FE6680712F734E11F58D87EE
                                   B66D4B21A8A1AD3441060814DA16D50F'
              ] >>,
              / parameter-image-size / 14: 30
            }
          ] >>
        } >>,
        / manifest-component-id / 5: [
          'dependency-manifest.suit'
        ],
        / validate / 7: << [
          / condition-image-match / 3, 15
        ] >>,
        / install / 17: << [
          / directive-set-component-index / 12, 0
            / ['decrypted-firmware'] /,
          / directive-write / 18, 15
            / consumes the SUIT_Encryption_Info set by dependent /,
          / condition-image-match / 3, 15
            / check the integrity of the decrypted payload /
        ] >>
      } >>
    })
  >>
})
]]></artwork></figure>

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

<figure><artwork><![CDATA[
D86BA3025873825824822F58206A1D9F42E7B4047D2F54046019AE3ED43A
8ACC467AC16576B17D6F8E633042D2584AD28443A10126A0F65840DF493B
DBF167EFFB40593C5910D33B66429721467DF05800EA66A88B91729CD510
07981F151FC324745FF43E6F75AAF5197DD5EC4AA6BCEFCE43E4B1E35C94
8E03590170A501010201035837A201A101A101815818646570656E64656E
63792D6D616E69666573742E73756974028181526465637279707465642D
6669726D77617265058157646570656E64656E742D6D616E69666573742E
73756974115901138E0C0014A212582E344FA2D5AD2F43F6F363DA6FF2C3
37FE69E33E3D63714D23985BF02499EB0E8B231D45C378245DA3611C160C
C511135890D8608443A10101A10550DAE613B2E0DC55F4322BE38BDBA9DC
68F6818344A101381CA220A401022001215820FF6E266DABAF51B7207569
E31CF72646183E94CEE64FCDC8695AD9A505AEFDEA2258205FBC4A298444
50B3AC22AB30C7F7004BB59D8BD60D7997734A9FA0124B65089504456B69
642D325818B0E21628283F3E409F8158D8FFCA567F340E379AC39E49C90C
0114A3035824822F58201051324059C5193317CAC9A099BBC0B6AFB56184
C04277F566A3A4131F4A1C250E18F7157423646570656E64656E63792D6D
616E6966657374150F070F0B0F7423646570656E64656E63792D6D616E69
6665737458F7D86BA2025873825824822F58201051324059C5193317CAC9
A099BBC0B6AFB56184C04277F566A3A4131F4A1C25584AD28443A10126A0
F6584055990F3745DC4F200FF946643A6DE30DDCE57B080B7D68DE9896D8
190B9A63E2D60E7C3D9693B67221AA6D07BBF0AB45314C236827A242C22B
5E688DDC46726903587BA601010201035849A20281815264656372797074
65642D6669726D7761726504582F840C0014A2035824822F582036921488
FE6680712F734E11F58D87EEB66D4B21A8A1AD3441060814DA16D50F0E18
1E05815818646570656E64656E63792D6D616E69666573742E7375697407
4382030F1147860C00120F030F
]]></artwork></figure>

</section>
</section>
<section anchor="operational-considerations"><name>Operational 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 a 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 need to be provisioned.
This specification places no requirements on the structure of the
key identifier.</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="sec-cons"><name>Security Considerations</name>

<t>This entire document is about security.</t>

<t>It is good security practise to use different keys for different purpose.
For example, the KEK used with an AES-KW-based content key distribution
method for encryption should be different from the long-term symmetric key
used for authentication in a communication security protocol.</t>

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

<t>A large part of this document is focused on the content key distribution and
two methods are utilized, namely AES Key Wrap (AES-KW) and Ephemeral-Static
Diffie-Hellman (ES-DH). In this table we summarize the main properties with
respect to their deployment:</t>

<figure><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="464" width="520" viewBox="0 0 520 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
<path d="M 8,32 L 8,448" fill="none" stroke="black"/>
<path d="M 136,32 L 136,448" fill="none" stroke="black"/>
<path d="M 144,32 L 144,448" fill="none" stroke="black"/>
<path d="M 248,32 L 248,448" fill="none" stroke="black"/>
<path d="M 376,32 L 376,448" fill="none" stroke="black"/>
<path d="M 512,32 L 512,448" fill="none" stroke="black"/>
<path d="M 8,32 L 512,32" fill="none" stroke="black"/>
<path d="M 8,128 L 512,128" fill="none" stroke="black"/>
<path d="M 8,272 L 512,272" fill="none" stroke="black"/>
<path d="M 8,368 L 512,368" fill="none" stroke="black"/>
<path d="M 8,448 L 512,448" fill="none" stroke="black"/>
<path d="M 128,32 C 136.83064,32 144,39.16936 144,48" fill="none" stroke="black"/>
<path d="M 152,32 C 143.16936,32 136,39.16936 136,48" fill="none" stroke="black"/>
<path d="M 128,128 C 136.83064,128 144,135.16936 144,144" fill="none" stroke="black"/>
<path d="M 128,128 C 136.83064,128 144,120.83064 144,112" fill="none" stroke="black"/>
<path d="M 152,128 C 143.16936,128 136,135.16936 136,144" fill="none" stroke="black"/>
<path d="M 152,128 C 143.16936,128 136,120.83064 136,112" fill="none" stroke="black"/>
<path d="M 128,272 C 136.83064,272 144,279.16936 144,288" fill="none" stroke="black"/>
<path d="M 128,272 C 136.83064,272 144,264.83064 144,256" fill="none" stroke="black"/>
<path d="M 152,272 C 143.16936,272 136,279.16936 136,288" fill="none" stroke="black"/>
<path d="M 152,272 C 143.16936,272 136,264.83064 136,256" fill="none" stroke="black"/>
<path d="M 128,368 C 136.83064,368 144,375.16936 144,384" fill="none" stroke="black"/>
<path d="M 128,368 C 136.83064,368 144,360.83064 144,352" fill="none" stroke="black"/>
<path d="M 152,368 C 143.16936,368 136,375.16936 136,384" fill="none" stroke="black"/>
<path d="M 152,368 C 143.16936,368 136,360.83064 136,352" fill="none" stroke="black"/>
<path d="M 128,448 C 136.83064,448 144,440.83064 144,432" fill="none" stroke="black"/>
<path d="M 152,448 C 143.16936,448 136,440.83064 136,432" fill="none" stroke="black"/>
<g class="text">
<text x="52" y="68">Number</text>
<text x="92" y="68">of</text>
<text x="180" y="68">Same</text>
<text x="216" y="68">key</text>
<text x="280" y="68">One</text>
<text x="312" y="68">key</text>
<text x="408" y="68">One</text>
<text x="440" y="68">Key</text>
<text x="64" y="84">Long-Term</text>
<text x="176" y="84">for</text>
<text x="208" y="84">all</text>
<text x="280" y="84">per</text>
<text x="324" y="84">device</text>
<text x="408" y="84">per</text>
<text x="452" y="84">device</text>
<text x="44" y="100">Keys</text>
<text x="192" y="100">devices</text>
<text x="52" y="164">Number</text>
<text x="92" y="164">of</text>
<text x="188" y="164">Single</text>
<text x="292" y="164">Single</text>
<text x="408" y="164">One</text>
<text x="440" y="164">CEK</text>
<text x="56" y="180">Content</text>
<text x="176" y="180">CEK</text>
<text x="208" y="180">per</text>
<text x="280" y="180">CEK</text>
<text x="312" y="180">per</text>
<text x="408" y="180">per</text>
<text x="456" y="180">payload</text>
<text x="68" y="196">Encryption</text>
<text x="192" y="196">payload</text>
<text x="296" y="196">payload</text>
<text x="436" y="196">encryption</text>
<text x="44" y="212">Keys</text>
<text x="92" y="212">(CEKs)</text>
<text x="188" y="212">shared</text>
<text x="292" y="212">shared</text>
<text x="440" y="212">transaction</text>
<text x="180" y="228">with</text>
<text x="216" y="228">all</text>
<text x="284" y="228">with</text>
<text x="320" y="228">all</text>
<text x="408" y="228">per</text>
<text x="452" y="228">device</text>
<text x="188" y="244">devies</text>
<text x="292" y="244">devies</text>
<text x="40" y="308">Use</text>
<text x="76" y="308">Case</text>
<text x="188" y="308">Legacy</text>
<text x="304" y="308">Efficient</text>
<text x="432" y="308">Point-to-</text>
<text x="184" y="324">Usage</text>
<text x="296" y="324">Payload</text>
<text x="416" y="324">Point</text>
<text x="472" y="324">Payload</text>
<text x="316" y="340">Distribution</text>
<text x="444" y="340">Distribution</text>
<text x="76" y="404">Recommended?</text>
<text x="176" y="404">No,</text>
<text x="208" y="404">bad</text>
<text x="280" y="404">Yes</text>
<text x="408" y="404">Yes</text>
<text x="196" y="420">practice</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
+---------------++------------+---------------+----------------+
|               ||            |               |                |
|  Number of    ||  Same key  |  One key      |  One Key       |
|  Long-Term    ||  for all   |  per device   |  per device    |
|  Keys         ||  devices   |               |                |
|               ||            |               |                |
+---------------++------------+---------------+----------------+
|               ||            |               |                |
|  Number of    ||  Single    |  Single       |  One CEK       |
|  Content      ||  CEK per   |  CEK per      |  per payload   |
|  Encryption   ||  payload   |  payload      |  encryption    |
|  Keys (CEKs)  ||  shared    |  shared       |  transaction   |
|               ||  with all  |  with all     |  per device    |
|               ||  devies    |  devies       |                |
|               ||            |               |                |
+---------------++------------+---------------+----------------+
|               ||            |               |                |
|  Use Case     ||  Legacy    |  Efficient    |  Point-to-     |
|               ||  Usage     |  Payload      |  Point Payload |
|               ||            |  Distribution |  Distribution  |
|               ||            |               |                |
+---------------++------------+---------------+----------------+
|               ||            |               |                |
|  Recommended? ||  No, bad   |  Yes          |  Yes           |
|               ||  practice  |               |                |
|               ||            |               |                |
+---------------++------------+---------------+----------------+
]]></artwork></artset></figure>

<t>The use of firmware encryption with IoT devices introduces an battery
exhaustion attack. This attack utilizes the fact that flash memory
operations are energy-expensive. To perform this attacker, the adversary
needs to be able to swap detached payloads and force the device to process
a wrong payload. Swapping the payloads is only possible when there is no
communication security protocol in place between the device and the
distribution system or when the distribution system itself is compromised.
The security features provided by the manifest will detect this attack and
the device will not boot the incorrectly provided payload. However, at this
time the energy-expensive flash operations have already been performed.
Consequently, these operations may reduce the lifetime of devices and
battery powered IoT devices are particularly vulnerable to such an attack.
See <xref target="flash"/> for further discussion about IoT devices using flash memory.</t>

<t>Including the digest of the encrypted payload in the manifest allows the
device to detect a battery exhaustion attack before energy consuming decryption
and flash memory copy or swap operations took place. When battery exhaustion
attacks are not a concern, it is adequate to use the digest of the plaintet
payload instead.</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
-----------------------------------------
TBD19      Encryption Info      Section 4
]]></artwork></figure>

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

</section>


  </middle>

  <back>


    <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="5" month="February" 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 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-25"/>
   
</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="11" month="September" 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-05"/>
   
</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="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>


<?line 2114?>

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

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+2963bbRpYw+p9r6R2wnFnHUlukcSNIaMYzAwJgrPY1lu10
ek6WF0RCElokwQCkZNnxPMf3KN+P829e7OxLVaEAgqLsOD1Jd9gzsUgU6rrv
e9fe3W53r7PKVrP0yIgXk+JmuUqnxsvkZpYn09LIFsbJm+PXxrNkkZ2l5arc
6ySnp0V6ddfW03yySObQ+bRIzlbdLF2ddct1tuqeZcX8OinSbsr9ZPmia/l7
nUmySs/z4ubIKFfTvc5eJ1sWR8aqWJcr2zR904YZFGlyZJykk3WRrW72Otd5
cXle5OvlEQ2/17lMb+C36ZFxvFilxSJddSMcHXsrV8li+i6Z5QuY000KM1xm
R3sdwyjOJum0XN3M5O+Gscon+t/ZYpouVuqXMi9WRXpWVj/czOvfV0U2qdpP
8vkc3q+eZ4tZttBGS9+vurOsXHWho9N8Bg27+Z8e4CPYxHmyXGaLc30+72bp
VYrNXFxYsl5d5AUupYvP6ZMt4OnjnvG6nFzkZ+kiO1eP+FAeJ4tFWrY9T+dJ
NjsyLqhBb6Ua/Of5/H0PdhSHbI70qmc8ztflLL1pDPNqXZYbj/LiHMDkQ4In
f2S8zc6zmTrTQ+Pp01C1lBBXb7MxVe7/P6+wVZlOerDh9VnSJEc941leJAv5
I89wVKSLabKoP6rPMCjmxtNsngHEywZiZPFyj17+z6SYbxk66kHT/LoxdJRc
ZdP6g/rAT7NFUuSNMaf4Vu8U3/rPGTXowVstgz6B408uk5tkntTHfZIuNp7U
Bz6JwxfPjPBFD47jddRrzOAyXfRW4v0e4jWABjyQa1/kxRz6uUoJu16NQ9uy
fPm34/iu/Ns3+7b2tyP/HloDbnPcjXoV3ZgL2qJecft+SzMiGN1pDlOCXSA6
sjhrTsk3qyn5lq2mNPSdgfy771XT69tDU/099PjdLFkkNOYRb1CFiHJLKzpk
BGWZnS+AZj5fz0/TojQCaq3AWVDi4+B5UCelxqv0HGhDIdpNgUoeGbZpO+K9
pDhPgda8HkU0vxcvb5nN99lltkynWVIb81W6WheL7osiAyqFVL3Iz4tkPgeq
o49pej3T6W2OfLFaLcujhw8BKq5l/wiSD/HbQ9F5Ljp/t6x3fvJyaJrdvnfL
pJ8fn7xuzJcp6pSg1YDDBUaUFd3vszIF4L4xYqD1p0BQL5DsGieTi3QOtO5N
CWMaUVZOinSVGk/z8wS2/2JuhMiFcFbLC6A/OJxxskwnWTIzXq6hnwmPwxMN
YPirrMQfHH13gmUBJMo2reHm7sDmLK5my/Vp2VvAUfbO86uH+Af+8lAMpY1U
PsQ59E5e9sSQhdNbTs8QlLvdLhBFgIZkQoT49UVWIpNY00pL7Oosg7Wu0snF
IvtpDX/i9khOC+sv87MVct9DQ/Lhw73OPJlcAEcyZmlSLLDVPJ8Cgzk0gGUa
S4DWfJHMBHXA9SbG6Y2xXmXwG7ZeXaTGcfx6vNchyJWI2qPDSM6LNKXpwVTh
9IF6AYzB++kSz6VIZl04rlU2Mfbjk4O9TpSdwRK6j9PZDDoy9qPHBzSNID6h
/r6HczL24Vv3yfcHPQP+jR4b6xJWuqQtBPIEqDLRztS4vshmqcGvcNMEZpJ2
ywtY/hRf6EmhBheYn+GKQD6YAQlB5owzTyYAdEsEKnjjGuAG2PriCpaV4d6g
CDBPke1jb4Y+ek+e2zybTmcpfvvGQLpQ5NP1BF/Hn96uZwvYi1PY0hUeII2g
iAfMCE56cV4a+8f56wNjCiA4gVYXyVVqFAnA/ZSnvEjhLzzxxCjSWQZYkNLm
lcg6U3XkxnqJUGvMAUzgsMo5vJ3wMmclMBwkavQudgXrRIDLkHiJgYGz5HiW
AGarqtNsnpynADQIDjVA2OswATaukxK7SGc5UAnj48d2Av/pU884XklYwcM6
XS9g62AbAFTTVYIQeAhMbjJbTxH+ri9SGH6Vw1QWtBHGkgVTnovcLWgAkDC5
MDKYEUhVM9xo3J2E9wdosXENZwYAT4f28aPgDp8+QR8rYHEl9af4CcAK7dtF
Qp2fpjX4ltuA6CVIOb8Hq1sYyXSacQ85rOssLXAhYkvx5+Qc+dcKMRFQmgkD
YOpVlsB0pyDprBDqgKUkKzxZOnKgciUcAVFRhExBuCaAzPAqnONZhoIsUBtc
6jy5oePGeSdnMDWYN61bQwXAEoRxXHdWAClICoROfe+T1SqZXAKJAIJS5HMD
p020HRAGpoPL0w6kZwSyvbG6WcIMZ7Mbg6AWUA0ACIDycpFfz9LpOYAzwD0c
Pgo5QJjLNRxdguBQh7hDHGOer4HCwEhZIaZUwlrGSPveJ4C30KqocyJD40TG
PvDNAwBI+AcOu0h/WmdFSkgPawA1iRfBMyGQqXQX2MdLaJrBUeEE5znMa4o0
bLKerQjmALBSmMZylmcrnNUoLeEcjOZ5MNlRy93yuMzXxQQ1gf20d95DxWuS
lIgaBuDUQjxWVP6AThkOWCxpiht4DaQVJyYOd6+D/xbQSbo4ByxnUIRFPoTd
K9KlolP1GapTIJj5nkgsPoX9hV4AOOc5SFwJMR2guWqaqxrLQoogO9rrVLvK
mLvmV2rEpCR0O01hsUCaQQpA2gc4BO0LNVCJi8IV4+hIxM8Ju/Hkmvta4ZwC
MZIau2oTAXgnl0Ta8Nc2dkgPqOPzdaH9jAPioy38FQXrvc5jWDWA5zUvF5cN
VH8uMQbXdp4CbxC4AoomrBN+TPAQL3LcodO/wQLKHgsECteQnKdKVV+T9JNo
jArmu8IjqDad9OdDQSQnwHwBcFIpS2l9XIHglDJIKg5S/iudLOn9fLTTFMgx
kt3rXI2FzHGK0mx2umbkSWENU5ZScPnI9wDfhEBRP/lD0l9mN+J4YiU/nFTy
g9EiPqhjaBch5LYhcYat5RkR+4TJIyXeztuFZEGsdwZkhyGw3CUNvFgXsDtI
vI0kmxONBNRcT/j0F6Qg4Obu2jXiq2rb1LlrtClhflikwI+AZhcpIiHiQwHU
QogbIC2dpqtrRCikW9AYhWZ945HulzClDAkpni2LqWrnznNAd4naQggVvCcr
mdKwqLCU9qLpmjATsLe7yrspHg+IGItymRcrljqBrRY4NPB2oGqrHGkXLkhw
854RboolMAfYL+S3l4p2/OX4pYRoFG/k8cKT9D0wfSJPyCABcIE+TlaAYsTH
zmZJCdQ8BXoOSJcQdQFmj9x0eUNUZYUbmRuvgmc94wQ2N8X9uiEhBVqXutwx
BSI8zY1FvmJeDySsmJIN7BQOBMSUfNGFd7pnMPo01QRR5NrAKsT6gdjr0zok
psP0fZEip0KyDFMSXbDkh68CoNSFNOwKxgSqtBRdnqZnyLloOIn6tEEgFBjf
w2LyQ+Miv0ZOAdQOuBmep5B+7rKW6wzo1SlqbinzSNThEEAWjO5na5Rj5FFR
awA3EKc2GaUAjR6L0qESw1mYew3EM1vks/z8RsIn4g+aBUvj3rM3J6/vHfK/
xvMX9Per+Ls3x6/iCP8+eRw8far+kC1OHr948xSe73XEn9Wr4Ytnz+LnEb8N
vxqNn54FP9xjiL734uXr4xfPg6f3cPcbxDJhAfZUYOcSVVRi1kAnJoD3fPqj
8OX/szgtl/9quQZJp2haAYGF/kazyadPex3EGB4xX8xuDP4KWwwbB6JtUmBH
yDwmyRKFSNTyAGvhbBcGUorepl6ZlOUaNeizZA4EI2FBGSlOO52+RbA/5MOm
5roYTfzQ0ATuQ0m6uG1SAKgiCUFZl5uZuHKNeM9m+TWxJ7IZZomAiIIowVRu
uVoUMZE/aewAWMGh4FnUmkZBcxXs736Nzgakp9K7XU1Wxq72n8RPDvRXsV3I
ZHyjbajaoqmJ296ZqcldkC8GlcwP89eG4imXZT7J6FGE6jswvyCiRcSM5Lji
l7MEiNg+UMwDua0oiQBwoJRV0IkAicyWKECz7rmqbf08TVC6EVt7Qm+hu2CF
AEO0AntCNNUEE6kZ4CuvZO/1t2DQNLtKt7641wmENoUiEolSmdCvNYHqXo2F
ljflKp3fM/bhZNWDvDggYb8SsnDAaiKomrAOqPYBmY7ia6S3ApAB5QJGlqBs
vSKyn/L7pI1uzgJfOQPEJLpITAZ1HBAsgOkCve0ZoMfsdQRDa8rIbf2lGfGr
arq6aURI8dVJEnSTHQUwIC/oKcAx/96UkthCp7FUIMVLwLRMmQtAyFhJq5DS
w6c5HB9sBIiYMKnGFvaMqucSOdohW62k5oYKqrIbFMbpOptNWcdsqIKNWSoa
0rZH+BIwCRSrjSKfoVHjGPWnOYoCKShrN3Oh+SIvpxb0TpmCNESYlOkCE8h2
JfVF8JKhBoKjI5/FsygFBSbG153lhKaCgwU14vYN0rpPlf2B6JxiA3ycNXJ4
pkMwWRGklEVib6U3kVyDwMWbQ4KCMOcA2OIJVSyeZBU2erB4K6BvU8bEw9OZ
RboAAJ60TXRFlqUlokZTRv34EVt2QX+CtSIvIoWaRGbWe/hkc/keGvCklkMY
V5N/NkFM2AIYmA8VhKPhQZpu8CWazKGuVBNa8AuCCtI7hNfErI1lXoLIX2r6
cYVsRhPXGNK1BnRECFAgl6YM/KLf2nv3S+Mvvb7pG5O0WLF0LfggeibQYEYk
omH4kSaDinwjrFTqsGZuqiMkQM0a+Lg0aOHipNUzYY8s9DZBICLxPKlYP9t4
sVepLyKWbtirQKTkF58FIb5DLFpTFHA6qs8VNQXYqWlVcobCiCsMbhVVk7jP
q2cjBS6gST8FNoDMiyD/N+yVSFiqL+tMkEUBdIzbpMBloK+UJP0DIFYmLUnv
WmAR0E2o/IRYYnxhQ5wAM01OcyQwlYjVQr4YkEARJ11kmqKRnUh71YFQv+Dl
ybrE/T0F+nlNG/Hf//3fRpKUV+iCedBVH3Q5/2wYEVEFA/+87bP5omFY9OTn
f4Oftr8ILdn5BX/KF9WT20ZtjKh/vf1F7lz5jWvj3fqKjHAwHnzJy8+U/ftz
3736jOVp7bYcIvy/WkflV6QHkQ5a6jRsniQeY3fLh9qdMCs1Pu8gWybcXGvL
jsmfer1e86d6q5a+mvshJ7uo1tmY/wZiAMoARz4yvpGMir2Rj+4FTV68gbHI
RjZCZnr3PjWEFaQAJTJfIJSVAGLkRKvKmvHrT5rAROpbRehAgjtdoeugpl8B
RVivNoi8IYlkViBJFRLCbRSnSEmEATK9RBMgWcOFQTkRoS/QZVJMsw/KLINU
FGQz9lDms7VQzK5AtCAfE/tMWGJEQXi9mLAoj+EgNEmdiEnNTOh/OKkFGUJA
MsT18l4ocYDnlC6JuErhoe6QQKvQLAGEwHbYE5N/tP2RX4WkciVFUTDEa+VV
2i8P5Mi6tYMsWBPUnHW63zw6YKUwUrldRJX+pgxNHw0pgnZGdKPYDlkfX8Un
r43g5XGJs79OT/FXZvvFWSIcYfQNZyiZDEUbbTn1WzQNseZSKIcypquUXUop
TToS13PeIMGuBYTsS7RhefSgB+g6S88rPWKVlJdkDjO0QRpKhnQ1tU2TrG4A
W7P0fcZGT5ZcxCwrk6uy2aG6Rn4pUgdJ/9zUPUsDrd9oT5veAHryIWCHUjJi
PyvtOMibdCCVhFKJgaxZKKAVQDkFgRQ9RYQEmqiipFaWxLatmW3CDJtiqxr7
p4msmi59fKYPNuWDSEtdZC+y84tVubHheIrXuXBuMKEA4Rg1Q6JaFgstevMC
6FwilYXwxUn8TlBKKQErCUxQqgVJXQK8qofodcQYNKG8bPQGI66ZQgOFQbM6
241xi9AaZnBsDvlI6ZFScJeg3pIaiBEDOaxkfiQmLaGvNo4QkRfpNVKPvQ7Z
MSeJdOyAHIzTFZteCbi5gKNDZayn73KISmwWljk0tJQtJgWkVkIsJtIKHZOQ
yiTxWovMOD4TFsiM9x71nUPe4GaP5IhmkBCoQ3LqgvfUkJKwpmnKzUvQMFRu
woiCLtEZzZG81EYKiDrBSC3EI7H5chv0Pmijz9a4uzmaemZGfpUWTWVrlNLe
o21fvao7niXlZhbYwAwK0iQFvpiyNQjOhCI4kF8U52kL2SBgWmXIqI2zpLwg
LUNoqKAMSHQg01JWdM+TJRtEtfmBqof7gYsmHw27WljJzuZLoNnKAqVFQZVk
SD8R2pzbc3rWACemmVRFH2xqXSCiQDcz9NGjk5d2mkFhXRTkFsawHFKCG2Ej
7K07zl8r+wFit72J3SLUBmhCd5bcoG9NQrxkLs9ykibgxMoULXeNvSCEZDgr
BVppWiFAPx56QUEiG6jIzkrmKksUjRaTG9QhBdvS7Ly3xA+qXQMNbw2gkyg7
IyhbMPZFmkyPSFConmhRGdCicoWxRb7WUnk2AaaUGMX4oTci53Fxs2EVIE4g
An70RQKlQk4C6xezT9+visSgACZggOS5JX7Iv8vgF2k9Q2KlkXEMEZHwUdm7
VhcouyBRREtluSn55qhzC16iAwU5JVDW3eAngv6ghUoEiQAdyY1TGGhygQa1
Zlfop6LuOPoD0JKjdMX7R2xzm1RWY1TpKZ4Gab0MtDjdkIyF+4lcTmcsqHCP
5CnJySfMfQsCwlNTMRZki5TEHqaOL5J4hDhnnGJHSADgQAp0OYr2GWDzFG30
wtrFpmTNncQgXyNlyiPLUtIGolGcU5EnaKrVCJnqI22JAmCBBAks6gwqjAIj
KrqKMtU5GDpOymW2SoW8qhzNOszhFpyTaA14XZHOdmxR3E1Y00v2xTeNemg+
1XwdMQaElPT6x28qq9on5dJqOKelk0ASl1S+L0UbdD69e1mZ55QcoSzN1KKa
wrtj0Lo0cWMfGQ2ABJEWNSP96gOqaUS8P36snpMh9EBKKoJFb4sG0BQ9oRnI
puKYdsyRCAQFO0qKyHZSdCzpPgBDGLQ/fiSrqPSLseegZ1BkAxrCEiOMn5C3
Xep4woBKeljNofnxo5gq7gh0iEyGIvMm+FpPkiN+Ex+QvHCac/jl7SEltYFY
2CmZP9718HBj2JMySYDNUE8UukXSJx0pBw2AvNKVrKirWXMFTWy0LFMNFMqa
+bdyVabGvUi+YXyPIWT32Itc/Rrmy5t7huoX2XCwaARpGBM41zkHOTCY4AkJ
pa+JEMLsWxEVaa0XxF0whmq+MvBBRmUQ4QRiqAQsos6yF9Knz26HZXF4hw1i
r6k1SvshyyoLmtgrTEzGP0+rAJlrXCOPj4EMzxKSl5CC4cxQ8F+cz7bPh+JN
MV6EY2o3Q2GZPXL0jkRTDNjIPqTS0spR0ToVefjwkbF/O0Vg09ajfzcw2Nvo
TU5h/DZoJU/tDuLyyMDrVcqAVaMy0ooVRtHTGrnQpquoqrBZgURpxCCekKz6
HJ2b+69HkeUfHAmj9GxdWcJ2LVM9QmwDzMCTtXxl1EJLU45IQb1Kii/j/hQu
lFsoPEcISidehSoihKyBYeJQKkyl0M0DPaRGB94K3E5vNg5BNiJUu30TevWp
IFpvzASjjrZORCEVMMoFi+7a1Jqjc4hoV7W+4xT3OjH7Y0s5HqJctaXsHKUw
ksrR8PFjo6MuG4HSaRdH5Q0Gug9kY42YtRJI1DgYZgSb9hftCEQEXGP7pdV0
r3NxPw6sXq8XxtF9SWGVgxndJGk9UnIb30S1SPIHChMo2EYE+7x192CAXto7
NC7uR0MP5mCNzftiSSBXr2fstVW3DbT4TRX4RSq3PLBvzIq2PDRuZ0EPDds8
ND4iPXm4uT/wmzU8MvTNOWw2bZITeMU/qq1lr4OBPfpMOOYZOz80rL5GfO4A
DpIkCXAjmJInoiJ+2xBVkKddMIeodCvIIQKi7iIihgSU8PgbEIgWa9A+KGAR
W7x5dQzHNeU4HFAyboR9Te4maFoMDsY9cTVI9I/X5x6q/nugndwT0tzmoCKY
jiyE+AOqPDLWbyrFbgErFkOasOHqTgGBBTuEIAnk7PLeCeU1wDhUMxUOXgyt
2KRfjQkr120LciDDqO/B56EIyl6qVRcv9r5HMLUBTA+/GJngTPGRdXSHMz3c
RJazdAUyDHaAyHJ41wmbXz7h3Si9QQU2uAZ0bR8Z1uZyEL/o6WehPr31BZiP
72m+NM0XcKqjq4irwIiWyQWjyyEjAOAtGz/JTIfXV+EH3MsqqKD1ug0+wOgF
GUQh5qlMrKA7vaZJzDUb12ElE9VjNbri4pEgJpJBLTjmSRmmS77802ZE1rAZ
aBk1CaU1u3dgyA2aofUB79XUQ0VYtWsJDKk7CGiH6BbQZD1LChKhYWqTtFjI
UBBQzlFjkvaD1k6xF6QIMqpHXJv6wknhDV9h6BOnK2dLUTxJ+55U4RUXSXmh
wuIqkBE3YDb5MsUOU5AOXoJSCltlAAe1KN2QfMnI0xWHp0m9C0NYbfc6w57b
G/Y8tttuvRv3G9OzqzBsaoaRrVFNg2K4K9enXaF+lywgqhne6YYIEBkW5dpv
cRCsbATPNuNmhalir/OMIvVJtZfmAhJflTgpIGqWoZuUI9Pp2tcVeqCkPkns
HY3OPXm5lGZBN1Inyh+xzJeIK2ogXcefJ8VlSlGieEVA8L0b4zqlQMMZh1FN
16mwR2Vo2VuJRAnKFkt2jbXEkWUq7uhhb6fsABEIkxUbdz+0N5RV5E4XdoSx
k+3u6NokirvXKWDYfA7HRJeWKMqRtMLzNSD4jC4EoWrIzaQHRbQlcJEOfryK
D5AqkY2jjAXJ+F7YiVvFMXZk5MYcZQdkI5VhV/jXKJGIZsvejLagC67CKCaU
R/FEu6eF129k6DNwDc6doKQOUN+76PTdfwVs/eSA5aiSDb8Yeyjj1sTVm8qo
/8riqEAKRFlV8XsnPdFp2N5puNkpd1V/80/0IhzBE/VFBckLEi6MItghmT34
u5jRE6Y5YiR2eKLfgh16GPahGdJPkUGcZ4Q1tArRyQl7yjCaMSHpjyisnGb8
PNxXZPfQuNTXqdFowQkqAs2Xx2iAhCD3sicOAyjUdhKlovorsvLxG2EC5Ve/
2bivjSC9hRDNznPOK5BtEGF1LUBcSRMXbWT0Y+Wl2MQiQyPgmqGebxGgnYsc
z/Vb7Rtt8XYCoyNSLe0Gu7yAR3Z+ScuaBFF6F4e9fs+unIt0BUHahmUbr2f3
LIrYkI0cEa2jIa1gX5VxVXnx/t93FT4oVQTQdpYvzqUFtqbLaJ4wnn61zNa+
DvGejLoUBsypUniEIMCvbgQQHNaN8rAEXUETAiPsc1O0ucjOL6pr5mKeCnyk
k1hdHFDO/b2OQDiYFvWRIiQub+QFmWTVvJZXC6J9gvOjsC4MoZrlJQXfhjle
rZpnijMQVqOMzCqXPIrqHb6LDXhO2R+qEF8hRMEsoAf9Xjh51xQf2rwbq7jN
ln1m4Lyph7E1clloMmB1niyU1d+bZZcMMhVySh3z+O0hc3UUV89FKJTkJrgj
qA+gKgGMajqtQ6mcdY9lXk4VcSYVCV6AvMUlJFOBxT1JV6KK9bxgBiP2RUTa
oZs1bWFQtQuzdUqET5RkXFEAYfI85mPUaPS+Zq4XAeMgaBni3jdf+ro5YIJf
PcbjxkgIySu2IVodXWq4zygquJu4bCi8vBVjJZG0xlUNw+oZY9KZFQsTD+ye
8a0gmIyZ9KvTI44SIoA+IWpJP7v8s7qiwoRUsAu+09DcdjbJFUCEZiQWTUAp
Bqkeowg1p7VIgWCoDAi8JkQxabSQ0TmK4lOOjoUWWCZueGvnJHFImGJYCIEJ
SWJDZ6u1pwtalZCD8WfCw64ko62nVrKIpDQc9JHXPSaCdpMWZ8ToYL6FbjdJ
pgYHSguj+DjyVi8L9IILlwsLD7rPF4HmFE75LFupS8eVl1sLi2q9B0+ryKUT
DCEY56PucbPXb5ETuGuebjy8ZFLkZS2gUwbyV8IPesnVCZQrPG4hLZLwPc2A
GayTGfXXsObjPIgq5cSPQL6GTtB0zQG9vCQp6wjc4cjW5DJVEZXyskeR1pEG
cKYFNwBh+E7IIwvHVXnIDLYZQYOEoq0rdHuVVfhmn9JDHbnE84Oqo0/8JyDh
LejWpeVwkpEK1QSUVzBMikYDdjiu8kxepGhIoCIARocPHcZI4F3kEp5QFlng
dXjCYZQnkHNqHIfOBy+qz7NV/a6VgisM3kS7lq5qLOrBJQzxABBrytHES9CV
hUOMchf7uWARHcVF0Rx3oUY7lUtUEFFjJwm1dp27ddu5W3zuOjjVn090uBCP
WsDDmqp2OljUGyGIftLEeJDjo+ipkh7Qbyl9jUJwFflJMnmrme0f0+msm6Tl
5TWZUNL5cnXzLi/elWmB18oBat7NgXniAWNQV1rwV5SBFVHcuB7Msm/D0dsw
pb+DWcGkHhnfeD3f2/8vDIpW4pNhHBk5nFjxrhr0nXp8CG3Xi6p1S1vtMbbW
BBFoTb7jh8Yimx1S4K8CQXj2X8YDlmHUz2KiP3Z+POh0tk8KVrJl8zZf0if/
SNvXTqd16EfG5u6w/xv96YYJa9Hc4TwL6G1zm6qOxZj4mGZEELBlp8TnX9s4
FMBu58dOR40Jc/34qdPZMZDxqPORIR1d+Rn6I6tRNEWRI82ytIDG/2G40u9/
WDWumugcSVP3FB9VU4K+/mTMktN0hv2R/7ykvqoop2UOc+p80oz0FZrUIgMq
vYqzPGzVpdkS/7x241nqk3K9hywRK1SSOqMNOqNDWmNNVcYsCeIyHYk0Imxe
83LQSHgXjjOELNHaurjKhRUZJpwpVs2iWAUrfGw1ob5NiCUt8fRmRdSAlGSY
5Ie0yI1ZujhfXfTuZGLYZZ/8+A0HVm0zOtzRvil0Wkp7yHujUqnp98A14wAL
WUntvmnVVL/5o0RHzAGU0C0ilfiFBuQ0QNV1YIBQCgNeXah3tlsV+tRbk7S+
rnEztE5ykGPteFAQFSrOU3pqYpLbkv0TeoSjjitKCZFtGm6iXtWddWS8keuo
qVsVGjduGG3acPY6JGtqEi+MVMDeiymJy8bX4g5A3QWqbr9SlibyO0u3JzZ8
/CQaC9wkmy32K5RmcaGKEyWUdMzY6aEK4qDtRAVjfooh72zAloqlNGvjAIfi
UvuKzTYU2RiH0eMubMgDaXihKDTpNId2DFzEMtNyeoHU5Xwy74oW1RkX6OTL
SrpLxKZ5zEomL9DRnDQSIpwB1eg0P44H0ygGyo/6cckMDfisYe3XoPbO6jlJ
fRQHs6mhV0F2Svrki8LXqcioQshZ0xjILzO7Tm50dU/eKuGIs66QAgV+PgTk
xpPmLDfLJCuEMhhI6fA6WYi7OkJw1S7Pt5vJ+fpaTfukWdIlKGUB2DC+iwAA
1UBTEbfdvkNP1m3GA/SIVr/LzgQM6lolo1a7WknGfImECvPSu+qsSVNOyhaL
GvXBwIOkKHT9C+inSm/K1Ja2dKHzcSm1avuu0VzlN/t7qXjVq5WcLmKhCPlq
Kt+X6XwtKl8ywxSnlJtZaHybGR4k+OtqIJsCE8T12rVITkgCIE13cRbd6t7m
piIIsHS2nrEOWF3o42PXskYDARIoR24WmX9MM2UTjZJ3ddjEot1jElmvAIW0
vXiX1VQdTWlkU6pUBJt6IElAlPxQ4yrV3Qu5QxpMaUfIk24ohuqWI4YqJJgI
rQZmX6Y33g2YhB65U5G8sya5Q5UUoHkXVVLwlQc7VUpkacTDXhArQJ9utsjm
67l2O0wTVWUPvW1KFFOKr6yCxifAPH8HGijN839FARU7tE3/JIVzQ9nDEfD8
P0cBle2/TP/cOoUv0TTvqB3epuVqQ99Vb227/0xuX5o5HcsTzELKk1FMVMuZ
o0LLiUB9uZpLk29quUSe7qTkYoxPM66Gbdbs9ZXXSDGn0nb5R9AhdoAbxxrT
OalkESZQwkte82xt6EA8Urku9JRjQsmAzaM0bXgFK8MrjPDOvVMMOLsnXety
DBnijSJjMtHyPNXj63XtTpOdWpT7hsvYES5jTDBFF9lWlGG9QN/h7KZF7dMX
nbK7k8Vlmn9j+iJJhlT180k+Q5oBErp0G6J3XNOROKrlEF9qT5vBye7T6Rbd
r0pXiACqbALVFGrWBkCH2VTl2d12x0tPkSXHqcTCtpR8jGyUP56ym6VnKyaV
LftJcyg1Ria2jmIzqxzYFGWDcTCLRHMiSr/tO9C53gnY7QVykscR986xO2J9
DfdrRRdYfNmiUsttbwU+BXlqVXsdxv8jI7DsIfDtfb6M0nVAaAgs39Z+cjnZ
XWD3Pe3X/sEtKzxZL5cv16eIpD04Icyk+JSOett6K2BQ8YXaFmg2p9v3EQ4A
WH/JrmR8h0UL6vMUc4oblNyMl8yGFlwMbBj8xLn0xOLrD337UGUF431g8xi3
gB96d9wMVtd5spNkyZJKDftQomZ4J+lKhMhtiTGrhdAojU9GgvElIZ4pXchK
WHFDqL5HoZ4y2VElBt2760oqXN1ypJXEsXHNcjtzbkf4/WSeo4ex2rzygJe1
yTV3xOOprF4s0DaXKCQbw9Bh64jEBPr5ZVKsbt5Q4D/KZfQVv3EKT+NHrdXb
zVYqa6dsqG0otlSydx1njoy1mgB+dPmJpAj1hHboyLi/5XDvU0Mx9n/w6EDZ
xfDYFYpOzUU9MvbpBUE0b6CpEFMNY0EOYu0HPiP6oXOg9VUt/cu7a4olOiHe
EE82TlZJCVUM/G5ToPEs+EFBdWKUoIUz0nMiglrUWsXArQYDF0SZ7V0goinC
oi57wBLgp4XIwoqTqSI9DZGloJW0K/vdnC5sinBLEcmqT1hkMkn5p0yZUCjo
qB5XJqpjcAwE49k9fOueRm8Eg67CsyXR4TgH3N3luljmVeAU9sBZVKpYL06r
wPbfBYaAiBnAuahQx+a8SwrkFQ3v46/3b5mXlqpF2OWqqYrYEpUGohpGUdFl
UpYqgbk8mnaT8VhmwGqXi7DfQ5i8zEY59Hwh2XHZJlnfCR7LP4W2+lJmjmhP
HI8Qyr/csAwirn9oNuGVuuq+VSiGyWNHQoyoGZFaXtTu9jWi2rUcAx+/0UX+
6t6pQJNyPZ8nGIUgheLKfCdyYDXSLSibtaxI81mB9+N6GFgQCcWyrOqloAnj
2/AZHUp4kcD/2ebDl/nsxnLMvnCIUThoU7SXRVCIy8IEcDLoA6NtSpO5UsSS
Wu5pihCsWUcBKDmnmpLjKlWhzaSymEhPPZt6W72F/Z5jtDiL2FQF5/WumgJw
PzIAySM/Mu6JA71H95xqrGeLbYEbIhgWQOveJYlkU/D7jxuapVzBpnpZmxjl
4t6g4LDeejM9TS3fJhDJ4VnwLTWpvCm/CIJS74+iWlo2m6OsVbmbhnjT7Fol
C2zPtKVJXMwY5AUbfQvrMh2AGvpUuywy6/5W2H15hfY+511Ozhd5iT5QGXkv
y/LkU94b873LdwBPsOSAwApFops1BQB/tt1WYkwixoioFL5+JeuRdcNRaOwr
4ocFCT99OmBpfEWXBuSwRKpqh3B4G9gfGrI+gQoPP5WprMgBWWUHqud9F8nd
g+hA3z0KH0bzJF+5QwZBVl6dXuhJaQ3ooG5ZIHfZmgiU0rX3OsHLYz7VXFuq
VIS3+dh3XapWbGwbLEhfu6Br25zlkuxllDZeWyoXtZMe8Y3iElvunNVvwEuH
oaT6MsFbpV9XNl+BnUr01gN0NT5wJBfUBaUNiU3XuMQ7mVZ/PBj2R/3QdyzX
cl3LGrmjgeUMnMAPzfHgPrc9fouNx5YbBCM/GlpR3xoPgsh3nXE8HARjdzww
w+g+zuSlDCIEOsjJrdgpDNDUSKd+j/vOsDLE+yOj73rA3weObYr/WrY5sL2+
Z3khfPPgV9uLBgPPwl+xlRfBswH8HctjEgb1B4otiT1VpE96jje1+9v2NGMt
lip9FMlSGgCwETr7pFnR2Af2UaRk0js4Eru8ujkyTirvutj5+0njIzb6MpvC
Q/hv17qvx7C3XRXgjRNl3yjNwL5wZlFuOcxsdYk5ZdAQPD2oXC3R0DOHrusE
lgn/g//2++auox17Q2vouGYnsE3Ltk3X7XsjOAHXjhyrD88Gfc90xkCm+tYw
GvguwFA4DINhYFn9YDAeOaDwd/qBF/X9vuNGnq0FQ+uBCNsSK1Jxnooui5J/
Gn/HuyBE4NpDAGgw4Z94WJGPI/jyb/9msHX7IcrEeF35yLDgHw1jjIfQ4JPx
7/9+SK9r5njsQL59/Bb+078TpmB3h+ISNOEq9rPAjIMPtXD+yor/kBtXPg5s
z7qv1IAbqwJedqietE64seSug2tmM8/DQ60FQCP811VwKR59qrqv1qBeu7h/
F4jQAeK+NmS7j0J0/2PHIDeOnja55eCVdKRDlLz83bQKVvrt5q2/GladoT8z
wbsaB1hersIqe9z3QyeApfj9gTke+X7Qd4Z27Hmu5wWObVuw9GjYD+O+ORwF
jumNR65jBZ4ZjztBP4CPORg6gIsD0zb7gTuyfG/o2NHYGoxrbsWG9/BrEztd
kWhqB0d6QM4WGvhKqIz3S+OlCB5p0sM4tPnbpLg6Ml52ARL4+3tEnv5w6IVA
2qMIqMrQs2PcnKFtxoPA6tsDN4R9CfwR/GO6wygKgzB2YPfN0PH6FuysIKU3
2Jcfx4CEdj/2HRv6NEMTWDW0MyMzcOEwxshTnMEwskam5cWRa/vDke17Vmz3
h2NrJPqaYl+eOY69KPLgEKP+wDXhfF1/5I19y/YGcRyE/VEwtEbDcNR34th2
/dgdufHIMu3QHXgjZ4PE28QwUW8X9hZuUB3FcYSUaB93Gs73gB9r9i92PHfr
pq8jQ7B4fKI7KJHO1RDe9uEPBU0C84nMydfZlPRou3HsN8ij3A6+5AytEJYE
pwwdAMMCrgV8yjad4XAAJzhy+yA2eABE7tANnLHpxQ4g6sjpmEE8HgMc+f3+
0AnH48Ac9UHoiADy4Lhd27apGxd+DEb9KAJpBA535I3GVr8TBK7XdyzTGVj9
Pkxs7Fljgot+YEG3QAl8gNjhaDBCngkAOxrb8XDoOrbrdcZmbAFAj4AkDJwB
SDhuYLomtAZCYPsje9T/NXjm9qi5fzqWqVbV5Iw6oijKp5idXOROVlsL2oLv
Xei7ek6sdnXDQ9o0oK0zYnwO9FK8h7tNhLPZBBO4dG3c0Z2gbrR+diHA/fp4
tBCHxmvFiQoltoy3C1MqueDTdslD2+WL+3W82o1Wv0TyaEGfnYIHOah+PxKH
NEzcpguj3YIUvUW+6Grq8OF2XRhv/S3yberwmwVdqxV2kENlHOGszwskHBi+
iTKcCo7Tag2S4QOOpTtZiXynvaoWrsjvIBLjbtaxFWMRFRNXE/ArINuhuNVL
dgTKYV2IDHcUrr9vHtSciZSrFoMJ+PI2pqiUkYWG5XXJ7FAlGDid5ZNLvmyv
MvSs0EteznIOGn6jksdhdeUsX1cynoAYbEr5IdF04rnGk2wk60tNMKkxPXJN
3yObhyjiJaPOG1NR/VjcujLaHr8V1TxMNNfY/b40v4CGj/m3aSyONYN3/4TO
Xn5HBaXOxS1Wbqp8GGqleg0h+Tl+a+l04/itrZdoaRSE+fmXPnugVXnRv8rn
P9ff/7n5/q3PL6nETSwf6F/v2v+u+d2ytpdWt7v/4ED+/NKmr19jM8PaCRko
5u91nqbn6QKYITbEsCYFuyibgBrSqytyEmVVCRyB+S8kmjPl/PWtZYIEaNYy
G5SS2LM8pJjj0RA02zjsR4ORbwem1x/HNWtZFEBTZ2THZhT2+2PgRfYodoYj
4ER+FHrD35i1DLf4D2vZVk3ERMOX44/H4wh1kV2Hy7pIh19rs5eBzuqaDvLm
0I5tOK/Y9SI3tBwLC7aC7mt1fDPwItsLx4Hl++avai9DlLuz8C8sS1tl+kpu
9vqgIgurEsKXEFV1sX8nlvwTWMp2w0IdFL6KpUw78r+3pWw0AnG8b9tB7A+G
IKGH4WDQD52RabvWKHJHpuM4gGeRHY1A8xvE8SBwfdgVZzTYbQj7enTsD0PY
/7Yh7KluCAOs2+et/uqGMB2ff1P2ry/kOu5tFrC+Cep/7EZjZ9yPhwPXj/xh
7MLRh6Y7DjpwtK4z8gCW4gH0AQplNHTGA28YDqwhaJDDPlvAfD/2APJG8djx
+/bIsuPxsOP4tjWyoE93AHKRN7CHLuj/djRwo6FvO0DSBgBecTTuByZywXjY
92HmcQxvdNw4DgOgCFbkAHLFTgTarRtboT8O46EPMo2ulv4KFrB/aib4D2b7
uh3Id8P4ViNXG9h/DtTfyZpF8KXjxl1Q42tYsT5HKPhaVqyvIw1IS9GtRqpR
+HWNVMeLykClclcBWssoVT2jHEcVKqUOk9SKGnx59S6bQw73OqLoc5XSCUUw
ssrw7YvJBacQWuXn6YqW0GL6Op0I0xdneue4fhySKiNVlhdhNiKr1a0mLVV7
SRizOMkVFp66kQYmSkrFtqupimLF3unuLOc9oLAt2CYRYMbqu5qdijxUBRRm
KV61r661p3UzV6JiC42zWVJeyKJ9MwxwJ0tfVU2OQgLvYBfbpyYHKhYLqB6B
jzQ/4m81I9leB62Fp9nK2BfmMiw0KiyOYhBTxNrhOA8t7xFSML3zqiKfMETC
HplVnbO6QQC+zmZl00yoQneBzdEmqfsAMCtx5OIm/fHbkhLqEhBW1jyrv8UA
97Ju2zFeaua3VpvQ8VtlZpLWqZqZ6ef6qz/velJZvH6ufeWnlb3s59rXnU9r
trifW2xxt/d8+6xuX+cD3YLXsgPGZz3ZaXx7mYEo+7Ju5KW6yiE+CCvxoXoS
wwMtPFmGbuOjS3ikTDWchsAw8LwfGX958aoC5qZ1j6lSzboHsP8bsO559mAc
jkEvGtrA4QdRHzQmf2jFGKkydkynZt3znQGoM0Or75vjoduP/DgcesC7ghAE
gFFk/dase7DFf1j37qBnBahn7Trcnda92PKH47ENP9leHII8D5Kc44AOPw4H
Ixu9rx0LfrRtz7JAebd/3Wg4RLlfSbGxpGID8NWi2OzEkn8C695uWKiDwtex
7lVH/ne27vmh6Vt9Lxy7oF6ZaHsYeqB8wXpjc2T64wCjjceD4dgeheFoDMqU
5UbRyLVHY7MT21Z8BxPfVyNmf5j4/rdNfLVYN0FS9gVF+aV2PkD9354h77MY
zK2GvFHoBXYURn3T7odDjNYP+hG0A4EldvudYRgMbHs8HI98dxT1oa07MP1w
ZPUDlC3coc+GPBzBgzMeewOnb1l9F46+YweAsX4wiKPAGdjhaDCygrHvBsDZ
Ri50OPZG0QjQOgisITK8ACYQjUd9Fwhax7YBskCUsp1+POqPbRfW54auG1re
0AcpxR04wa9qyPtn5nf/YIa824F8N4xvNeS1gf3nQP3dDXk6btwFNb6KIe8z
+P9XMuR9RcaP1jthbwupwDlW39ZLZxmRKqgpaDmlTjxeqNL2nOg8w/J2C/5F
1MgCujG5IO1EJAZ1ez5nj0ESsq0u1sEhmhCDqLo1rZn4WqqcK4OizDZ5ndzQ
1cerZJbJO+eaWRGGV8Xvyl7j1m/VWVXoiPICUsFgLKNApT9SYa1cUcXgxTTB
O9/E757JMm6aQbI631LeeXvLc0M6LDmkOojqKnJVakvWMEKBCwtJUGbJrWuk
hCKNIeGkyZb1jA4lOcNL8eJoa9W9tp5j3shcr6fl59we1OdU9VlPIAp7Pufq
CD9xJoH6hWFOkakP2KX+ulV/OoP5TZWCvEMlyL9DLchaXbqHBlBe5E97FW9l
ZOpmRCu7FnAC4+RxwCxBNuPXKVyyZJLqjLCgrG8H99XjerEmCQYPsQ/ibe0z
I+strBK0OgczgEubcktPdy5d63g+TK5vjr9anUt61o4AsKfYAv6tiMlE0syq
7LC+CsUs7gDeinlQlzqyBg1kvfepDaVP0zNM7/BZOI11q6jw+akoI0iFNVro
FtZSoO71+SaXmIl6llCthLthOhL+lr3gzjdxXctLYsxh+udU5fc0Wa3QD5K+
v0jWJd8Zp5otJdVyWZelzKsI1JPKk/5dScevhIjDkQuwHjluHRE3ZYgvRcSW
njZ6+Mpk8YtQrX2e/1DVdneQjg102U47Rk2qUBEPakxB+PVqra+Tc1FHp05L
GkLZXROTYKYXTP7SlMI4GL46TCo/q1J2b4pFlDNEF7Fa5aRtAhzsVYY5cUUO
x+2y4arK6ihSf9cG7SEFE8+76sXuZJaUpcq50l2BjNYoTZ4Y9TYGtiE5laem
skuWq+R0lpUXlXwlR2l6C6UD7M6fB3udhk/rO6undjqCzSL/cu3zM47zWSM9
YI9cY6TbPz/zG3DEMlPP1g8J+aV84zM+V5tv7FxXy0rEt+/snvFMsCRjJDiS
vpaWd0AXVBwrEBxr6zs7dn3LLt+6I6179rPxPG9t/UO6ZZev7jbG5vQf7Hjj
Z+M7p1dL8dG+HH2MB81d2fHGtqO5/Y0fUnFSsFe3viH2pr5F2zYMIbInFvCA
E18bPbEO/NR+Eq0YhTGjjGFoXvJg/Dp+VftpFI9fvJLO9Z+NV3yjaCobVLTd
aP0JpnZfjnqf53G/mkfrTxrTuhOFVFyrThhfw6MjI9Cqez2VJWCAPmvMTRlS
ajUWlUQhfRBI4x5jmepc+CuqRKvn6cpYtRli/kOFgrSWJsYrbbSyRC+bsNfJ
KF29YljQcFakyfRG8RutoMEtxeMxKilX9pVktiEFiUw+4pbYVKRoQpIUyUVq
RSOoOoQkVduFZ17zTcrVBVsWfpHI5FXVcjbUAjkXQOTjUuemTeNaPZlPY/C7
r12Vxq6frJyhqEO5jcULQUdOH1MscUq/RX4o++BfS928MoedI/2H1R8jzcjy
JDYDc0dv2kLQ2DaWoQhvljQ5FGcxYiqiiCkhb4wpsupZOs/hmD5+Q4FWDUif
Y9lzeHCFYWUousuiphx6JTaRi5Ljhs2S4jzlFLFFcs7XJKtbmlwGBi+BUuZ7
jGfCVFvNcrT4elUepaye42AZ5v+Vq1vT6jgx5HStl+jmARZaZkoqId8zXlDB
p7zMqIIEHLAs8UTSl7QOYjETDGNrLfldgviYFFkugVSVdzfSpMywACMOfamq
T98Tyb0X5/dUtA2HIubUu6oCLBTaslJJpbSpZTvEXuuRJnS682wCu6Ci5MQu
5giXCMWodN/gq5RPE3op87MVdnHYUmqXk/zOk8kFCrWzNCnoYuc8BzG37Bms
7cutmYjk0Svl9CHQvwa6glNeSer4hlNgcjjfnIDuSIAgf2tdBUXXrG6W9C7G
eF7lM5goeonFWwRHaZGgk5gyCYJsR2BI1RJXquwQB0AdAkKeI9xigKAIl6QL
s6DmXAPOyU5EInS6IztLr9KZsQ8bli4Ml1VlKoiuD9OrrYViEs/WBWIrJcMs
U4ENnEKzgiuxiiI9R9iXKX/LVV6IHKaneb5CCoIBodVrIqtlWQtAFdCwDztQ
5l2xbgwZLA9k/fDNssrGx4+s8s2Sm3y9Am0CbSgl59BkQws/4bjMxgkBMtKy
YfhEUORn9RZAc8rsfHEEAvc0bT3jqpzwJFnI6slcmHIqalGj+ag4zUDFgb1i
UgiL1GGJSBrOknOpSvDG1PJwevmSMJcpC04H660AzlZZ7ESzlOgcHjSq0kiy
1e5yUj+VI786F7Ju6ZU0MaUgh19qcawzKVvIiUsIBpqEAzIpVa2ophen1M9B
D+/icJRJsRYwilBG6eypfjQf+D0QZua4T3jynMf6e5n7tWKNjY6Q5VKVGErg
D0BWVHn7mNYT+cZyxLAH6sCQ+iGoToU7N52KvIIIDxLzmAamKC/VpxXwTi4o
PjEXka76xlL1Y+C1+fmCs7Eu0uvmzPFMeVoc56yxWJp8fr2g3qaiPWM9YHFX
hPDKDozyOlnyIlcXgptzVC7vsHBLaJvbLBGEIdjQx1KODbNFbrAxBSWayWvT
MyG4iefqUj5SUcJfUd05v+Z5Cb7H7KfAYG1hiZwkQkChoQ0uBLx52mdJNuM6
07jZchnTaWkU+SmIHAsuQ10PUW4y26q0AO4b7SBXN6vEFZZOSEoEnEs4w27T
vQNDk+UmI1GhXgmyarUJ+MkVrIJyF7ccjSg+jePzltEkFZQjcs9SrEAD1HuG
q703Xc/nNxJ67unVMbCxRO0LQly05TWdVCAQFFVJXQV+ol5zVe0Jto4KA9OM
YMGRPi42IMTnzKoVBuoXDtoCxwWIirXWcK0d4nlRPBMkxPgXLs5Qa1MRHHud
rcewT0b95gAHihjDqjGuQ+4GHYLaih4SpqqMdsLl2ygOBK35aI6fZx+EUAgi
W5md4tUBaQ2ENV5xfRKcd0qpKPY6lIhDrFPm8ZZCHQx7QYtDdiJWK5UvCrev
rw61IxyrPhEqz5yv6jnPN/NRM90V23CRFFPsl5Osg/ABeulF2j2b1Q6+ojh1
gIZpiNsWNZCfoGAmUoNzIUqtMBeMVdF6oS6g5Zd1DJWxtw4pghCImpaLFJOB
47NryT4agIXopESSvY4oXw9nOM9KIZ0U/LKQ/HNmDhmC8VkXxMtljYcjJ9R/
rmQ80DGltE3i1NV6hmnhOXG5sby4KZEhSQXzF9svhQVzVHGiu31+/vKxXgri
dYIbe8ex7myV3BcIYR3gW73P/nzOWL9shvZvfobOb36G7sEvgMMTheJ3hMQ/
4PB/Z4b/6HCIokKAWsSvMMPaW186w7CmS1Mi9V9pLGXt1hV1adSWYX9sfqAd
e0oNqvC/5DQjcxOwyiJlLUkYlotiXdcGhZCfSS04kcrInFg8BputF2jZXWhW
QJXCnar4YmmTYs1xiKCxgBwyPRRxbayMVFc3KSwuN87WszO+Y0o3StV4Qmyo
BBEUxi/Wi0uQNTYUAjSraBYdvYBeXSaU929RNeM7mYn0ApHeoUrJqKuxrMB8
UBUJqtjmKqx3r7PPBQdOb+hlNCxj1wujbnoH9ehc6EU0LU1KQwPVQaWvw6vi
NM5TLF13yjbGayky64oyVbyo6b11BXCvUynLNRVV3R9tMWlIWGFTBJwF1YcD
yY3lRBAi08kFF7olQ2ZNe8SRTlN0AehCvboITEctKuMcqlIAUm1ou5tNgndL
aWjNHMz37jRPvvZ2u94ks/oJb/6UE9wpr0l7rM1hW3URDDod9jyKN9gec3pY
rw+Eu6FVgiArYEmRIXiBJwSlDvdvX9xtPCALrLy/LC53GiO6shxecPY9AENx
neZAqyVBUE1gSQfVfvcdr3DrZRl4uwE3Bdrjs4Sv4iTKLVJtqH4pflHDcSpv
QZ4EjpulqhTcFYOWNNYZS5De2TxbN1TqtXpyAqiSTOgfKjvmXkfTfhRSMVyL
MlB69QrEmFdx+OLZs/h5FEct9Q61YI+qCogw6W6pbQQnQEkGxLSuRM7E/eO3
B4BoMwEpcjNFBR6++6QKhGDSzUUdVLWdVcWgAlD1Rc5KWfWDS2tONW0NqTFG
9AtbhqwzwiarmSBIMv8lnTg7C7gQFYUeC5WZi4PlVUbHh0Lnn+RzLHVcM2wq
bY5SFPDtY3S+iNv+ZWXeIZLXlaQVgRov4cxB6YYNmydkPiZtvXGtX3bNdkhp
f5D91MzCmUpEmRdTLo/3JBsps68qZl8lY6hBUhVuCbiYzcgqLq7mC35SVsYk
VQOKvxvqxvMmdKky42gvgkYYuCQCc6YcHtPiF+Uy9jBBDSK46FuuMdS9zuNn
QUhXMOBfwmOK7cd9EHfuUjmxtco+qgE+X/IFwNFLeW/c6G294bvvWfg/EDPF
7apDOWlR1hL3y7Grou5c2FHNh+zs2flC5W2tTy0Oo5MAJ7iE1RVWfY4kLY3i
b4+fGy9fHb8NXsfGk/gH+nWv8+z428fBeRw8Gz37dnTz07cnz1wfvn8bhuLv
6/jx6FvzOrk+HgXffXceLP/6w9/+Gr759umzvvkWc5CEf/vhZPWXB6b/t2/n
i5s/vyyW0dPXHx5eZH95cfEqeB4GwUk8y+OkOF//9JP/54u377N08DyfX/30
09Phq9XVXuflg9Ns9f33k4vpVVC8Ls+eXK7K8If4/fWT56vi+eO/ZP6LkfP8
wfUieLMqP8xf2c4zd/Uk+14sDQhVy8K0K1eTvACWvcSwBLwiWdU/RmZ+WjHP
Kk6uTNXWt+/jm9HT41DfxvHldXz9w+Mn+V+PP/zNDIPvfjgWf0fBd5MINi6+
+HMy+vYn9+lPP12d/PB28sNi/SH5c+H9lD2MT/c6px8ezt3i7Wxx/JfT6yfm
4PHN8ulpMB89m4R/O00+vLLcq9fn0w9n5Z+vx09Pn/Uvp6sPL56e5LPzR4/0
jWjOTMITyVT6xdGTxwHhgqiEKgJatYJ1MtVMVU5WitREob9Hr6ARyfhJ4+M3
ovsuIxO7DT9tonjdoYz8kvA9wajNkszSea0QWt1WSWPT/Z5nycQ0EKU5WXFu
0ICEV+jd0gShlhCSBaWiqcJC61EhVVQo9QndyR8UQ6yvYkslLb5NVN2aLJni
sOCAgSlCAzmoQrSR8Vcw91BWeWIn3LvXyfl5ilezLXOw/5FiXdsjWDCSleKe
+eqc+kMLbd4RCN1srkVC9x0vDj2/H7u247j2eNwfjIOhP3JiJ7Ts0Oxs0/QM
Y+zb/YHv2+NB5Htj0xrYQ2swtCPMxB3iPQK+7aVu6MHEH1bHra1/sH/nS4Fq
lXxVD6OaBdjc8Upg+203vMpYPQD1Rd7XGJj9gWV5/sgcx3E/9mzbHI2HHvzp
D5zx5uYMxo49HPRdv++bwzgKAt+KQ993R2HguiPbF3tyAHPsVHvzsII+FeMu
Ytflg66s8chFCw6bj+UFgS4nJGKYUc0w6oLe1TsXD8TtLX6jqkv7X/eVR6Qr
xbT7P4rH/G+10xhbDooU3Qe1Bkd1GOVI9Ra37EMNLu8QQq5BQqW0yEtsMO7w
SDuPi/ufl2e+dpT1pPO7cs7fP2ydWXuEO+yMuNCrvbMV5hXcG1trVciPDvbt
oN/o9fNqWKhh6mN8xnXg6qW2a8EK7Bo4tWt3Nhd+h8U3tnVL6oyq5ZYUGq17
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
/7XAfee1OgEA

-->

</rfc>

