Skip to content

Commit 5991b9c

Browse files
author
David Saada
committed
PSA storage: Implement additional flags, change ints to size_t
1 parent 9974899 commit 5991b9c

File tree

10 files changed

+57
-31
lines changed

10 files changed

+57
-31
lines changed

components/TARGET_PSA/inc/psa/protected_storage.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ extern "C" {
5454
* \retval PSA_ERROR_GENERIC_ERROR The operation failed because of an unspecified internal failure
5555
*/
5656
psa_status_t psa_ps_set(psa_storage_uid_t uid,
57-
uint32_t data_length,
57+
size_t data_length,
5858
const void *p_data,
5959
psa_storage_create_flags_t create_flags);
6060

@@ -78,8 +78,8 @@ psa_status_t psa_ps_set(psa_storage_uid_t uid,
7878
* \retval PSA_ERROR_INVALID_SIGNATURE The operation failed because the data associated with the UID failed authentication
7979
*/
8080
psa_status_t psa_ps_get(psa_storage_uid_t uid,
81-
uint32_t data_offset,
82-
uint32_t data_length,
81+
size_t data_offset,
82+
size_t data_length,
8383
void *p_data);
8484

8585
/**
@@ -149,7 +149,7 @@ psa_status_t psa_ps_remove(psa_storage_uid_t uid);
149149
* \retval PSA_ERROR_GENERIC_ERROR The operation has failed due to an unspecified error
150150
*/
151151
psa_status_t psa_ps_create(psa_storage_uid_t uid,
152-
uint32_t size,
152+
size_t size,
153153
psa_storage_create_flags_t create_flags);
154154

155155
/**
@@ -179,8 +179,8 @@ psa_status_t psa_ps_create(psa_storage_uid_t uid,
179179
* \retval PSA_ERROR_INVALID_SIGNATURE The operation failed because the existing data failed authentication (MAC check failed)
180180
*/
181181
psa_status_t psa_ps_set_extended(psa_storage_uid_t uid,
182-
uint32_t data_offset,
183-
uint32_t data_length,
182+
size_t data_offset,
183+
size_t data_length,
184184
const void *p_data);
185185

186186
/**

components/TARGET_PSA/inc/psa/storage_common.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ extern "C" {
3333
*/
3434
typedef uint32_t psa_storage_create_flags_t;
3535

36-
#define PSA_STORAGE_FLAG_NONE 0 /**< No flags to pass */
37-
#define PSA_STORAGE_FLAG_WRITE_ONCE (1 << 0) /**< The data associated with the uid will not be able to be modified or deleted. Intended to be used to set bits in `psa_storage_create_flags_t`*/
36+
#define PSA_STORAGE_FLAG_NONE 0 /**< No flags to pass */
37+
#define PSA_STORAGE_FLAG_WRITE_ONCE (1 << 0) /**< The data associated with the uid will not be able to be modified or deleted. Intended to be used to set bits in `psa_storage_create_flags_t`*/
38+
#define PSA_STORAGE_FLAG_NO_CONFIDENTIALITY (1 << 1) /**< The data associated with the uid is public and therefore does not require confidentiality. It therefore only needs to be integrity protected */
39+
#define PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION (1 << 2) /**< The data associated with the uid does not require replay protection. This may permit faster storage - but it permits an attecker with physical access to revert to an earlier version of the data. */
3840

3941
/** \brief A type for UIDs used for identifying data
4042
*/
@@ -44,7 +46,8 @@ typedef uint64_t psa_storage_uid_t;
4446
* \brief A container for metadata associated with a specific uid
4547
*/
4648
struct psa_storage_info_t {
47-
uint32_t size; /**< The size of the data associated with a uid **/
49+
size_t capacity; /**< The allocated capacity of the storage associated with a UID **/
50+
size_t size; /**< The size of the data associated with a uid **/
4851
psa_storage_create_flags_t flags; /**< The flags set when the uid was created **/
4952
};
5053

components/TARGET_PSA/services/storage/common/psa_storage_common_impl.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ static void generate_fn(char *tdb_filename, uint32_t tdb_filename_size, psa_stor
184184
}
185185

186186
psa_status_t psa_storage_set_impl(KVStore *kvstore, int32_t pid, psa_storage_uid_t uid,
187-
uint32_t data_length, const void *p_data,
187+
size_t data_length, const void *p_data,
188188
uint32_t kv_create_flags)
189189
{
190190
if (uid == 0) {
@@ -200,7 +200,7 @@ psa_status_t psa_storage_set_impl(KVStore *kvstore, int32_t pid, psa_storage_uid
200200
}
201201

202202
psa_status_t psa_storage_get_impl(KVStore *kvstore, int32_t pid, psa_storage_uid_t uid,
203-
uint32_t data_offset, uint32_t data_length, void *p_data)
203+
size_t data_offset, size_t data_length, void *p_data)
204204
{
205205
if (uid == 0) {
206206
return PSA_ERROR_INVALID_ARGUMENT;
@@ -238,7 +238,7 @@ psa_status_t psa_storage_get_impl(KVStore *kvstore, int32_t pid, psa_storage_uid
238238
}
239239

240240
psa_status_t psa_storage_get_info_impl(KVStore *kvstore, int32_t pid, psa_storage_uid_t uid,
241-
struct psa_storage_info_t *p_info)
241+
struct psa_storage_info_t *p_info, uint32_t *kv_get_flags)
242242
{
243243

244244
if (uid == 0) {
@@ -257,7 +257,9 @@ psa_status_t psa_storage_get_info_impl(KVStore *kvstore, int32_t pid, psa_storag
257257
if (kv_info.flags & KVStore::WRITE_ONCE_FLAG) {
258258
p_info->flags |= PSA_STORAGE_FLAG_WRITE_ONCE;
259259
}
260-
p_info->size = (uint32_t)(kv_info.size); // kv_info.size is of type size_t
260+
*kv_get_flags = kv_info.flags;
261+
p_info->size = kv_info.size;
262+
p_info->capacity = kv_info.size;
261263
}
262264

263265
return convert_status(status);

components/TARGET_PSA/services/storage/common/psa_storage_common_impl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ typedef psa_status_t (*migrate_func_t)(mbed::KVStore *kvstore, const psa_storage
3636

3737
void psa_storage_handle_version(mbed::KVStore *kvstore, const char *version_key, const psa_storage_version_t *version,
3838
migrate_func_t migrate_func);
39-
psa_status_t psa_storage_set_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, uint32_t data_length, const void *p_data, uint32_t kv_create_flags);
40-
psa_status_t psa_storage_get_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data);
41-
psa_status_t psa_storage_get_info_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info);
39+
psa_status_t psa_storage_set_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, size_t data_length, const void *p_data, uint32_t kv_create_flags);
40+
psa_status_t psa_storage_get_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data);
41+
psa_status_t psa_storage_get_info_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info, uint32_t *kv_get_flags);
4242
psa_status_t psa_storage_remove_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid);
4343
psa_status_t psa_storage_reset_impl(mbed::KVStore *kvstore);
4444

