1
1
// Copyright 2020 Contributors to the Parsec project.
2
2
// SPDX-License-Identifier: Apache-2.0
3
- use super :: { LocalIdStore , MbedProvider } ;
3
+ use super :: MbedProvider ;
4
4
use crate :: authenticators:: ApplicationName ;
5
5
use crate :: key_info_managers;
6
6
use crate :: key_info_managers:: { KeyInfo , KeyTriple , ManageKeyInfo } ;
7
+ use log:: error;
7
8
use log:: { info, warn} ;
8
9
use parsec_interface:: operations:: psa_key_attributes:: Attributes ;
9
10
use parsec_interface:: operations:: {
@@ -12,8 +13,7 @@ use parsec_interface::operations::{
12
13
use parsec_interface:: requests:: { ProviderID , ResponseStatus , Result } ;
13
14
use psa_crypto:: operations:: key_management as psa_crypto_key_management;
14
15
use psa_crypto:: types:: key;
15
- use rand:: rngs:: SmallRng ;
16
- use rand:: { Rng , SeedableRng } ;
16
+ use std:: sync:: atomic:: { AtomicU32 , Ordering :: Relaxed } ;
17
17
18
18
/// Gets a PSA Key ID from the Key Info Manager.
19
19
/// Wrapper around the get method of the Key Info Manager to convert the key ID to the psa_key_id_t
@@ -46,42 +46,40 @@ fn create_key_id(
46
46
key_triple : KeyTriple ,
47
47
key_attributes : Attributes ,
48
48
store_handle : & mut dyn ManageKeyInfo ,
49
- local_ids_handle : & mut LocalIdStore ,
49
+ max_current_id : & AtomicU32 ,
50
50
) -> Result < key:: psa_key_id_t > {
51
- let mut rng = SmallRng :: from_entropy ( ) ;
52
- let mut key_id = rng. gen_range ( key:: PSA_KEY_ID_USER_MIN , key:: PSA_KEY_ID_USER_MAX + 1 ) ;
53
-
54
- while local_ids_handle. contains ( & key_id) {
55
- key_id = rng. gen_range ( key:: PSA_KEY_ID_USER_MIN , key:: PSA_KEY_ID_USER_MAX + 1 ) ;
51
+ // fetch_add adds 1 to the old value and returns the old value, so add 1 to local value for new ID
52
+ let new_key_id = max_current_id. fetch_add ( 1 , Relaxed ) + 1 ;
53
+ if new_key_id > key:: PSA_KEY_ID_USER_MAX {
54
+ // If storing key failed and no other keys were created in the mean time, it is safe to
55
+ // decrement the key counter.
56
+ let _ = max_current_id. store ( key:: PSA_KEY_ID_USER_MAX , Relaxed ) ;
57
+ error ! (
58
+ "PSA max key ID limit of {} reached" ,
59
+ key:: PSA_KEY_ID_USER_MAX
60
+ ) ;
61
+ return Err ( ResponseStatus :: PsaErrorInsufficientMemory ) ;
56
62
}
63
+
57
64
let key_info = KeyInfo {
58
- id : key_id . to_ne_bytes ( ) . to_vec ( ) ,
65
+ id : new_key_id . to_ne_bytes ( ) . to_vec ( ) ,
59
66
attributes : key_attributes,
60
67
} ;
61
68
match store_handle. insert ( key_triple. clone ( ) , key_info) {
62
69
Ok ( insert_option) => {
63
70
if insert_option. is_some ( ) {
64
71
warn ! ( "Overwriting Key triple mapping ({})" , key_triple) ;
65
72
}
66
- let _ = local_ids_handle. insert ( key_id) ;
67
-
68
- Ok ( key_id)
73
+ Ok ( new_key_id)
69
74
}
70
75
Err ( string) => Err ( key_info_managers:: to_response_status ( string) ) ,
71
76
}
72
77
}
73
78
74
- fn remove_key_id (
75
- key_triple : & KeyTriple ,
76
- key_id : key:: psa_key_id_t ,
77
- store_handle : & mut dyn ManageKeyInfo ,
78
- local_ids_handle : & mut LocalIdStore ,
79
- ) -> Result < ( ) > {
79
+ fn remove_key_id ( key_triple : & KeyTriple , store_handle : & mut dyn ManageKeyInfo ) -> Result < ( ) > {
80
+ // ID Counter not affected as overhead and extra complication deemed unnecessary
80
81
match store_handle. remove ( key_triple) {
81
- Ok ( _) => {
82
- let _ = local_ids_handle. remove ( & key_id) ;
83
- Ok ( ( ) )
84
- }
82
+ Ok ( _) => Ok ( ( ) ) ,
85
83
Err ( string) => Err ( key_info_managers:: to_response_status ( string) ) ,
86
84
}
87
85
}
@@ -99,23 +97,21 @@ impl MbedProvider {
99
97
op : psa_generate_key:: Operation ,
100
98
) -> Result < psa_generate_key:: Result > {
101
99
info ! ( "Mbed Provider - Create Key" ) ;
102
- let _semaphore_guard = self . key_slot_semaphore . access ( ) ;
103
100
let key_name = op. key_name ;
104
101
let key_attributes = op. attributes ;
105
102
let key_triple = KeyTriple :: new ( app_name, ProviderID :: MbedCrypto , key_name) ;
106
103
let mut store_handle = self
107
104
. key_info_store
108
105
. write ( )
109
106
. expect ( "Key store lock poisoned" ) ;
110
- let mut local_ids_handle = self . local_ids . write ( ) . expect ( "Local ID lock poisoned" ) ;
111
107
if key_info_exists ( & key_triple, & * store_handle) ? {
112
108
return Err ( ResponseStatus :: PsaErrorAlreadyExists ) ;
113
109
}
114
110
let key_id = create_key_id (
115
111
key_triple. clone ( ) ,
116
112
key_attributes,
117
113
& mut * store_handle,
118
- & mut local_ids_handle ,
114
+ & self . id_counter ,
119
115
) ?;
120
116
121
117
let _guard = self
@@ -126,12 +122,7 @@ impl MbedProvider {
126
122
match psa_crypto_key_management:: generate ( key_attributes, Some ( key_id) ) {
127
123
Ok ( _) => Ok ( psa_generate_key:: Result { } ) ,
128
124
Err ( error) => {
129
- remove_key_id (
130
- & key_triple,
131
- key_id,
132
- & mut * store_handle,
133
- & mut local_ids_handle,
134
- ) ?;
125
+ remove_key_id ( & key_triple, & mut * store_handle) ?;
135
126
let error = ResponseStatus :: from ( error) ;
136
127
format_error ! ( "Generate key status: {}" , error) ;
137
128
Err ( error)
@@ -145,7 +136,6 @@ impl MbedProvider {
145
136
op : psa_import_key:: Operation ,
146
137
) -> Result < psa_import_key:: Result > {
147
138
info ! ( "Mbed Provider - Import Key" ) ;
148
- let _semaphore_guard = self . key_slot_semaphore . access ( ) ;
149
139
let key_name = op. key_name ;
150
140
let key_attributes = op. attributes ;
151
141
let key_data = op. data ;
@@ -154,15 +144,14 @@ impl MbedProvider {
154
144
. key_info_store
155
145
. write ( )
156
146
. expect ( "Key store lock poisoned" ) ;
157
- let mut local_ids_handle = self . local_ids . write ( ) . expect ( "Local ID lock poisoned" ) ;
158
147
if key_info_exists ( & key_triple, & * store_handle) ? {
159
148
return Err ( ResponseStatus :: PsaErrorAlreadyExists ) ;
160
149
}
161
150
let key_id = create_key_id (
162
151
key_triple. clone ( ) ,
163
152
key_attributes,
164
153
& mut * store_handle,
165
- & mut local_ids_handle ,
154
+ & self . id_counter ,
166
155
) ?;
167
156
168
157
let _guard = self
@@ -173,12 +162,7 @@ impl MbedProvider {
173
162
match psa_crypto_key_management:: import ( key_attributes, Some ( key_id) , & key_data[ ..] ) {
174
163
Ok ( _) => Ok ( psa_import_key:: Result { } ) ,
175
164
Err ( error) => {
176
- remove_key_id (
177
- & key_triple,
178
- key_id,
179
- & mut * store_handle,
180
- & mut local_ids_handle,
181
- ) ?;
165
+ remove_key_id ( & key_triple, & mut * store_handle) ?;
182
166
let error = ResponseStatus :: from ( error) ;
183
167
format_error ! ( "Import key status: {}" , error) ;
184
168
Err ( error)
@@ -192,7 +176,6 @@ impl MbedProvider {
192
176
op : psa_export_public_key:: Operation ,
193
177
) -> Result < psa_export_public_key:: Result > {
194
178
info ! ( "Mbed Provider - Export Public Key" ) ;
195
- let _semaphore_guard = self . key_slot_semaphore . access ( ) ;
196
179
let key_name = op. key_name ;
197
180
let key_triple = KeyTriple :: new ( app_name, ProviderID :: MbedCrypto , key_name) ;
198
181
let store_handle = self . key_info_store . read ( ) . expect ( "Key store lock poisoned" ) ;
@@ -220,14 +203,12 @@ impl MbedProvider {
220
203
op : psa_destroy_key:: Operation ,
221
204
) -> Result < psa_destroy_key:: Result > {
222
205
info ! ( "Mbed Provider - Destroy Key" ) ;
223
- let _semaphore_guard = self . key_slot_semaphore . access ( ) ;
224
206
let key_name = op. key_name ;
225
207
let key_triple = KeyTriple :: new ( app_name, ProviderID :: MbedCrypto , key_name) ;
226
208
let mut store_handle = self
227
209
. key_info_store
228
210
. write ( )
229
211
. expect ( "Key store lock poisoned" ) ;
230
- let mut local_ids_handle = self . local_ids . write ( ) . expect ( "Local ID lock poisoned" ) ;
231
212
let key_id = get_key_id ( & key_triple, & * store_handle) ?;
232
213
233
214
let _guard = self
@@ -247,12 +228,7 @@ impl MbedProvider {
247
228
248
229
match destroy_key_status {
249
230
Ok ( ( ) ) => {
250
- remove_key_id (
251
- & key_triple,
252
- key_id,
253
- & mut * store_handle,
254
- & mut local_ids_handle,
255
- ) ?;
231
+ remove_key_id ( & key_triple, & mut * store_handle) ?;
256
232
Ok ( psa_destroy_key:: Result { } )
257
233
}
258
234
Err ( error) => {
0 commit comments