blob: f6b2dec40816c4da0f2467aa8a1d6a26a388ef40 [file] [log] [blame]
#######################################################
TF-M Internal Trusted Storage Service Integration Guide
#######################################################
************
Introduction
************
TF-M Internal Trusted Storage (ITS) service implements PSA Internal Trusted
Storage APIs.
The service is backed by hardware isolation of the flash access domain and
relies on hardware to isolate the flash area from access by the Non-secure
Processing Environment, as well as the Application Root of Trust at higher
levels of isolation.
The current ITS service design relies on hardware abstraction provided by TF-M.
The ITS service provides a non-hierarchical storage model, as a filesystem,
where all the assets are managed by a linearly indexed list of metadata.
The design addresses the following high level requirements as well:
- **Confidentiality** - Resistance to unauthorised accesses through
hardware/software attacks. Assumed to be provided by the internal flash
device, backed by hardware isolation.
- **Access Authentication** - Mechanism to establish requester's identity (a
non-secure entity, secure entity, or a remote server).
- **Integrity** - Resistance to tampering by attackers with physical access is
assumed to be provided by the internal flash device itself, while resistance
to tampering by Non-secure or App RoT attackers also requires hardware
isolation.
- **Reliability** - Resistance to power failure scenarios and incomplete write
cycles.
- **Configurability** - High level of configurability to scale up/down memory
footprint to cater for a variety of devices with varying requirements.
- **Performance** - Optimized to be used for resource constrained devices with
very small silicon footprint, the PPA (power, performance, area) should be
optimal.
*******************************
Current ITS Service Limitations
*******************************
- **Fragmentation** - The current design does not support fragmentation, as an
asset is stored in a contiguous space in a block. This means that the maximum
asset size can only be up-to a block size. Each block can potentially store
multiple assets.
A delete operation implicitly moves all the assets towards the top of the
block to avoid fragmentation within block. However, this may also result in
unutilized space at the end of each block.
- **Non-hierarchical storage model** - The current design uses a
non-hierarchical storage model, as a filesystem, where all the assets are
managed by a linearly indexed list of metadata. This model locates the
metadata in blocks which are always stored in the same flash location. That
increases the number of writes in a specific flash location as every change in
the storage area requires a metadata update.
- **Protection against physical storage medium failure** - Complete handling of
inherent failures of storage mediums (e.g. bad blocks in a NAND based device)
is not supported by the current design.
- **Lifecycle management** - Currently, it does not support any subscription
based keys and certificates required in a secure lifecycle management. Hence,
an asset's validity time-stamp can not be invalidated based on the system
time.
- **Provisioning vs user/device data** - In the current design, all assets are
treated in the same manner. In an alternative design, it may be required to
create separate partitions for provisioning content and user/device generated
content. This is to allow safe update of provisioning data during firmware
updates without the need to wipe out the user/device generated data.
**************
Code Structure
**************
TF-M Internal Trusted Storage service code is located in
``secure_fw/partitions/internal_trusted_storage/`` and is divided as follows:
- Core files
- Flash filesystem interfaces
- Flash interfaces
The PSA ITS interfaces for the TF-M ITS service are located in
``interface/include/psa``.
PSA Internal Trusted Storage Interfaces
=======================================
The TF-M ITS service exposes the following mandatory PSA ITS interfaces
version 1.0:
.. code-block:: c
psa_status_t psa_its_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags);
psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_size, void *p_data, size_t *p_data_length);
psa_status_t psa_its_get_info(psa_storage_uid_t uid, struct psa_storage_info_t *p_info);
psa_status_t psa_its_remove(psa_storage_uid_t uid);
These PSA ITS interfaces and TF-M ITS types are defined and documented in
``interface/include/psa/storage_common.h``,
``interface/include/psa/internal_trusted_storage.h``, and
``interface/include/tfm_its_defs.h``
Core Files
==========
- ``tfm_its_req_mngr.c`` - Contains the ITS request manager implementation which
handles all requests which arrive to the service. This layer extracts the
arguments from the input and output vectors, and it calls the internal trusted
storage layer with the provided parameters.
- ``tfm_internal_trusted_storage.c`` - Contains the TF-M internal trusted
storage API implementations which are the entry points to the ITS service.
Allocates a filesystem context for ITS and makes appropriate fs calls. Also
handles requests from the PS partition with a separate fs context.
- ``its_utils.c`` - Contains common and basic functionalities used across the
ITS service code.
Flash Filesystem Interface
==========================
- ``flash_fs/its_flash_fs.h`` - Abstracts the flash filesystem operations used
by the internal trusted storage service. The purpose of this abstraction is to
have the ability to plug-in other filesystems or filesystem proxies
(supplicant).
- ``flash_fs/its_flash_fs.c`` - Contains the ``its_flash_fs`` implementation for
the required interfaces.
- ``flash_fs/its_flash_fs_mbloc.c`` - Contains the metadata block manipulation
functions required to implement the ``its_flash_fs`` interfaces in
``flash_fs/its_flash_fs.c``.
- ``flash_fs/its_flash_fs_dbloc.c`` - Contains the data block manipulation
functions required to implement the ``its_flash_fs`` interfaces in
``flash_fs/its_flash_fs.c``.
The system integrator **may** replace this implementation with its own
flash filesystem implementation or filesystem proxy (supplicant).
Flash Interface
===============
- ``flash/its_flash.h`` - Abstracts the flash operations for the internal
trusted storage service. Defines the ``struct its_flash_info_t`` type, which
is used as a parameter to the filesystem to provide information about the
flash device in use, such as the block size and number of blocks available.
- ``flash/its_flash.c`` - Contains the ``its_flash`` implementations common to
all flash types.
- ``flash/its_flash_nand.c`` - Implements the ITS flash interface for a NAND
flash device, on top of the CMSIS flash interface implemented by the target.
This implementation writes entire block updates in one-shot, so the CMSIS
flash implementation **must** be able to detect incomplete writes and return
an error the next time the block is read.
- ``flash/its_flash_nor.c`` - Implements the ITS flash interface for a NOR flash
device, on top of the CMSIS flash interface implemented by the target.
- ``flash/its_flash_ram.c`` - Implements the ITS flash interface for an emulated
flash device using RAM, on top of the CMSIS flash interface implemented by the
target.
- ``flash/its_flash_info_internal.c`` - Defines an instance of the
``struct its_flash_info_t`` type for the internal flash device based on
target-specific definitions.
- ``flash/its_flash_info_external.c`` - Defines an instance of the
``struct its_flash_info_t`` type for the external flash device, used only to
handle requests from the PS partition.
The CMSIS flash interface **must** be implemented for each target based on its
flash controller.
The ITS flash interface depends on target-specific definitions from
``platform/ext/target/<TARGET_NAME>/partition/flash_layout.h``.
Please see the `Internal Trusted Storage Service Definitions` section for
details.
*****************************
ITS Service Integration Guide
*****************************
This section describes mandatory (i.e. **must** implement) or optional
(i.e. **may** implement) interfaces which the system integrator has to take in
to account in order to integrate the internal trusted storage service in a new
platform.
Maximum Asset Size
==================
An asset is stored in a contiguous space in a block/sector. The maximum size of
an asset can be up-to the size of the data block/sector.
Internal Trusted Storage Service Definitions
============================================
The ITS service requires the following platform definitions:
- ``ITS_FLASH_AREA_ADDR`` - Defines the flash address where the internal trusted
storage area starts.
- ``ITS_FLASH_AREA_SIZE`` - Defines the size of the dedicated flash area for
internal trusted storage in bytes.
- ``ITS_SECTOR_SIZE`` - Defines the size of the flash sectors (the smallest
erasable unit) in bytes.
- ``ITS_SECTORS_PER_BLOCK`` - Defines the number of contiguous ITS_SECTOR_SIZE
to form a logical block in the filesystem.
- ``ITS_FLASH_DEV_NAME`` - Specifies the flash device used by ITS to store the
data.
- ``ITS_FLASH_PROGRAM_UNIT`` - Defines the smallest flash programmable unit in
bytes. Valid values are powers of two between 1 and ``ITS_SECTOR_SIZE``
inclusive.
- ``ITS_MAX_ASSET_SIZE`` - Defines the maximum asset size to be stored in the
ITS area. This size is used to define the temporary buffers used by ITS to
read/write the asset content from/to flash. The memory used by the temporary
buffers is allocated statically as ITS does not use dynamic memory allocation.
- ``ITS_NUM_ASSETS`` - Defines the maximum number of assets to be stored in the
ITS area. This number is used to dimension statically the filesystem metadata
tables in RAM (fast access) and flash (persistent storage). The memory used by
the filesystem metadata tables is allocated statically as ITS does not use
dynamic memory allocation.
The sectors reserved to be used as internal trusted storage **must** be
contiguous sectors starting at ``ITS_FLASH_AREA_ADDR``.
Target must provide a header file, called ``flash_layout.h``, which defines the
information explained above. The defines must be named as they are specified
above.
More information about the ``flash_layout.h`` content, not ITS related, is
available in :doc:`platform readme </platform/ext/readme>` along with other
platform information.
The following optional platform definitions may also be defined in
``flash_layout.h`` or set at build time in ``platform/ext/<TARGET_NAME>.cmake``:
- ``ITS_BUF_SIZE``- Defines the size of the partition's internal data transfer
buffer. If not provided, then ``ITS_MAX_ASSET_SIZE`` is used to allow asset
data to be copied between the client and the filesystem in one iteration.
Reducing the buffer size will decrease the RAM usage of the partition at the
expense of latency, as data will be copied in multiple iterations. *Note:*
when data is copied in multiple iterations, the atomicity property of the
filesystem is lost in the case of an asynchronous power failure.
- ``ITS_MAX_BLOCK_DATA_COPY`` - Defines the buffer size used when copying data
between blocks, in bytes. If not provided, defaults to 256. Increasing this
value will increase the memory footprint of the service.
Flash Interface
===============
For ITS service operations, a contiguous set of blocks must be earmarked for
the internal trusted storage area. The design requires either 2 blocks, or any
number of blocks greater than or equal to 4. Total number of blocks can not be
0, 1 or 3. This is a design choice limitation to provide power failure safe
update operations.
For API specification, please check:
``secure_fw/partitions/internal_trusted_storage/flash/its_flash.h``
ITS Service Features Flags
==========================
ITS service defines a set of flags that can be used to compile in/out certain
ITS service features. The ``CommonConfig.cmake`` file sets the default values
of those flags. However, those flags values can be overwritten by setting them
in ``platform/ext/<TARGET_NAME>.cmake`` based on the target capabilities or
needs. The list of ITS services flags are:
- ``ITS_CREATE_FLASH_LAYOUT``- this flag indicates that it is required
to create an ITS flash layout. If this flag is set, ITS service will
generate an empty and valid ITS flash layout to store assets. It will
erase all data located in the assigned ITS memory area before generating
the ITS layout. This flag is required to be set if the ITS memory area
is located in a non-persistent memory. This flag can be set if the ITS
memory area is located in a persistent memory without a valid ITS flash
layout in it. That is the case when it is the first time in the device
life that the ITS service is executed.
- ``ITS_VALIDATE_METADATA_FROM_FLASH``- this flag allows to
enable/disable the validation mechanism to check the metadata store in flash
every time the flash data is read from flash. This validation is required
if the flash is not hardware protected against data corruption.
- ``ITS_RAM_FS``- this flag allows to enable/disable the use of RAM
instead of the flash to store the FS in internal trusted storage service. This
flag is set by default in the regression tests, if it is not defined by the
platform. The ITS regression tests reduce the life of the flash memory
as they write/erase multiple times in the memory.
.. Note::
If this flag is manually disabled when running the regression tests,
then the storage flash area should also be erased before running the tests
to ensure they run successfully. The type of storage flash area is platform
specific (QSPI, eFlash, etc.) and it is described in corresponding
flash_layout.h
--------------
*Copyright (c) 2019-2020, Arm Limited. All rights reserved.*
*Copyright (c) 2020, Cypress Semiconductor Corporation. All rights reserved.*