1111
1212LOG_MODULE_DECLARE (secure_storage , CONFIG_SECURE_STORAGE_LOG_LEVEL );
1313
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+
1441static void log_failed_operation (const char * operation , const char * preposition , psa_status_t ret )
1542{
1643 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
117144 return ret ;
118145}
119146
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 )
122150{
123151 psa_status_t ret ;
152+ secure_storage_its_uid_t its_uid ;
124153
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 ) {
126158 return PSA_ERROR_INVALID_ARGUMENT ;
127159 }
128160 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
134166 return PSA_ERROR_INSUFFICIENT_STORAGE ;
135167 }
136168
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 )) {
138170 return ret ;
139171 }
140172
141- ret = store_entry (uid , data_length , p_data , create_flags );
173+ ret = store_entry (its_uid , data_length , p_data , create_flags );
142174 return ret ;
143175}
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 )
147179{
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 ) {
149190 return PSA_ERROR_INVALID_ARGUMENT ;
150191 }
151192 if (data_size == 0 ) {
152193 * p_data_length = 0 ;
153194 return PSA_SUCCESS ;
154195 }
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 ;
159196
160- ret = get_stored_data (uid , stored_data , & stored_data_len );
197+
198+ ret = get_stored_data (its_uid , stored_data , & stored_data_len );
161199 if (ret != PSA_SUCCESS ) {
162200 return ret ;
163201 }
164202 if (data_offset == 0
165203 && data_size >= SECURE_STORAGE_ITS_TRANSFORM_DATA_SIZE (stored_data_len )) {
166204 /* 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 );
169207 }
170208 uint8_t data [CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE ];
171209 size_t data_len ;
172210
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 ,
174212 & data_len , & create_flags );
175213 if (ret == PSA_SUCCESS ) {
176214 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
184222 return ret ;
185223}
186224
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 )
189227{
190228 psa_status_t ret ;
229+ secure_storage_its_uid_t its_uid ;
191230 uint8_t data [CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE ];
192231
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 ) {
194236 return PSA_ERROR_INVALID_ARGUMENT ;
195237 }
196238
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 );
198240 if (ret == PSA_SUCCESS ) {
199241 p_info -> capacity = p_info -> size ;
200242 }
201243 return ret ;
202244}
203245
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 )
205248{
206249 psa_status_t ret ;
250+ secure_storage_its_uid_t its_uid ;
207251 psa_storage_create_flags_t create_flags ;
208252 uint8_t data [CONFIG_SECURE_STORAGE_ITS_MAX_DATA_SIZE ];
209253 size_t data_len ;
210254
211- if (uid . uid == 0 ) {
255+ if (make_its_uid ( caller_id , uid , & its_uid ) != PSA_SUCCESS ) {
212256 return PSA_ERROR_INVALID_ARGUMENT ;
213257 }
214258
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 );
216260 if (ret == PSA_SUCCESS && (create_flags & PSA_STORAGE_FLAG_WRITE_ONCE )) {
217261 return PSA_ERROR_NOT_PERMITTED ;
218262 }
219263 /* Allow overwriting corrupted entries as well to not be stuck with them forever. */
220264 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 );
222266 if (ret != PSA_SUCCESS ) {
223267 log_failed_operation ("remove" , "from" , ret );
224268 return PSA_ERROR_STORAGE_FAILURE ;
0 commit comments