Document block store encryption

Change-Id: Id86c5a62d812b8089d6b80720a8c36424b72ba94
Signed-off-by: Gabor Toth <gabor.toth2@arm.com>
diff --git a/docs/project/change-log.rst b/docs/project/change-log.rst
index a38d707..18dde95 100644
--- a/docs/project/change-log.rst
+++ b/docs/project/change-log.rst
@@ -83,7 +83,7 @@
 Feature Highlights
 ^^^^^^^^^^^^^^^^^^
 
-- Introduce the :doc:`Block Storage Service </services/block-storage-service-description>`. The Block Storage service
+- Introduce the :doc:`Block Storage Service </services/block-storage/block-storage-service-description>`. The Block Storage service
   can be used to share a block-oriented storage device such as a QSPI flash between a set of independent secure world
   clients.
 
diff --git a/docs/services/block-storage-service-description.rst b/docs/services/block-storage/block-storage-service-description.rst
similarity index 69%
rename from docs/services/block-storage-service-description.rst
rename to docs/services/block-storage/block-storage-service-description.rst
index a29f057..7dbb8e8 100644
--- a/docs/services/block-storage-service-description.rst
+++ b/docs/services/block-storage/block-storage-service-description.rst
@@ -5,13 +5,9 @@
 The Block Storage service can be used to share a block-oriented storage device
 such as a QSPI flash between a set of independent secure world clients. A block
 storage service provider presents a block level interface for accessing an
-underlying block storage device. To allow multiple higher layer filesystems to
-share the same storage device, logical block addresses are partitioned, based on
-configuration data provided by a system integrator. The partition configuration
-data may be read from a GUID Partition Table (GPT) or from the block storage SP
-manifest. The configuration data restricts access to a storage partition to a
-defined owner. Each owner is allocated a maximum number of blocks and is given
-exclusive access to its own blocks, based on the client ID of the calling client.
+underlying block storage device. The basic storage functionality provided by a
+device can be extended by Stacked Block Stores, which add extra features, like
+encryption or partitioning on top of a device.
 
 The following diagram illustrates a firmware integration that uses a single block
 storage service provider to control access to a dedicated flash device. In this
@@ -19,7 +15,7 @@
 the service.  Each client independently manages its own filesystem and is presented
 with its own logical partition, starting with a logical block address (LBA) of zero.
 
-.. image:: image/block-storage-example-usage.svg
+.. image:: ../image/block-storage-example-usage.svg
 
 Project Directories
 -------------------
@@ -33,12 +29,47 @@
     - Contains
   * - ``components/service/block_storage``
     - Service specific code components.
+  * - ``components/service/block_storage/block_store``
+    - Client, devices, stacked block stores.
   * - ``deployments/block-storage``
     - Build files and deployment specific code for building alternative configurations
       of the block storage service provider.
   * - ``protocols/service/block_storage``
     - Service access protocol definitions.
 
+Design Description
+------------------
+The block storage service provider conforms to the same model as other service providers
+within the TS project. Service requests from clients are received by a service provider
+that is responsible for parameter deserialization/serialization and service level access
+control. Block storage operations are delegated to a backend *block_store* that provides
+block-level storage in some way. There is much flexibility to realize the backend block-level
+storage in different ways, allowing platform integrators to use alternative *block_store*
+realizations to provide storage solutions that meet specific product requirements.
+
+The following class diagram illustrates the block storage service provider model:
+
+.. uml:: ../uml/BlockStorageProvider.puml
+
+Block Store
+^^^^^^^^^^^
+The *block_store* component defines a virtual interface for block IO operations. Alternative
+concrete *block_store* implementations are supported. Some *block_store* components are stackable
+over other *block_store* components to add features such as store partitioning or block
+authentication. Separation of functionality into stackable *block_store* components gives
+platform integrators the flexibility to create alternative storage solutions with different
+security/cost tradeoffs. The base *block_store* interface is defined in::
+
+  components/service/block_storage/block_store/block_store.h
+
+Components that implement the *block_store* interface are located in subdirectories beneath
+``components/service/block_storage/block_store``. A *block_device* is class of *block_store*
+that actually provides block-level storage. In a stack of *block_store* components, a
+*block_device* will always live at the bottom. The following layer diagram illustrates a
+typical block storage deployment where storage is provided by a stack of *block_store* components:
+
+.. image:: ../image/block-storage-layers.svg
+
 Service Interface
 -----------------
 The Block Storage service supports a conventional set of block-level operations that
