11
11
12
12
LOG_MODULE_DECLARE (secure_storage , CONFIG_SECURE_STORAGE_LOG_LEVEL );
13
13
14
+ #ifndef CONFIG_SECURE_STORAGE_64_BIT_UID
15
+ BUILD_ASSERT (sizeof (secure_storage_its_uid_t ) == 4 ); /* ITS UIDs are 32-bit */
16
+ BUILD_ASSERT (1 << SECURE_STORAGE_ITS_CALLER_ID_BIT_SIZE >= SECURE_STORAGE_ITS_CALLER_COUNT );
17
+ BUILD_ASSERT (SECURE_STORAGE_ITS_CALLER_ID_BIT_SIZE + SECURE_STORAGE_ITS_UID_BIT_SIZE == 32 );
18
+ #endif
19
+
20
+ static psa_status_t make_its_uid (secure_storage_its_caller_id_t caller_id , psa_storage_uid_t uid ,
21
+ secure_storage_its_uid_t * its_uid )
22
+ {
23
+ if (uid == 0 ) {
24
+ return PSA_ERROR_INVALID_ARGUMENT ;
25
+ }
26
+
27
+ #ifndef CONFIG_SECURE_STORAGE_64_BIT_UID
28
+ /* Check that the UID is not bigger than the maximum defined size. */
29
+ if (uid & GENMASK64 (63 , SECURE_STORAGE_ITS_UID_BIT_SIZE )) {
30
+ LOG_DBG ("UID %u/0x%llx cannot be used as it has bits set past "
31
+ "the first " STRINGIFY (SECURE_STORAGE_ITS_UID_BIT_SIZE ) " ones." ,
32
+ caller_id , (unsigned long long )uid );
33
+ return PSA_ERROR_INVALID_ARGUMENT ;
34
+ }
35
+ #endif /* !CONFIG_SECURE_STORAGE_64_BIT_UID */
36
+
37
+ * its_uid = (secure_storage_its_uid_t ){.caller_id = caller_id , .uid = uid };
38
+ return PSA_SUCCESS ;
39
+ }
40
+
14
41
static void log_failed_operation (const char * operation , const char * preposition , psa_status_t ret )
15
42
{
16
43
LOG_ERR ("Failed to %s data %s storage. (%d)" , operation , preposition , ret );
@@ -117,12 +144,17 @@ static psa_status_t store_entry(secure_storage_its_uid_t uid, size_t data_length
117
144
return ret ;
118
145
}
119
146
120
- psa_status_t secure_storage_its_set (secure_storage_its_uid_t uid , size_t data_length ,
121
- const void * p_data , psa_storage_create_flags_t create_flags )
147
+ psa_status_t secure_storage_its_set (secure_storage_its_caller_id_t caller_id , psa_storage_uid_t uid ,
148
+ size_t data_length , const void * p_data ,
149
+ psa_storage_create_flags_t create_flags )
122
150
{
123
151
psa_status_t ret ;
152
+ secure_storage_its_uid_t its_uid ;
124
153
125
- if (uid .uid == 0 || (p_data == NULL && data_length != 0 )) {
154
+ if (make_its_uid (caller_id , uid , & its_uid ) != PSA_SUCCESS ) {
155
+ return PSA_ERROR_INVALID_ARGUMENT ;
156
+ }
157
+ if (p_data == NULL && data_length != 0 ) {
126
158
return PSA_ERROR_INVALID_ARGUMENT ;
127
159
}
128
160
if (create_flags & ~SECURE_STORAGE_ALL_CREATE_FLAGS ) {
@@ -134,43 +166,49 @@ psa_status_t secure_storage_its_set(secure_storage_its_uid_t uid, size_t data_le
134
166
return PSA_ERROR_INSUFFICIENT_STORAGE ;
135
167
}
136
168
137
- if (keep_stored_entry (uid , data_length , p_data , create_flags , & ret )) {
169
+ if (keep_stored_entry (its_uid , data_length , p_data , create_flags , & ret )) {
138
170
return ret ;
139
171
}
140
172
141
- ret = store_entry (uid , data_length , p_data , create_flags );
173
+ ret = store_entry (its_uid , data_length , p_data , create_flags );
142
174
return ret ;
143
175
}
144
-
145
- psa_status_t secure_storage_its_get ( secure_storage_its_uid_t uid , size_t data_offset ,
146
- size_t data_size , void * p_data , size_t * p_data_length )
176
+ psa_status_t secure_storage_its_get ( secure_storage_its_caller_id_t caller_id , psa_storage_uid_t uid ,
177
+ size_t data_offset , size_t data_size ,
178
+ void * p_data , size_t * p_data_length )
147
179
{
148
- if (uid .uid == 0 || (p_data == NULL && data_size != 0 ) || p_data_length == NULL ) {
180
+ psa_status_t ret ;
181
+ secure_storage_its_uid_t its_uid ;
182
+ uint8_t stored_data [SECURE_STORAGE_ITS_TRANSFORM_MAX_STORED_DATA_SIZE ];
183
+ size_t stored_data_len ;
184
+ psa_storage_create_flags_t create_flags ;
185
+
186
+ if (make_its_uid (caller_id , uid , & its_uid ) != PSA_SUCCESS ) {
187
+ return PSA_ERROR_INVALID_ARGUMENT ;
188
+ }
189
+ if ((p_data == NULL && data_size != 0 ) || p_data_length == NULL ) {
149
190
return PSA_ERROR_INVALID_ARGUMENT ;
150
191
}
151
192
if (data_size == 0 ) {
152
193
* p_data_length = 0 ;
153
194
return PSA_SUCCESS ;
154
195
}
155
- psa_status_t ret ;
156
- uint8_t stored_data [SECURE_STORAGE_ITS_TRANSFORM_MAX_STORED_DATA_SIZE ];
157
- size_t stored_data_len ;
158
- psa_storage_create_flags_t create_flags ;
159
196
160
- ret = get_stored_data (uid , stored_data , & stored_data_len );
197
+
198
+ ret = get_stored_data (its_uid , stored_data , & stored_data_len );
161
199
if (ret != PSA_SUCCESS ) {
162
200
return ret ;
163
201
}
164
202
if (data_offset == 0
165
203
&& data_size >= SECURE_STORAGE_ITS_TRANSFORM_DATA_SIZE (stored_data_len )) {
166
204
/* All the data fits directly in the provided buffer. */
167
- return transform_stored_data (uid , stored_data_len , stored_data , data_size , p_data ,
168
- p_data_length , & create_flags );
205
+ return transform_stored_data (its_uid , stored_data_len , stored_data , data_size ,
206
+ p_data , p_data_length , & create_flags );
169
207
}
170
208
uint8_t data [CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE ];
171
209
size_t data_len ;
172
210
173
- ret = transform_stored_data (uid , stored_data_len , stored_data , sizeof (data ), data ,
211
+ ret = transform_stored_data (its_uid , stored_data_len , stored_data , sizeof (data ), data ,
174
212
& data_len , & create_flags );
175
213
if (ret == PSA_SUCCESS ) {
176
214
if (data_offset > data_len ) {
@@ -184,41 +222,47 @@ psa_status_t secure_storage_its_get(secure_storage_its_uid_t uid, size_t data_of
184
222
return ret ;
185
223
}
186
224
187
- psa_status_t secure_storage_its_get_info (secure_storage_its_uid_t uid ,
188
- struct psa_storage_info_t * p_info )
225
+ psa_status_t secure_storage_its_get_info (secure_storage_its_caller_id_t caller_id ,
226
+ psa_storage_uid_t uid , struct psa_storage_info_t * p_info )
189
227
{
190
228
psa_status_t ret ;
229
+ secure_storage_its_uid_t its_uid ;
191
230
uint8_t data [CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE ];
192
231
193
- if (uid .uid == 0 || p_info == NULL ) {
232
+ if (make_its_uid (caller_id , uid , & its_uid ) != PSA_SUCCESS ) {
233
+ return PSA_ERROR_INVALID_ARGUMENT ;
234
+ }
235
+ if (p_info == NULL ) {
194
236
return PSA_ERROR_INVALID_ARGUMENT ;
195
237
}
196
238
197
- ret = get_entry (uid , sizeof (data ), data , & p_info -> size , & p_info -> flags );
239
+ ret = get_entry (its_uid , sizeof (data ), data , & p_info -> size , & p_info -> flags );
198
240
if (ret == PSA_SUCCESS ) {
199
241
p_info -> capacity = p_info -> size ;
200
242
}
201
243
return ret ;
202
244
}
203
245
204
- psa_status_t secure_storage_its_remove (secure_storage_its_uid_t uid )
246
+ psa_status_t secure_storage_its_remove (secure_storage_its_caller_id_t caller_id ,
247
+ psa_storage_uid_t uid )
205
248
{
206
249
psa_status_t ret ;
250
+ secure_storage_its_uid_t its_uid ;
207
251
psa_storage_create_flags_t create_flags ;
208
252
uint8_t data [CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE ];
209
253
size_t data_len ;
210
254
211
- if (uid . uid == 0 ) {
255
+ if (make_its_uid ( caller_id , uid , & its_uid ) != PSA_SUCCESS ) {
212
256
return PSA_ERROR_INVALID_ARGUMENT ;
213
257
}
214
258
215
- ret = get_entry (uid , sizeof (data ), data , & data_len , & create_flags );
259
+ ret = get_entry (its_uid , sizeof (data ), data , & data_len , & create_flags );
216
260
if (ret == PSA_SUCCESS && (create_flags & PSA_STORAGE_FLAG_WRITE_ONCE )) {
217
261
return PSA_ERROR_NOT_PERMITTED ;
218
262
}
219
263
/* Allow overwriting corrupted entries as well to not be stuck with them forever. */
220
264
if (ret == PSA_SUCCESS || ret == PSA_ERROR_STORAGE_FAILURE ) {
221
- ret = secure_storage_its_store_remove (uid );
265
+ ret = secure_storage_its_store_remove (its_uid );
222
266
if (ret != PSA_SUCCESS ) {
223
267
log_failed_operation ("remove" , "from" , ret );
224
268
return PSA_ERROR_STORAGE_FAILURE ;
0 commit comments