1
1
// Copyright 2020 Contributors to the Parsec project.
2
2
// SPDX-License-Identifier: Apache-2.0
3
- use super :: { utils, KeyInfo , KeyPairType , LocalIdStore , Pkcs11Provider , ReadWriteSession , Session } ;
3
+ use super :: { utils, KeyPairType , Pkcs11Provider , ReadWriteSession , Session } ;
4
4
use crate :: authenticators:: ApplicationName ;
5
5
use crate :: key_info_managers:: KeyTriple ;
6
- use crate :: key_info_managers:: { self , ManageKeyInfo } ;
7
- use log:: { error, info, trace, warn} ;
8
- use parsec_interface:: operations:: psa_key_attributes:: * ;
6
+ use log:: { error, info, trace} ;
7
+ use parsec_interface:: operations:: psa_key_attributes:: Type ;
9
8
use parsec_interface:: operations:: {
10
9
psa_destroy_key, psa_export_public_key, psa_generate_key, psa_import_key,
11
10
} ;
@@ -16,80 +15,6 @@ use picky_asn1_x509::RSAPublicKey;
16
15
use pkcs11:: types:: { CKR_OK , CK_ATTRIBUTE , CK_OBJECT_HANDLE , CK_SESSION_HANDLE } ;
17
16
use std:: mem;
18
17
19
- /// Gets a key identifier and key attributes from the Key Info Manager.
20
- pub fn get_key_info (
21
- key_triple : & KeyTriple ,
22
- store_handle : & dyn ManageKeyInfo ,
23
- ) -> Result < ( [ u8 ; 4 ] , Attributes ) > {
24
- match store_handle. get ( key_triple) {
25
- Ok ( Some ( key_info) ) => {
26
- if key_info. id . len ( ) == 4 {
27
- let mut dst = [ 0 ; 4 ] ;
28
- dst. copy_from_slice ( & key_info. id ) ;
29
- Ok ( ( dst, key_info. attributes ) )
30
- } else {
31
- error ! ( "Stored Key ID is not valid." ) ;
32
- Err ( ResponseStatus :: KeyInfoManagerError )
33
- }
34
- }
35
- Ok ( None ) => Err ( ResponseStatus :: PsaErrorDoesNotExist ) ,
36
- Err ( string) => Err ( key_info_managers:: to_response_status ( string) ) ,
37
- }
38
- }
39
-
40
- pub fn create_key_id (
41
- key_triple : KeyTriple ,
42
- key_attributes : Attributes ,
43
- store_handle : & mut dyn ManageKeyInfo ,
44
- local_ids_handle : & mut LocalIdStore ,
45
- ) -> Result < [ u8 ; 4 ] > {
46
- let mut key_id = rand:: random :: < [ u8 ; 4 ] > ( ) ;
47
- while local_ids_handle. contains ( & key_id) {
48
- key_id = rand:: random :: < [ u8 ; 4 ] > ( ) ;
49
- }
50
- let key_info = KeyInfo {
51
- id : key_id. to_vec ( ) ,
52
- attributes : key_attributes,
53
- } ;
54
- match store_handle. insert ( key_triple. clone ( ) , key_info) {
55
- Ok ( insert_option) => {
56
- if insert_option. is_some ( ) {
57
- if crate :: utils:: GlobalConfig :: log_error_details ( ) {
58
- warn ! ( "Overwriting Key triple mapping ({})" , key_triple) ;
59
- } else {
60
- warn ! ( "Overwriting Key triple mapping" ) ;
61
- }
62
- }
63
- let _ = local_ids_handle. insert ( key_id) ;
64
-
65
- Ok ( key_id)
66
- }
67
- Err ( string) => Err ( key_info_managers:: to_response_status ( string) ) ,
68
- }
69
- }
70
-
71
- pub fn remove_key_id (
72
- key_triple : & KeyTriple ,
73
- key_id : [ u8 ; 4 ] ,
74
- store_handle : & mut dyn ManageKeyInfo ,
75
- local_ids_handle : & mut LocalIdStore ,
76
- ) -> Result < ( ) > {
77
- match store_handle. remove ( key_triple) {
78
- Ok ( _) => {
79
- let _ = local_ids_handle. remove ( & key_id) ;
80
- Ok ( ( ) )
81
- }
82
- Err ( string) => Err ( key_info_managers:: to_response_status ( string) ) ,
83
- }
84
- }
85
-
86
- pub fn key_info_exists ( key_triple : & KeyTriple , store_handle : & dyn ManageKeyInfo ) -> Result < bool > {
87
- match store_handle. exists ( key_triple) {
88
- Ok ( val) => Ok ( val) ,
89
- Err ( string) => Err ( key_info_managers:: to_response_status ( string) ) ,
90
- }
91
- }
92
-
93
18
impl Pkcs11Provider {
94
19
/// Find the PKCS 11 object handle corresponding to the key ID and the key type (public,
95
20
/// private or any key type) given as parameters for the current session.
@@ -151,20 +76,10 @@ impl Pkcs11Provider {
151
76
let key_attributes = op. attributes ;
152
77
153
78
let key_triple = KeyTriple :: new ( app_name, ProviderID :: Pkcs11 , key_name) ;
154
- let mut store_handle = self
155
- . key_info_store
156
- . write ( )
157
- . expect ( "Key store lock poisoned" ) ;
158
- let mut local_ids_handle = self . local_ids . write ( ) . expect ( "Local ID lock poisoned" ) ;
159
- if key_info_exists ( & key_triple, & * store_handle) ? {
79
+ if self . key_info_exists ( & key_triple) ? {
160
80
return Err ( ResponseStatus :: PsaErrorAlreadyExists ) ;
161
81
}
162
- let key_id = create_key_id (
163
- key_triple. clone ( ) ,
164
- key_attributes,
165
- & mut * store_handle,
166
- & mut local_ids_handle,
167
- ) ?;
82
+ let key_id = self . create_key_id ( key_triple. clone ( ) , key_attributes) ?;
168
83
169
84
let ( mech, mut pub_template, mut priv_template, mut allowed_mechanism) =
170
85
utils:: parsec_to_pkcs11_params ( key_attributes, & key_id) ?;
@@ -178,12 +93,7 @@ impl Pkcs11Provider {
178
93
179
94
let session = Session :: new ( self , ReadWriteSession :: ReadWrite ) . or_else ( |err| {
180
95
format_error ! ( "Error creating a new session" , err) ;
181
- remove_key_id (
182
- & key_triple,
183
- key_id,
184
- & mut * store_handle,
185
- & mut local_ids_handle,
186
- ) ?;
96
+ let _ = self . remove_key_id ( & key_triple) ?;
187
97
Err ( err)
188
98
} ) ?;
189
99
@@ -204,12 +114,7 @@ impl Pkcs11Provider {
204
114
Ok ( _key) => Ok ( psa_generate_key:: Result { } ) ,
205
115
Err ( e) => {
206
116
format_error ! ( "Generate Key Pair operation failed" , e) ;
207
- remove_key_id (
208
- & key_triple,
209
- key_id,
210
- & mut * store_handle,
211
- & mut local_ids_handle,
212
- ) ?;
117
+ let _ = self . remove_key_id ( & key_triple) ?;
213
118
Err ( utils:: to_response_status ( e) )
214
119
}
215
120
}
@@ -228,43 +133,23 @@ impl Pkcs11Provider {
228
133
let key_name = op. key_name ;
229
134
let key_attributes = op. attributes ;
230
135
let key_triple = KeyTriple :: new ( app_name, ProviderID :: Pkcs11 , key_name) ;
231
- let mut store_handle = self
232
- . key_info_store
233
- . write ( )
234
- . expect ( "Key store lock poisoned" ) ;
235
- let mut local_ids_handle = self . local_ids . write ( ) . expect ( "Local ID lock poisoned" ) ;
236
- if key_info_exists ( & key_triple, & * store_handle) ? {
136
+ if self . key_info_exists ( & key_triple) ? {
237
137
return Err ( ResponseStatus :: PsaErrorAlreadyExists ) ;
238
138
}
239
- let key_id = create_key_id (
240
- key_triple. clone ( ) ,
241
- key_attributes,
242
- & mut * store_handle,
243
- & mut local_ids_handle,
244
- ) ?;
139
+ let key_id = self . create_key_id ( key_triple. clone ( ) , key_attributes) ?;
245
140
246
141
let mut template: Vec < CK_ATTRIBUTE > = Vec :: new ( ) ;
247
142
248
143
let public_key: RSAPublicKey = picky_asn1_der:: from_bytes ( op. data . expose_secret ( ) )
249
144
. or_else ( |e| {
250
145
format_error ! ( "Failed to parse RsaPublicKey data" , e) ;
251
- remove_key_id (
252
- & key_triple,
253
- key_id,
254
- & mut * store_handle,
255
- & mut local_ids_handle,
256
- ) ?;
146
+ let _ = self . remove_key_id ( & key_triple) ?;
257
147
Err ( ResponseStatus :: PsaErrorInvalidArgument )
258
148
} ) ?;
259
149
260
150
if public_key. modulus . is_negative ( ) || public_key. public_exponent . is_negative ( ) {
261
151
error ! ( "Only positive modulus and public exponent are supported." ) ;
262
- remove_key_id (
263
- & key_triple,
264
- key_id,
265
- & mut * store_handle,
266
- & mut local_ids_handle,
267
- ) ?;
152
+ let _ = self . remove_key_id ( & key_triple) ?;
268
153
return Err ( ResponseStatus :: PsaErrorInvalidArgument ) ;
269
154
}
270
155
@@ -281,6 +166,8 @@ impl Pkcs11Provider {
281
166
} else {
282
167
error ! ( "`bits` field of key attributes must be either 0 or equal to the size of the key in `data`." ) ;
283
168
}
169
+
170
+ let _ = self . remove_key_id ( & key_triple) ?;
284
171
return Err ( ResponseStatus :: PsaErrorInvalidArgument ) ;
285
172
}
286
173
@@ -320,12 +207,7 @@ impl Pkcs11Provider {
320
207
321
208
let session = Session :: new ( self , ReadWriteSession :: ReadWrite ) . or_else ( |err| {
322
209
format_error ! ( "Error creating a new session" , err) ;
323
- remove_key_id (
324
- & key_triple,
325
- key_id,
326
- & mut * store_handle,
327
- & mut local_ids_handle,
328
- ) ?;
210
+ let _ = self . remove_key_id ( & key_triple) ?;
329
211
Err ( err)
330
212
} ) ?;
331
213
@@ -344,12 +226,7 @@ impl Pkcs11Provider {
344
226
Ok ( _key) => Ok ( psa_import_key:: Result { } ) ,
345
227
Err ( e) => {
346
228
format_error ! ( "Import operation failed" , e) ;
347
- remove_key_id (
348
- & key_triple,
349
- key_id,
350
- & mut * store_handle,
351
- & mut local_ids_handle,
352
- ) ?;
229
+ let _ = self . remove_key_id ( & key_triple) ?;
353
230
Err ( utils:: to_response_status ( e) )
354
231
}
355
232
}
@@ -362,8 +239,7 @@ impl Pkcs11Provider {
362
239
) -> Result < psa_export_public_key:: Result > {
363
240
let key_name = op. key_name ;
364
241
let key_triple = KeyTriple :: new ( app_name, ProviderID :: Pkcs11 , key_name) ;
365
- let store_handle = self . key_info_store . read ( ) . expect ( "Key store lock poisoned" ) ;
366
- let ( key_id, _key_attributes) = get_key_info ( & key_triple, & * store_handle) ?;
242
+ let ( key_id, _key_attributes) = self . get_key_info ( & key_triple) ?;
367
243
368
244
let session = Session :: new ( self , ReadWriteSession :: ReadOnly ) ?;
369
245
if crate :: utils:: GlobalConfig :: log_error_details ( ) {
@@ -458,12 +334,7 @@ impl Pkcs11Provider {
458
334
) -> Result < psa_destroy_key:: Result > {
459
335
let key_name = op. key_name ;
460
336
let key_triple = KeyTriple :: new ( app_name, ProviderID :: Pkcs11 , key_name) ;
461
- let mut store_handle = self
462
- . key_info_store
463
- . write ( )
464
- . expect ( "Key store lock poisoned" ) ;
465
- let mut local_ids_handle = self . local_ids . write ( ) . expect ( "Local ID lock poisoned" ) ;
466
- let ( key_id, _) = get_key_info ( & key_triple, & * store_handle) ?;
337
+ let ( key_id, _) = self . get_key_info ( & key_triple) ?;
467
338
468
339
let session = Session :: new ( self , ReadWriteSession :: ReadWrite ) ?;
469
340
if crate :: utils:: GlobalConfig :: log_error_details ( ) {
@@ -510,12 +381,7 @@ impl Pkcs11Provider {
510
381
}
511
382
} ;
512
383
513
- remove_key_id (
514
- & key_triple,
515
- key_id,
516
- & mut * store_handle,
517
- & mut local_ids_handle,
518
- ) ?;
384
+ let _ = self . remove_key_id ( & key_triple) ?;
519
385
520
386
Ok ( psa_destroy_key:: Result { } )
521
387
}
0 commit comments