@@ -55,7 +86,7 @@
       a handle to be used as a qualifier for other requests made by a client.
   * - Close
     - Close a previously opened session.
-  * - GetInfo
+  * - GetPartitionInfo
     - Returns information about the partition associated with an open session. Includes
       the block size and the total number of blocks assigned to the partition.
   * - Read
@@ -65,8 +96,6 @@
   * - Erase
     - Erase a set of one or more blocks.
 
-Protocol definitions live under: ``protocols/service/block_storage``.
-
 The service interface is realized by the block storage service provider. It delegates
 storage operations to a backend *block_store*. The *block_store* defines a common
 interface for components that realize block storage operations. Where an underlying storage
@@ -75,17 +104,47 @@
 operation (if the partition is writable and the LBA falls within the limits of the
 partition).
 
-Service Provider Configuration
-------------------------------
-A platform integrator must provide a set of configuration data to configure how the block
-storage service provider presents block storage to clients. Configuration data relates to
-the following:
+Block Store Client
+------------------
 
-  - **Storage partition configuration** - determines how storage is divided into separate partitions
-  - **Block device configuration** - determines how the backed storage device is configured
+Communicates with a remote block storage service provider to provide storage.
+
+Block Store Devices
+-------------------
+
+  - **file_block_store** - stores blocks in file accessed using the standard C file (stdio.h) API.
+    The file represents a contiguous array of storage blocks. Designed to be used in a POSIX
+    environment as a virtual storage media.
+  - **fvb_block_store** - an adapter that uses a UEFI firmware volume block driver to access
+    storage. Can be used with drivers from the EDK2 project.
+  - **mock_block_store** - mocked block store for unit testing.
+  - **null_block_store** - a store with no real storage. Always accepts legal writes and returns
+    zeros for reads.
+  - **ram_block_store** - stores blocks in RAM. Intended for test purposes.
+  - **rpmb_block_store** - it is a Replay Protected Memory Block device
+    (see `SD Association home page`_) that uses the RPMB frontend to provide RPMB based storage.
+  - **semihosting_block_store** - it is a block device that can be used on emulators
+    (FVP, qemu, etc...) or on target platforms where the debugger can provide the file-system
+    semihosting features (See `this page`_.). Semihosting allows accessing files from the host
+    environment. This block store uses a single file to represent a contiguous array of storage
+    blocks.
+
+Stacked Block Stores
+--------------------
+
+Partitioned Block Store
+^^^^^^^^^^^^^^^^^^^^^^^
+
+To allow multiple higher layer filesystems to share the same storage device,
+logical block addresses are partitioned, based on configuration data provided
+by a system integrator. The partition configuration data may be read from a
+GUID Partition Table (GPT) or from the block storage SP manifest. The
+configuration data restricts access to a storage partition to a defined owner.
+Each owner is allocated a maximum number of blocks and is given exclusive access
+to its own blocks, based on the client ID of the calling client.
 
 Storage Partition Configuration
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+"""""""""""""""""""""""""""""""
 The block storage service allows a block storage device to be presented as a single storage
 partition or as a set of smaller storage partitions. The way that storage is presented is
 determined by configuration data prepared by a platform integrator. Each storage partition
@@ -206,57 +265,47 @@
     - 72 bytes
     - PartitionName - Holds canonical UUID string for owner.
 
