12 #include "cmsis_compiler.h"
14 #include "flash_layout.h"
22 #define PS_FLASH_DEFAULT_VAL 0xFFU
29 #define PS_OBJECT_SYSTEM_VERSION 0x01
50 #define PS_OBJ_TABLE_ENTRIES (PS_NUM_ASSETS + 1)
64 #ifndef PS_ROLLBACK_PROTECTION
76 #define PS_OBJ_TABLE_IDX_0 0
77 #define PS_OBJ_TABLE_IDX_1 1
80 #define PS_NUM_OBJ_TABLES 2
93 #define PS_TABLE_FS_ID(idx) (idx + 1)
105 #define PS_OBJECT_FS_ID(idx) ((idx + 1) + \
106 PS_TABLE_FS_ID(PS_OBJ_TABLE_IDX_1))
117 #define PS_OBJECT_FS_ID_TO_IDX(fid) ((fid - 1) - \
118 PS_TABLE_FS_ID(PS_OBJ_TABLE_IDX_1))
135 #define PS_OBJ_TABLE_SIZE sizeof(struct ps_obj_table_t)
138 #define PS_OBJECTS_TABLE_ENTRY_SIZE sizeof(struct ps_obj_table_entry_t)
141 #define PS_NON_AUTH_OBJ_TABLE_SIZE sizeof(union ps_crypto_t)
144 #define PS_OBJECT_TABLE_OBJECT_OFFSET 0
147 #define PS_CRYPTO_ASSOCIATED_DATA(crypto) ((uint8_t *)crypto + \
148 PS_NON_AUTH_OBJ_TABLE_SIZE)
150 #ifdef PS_ROLLBACK_PROTECTION
151 #define PS_OBJ_TABLE_AUTH_DATA_SIZE (PS_OBJ_TABLE_SIZE - \
152 PS_NON_AUTH_OBJ_TABLE_SIZE)
154 struct ps_crypto_assoc_data_t {
155 uint8_t obj_table_data[PS_OBJ_TABLE_AUTH_DATA_SIZE];
159 #define PS_CRYPTO_ASSOCIATED_DATA_LEN sizeof(struct ps_crypto_assoc_data_t)
164 #define PS_CRYPTO_ASSOCIATED_DATA_LEN (PS_OBJ_TABLE_SIZE - \
165 PS_NON_AUTH_OBJ_TABLE_SIZE)
188 #define PS_INVALID_NVC_VALUE 0
205 #ifdef PS_ROLLBACK_PROTECTION
217 __attribute__ ((always_inline))
254 __attribute__ ((always_inline))
265 (
const void *)obj_table,
280 #ifdef PS_ROLLBACK_PROTECTION
288 static psa_status_t ps_object_table_align_nv_counters(uint32_t nvc_1)
291 uint32_t nvc_x_val = 0;
299 for (; nvc_x_val < nvc_1; nvc_x_val++) {
312 for (; nvc_x_val < nvc_1; nvc_x_val++) {
331 __attribute__ ((always_inline))
332 __STATIC_INLINE
psa_status_t ps_object_table_nvc_generate_auth_tag(
336 struct ps_crypto_assoc_data_t assoc_data;
342 assoc_data.nv_counter = nvc_1;
345 PS_OBJ_TABLE_AUTH_DATA_SIZE);
358 static void ps_object_table_authenticate(uint8_t table_idx,
361 struct ps_crypto_assoc_data_t assoc_data;
366 assoc_data.nv_counter = init_ctx->nvc_1;
369 PS_OBJ_TABLE_AUTH_DATA_SIZE);
384 assoc_data.nv_counter = init_ctx->nvc_3;
402 __attribute__ ((always_inline))
403 __STATIC_INLINE
psa_status_t ps_object_table_nvc_authenticate(
425 if (init_ctx->nvc_3 != nvc_2) {
457 __attribute__ ((always_inline))
458 __STATIC_INLINE
psa_status_t ps_object_table_generate_auth_tag(
477 __attribute__ ((always_inline))
478 __STATIC_INLINE
void ps_object_table_authenticate_ctx_tables(
522 #ifdef PS_ROLLBACK_PROTECTION
555 #ifdef PS_ROLLBACK_PROTECTION
559 err = ps_object_table_nvc_generate_auth_tag(nvc_1, obj_table);
562 err = ps_object_table_generate_auth_tag(obj_table);
578 #ifdef PS_ROLLBACK_PROTECTION
584 err = ps_object_table_align_nv_counters(nvc_1);
596 __attribute__ ((always_inline))
625 #ifndef PS_ROLLBACK_PROTECTION
626 uint8_t table0_swap_count =
628 uint8_t table1_swap_count =
665 #ifdef PS_ROLLBACK_PROTECTION
685 if ((table1_swap_count == 0) && (table0_swap_count != 1)) {
692 }
else if ((table0_swap_count == 0) && (table1_swap_count != 1)) {
699 }
else if (table1_swap_count > table0_swap_count) {
769 __attribute__ ((always_inline))
774 uint32_t last_free = 0;
781 for (i = 0; i < PS_OBJ_TABLE_ENTRIES && idx_num > 0; i++) {
802 static void ps_table_delete_entry(uint32_t idx)
826 return ps_object_table_save_table(p_table);
835 #ifdef PS_ROLLBACK_PROTECTION
853 #ifdef PS_ROLLBACK_PROTECTION
855 err = ps_object_table_nvc_authenticate(&init_ctx);
861 ps_object_table_authenticate_ctx_tables(&init_ctx);
874 err = ps_set_active_object_table(&init_ctx);
885 #ifdef PS_ROLLBACK_PROTECTION
887 err = ps_object_table_align_nv_counters(init_ctx.nvc_1);
905 return ps_get_object_entry_idx(uid, client_id, &idx);
945 uint32_t backup_idx = 0;
957 err = ps_get_object_entry_idx(uid, client_id, &backup_idx);
966 ps_table_delete_entry(backup_idx);
981 err = ps_object_table_save_table(p_table);
989 ps_table_delete_entry(idx);
1003 err = ps_get_object_entry_idx(uid, client_id, &idx);
1010 #ifdef PS_ENCRYPTION
1023 uint32_t backup_idx = 0;
1031 err = ps_get_object_entry_idx(uid, client_id, &backup_idx);
1044 ps_table_delete_entry(backup_idx);
1046 err = ps_object_table_save_table(p_table);
#define PS_OBJ_TABLE_IDX_0
void ps_crypto_set_iv(const union ps_crypto_t *crypto)
Provides current IV value to crypto layer.
#define PS_OBJ_TABLE_SIZE
enum ps_obj_table_state table_state[2]
psa_status_t ps_increment_nv_counter(enum tfm_nv_counter_t counter_id)
Increments the given non-volatile (NV) counter.
psa_status_t ps_object_table_init(uint8_t *obj_data)
Initializes object table.
__STATIC_INLINE void * tfm_memset(void *ptr, int value, size_t num)
__STATIC_INLINE void ps_object_table_validate_version(struct ps_obj_table_init_ctx_t *init_ctx)
Checks the validity of the table version.
#define PS_CRYPTO_ASSOCIATED_DATA(crypto)
struct ps_obj_table_t obj_table
psa_status_t ps_crypto_setkey(void)
Sets the key to use for crypto operations for the current client.
struct ps_obj_table_entry_t obj_db[(PS_NUM_ASSETS+1)]
#define PS_FLASH_DEFAULT_VAL
#define PS_TABLE_FS_ID(idx)
File ID to be used in order to store the object table in the file system.
#define PS_OBJ_TABLE_ENTRIES
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)
Retrieve data associated with a provided UID.
psa_status_t psa_its_remove(psa_storage_uid_t uid)
Remove the provided uid and its associated data from the storage.
psa_status_t ps_object_table_delete_object(psa_storage_uid_t uid, int32_t client_id)
Deletes the table entry for the provided UID and client ID pair.
#define PSA_ERROR_INSUFFICIENT_STORAGE
#define PS_CRYPTO_ASSOCIATED_DATA_LEN
#define PS_NUM_OBJ_TABLES
psa_status_t ps_read_nv_counter(enum tfm_nv_counter_t counter_id, uint32_t *val)
Reads the given non-volatile (NV) counter.
#define TFM_PS_NV_COUNTER_1
psa_status_t ps_object_table_delete_old_table(void)
Deletes old object table from the persistent area.
#define PSA_ERROR_GENERIC_ERROR
#define PSA_ERROR_INVALID_ARGUMENT
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)
Create a new, or modify an existing, uid/value pair.
__STATIC_INLINE void ps_object_table_fs_read_table(struct ps_obj_table_init_ctx_t *init_ctx)
Reads object table from persistent memory.
#define TFM_PS_NV_COUNTER_3
#define PS_OBJECT_TABLE_OBJECT_OFFSET
#define PS_INVALID_NVC_VALUE
psa_status_t ps_crypto_generate_auth_tag(union ps_crypto_t *crypto, const uint8_t *add, uint32_t add_len)
Generates authentication tag for given data.
__STATIC_INLINE psa_status_t ps_object_table_fs_write_table(struct ps_obj_table_t *obj_table)
Writes object table in persistent memory.
Object table context structure.
char OBJ_TABLE_NOT_FIT_IN_STATIC_OBJ_DATA_BUF[(sizeof(struct ps_obj_table_t)<=PS_MAX_ASSET_SIZE)*2-1]
psa_status_t ps_object_table_obj_exist(psa_storage_uid_t uid, int32_t client_id)
Checks if there is an entry in the table for the provided UID and client ID pair. ...
psa_status_t ps_crypto_authenticate(const union ps_crypto_t *crypto, const uint8_t *add, uint32_t add_len)
Authenticate given data against the tag.
psa_status_t ps_object_table_get_obj_tbl_info(psa_storage_uid_t uid, int32_t client_id, struct ps_obj_table_info_t *obj_tbl_info)
Gets object table information from the object table for the provided UID and client ID pair...
#define PS_OBJ_TABLE_IDX_1
struct ps_obj_table_t * p_table[2]
#define PS_UTILS_BOUND_CHECK(err_msg, data_size, data_buf_size)
Macro to check, at compilation time, if data fits in data buffer.
__STATIC_INLINE void * tfm_memcpy(void *dest, const void *src, size_t num)
psa_status_t ps_object_table_get_free_fid(uint32_t fid_num, uint32_t *p_fid)
Gets a not in use file ID.
uint64_t psa_storage_uid_t
psa_status_t ps_crypto_destroykey(void)
Destroys the transient key used for crypto operations.
#define PS_OBJECT_FS_ID_TO_IDX(fid)
Gets object index in the table based on the file ID.
#define PS_OBJECT_SYSTEM_VERSION
Current object system version.
void ps_crypto_get_iv(union ps_crypto_t *crypto)
Gets a new IV value into the crypto union.
#define TFM_PS_INVALID_UID
#define TFM_PS_NV_COUNTER_2
#define PSA_STORAGE_FLAG_NONE
__STATIC_INLINE psa_status_t ps_table_free_idx(uint32_t idx_num, uint32_t *idx)
Gets free index in the table.
#define PSA_ERROR_DOES_NOT_EXIST
psa_status_t ps_object_table_create(void)
Creates object table.
int32_t psa_status_t
Function return status.
#define PS_OBJECT_FS_ID(idx)
File ID to be used in order to store an object in the file system.
psa_status_t ps_object_table_set_obj_tbl_info(psa_storage_uid_t uid, int32_t client_id, const struct ps_obj_table_info_t *obj_tbl_info)
Sets object table information in the object table and stores it persistently, for the provided UID an...
#define PS_OBJECTS_TABLE_ENTRY_SIZE
Object table information structure.
#define PS_DEFAULT_EMPTY_BUFF_VAL