components/TARGET_PSA/services/storage/its/COMPONENT_PSA_SRV_EMUL/psa_prot_internal_storage.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
// So here we set a global pid value to be used for when calling IMPL functions
2929
#define PSA_ITS_EMUL_PID 1
3030

31-
psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
31+
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)
3232
{
3333
if (!p_data && data_length) {
3434
return PSA_ERROR_INVALID_ARGUMENT;
@@ -47,7 +47,7 @@ psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void
4747
return res;
4848
}
4949

50-
psa_status_t psa_its_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
50+
psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
5151
{
5252
if (!p_data && data_length) {
5353
return PSA_ERROR_INVALID_ARGUMENT;

components/TARGET_PSA/services/storage/its/COMPONENT_PSA_SRV_IMPL/pits_impl.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void its_deinit(void)
8181
}
8282

8383

84-
psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
84+
psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
8585
{
8686
if (!kvstore) {
8787
its_init();
@@ -94,7 +94,7 @@ psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_
9494
return psa_storage_set_impl(kvstore, pid, uid, data_length, p_data, create_flags);
9595
}
9696

97-
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
97+
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
9898
{
9999
if (!kvstore) {
100100
its_init();
@@ -105,11 +105,12 @@ psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_
105105

106106
psa_status_t psa_its_get_info_impl(int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info)
107107
{
108+
uint32_t kv_get_flags;
108109
if (!kvstore) {
109110
its_init();
110111
}
111112

112-
return psa_storage_get_info_impl(kvstore, pid, uid, p_info);
113+
return psa_storage_get_info_impl(kvstore, pid, uid, p_info, &kv_get_flags);
113114
}
114115

115116
psa_status_t psa_its_remove_impl(int32_t pid, psa_storage_uid_t uid)

components/TARGET_PSA/services/storage/its/COMPONENT_PSA_SRV_IMPL/pits_impl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ extern "C"
2626
{
2727
#endif
2828

29-
psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags);
30-
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data);
29+
psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags);
30+
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data);
3131
psa_status_t psa_its_get_info_impl(int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info);
3232
psa_status_t psa_its_remove_impl(int32_t pid, psa_storage_uid_t uid);
3333
psa_status_t psa_its_reset_impl();

components/TARGET_PSA/services/storage/its/COMPONENT_PSA_SRV_IPC/psa_prot_internal_storage.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "psa/internal_trusted_storage.h"
2121
#include "psa_manifest/sid.h"
2222

23-
psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
23+
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)
2424
{
2525
if (!p_data && data_length) {
2626
return PSA_ERROR_INVALID_ARGUMENT;
@@ -46,7 +46,7 @@ psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void
4646
return status;
4747
}
4848

49-
psa_status_t psa_its_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
49+
psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
5050
{
5151
if (!p_data && data_length) {
5252
return PSA_ERROR_INVALID_ARGUMENT;

components/TARGET_PSA/services/storage/its/psa_prot_internal_storage.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ MBED_DEPRECATED("PS specific types should not be used")
9797
* is invalid, for example is `NULL` or references memory the caller cannot access
9898
*/
9999
psa_status_t psa_its_set(psa_storage_uid_t uid,
100-
uint32_t data_length,
100+
size_t data_length,
101101
const void *p_data,
102102
psa_storage_create_flags_t create_flags);
103103

@@ -120,8 +120,8 @@ psa_status_t psa_its_set(psa_storage_uid_t uid,
120120
* is invalid. For example is `NULL` or references memory the caller cannot access
121121
*/
122122
psa_status_t psa_its_get(psa_storage_uid_t uid,
123-
uint32_t data_offset,
124-
uint32_t data_length,
123+
size_t data_offset,
124+
size_t data_length,
125125
void *p_data);
126126

127127
/**

components/TARGET_PSA/services/storage/ps/COMPONENT_NSPE/protected_storage.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ void ps_deinit(void)
8484
}
8585

8686

87-
psa_status_t psa_ps_set(psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
87+
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)
8888
{
8989
if (!kvstore) {
9090
ps_init();
@@ -95,14 +95,20 @@ psa_status_t psa_ps_set(psa_storage_uid_t uid, uint32_t data_length, const void
9595
}
9696

9797
uint32_t kv_create_flags = def_kvstore_flags;
98+
if (create_flags & PSA_STORAGE_FLAG_NO_CONFIDENTIALITY) {
99+
kv_create_flags &= ~KVStore::REQUIRE_CONFIDENTIALITY_FLAG;
100+
}
101+
if (create_flags & PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION) {
102+
kv_create_flags &= ~KVStore::REQUIRE_REPLAY_PROTECTION_FLAG;
103+
}
98104
if (create_flags & PSA_STORAGE_FLAG_WRITE_ONCE) {
99105
kv_create_flags |= KVStore::WRITE_ONCE_FLAG;
100106
}
101107

102108
return psa_storage_set_impl(kvstore, PSA_PS_GLOBAL_PID, uid, data_length, p_data, kv_create_flags);
103109
}
104110

105-
psa_status_t psa_ps_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
111+
psa_status_t psa_ps_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
106112
{
107113
if (!kvstore) {
108114
ps_init();
@@ -113,11 +119,25 @@ psa_status_t psa_ps_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t da
113119

114120
psa_status_t psa_ps_get_info(psa_storage_uid_t uid, struct psa_storage_info_t *p_info)
115121
{
122+
psa_status_t ret;
123+
uint32_t kv_get_flags;
124+
116125
if (!kvstore) {
117126
ps_init();
118127
}
119128

120-
return psa_storage_get_info_impl(kvstore, PSA_PS_GLOBAL_PID, uid, p_info);
129+
ret = psa_storage_get_info_impl(kvstore, PSA_PS_GLOBAL_PID, uid, p_info, &kv_get_flags);
130+
131+
// In case we're on external storage, need to add some logics in order to remove missing flags
132+
if (def_kvstore_flags) {
133+
if ((kv_get_flags & ~KVStore::REQUIRE_CONFIDENTIALITY_FLAG) == kv_get_flags) {
134+
p_info->flags |= PSA_STORAGE_FLAG_NO_CONFIDENTIALITY;
135+
}
136+
if ((kv_get_flags & ~KVStore::REQUIRE_REPLAY_PROTECTION_FLAG) == kv_get_flags) {
137+
p_info->flags |= PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION;
138+
}
139+
}
140+
return ret;
121141
}
122142

123143
psa_status_t psa_ps_remove(psa_storage_uid_t uid)

0 commit comments

Comments
 (0)