-Design Description
-------------------
-The block storage service provider conforms to the same model as other service providers
-within the TS project. Service requests from clients are received by a service provider
-that is responsible for parameter deserialization/serialization and service level access
-control. Block storage operations are delegated to a backend *block_store* that provides
-block-level storage in some way. There is much flexibility to realize the backend block-level
-storage in different ways, allowing platform integrators to use alternative *block_store*
-realizations to provide storage solutions that meet specific product requirements.
+Encrypted Block Store
+^^^^^^^^^^^^^^^^^^^^^
 
-The following class diagram illustrates the block storage service provider model:
+To provide data in rest, and data in transit protection for the stored data using encryption.
+The current implementation uses *AES-CBC with ESSIV* encryption, where the encryption key is
+derived from the Encryption Root key (ERK).
+This way a unique, deterministic, but unpredictable vector is generated for each sector, which
+mitigates IV prediction based attacks, like watermarking attack.
+To implement the algorithm two keys are derived from the root key and generated with the same
+salt value, but with different info:
 
-.. uml:: uml/BlockStorageProvider.puml
+  - **encryption key** - encryption and decryption of the data (AES with CBC block cipher mode)
+  - **essiv key** - generation of the IV (AES with ECB block cipher mode)
 
-Block Store
-^^^^^^^^^^^
-The *block_store* component defines a virtual interface for block IO operations. Alternative
-concrete *block_store* implementations are supported. Some *block_store* components are stackable
-over other *block_store* components to add features such as store partitioning or block
-authentication. Separation of functionality into stackable *block_store* components gives
-platform integrators the flexibility to create alternative storage solutions with different
-security/cost tradeoffs. The base *block_store* interface is defined in::
+Encrypted Block Store Configuration
+"""""""""""""""""""""""""""""""""""
 
-  components/service/block_storage/block_store/block_store.h
+  - **ENCRYPTED_BLK_AES_KEY_BITS** - determines the size of the keys derived from the root key
+    supported values are 128, 192 and 256.
+  - **ENCRYPTED_BLK_BLOCK_ENCRYPTION_ROOT_KEY** - root key to be used to derive encryption
+    and ESSIV keys from.
+  - **ENCRYPTED_BLK_BLOCK_ENCRYPTION_SALT** - Salt value to make impossible for an attacker to
+    derive the same keys as the ones used for encryption without knowing this value.
 
-Components that implement the *block_store* interface are located in subdirectories beneath
-``components/service/block_storage/block_store``. A *block_device* is class of *block_store*
-that actually provides block-level storage. In a stack of *block_store* components, a
-*block_device* will always live at the bottom. The following layer diagram illustrates a
-typical block storage deployment where storage is provided by a stack of *block_store* components:
+Encrypted Block Store Limitations
+"""""""""""""""""""""""""""""""""
 
-.. image:: image/block-storage-layers.svg
-
-Some block devices supported in the TS project (located under:
-``components/service/block_storage/block_store/block_device``) are:
-
-  - **ram_block_store** - stores blocks in RAM. Intended for test purposes.
-  - **null_block_store** - a store with no real storage. Always accepts legal writes and returns
-    zeros for reads.
-  - **fvb_block_store** - an adapter that uses a UEFI firmware volume block driver to access
-    storage. Can be used with drivers from the EDK2 project.
-
-Other supported block_store components:
-
-  - **partitioned_block_store** - a stackable *block_store* that presents an underlying *block_store*
-    as a set of configurable storage partitions.
-  - **block_storage_client** - communicates with a remote block storage service provider to provide
-    storage.
+  - Block size of the store must be multiple of the AES block size (16 bytes).
+  - Encryption root key is currently a configurable vector in the future it should come from a
+    secure source, like from the Crypto SP or a separate SP responsible for root key storage and
+    key derivation, but in the current implementation
+  - AES with CBC block method encrypts a whole block, where the consecutive AES blocks are
+    interconnected. A drawback of this algorithm is that partial read or write does not
+    work. To mitigate this limitation at read request the whole block is read and only partial
+    data is returned, at write request the read-modify-write methodology is used.
 
 --------------
 
