diff --git a/doc/services/storage/secure_storage/index.rst b/doc/services/storage/secure_storage/index.rst index 57f7dc03b27..1829b435ea9 100644 --- a/doc/services/storage/secure_storage/index.rst +++ b/doc/services/storage/secure_storage/index.rst @@ -43,9 +43,18 @@ The secure storage subsystem's implementation of the PSA Secure Storage API: Instead, the PS API directly calls into the Internal Trusted Storage (ITS) API (unless a `custom implementation <#whole-api>`_ of the PS API is provided). -Below are some ways the implementation deviates from the specification +Below are some ways the implementation purposefully deviates from the specification and an explanation why. This is not an exhaustive list. +* The UID type is only 30 bits by default. (Against `2.5 UIDs `_.) + + | This is an optimization done to make it more convenient to directly use the UIDs as + storage entry IDs (e.g., with :ref:`ZMS ` when + :kconfig:option:`CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_ZMS` is enabled). + | Zephyr defines numerical ranges to be used by different users of the API which guarantees that + there are no collisions and that they all fit within 30 bits. + See the header files in :zephyr_file:`include/zephyr/psa` for more information. + * The data stored in the ITS is by default encrypted and authenticated (Against ``1.`` in `3.2. Internal Trusted Storage requirements `_.) diff --git a/samples/psa/its/sample.yaml b/samples/psa/its/sample.yaml index 8d67cddd157..d3e7b7e10c9 100644 --- a/samples/psa/its/sample.yaml +++ b/samples/psa/its/sample.yaml @@ -2,6 +2,8 @@ sample: name: PSA ITS API sample description: Demonstration of PSA Internal Trusted Storage (ITS) API usage. common: + integration_platforms: + - native_sim tags: - psa.secure_storage timeout: 10 diff --git a/samples/psa/persistent_key/sample.yaml b/samples/psa/persistent_key/sample.yaml index 490f2ea8f15..7c5b9d80300 100644 --- a/samples/psa/persistent_key/sample.yaml +++ b/samples/psa/persistent_key/sample.yaml @@ -2,6 +2,8 @@ sample: name: PSA Crypto persistent key sample description: Demonstration of persistent key usage in the PSA Crypto API. common: + integration_platforms: + - native_sim tags: - psa.secure_storage timeout: 10 diff --git a/subsys/secure_storage/Kconfig b/subsys/secure_storage/Kconfig index 3fe8eb0f76a..b0ac8c08a14 100644 --- a/subsys/secure_storage/Kconfig +++ b/subsys/secure_storage/Kconfig @@ -25,6 +25,17 @@ module = SECURE_STORAGE module-str = secure_storage source "subsys/logging/Kconfig.template.log_config" +config SECURE_STORAGE_64_BIT_UID + bool "Make psa_storage_uid_t 64-bit" + help + Zephyr, by default, uses a 30-bit psa_storage_uid_t, which allows using only 32 bits to + identify entries. + UID ranges are defined for the different users of the API which guarantees that all the + UIDs fit within 30 bits. See for example the zephyr/psa/key_ids.h header file. + Enable this for backward compatibility if you are updating an existing installation with + stored entries that was using Zephyr prior to 4.3 or if for some reason you need the full + 64-bit UID range. + choice SECURE_STORAGE_ITS_IMPLEMENTATION prompt "Internal Trusted Storage (ITS) API implementation" diff --git a/subsys/secure_storage/Kconfig.its_store b/subsys/secure_storage/Kconfig.its_store index ccd15b968a7..c924def563f 100644 --- a/subsys/secure_storage/Kconfig.its_store +++ b/subsys/secure_storage/Kconfig.its_store @@ -17,7 +17,7 @@ config SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_ZMS depends on ZMS help This implementation of the ITS store module makes direct use of ZMS for storage. - It needs a `secure_storage_its_partition` devicetree chosen property that points + It needs a secure_storage_its_partition devicetree chosen property that points to a fixed storage partition that will be dedicated to the ITS. It has lower overhead compared to the settings-based implementation, both in terms of runtime execution and storage space, and also ROM footprint if the settings subsystem is disabled. @@ -78,7 +78,8 @@ config SECURE_STORAGE_ITS_STORE_SETTINGS_PREFIX config SECURE_STORAGE_ITS_STORE_SETTINGS_NAME_MAX_LEN int "Maximum setting name length" range 2 64 - default 22 if !SECURE_STORAGE_ITS_STORE_SETTINGS_NAME_CUSTOM - default 0 + default 0 if SECURE_STORAGE_ITS_STORE_SETTINGS_NAME_CUSTOM + default 22 if SECURE_STORAGE_64_BIT_UID + default 14 endif # SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_SETTINGS diff --git a/subsys/secure_storage/include/internal/zephyr/secure_storage/its.h b/subsys/secure_storage/include/internal/zephyr/secure_storage/its.h index 009bb5e061a..c19dd7be7b6 100644 --- a/subsys/secure_storage/include/internal/zephyr/secure_storage/its.h +++ b/subsys/secure_storage/include/internal/zephyr/secure_storage/its.h @@ -14,18 +14,21 @@ #include "its/common.h" /** @brief See `psa_its_set()`, to which this function is analogous. */ -psa_status_t secure_storage_its_set(secure_storage_its_uid_t uid, size_t data_length, - const void *p_data, psa_storage_create_flags_t create_flags); +psa_status_t secure_storage_its_set(secure_storage_its_caller_id_t caller_id, psa_storage_uid_t uid, + size_t data_length, const void *p_data, + psa_storage_create_flags_t create_flags); /** @brief See `psa_its_get()`, to which this function is analogous. */ -psa_status_t secure_storage_its_get(secure_storage_its_uid_t uid, size_t data_offset, - size_t data_size, void *p_data, size_t *p_data_length); +psa_status_t secure_storage_its_get(secure_storage_its_caller_id_t caller_id, psa_storage_uid_t uid, + size_t data_offset, size_t data_size, + void *p_data, size_t *p_data_length); /** @brief See `psa_its_get_info()`, to which this function is analogous. */ -psa_status_t secure_storage_its_get_info(secure_storage_its_uid_t uid, - struct psa_storage_info_t *p_info); +psa_status_t secure_storage_its_get_info(secure_storage_its_caller_id_t caller_id, + psa_storage_uid_t uid, struct psa_storage_info_t *p_info); /** @brief See `psa_its_remove()`, to which this function is analogous. */ -psa_status_t secure_storage_its_remove(secure_storage_its_uid_t uid); +psa_status_t secure_storage_its_remove(secure_storage_its_caller_id_t caller_id, + psa_storage_uid_t uid); #endif diff --git a/subsys/secure_storage/include/internal/zephyr/secure_storage/its/common.h b/subsys/secure_storage/include/internal/zephyr/secure_storage/its/common.h index cd953086950..6ffc1bc78f5 100644 --- a/subsys/secure_storage/include/internal/zephyr/secure_storage/its/common.h +++ b/subsys/secure_storage/include/internal/zephyr/secure_storage/its/common.h @@ -12,8 +12,7 @@ #include /** @brief The ID of the caller from which the ITS API call originates. - * This is used to prevent ID collisions between different callers that are not aware - * of each other and so might use the same numerical IDs, e.g. PSA Crypto and PSA ITS. + * This is used to namespace the different callers and possibly treat them differently. */ typedef enum { SECURE_STORAGE_ITS_CALLER_PSA_ITS, @@ -22,12 +21,33 @@ typedef enum { SECURE_STORAGE_ITS_CALLER_COUNT } secure_storage_its_caller_id_t; +#ifdef CONFIG_SECURE_STORAGE_64_BIT_UID + /** The UID (caller + entry IDs) of an ITS entry. */ typedef struct { psa_storage_uid_t uid; secure_storage_its_caller_id_t caller_id; } __packed secure_storage_its_uid_t; +#else + +#define SECURE_STORAGE_ITS_UID_BIT_SIZE 30 +#define SECURE_STORAGE_ITS_CALLER_ID_BIT_SIZE 2 + +/** @brief The UID (caller + entry IDs) of an ITS entry. + * This is a packed, 32-bit version of `psa_storage_uid_t` which allows storing + * smaller IDs compared to the 64-bit ones that PSA Secure Storage specifies. + * Zephyr defines ranges of IDs to be used by different users of the API (subsystems, application) + * which guarantees 1. no collisions and 2. that the IDs used fit within `uid`. + * @see @ref zephyr/psa/key_ids.h and the other header files under `zephyr/psa`. + */ +typedef struct { + psa_storage_uid_t uid : SECURE_STORAGE_ITS_UID_BIT_SIZE; + secure_storage_its_caller_id_t caller_id : SECURE_STORAGE_ITS_CALLER_ID_BIT_SIZE; +} secure_storage_its_uid_t; + +#endif /* CONFIG_SECURE_STORAGE_64_BIT_UID */ + #ifdef CONFIG_SECURE_STORAGE_ITS_TRANSFORM_MODULE /** The maximum size, in bytes, of an entry's data after it has been transformed for storage. */ diff --git a/subsys/secure_storage/include/psa/internal_trusted_storage.h b/subsys/secure_storage/include/psa/internal_trusted_storage.h index a8c3b77c601..06a09e34988 100644 --- a/subsys/secure_storage/include/psa/internal_trusted_storage.h +++ b/subsys/secure_storage/include/psa/internal_trusted_storage.h @@ -16,7 +16,6 @@ #else #define ITS_CALLER_ID SECURE_STORAGE_ITS_CALLER_PSA_ITS #endif -#define ITS_UID (secure_storage_its_uid_t){.uid = uid, .caller_id = ITS_CALLER_ID} /** @endcond */ #include @@ -50,7 +49,7 @@ static ALWAYS_INLINE 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) { - return secure_storage_its_set(ITS_UID, data_length, p_data, create_flags); + return secure_storage_its_set(ITS_CALLER_ID, uid, data_length, p_data, create_flags); } /** @@ -76,7 +75,8 @@ static ALWAYS_INLINE 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) { - return secure_storage_its_get(ITS_UID, data_offset, data_size, p_data, p_data_length); + return secure_storage_its_get(ITS_CALLER_ID, uid, data_offset, + data_size, p_data, p_data_length); } /** @@ -96,7 +96,7 @@ static ALWAYS_INLINE /** @endcond */ psa_status_t psa_its_get_info(psa_storage_uid_t uid, struct psa_storage_info_t *p_info) { - return secure_storage_its_get_info(ITS_UID, p_info); + return secure_storage_its_get_info(ITS_CALLER_ID, uid, p_info); } /** @@ -117,7 +117,7 @@ static ALWAYS_INLINE /** @endcond */ psa_status_t psa_its_remove(psa_storage_uid_t uid) { - return secure_storage_its_remove(ITS_UID); + return secure_storage_its_remove(ITS_CALLER_ID, uid); } #undef ITS_UID diff --git a/subsys/secure_storage/include/psa/protected_storage.h b/subsys/secure_storage/include/psa/protected_storage.h index 7c20d3097a2..40d731b0425 100644 --- a/subsys/secure_storage/include/psa/protected_storage.h +++ b/subsys/secure_storage/include/psa/protected_storage.h @@ -12,8 +12,7 @@ /** @cond INTERNAL_HIDDEN */ #ifdef CONFIG_SECURE_STORAGE_PS_IMPLEMENTATION_ITS #include "../internal/zephyr/secure_storage/its.h" -#define ITS_UID (secure_storage_its_uid_t){.uid = uid, \ - .caller_id = SECURE_STORAGE_ITS_CALLER_PSA_PS} +#define ITS_CALLER_ID SECURE_STORAGE_ITS_CALLER_PSA_PS #else #include "../internal/zephyr/secure_storage/ps.h" #endif @@ -50,7 +49,7 @@ psa_status_t psa_ps_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags) { #ifdef CONFIG_SECURE_STORAGE_PS_IMPLEMENTATION_ITS - return secure_storage_its_set(ITS_UID, data_length, p_data, create_flags); + return secure_storage_its_set(ITS_CALLER_ID, uid, data_length, p_data, create_flags); #else return secure_storage_ps_set(uid, data_length, p_data, create_flags); #endif @@ -83,7 +82,8 @@ psa_status_t psa_ps_get(psa_storage_uid_t uid, size_t data_offset, size_t data_size, void *p_data, size_t *p_data_length) { #ifdef CONFIG_SECURE_STORAGE_PS_IMPLEMENTATION_ITS - return secure_storage_its_get(ITS_UID, data_offset, data_size, p_data, p_data_length); + return secure_storage_its_get(ITS_CALLER_ID, uid, data_offset, + data_size, p_data, p_data_length); #else return secure_storage_ps_get(uid, data_offset, data_size, p_data, p_data_length); #endif @@ -110,7 +110,7 @@ static ALWAYS_INLINE psa_status_t psa_ps_get_info(psa_storage_uid_t uid, struct psa_storage_info_t *p_info) { #ifdef CONFIG_SECURE_STORAGE_PS_IMPLEMENTATION_ITS - return secure_storage_its_get_info(ITS_UID, p_info); + return secure_storage_its_get_info(ITS_CALLER_ID, uid, p_info); #else return secure_storage_ps_get_info(uid, p_info); #endif @@ -138,7 +138,7 @@ static ALWAYS_INLINE psa_status_t psa_ps_remove(psa_storage_uid_t uid) { #ifdef CONFIG_SECURE_STORAGE_PS_IMPLEMENTATION_ITS - return secure_storage_its_remove(ITS_UID); + return secure_storage_its_remove(ITS_CALLER_ID, uid); #else return secure_storage_ps_remove(uid); #endif diff --git a/subsys/secure_storage/include/psa/storage_common.h b/subsys/secure_storage/include/psa/storage_common.h index d5bed2a692e..2bd0f7cce73 100644 --- a/subsys/secure_storage/include/psa/storage_common.h +++ b/subsys/secure_storage/include/psa/storage_common.h @@ -20,7 +20,11 @@ #include /** UID type for identifying entries. */ +#ifdef CONFIG_SECURE_STORAGE_64_BIT_UID typedef uint64_t psa_storage_uid_t; +#else +typedef uint32_t psa_storage_uid_t; +#endif /** Flags used when creating an entry. */ typedef uint32_t psa_storage_create_flags_t; diff --git a/subsys/secure_storage/src/its/implementation.c b/subsys/secure_storage/src/its/implementation.c index 2ad937d45d2..6f33195a062 100644 --- a/subsys/secure_storage/src/its/implementation.c +++ b/subsys/secure_storage/src/its/implementation.c @@ -11,6 +11,33 @@ LOG_MODULE_DECLARE(secure_storage, CONFIG_SECURE_STORAGE_LOG_LEVEL); +#ifndef CONFIG_SECURE_STORAGE_64_BIT_UID +BUILD_ASSERT(sizeof(secure_storage_its_uid_t) == 4); /* ITS UIDs are 32-bit */ +BUILD_ASSERT(1 << SECURE_STORAGE_ITS_CALLER_ID_BIT_SIZE >= SECURE_STORAGE_ITS_CALLER_COUNT); +BUILD_ASSERT(SECURE_STORAGE_ITS_CALLER_ID_BIT_SIZE + SECURE_STORAGE_ITS_UID_BIT_SIZE == 32); +#endif + +static psa_status_t make_its_uid(secure_storage_its_caller_id_t caller_id, psa_storage_uid_t uid, + secure_storage_its_uid_t *its_uid) +{ + if (uid == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + +#ifndef CONFIG_SECURE_STORAGE_64_BIT_UID + /* Check that the UID is not bigger than the maximum defined size. */ + if (uid & GENMASK64(63, SECURE_STORAGE_ITS_UID_BIT_SIZE)) { + LOG_DBG("UID %u/%#llx cannot be used as it has bits set past " + "the first " STRINGIFY(SECURE_STORAGE_ITS_UID_BIT_SIZE) " ones.", + caller_id, (unsigned long long)uid); + return PSA_ERROR_INVALID_ARGUMENT; + } +#endif /* !CONFIG_SECURE_STORAGE_64_BIT_UID */ + + *its_uid = (secure_storage_its_uid_t){.caller_id = caller_id, .uid = uid}; + return PSA_SUCCESS; +} + static void log_failed_operation(const char *operation, const char *preposition, psa_status_t ret) { LOG_ERR("Failed to %s data %s storage. (%d)", operation, preposition, ret); @@ -88,8 +115,15 @@ static bool keep_stored_entry(secure_storage_its_uid_t uid, size_t data_length, if (existing_data_len == data_length && existing_create_flags == create_flags && !memcmp(existing_data, p_data, data_length)) { - LOG_DBG("Not writing entry %u/%llu to storage because its stored data" - " (of length %zu) is identical.", uid.caller_id, uid.uid, data_length); +#ifdef CONFIG_SECURE_STORAGE_64_BIT_UID + LOG_DBG("Not writing entry %u/%#llx to storage because its stored data" + " (of length %zu) is identical.", uid.caller_id, + (unsigned long long)uid.uid, data_length); +#else + LOG_DBG("Not writing entry %u/%#lx to storage because its stored data" + " (of length %zu) is identical.", uid.caller_id, + (unsigned long)uid.uid, data_length); +#endif *ret = PSA_SUCCESS; return true; } @@ -117,12 +151,17 @@ static psa_status_t store_entry(secure_storage_its_uid_t uid, size_t data_length return ret; } -psa_status_t secure_storage_its_set(secure_storage_its_uid_t uid, size_t data_length, - const void *p_data, psa_storage_create_flags_t create_flags) +psa_status_t secure_storage_its_set(secure_storage_its_caller_id_t caller_id, psa_storage_uid_t uid, + size_t data_length, const void *p_data, + psa_storage_create_flags_t create_flags) { psa_status_t ret; + secure_storage_its_uid_t its_uid; - if (uid.uid == 0 || (p_data == NULL && data_length != 0)) { + if (make_its_uid(caller_id, uid, &its_uid) != PSA_SUCCESS) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if (p_data == NULL && data_length != 0) { return PSA_ERROR_INVALID_ARGUMENT; } if (create_flags & ~SECURE_STORAGE_ALL_CREATE_FLAGS) { @@ -134,43 +173,49 @@ psa_status_t secure_storage_its_set(secure_storage_its_uid_t uid, size_t data_le return PSA_ERROR_INSUFFICIENT_STORAGE; } - if (keep_stored_entry(uid, data_length, p_data, create_flags, &ret)) { + if (keep_stored_entry(its_uid, data_length, p_data, create_flags, &ret)) { return ret; } - ret = store_entry(uid, data_length, p_data, create_flags); + ret = store_entry(its_uid, data_length, p_data, create_flags); return ret; } - -psa_status_t secure_storage_its_get(secure_storage_its_uid_t uid, size_t data_offset, - size_t data_size, void *p_data, size_t *p_data_length) +psa_status_t secure_storage_its_get(secure_storage_its_caller_id_t caller_id, psa_storage_uid_t uid, + size_t data_offset, size_t data_size, + void *p_data, size_t *p_data_length) { - if (uid.uid == 0 || (p_data == NULL && data_size != 0) || p_data_length == NULL) { + psa_status_t ret; + secure_storage_its_uid_t its_uid; + uint8_t stored_data[SECURE_STORAGE_ITS_TRANSFORM_MAX_STORED_DATA_SIZE]; + size_t stored_data_len; + psa_storage_create_flags_t create_flags; + + if (make_its_uid(caller_id, uid, &its_uid) != PSA_SUCCESS) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if ((p_data == NULL && data_size != 0) || p_data_length == NULL) { return PSA_ERROR_INVALID_ARGUMENT; } if (data_size == 0) { *p_data_length = 0; return PSA_SUCCESS; } - psa_status_t ret; - uint8_t stored_data[SECURE_STORAGE_ITS_TRANSFORM_MAX_STORED_DATA_SIZE]; - size_t stored_data_len; - psa_storage_create_flags_t create_flags; - ret = get_stored_data(uid, stored_data, &stored_data_len); + + ret = get_stored_data(its_uid, stored_data, &stored_data_len); if (ret != PSA_SUCCESS) { return ret; } if (data_offset == 0 && data_size >= SECURE_STORAGE_ITS_TRANSFORM_DATA_SIZE(stored_data_len)) { /* All the data fits directly in the provided buffer. */ - return transform_stored_data(uid, stored_data_len, stored_data, data_size, p_data, - p_data_length, &create_flags); + return transform_stored_data(its_uid, stored_data_len, stored_data, data_size, + p_data, p_data_length, &create_flags); } uint8_t data[CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE]; size_t data_len; - ret = transform_stored_data(uid, stored_data_len, stored_data, sizeof(data), data, + ret = transform_stored_data(its_uid, stored_data_len, stored_data, sizeof(data), data, &data_len, &create_flags); if (ret == PSA_SUCCESS) { if (data_offset > data_len) { @@ -184,41 +229,47 @@ psa_status_t secure_storage_its_get(secure_storage_its_uid_t uid, size_t data_of return ret; } -psa_status_t secure_storage_its_get_info(secure_storage_its_uid_t uid, - struct psa_storage_info_t *p_info) +psa_status_t secure_storage_its_get_info(secure_storage_its_caller_id_t caller_id, + psa_storage_uid_t uid, struct psa_storage_info_t *p_info) { psa_status_t ret; + secure_storage_its_uid_t its_uid; uint8_t data[CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE]; - if (uid.uid == 0 || p_info == NULL) { + if (make_its_uid(caller_id, uid, &its_uid) != PSA_SUCCESS) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if (p_info == NULL) { return PSA_ERROR_INVALID_ARGUMENT; } - ret = get_entry(uid, sizeof(data), data, &p_info->size, &p_info->flags); + ret = get_entry(its_uid, sizeof(data), data, &p_info->size, &p_info->flags); if (ret == PSA_SUCCESS) { p_info->capacity = p_info->size; } return ret; } -psa_status_t secure_storage_its_remove(secure_storage_its_uid_t uid) +psa_status_t secure_storage_its_remove(secure_storage_its_caller_id_t caller_id, + psa_storage_uid_t uid) { psa_status_t ret; + secure_storage_its_uid_t its_uid; psa_storage_create_flags_t create_flags; uint8_t data[CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE]; size_t data_len; - if (uid.uid == 0) { + if (make_its_uid(caller_id, uid, &its_uid) != PSA_SUCCESS) { return PSA_ERROR_INVALID_ARGUMENT; } - ret = get_entry(uid, sizeof(data), data, &data_len, &create_flags); + ret = get_entry(its_uid, sizeof(data), data, &data_len, &create_flags); if (ret == PSA_SUCCESS && (create_flags & PSA_STORAGE_FLAG_WRITE_ONCE)) { return PSA_ERROR_NOT_PERMITTED; } /* Allow overwriting corrupted entries as well to not be stuck with them forever. */ if (ret == PSA_SUCCESS || ret == PSA_ERROR_STORAGE_FAILURE) { - ret = secure_storage_its_store_remove(uid); + ret = secure_storage_its_store_remove(its_uid); if (ret != PSA_SUCCESS) { log_failed_operation("remove", "from", ret); return PSA_ERROR_STORAGE_FAILURE; diff --git a/subsys/secure_storage/src/its/store/settings.c b/subsys/secure_storage/src/its/store/settings.c index 962fa516770..37973ffb024 100644 --- a/subsys/secure_storage/src/its/store/settings.c +++ b/subsys/secure_storage/src/its/store/settings.c @@ -38,9 +38,15 @@ void secure_storage_its_store_settings_get_name( { int ret; +#ifdef CONFIG_SECURE_STORAGE_64_BIT_UID ret = snprintf(name, SECURE_STORAGE_ITS_STORE_SETTINGS_NAME_BUF_SIZE, CONFIG_SECURE_STORAGE_ITS_STORE_SETTINGS_PREFIX "%x/%llx", uid.caller_id, (unsigned long long)uid.uid); +#else + ret = snprintf(name, SECURE_STORAGE_ITS_STORE_SETTINGS_NAME_BUF_SIZE, + CONFIG_SECURE_STORAGE_ITS_STORE_SETTINGS_PREFIX "%x/%lx", + uid.caller_id, (unsigned long)uid.uid); +#endif __ASSERT_NO_MSG(ret > 0 && ret < SECURE_STORAGE_ITS_STORE_SETTINGS_NAME_BUF_SIZE); } diff --git a/subsys/secure_storage/src/its/store/zms.c b/subsys/secure_storage/src/its/store/zms.c index ede296952ab..4778e0365e9 100644 --- a/subsys/secure_storage/src/its/store/zms.c +++ b/subsys/secure_storage/src/its/store/zms.c @@ -33,26 +33,26 @@ static int init_zms(void) } SYS_INIT(init_zms, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); +#ifdef CONFIG_SECURE_STORAGE_64_BIT_UID + /* Bit position of the ITS caller ID in the ZMS entry ID. */ #define ITS_CALLER_ID_POS 30 /* Make sure that every ITS caller ID fits in ZMS entry IDs at the defined position. */ BUILD_ASSERT(1 << (32 - ITS_CALLER_ID_POS) >= SECURE_STORAGE_ITS_CALLER_COUNT); -static bool has_forbidden_bits_set(secure_storage_its_uid_t uid) +static uint32_t zms_id_from(secure_storage_its_uid_t uid) { - if (uid.uid & GENMASK64(63, ITS_CALLER_ID_POS)) { - LOG_DBG("UID %u/0x%llx cannot be used as it has bits set past " - "the first " STRINGIFY(ITS_CALLER_ID_POS) " ones.", - uid.caller_id, (unsigned long long)uid.uid); - return true; - } - return false; + __ASSERT_NO_MSG(!(uid.uid & GENMASK64(63, ITS_CALLER_ID_POS))); + return (uint32_t)uid.uid | (uid.caller_id << ITS_CALLER_ID_POS); } +#else static uint32_t zms_id_from(secure_storage_its_uid_t uid) { - return (uint32_t)uid.uid | (uid.caller_id << ITS_CALLER_ID_POS); + BUILD_ASSERT(sizeof(uid) == sizeof(uint32_t)); + return *(uint32_t *)&uid; } +#endif /* CONFIG_SECURE_STORAGE_64_BIT_UID */ psa_status_t secure_storage_its_store_set(secure_storage_its_uid_t uid, size_t data_length, const void *data) @@ -61,10 +61,6 @@ psa_status_t secure_storage_its_store_set(secure_storage_its_uid_t uid, ssize_t zms_ret; const uint32_t zms_id = zms_id_from(uid); - if (has_forbidden_bits_set(uid)) { - return PSA_ERROR_INVALID_ARGUMENT; - } - zms_ret = zms_write(&s_zms, zms_id, data, data_length); if (zms_ret == data_length) { psa_ret = PSA_SUCCESS; @@ -73,7 +69,7 @@ psa_status_t secure_storage_its_store_set(secure_storage_its_uid_t uid, } else { psa_ret = PSA_ERROR_STORAGE_FAILURE; } - LOG_DBG("%s 0x%x with %zu bytes. (%zd)", (psa_ret == PSA_SUCCESS) ? + LOG_DBG("%s %#x with %zu bytes. (%zd)", (psa_ret == PSA_SUCCESS) ? "Wrote" : "Failed to write", zms_id, data_length, zms_ret); return psa_ret; } @@ -85,10 +81,6 @@ psa_status_t secure_storage_its_store_get(secure_storage_its_uid_t uid, size_t d ssize_t zms_ret; const uint32_t zms_id = zms_id_from(uid); - if (has_forbidden_bits_set(uid)) { - return PSA_ERROR_INVALID_ARGUMENT; - } - zms_ret = zms_read(&s_zms, zms_id, data, data_size); if (zms_ret > 0) { *data_length = zms_ret; @@ -98,7 +90,7 @@ psa_status_t secure_storage_its_store_get(secure_storage_its_uid_t uid, size_t d } else { psa_ret = PSA_ERROR_STORAGE_FAILURE; } - LOG_DBG("%s 0x%x for up to %zu bytes. (%zd)", (psa_ret != PSA_ERROR_STORAGE_FAILURE) ? + LOG_DBG("%s %#x for up to %zu bytes. (%zd)", (psa_ret != PSA_ERROR_STORAGE_FAILURE) ? "Read" : "Failed to read", zms_id, data_size, zms_ret); return psa_ret; } @@ -108,12 +100,8 @@ psa_status_t secure_storage_its_store_remove(secure_storage_its_uid_t uid) int ret; const uint32_t zms_id = zms_id_from(uid); - if (has_forbidden_bits_set(uid)) { - return PSA_ERROR_INVALID_ARGUMENT; - } - ret = zms_delete(&s_zms, zms_id); - LOG_DBG("%s 0x%x. (%d)", ret ? "Failed to delete" : "Deleted", zms_id, ret); + LOG_DBG("%s %#x. (%d)", ret ? "Failed to delete" : "Deleted", zms_id, ret); return ret ? PSA_ERROR_STORAGE_FAILURE : PSA_SUCCESS; } diff --git a/tests/subsys/secure_storage/psa/crypto/testcase.yaml b/tests/subsys/secure_storage/psa/crypto/testcase.yaml index 8755a5a1935..1482d23cb6c 100644 --- a/tests/subsys/secure_storage/psa/crypto/testcase.yaml +++ b/tests/subsys/secure_storage/psa/crypto/testcase.yaml @@ -8,7 +8,6 @@ tests: integration_platforms: - native_sim - nrf54l15dk/nrf54l15/cpuapp - - ophelia4ev/nrf54l15/cpuapp secure_storage.psa.crypto.tfm: filter: CONFIG_BUILD_WITH_TFM extra_args: EXTRA_CONF_FILE=overlay-tfm.conf diff --git a/tests/subsys/secure_storage/psa/its/overlay-store_zms.conf b/tests/subsys/secure_storage/psa/its/overlay-store_zms.conf index 7efe611bc0a..6c36dd40297 100644 --- a/tests/subsys/secure_storage/psa/its/overlay-store_zms.conf +++ b/tests/subsys/secure_storage/psa/its/overlay-store_zms.conf @@ -1,3 +1,4 @@ CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_ZMS=y CONFIG_ZMS=y CONFIG_FLASH=y +CONFIG_FLASH_MAP=y diff --git a/tests/subsys/secure_storage/psa/its/testcase.yaml b/tests/subsys/secure_storage/psa/its/testcase.yaml index 74bcec13586..0125b9d1e21 100644 --- a/tests/subsys/secure_storage/psa/its/testcase.yaml +++ b/tests/subsys/secure_storage/psa/its/testcase.yaml @@ -2,7 +2,6 @@ common: integration_platforms: - native_sim - nrf54l15dk/nrf54l15/cpuapp - - ophelia4ev/nrf54l15/cpuapp platform_exclude: - qemu_cortex_m0 # settings subsystem initialization fails timeout: 600 @@ -10,10 +9,9 @@ common: - psa.secure_storage tests: secure_storage.psa.its.secure_storage.store.zms: - filter: CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_ZMS # DT-based filtering is not possible for this test scenario. # Platforms with a storage_partition must be manually added here. - platform_allow: + platform_allow: &zms_platform_allow - native_sim - mps2/an385 - qemu_x86/atom @@ -25,15 +23,30 @@ tests: - nrf9160dk/nrf9160 - nrf9161dk/nrf9161 - ophelia4ev/nrf54l15/cpuapp - extra_args: + extra_args: &zms_extra_args - EXTRA_DTC_OVERLAY_FILE=zms.overlay - - EXTRA_CONF_FILE=overlay-secure_storage.conf;overlay-store_zms.conf;overlay-transform_default.conf + - EXTRA_CONF_FILE=\ + overlay-secure_storage.conf;overlay-store_zms.conf;overlay-transform_default.conf - SB_CONFIG_PARTITION_MANAGER=n + secure_storage.psa.its.secure_storage.store.zms.64-bit_uids: + platform_allow: *zms_platform_allow + extra_args: *zms_extra_args + extra_configs: + - CONFIG_SECURE_STORAGE_64_BIT_UID=y + secure_storage.psa.its.secure_storage.store.settings: - filter: CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_SETTINGS - extra_args: "EXTRA_CONF_FILE=\ - overlay-secure_storage.conf;overlay-transform_default.conf;overlay-store_settings.conf" + filter: &settings_filter + CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_SETTINGS + extra_args: &settings_extra_args + "EXTRA_CONF_FILE=\ + overlay-secure_storage.conf;overlay-transform_default.conf;overlay-store_settings.conf" + + secure_storage.psa.its.secure_storage.store.settings.64-bit_uids: + filter: *settings_filter + extra_args: *settings_extra_args + extra_configs: + - CONFIG_SECURE_STORAGE_64_BIT_UID=y secure_storage.psa.its.secure_storage.custom.transform: filter: CONFIG_SECURE_STORAGE and not CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_NONE