+.. _`SD Association home page`: https://www.sdcard.org/developers/boot-and-new-security-features/replay-protected-memory-block/
+.. _`this page`: https://developer.arm.com/documentation/dui0203/j/semihosting?lang=en
+
 *Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.*
 
 SPDX-License-Identifier: BSD-3-Clause
diff --git a/docs/services/image/block-storage-example-usage.svg b/docs/services/image/block-storage-example-usage.svg
index 5da7427..beebab0 100644
--- a/docs/services/image/block-storage-example-usage.svg
+++ b/docs/services/image/block-storage-example-usage.svg
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than diagrams.net -->
+<!-- Do not edit this file with editors other than draw.io -->
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="921px" height="551px" viewBox="-0.5 -0.5 921 551" content="&lt;mxfile host=&quot;confluence.arm.com&quot; modified=&quot;2022-08-25T16:15:08.782Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;mAY4xjS1y1Ce76DsL9WA&quot; version=&quot;20.1.4&quot; type=&quot;atlas&quot;&gt;&lt;mxAtlasLibraries/&gt;&lt;diagram id=&quot;plxMLLH-skr558P6A1ZB&quot; name=&quot;Page-1&quot;&gt;3VrbctowEP0aHunYFubyyDWdJkyY0k5KXjqKLWwNwmJkESBfXxnLV5lLCdSmT1hH0gqdPdr1Cmqgv9w+MLhyx9RGpGZo9rYGBjXD0DsAiI8A2YVIGzRCwGHYloMSYIo/kAQ1ia6xjfzMQE4p4XiVBS3qecjiGQwyRjfZYXNKsquuoCNX1BJgakGClGEv2Oau3IWZGv0VYceNVtY12bOE0WAJ+C606SYFgWEN9BmlPHxabvuIBORFvITzRgd64y/GkMfPmTBv7Zzxyuqw2XjDtfaH/mrCuhFaeYdkLTcsvyzfRQwwuvZsFBjRa6C3cTFH0xW0gt6N8LnAXL4ksnuOCelTQtl+LrAhas8tgfuc0QWKejzqiek9dQdyU++IcbRNQXJHD4guEWc7MUT21vWmpFfqK2J7kzgrHuKmHdWWIJQCcWLbCYfiQdJYTOmju/6tdRmZ6LPm2+IbefrOaF2/d0pblaNUVemUj8dHaNVO03oVphpZppqmypRRwFTnCkQ96QuwaDuzH5OXwSvt9Qh/9O5fe2aZ2iukVNXehFEuUo3g0NCmnLIgg5QuRbNqUgT3LkVQOSk2FEqfJ/Ufw2H56gNVU5957+pTAmG7dPk1FU57hFqLKkdBYJQtxJZC2gDZ2IJh+hgR6LsKbaJSWAWP1o5gwR8Dp8l7C5l+eosBaC2cPf/Pay7MIIn7YYWlm9diXM8y3uioOi2S6c1U2j598pFnd4PSMDmxKSbRFvNfgWK/mLI1k/oNngfbdGOXakwQw2IHiEWYJ3aTMhQ0Z9EaQSMxtW9Ftg46xadrZqHTUuOQOYifPsfIjirfAy5OedAs8GCEMUQgx+/ZernIrXKFCcViZ4mCjFykA3lphBuX09IFrmIpp0UAcpZCahRLe53FG79cep1PSu+g66viKqUybFzoqsYJOzd2VKSTlKdGo3pXIGPk+9DBnqN4TgREnnVXYe5PvyhICBLseEE4F24NwkMvCK8iBZCu7Fhi2w6WKQzy2Rx6hZBt5rgHBS8WeoGIjFtFbP2MqvV4yL52qD0ZQhvVOpdxNv3suVRDaN7rtz6Zarn9b7RwSdq/PFU3z9SZUTGd5VN16251dsb1RHkx59glaFW00Px/Yo56rzKBIkNzTD0B96k3x86awbB9oFazqbVe7n3616XaFXK6cgEDCrJ6p0ANNyvD9DNuYNQDZotyOL6SKSjK9HRsjiN1WdFZr9prwD2G58KfJdU3wp8rG3IksK6D5Jql3jTpJd54FlJW6YR2zMlVOT3Xy2c5Q6Z5pbMjmsnfBcLhyZ8uwPAP&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="600" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all"/><rect x="0" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all"/><rect x="20" y="45" width="120" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">StMM</div></div></div></foreignObject><text x="80" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">StMM</text></switch></g><rect x="200" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all"/><rect x="220" y="45" width="120" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 221px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Protected Storage</div></div></div></foreignObject><text x="280" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Protected Storage</text></switch></g><rect x="400" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all"/><rect x="420" y="45" width="120" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">OP-TEE</div></div></div></foreignObject><text x="480" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">OP-TEE</text></switch></g><rect x="200" y="260" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all"/><rect x="220" y="305" width="120" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 350px; margin-left: 221px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Block Storage</div></div></div></foreignObject><text x="280" y="354" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Block Storage</text></switch></g><path d="M 250 485 C 250 476.72 263.43 470 280 470 C 287.96 470 295.59 471.58 301.21 474.39 C 306.84 477.21 310 481.02 310 485 L 310 535 C 310 543.28 296.57 550 280 550 C 263.43 550 250 543.28 250 535 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 310 485 C 310 493.28 296.57 500 280 500 C 263.43 500 250 493.28 250 485" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 523px; margin-left: 251px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Dedicated Flash</div></div></div></foreignObject><text x="280" y="526" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Dedicated...</text></switch></g><path d="M 280 470 L 280 395" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 0 220 L 800 220" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="810" y="210" width="110" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 220px; margin-left: 811px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">FF-A Messaging</div></div></div></foreignObject><text x="865" y="224" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">FF-A Messaging</text></switch></g><path d="M 480 220 L 480 135" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 280 305 L 280 135" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 80 220 L 80 135" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 420 310 L 510 310 L 510 378 Q 487.5 356.4 465 378 Q 442.5 399.6 420 378 L 420 322 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 338px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Partition Configuration</div></div></div></foreignObject><text x="465" y="342" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Partition Confi...</text></switch></g><path d="M 340 350 L 420 350" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><rect x="620" y="45" width="120" height="90" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 621px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Update Agent</div></div></div></foreignObject><text x="680" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Update Agent</text></switch></g><path d="M 680 220 L 680 135" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="921px" height="531px" viewBox="-0.5 -0.5 921 531" content="&lt;mxfile host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36&quot; version=&quot;26.0.14&quot;&gt;&#10;  &lt;diagram name=&quot;Page-1&quot; id=&quot;DQ98of8pp7M35S4G1Lo6&quot;&gt;&#10;    &lt;mxGraphModel dx=&quot;1853&quot; dy=&quot;603&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;827&quot; pageHeight=&quot;1169&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#10;      &lt;root&gt;&#10;        &lt;mxCell id=&quot;0&quot; /&gt;&#10;        &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-1&quot; value=&quot;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-160&quot; y=&quot;20&quot; width=&quot;160&quot; height=&quot;180&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-2&quot; value=&quot;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-760&quot; y=&quot;20&quot; width=&quot;160&quot; height=&quot;180&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-3&quot; value=&quot;StMM&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-740&quot; y=&quot;65&quot; width=&quot;120&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-4&quot; value=&quot;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-560&quot; y=&quot;20&quot; width=&quot;160&quot; height=&quot;180&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-5&quot; value=&quot;Protected Storage&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-540&quot; y=&quot;65&quot; width=&quot;120&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-6&quot; value=&quot;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-360&quot; y=&quot;20&quot; width=&quot;160&quot; height=&quot;180&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-7&quot; value=&quot;OP-TEE&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-340&quot; y=&quot;65&quot; width=&quot;120&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-8&quot; value=&quot;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-590&quot; y=&quot;270&quot; width=&quot;232&quot; height=&quot;190&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-9&quot; value=&quot;&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-570&quot; y=&quot;290&quot; width=&quot;182&quot; height=&quot;150&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-10&quot; value=&quot;Dedicated Flash&quot; style=&quot;shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-509&quot; y=&quot;470&quot; width=&quot;60&quot; height=&quot;80&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-12&quot; value=&quot;&quot; style=&quot;endArrow=none;html=1;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-760&quot; y=&quot;240&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;40&quot; y=&quot;240&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-13&quot; value=&quot;FF-A Messaging&quot; style=&quot;text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;50&quot; y=&quot;230&quot; width=&quot;110&quot; height=&quot;20&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-14&quot; value=&quot;&quot; style=&quot;endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; target=&quot;8d1qzFLiU4dvMAKzdGGc-7&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-280&quot; y=&quot;240&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;-210&quot; y=&quot;320&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-15&quot; value=&quot;&quot; style=&quot;endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;8d1qzFLiU4dvMAKzdGGc-9&quot; target=&quot;8d1qzFLiU4dvMAKzdGGc-5&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-260&quot; y=&quot;370&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;-210&quot; y=&quot;320&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-16&quot; value=&quot;&quot; style=&quot;endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; target=&quot;8d1qzFLiU4dvMAKzdGGc-3&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-680&quot; y=&quot;240&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;-210&quot; y=&quot;320&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-17&quot; value=&quot;Partition Configuration&quot; style=&quot;shape=document;whiteSpace=wrap;html=1;boundedLbl=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-325&quot; y=&quot;350&quot; width=&quot;90&quot; height=&quot;80&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-19&quot; value=&quot;Update Agent&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-140&quot; y=&quot;65&quot; width=&quot;120&quot; height=&quot;90&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-20&quot; value=&quot;&quot; style=&quot;endArrow=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; target=&quot;8d1qzFLiU4dvMAKzdGGc-19&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-80&quot; y=&quot;240&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;-20&quot; y=&quot;255&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-27&quot; value=&quot;&quot; style=&quot;rounded=1;whiteSpace=wrap;html=1;dashed=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-560&quot; y=&quot;330&quot; width=&quot;160&quot; height=&quot;100&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-21&quot; value=&quot;Block Storage&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-534&quot; y=&quot;290&quot; width=&quot;110&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-22&quot; value=&quot;Encrypted&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-534&quot; y=&quot;360&quot; width=&quot;110&quot; height=&quot;20&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-23&quot; value=&quot;Partitioned&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-534&quot; y=&quot;380&quot; width=&quot;110&quot; height=&quot;20&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-26&quot; value=&quot;Device: RPMB&quot; style=&quot;rounded=0;whiteSpace=wrap;html=1;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-534&quot; y=&quot;400&quot; width=&quot;110&quot; height=&quot;20&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-18&quot; value=&quot;&quot; style=&quot;endArrow=none;dashed=1;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;8d1qzFLiU4dvMAKzdGGc-23&quot; target=&quot;8d1qzFLiU4dvMAKzdGGc-17&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-348&quot; y=&quot;350&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;-298&quot; y=&quot;300&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-11&quot; value=&quot;&quot; style=&quot;endArrow=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;8d1qzFLiU4dvMAKzdGGc-10&quot; target=&quot;8d1qzFLiU4dvMAKzdGGc-26&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;-348&quot; y=&quot;360&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;-298&quot; y=&quot;310&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;8d1qzFLiU4dvMAKzdGGc-28&quot; value=&quot;Block Store&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;-519&quot; y=&quot;330&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;      &lt;/root&gt;&#10;    &lt;/mxGraphModel&gt;&#10;  &lt;/diagram&gt;&#10;&lt;/mxfile&gt;&#10;"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-1"><g><rect x="600" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-2"><g><rect x="0" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-3"><g><rect x="20" y="45" width="120" height="90" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">StMM</div></div></div></foreignObject><text x="80" y="94" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">StMM</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-4"><g><rect x="200" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-5"><g><rect x="220" y="45" width="120" height="90" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 221px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Protected Storage</div></div></div></foreignObject><text x="280" y="94" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Protected Storage</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-6"><g><rect x="400" y="0" width="160" height="180" rx="24" ry="24" fill="#dae8fc" stroke="none" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-7"><g><rect x="420" y="45" width="120" height="90" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">OP-TEE</div></div></div></foreignObject><text x="480" y="94" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">OP-TEE</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-8"><g><rect x="170" y="250" width="232" height="190" rx="28.5" ry="28.5" fill="#dae8fc" stroke="none" pointer-events="all" style="fill: light-dark(rgb(218, 232, 252), rgb(29, 41, 59));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-9"><g><rect x="190" y="270" width="182" height="150" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-10"><g><path d="M 251 465 C 251 456.72 264.43 450 281 450 C 288.96 450 296.59 451.58 302.21 454.39 C 307.84 457.21 311 461.02 311 465 L 311 515 C 311 523.28 297.57 530 281 530 C 264.43 530 251 523.28 251 515 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 311 465 C 311 473.28 297.57 480 281 480 C 264.43 480 251 473.28 251 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 503px; margin-left: 252px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Dedicated Flash</div></div></div></foreignObject><text x="281" y="506" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Dedicated...</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-12"><g><path d="M 0 220 L 800 220" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-13"><g><rect x="810" y="210" width="110" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 220px; margin-left: 811px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">FF-A Messaging</div></div></div></foreignObject><text x="865" y="224" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">FF-A Messaging</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-14"><g><path d="M 480 220 L 480 135" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-15"><g><path d="M 281 270 L 280 135" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-16"><g><path d="M 80 220 L 80 135" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-17"><g><path d="M 435 330 L 525 330 L 525 398 Q 502.5 376.4 480 398 Q 457.5 419.6 435 398 L 435 342 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 358px; margin-left: 436px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Partition Configuration</div></div></div></foreignObject><text x="480" y="362" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Partition Confi...</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-19"><g><rect x="620" y="45" width="120" height="90" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 621px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Update Agent</div></div></div></foreignObject><text x="680" y="94" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Update Agent</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-20"><g><path d="M 680 220 L 680 135" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-27"><g><rect x="200" y="310" width="160" height="100" rx="15" ry="15" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-21"><g><rect x="226" y="270" width="110" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 285px; margin-left: 227px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Block Storage</div></div></div></foreignObject><text x="281" y="289" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Block Storage</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-22"><g><rect x="226" y="340" width="110" height="20" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 350px; margin-left: 227px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Encrypted</div></div></div></foreignObject><text x="281" y="354" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Encrypted</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-23"><g><rect x="226" y="360" width="110" height="20" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 370px; margin-left: 227px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Partitioned</div></div></div></foreignObject><text x="281" y="374" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Partitioned</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-26"><g><rect x="226" y="380" width="110" height="20" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 390px; margin-left: 227px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Device: RPMB</div></div></div></foreignObject><text x="281" y="394" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Device: RPMB</text></switch></g></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-18"><g><path d="M 336 370 L 435 370" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-11"><g><path d="M 281 450 L 281 400" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="8d1qzFLiU4dvMAKzdGGc-28"><g><rect x="241" y="310" width="80" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 325px; margin-left: 242px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Block Store</div></div></div></foreignObject><text x="281" y="329" fill="light-dark(#000000, #ffffff)" font-family="&quot;Helvetica&quot;" font-size="12px" text-anchor="middle">Block Store</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
diff --git a/docs/services/index.rst b/docs/services/index.rst
index 5f7377d..15e2415 100644
--- a/docs/services/index.rst
+++ b/docs/services/index.rst
@@ -9,7 +9,7 @@
     crypto-service-description
     fwu/index
     secure-storage-service-description
-    block-storage-service-description
+    block-storage/block-storage-service-description
     uefi-smm-services
     logging-service-description