1
1
// Copyright 2020 Contributors to the Parsec project.
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
use super :: ts_protobuf:: {
4
- CloseKeyIn , DestroyKeyIn , DestroyKeyOut , GenerateKeyIn , GenerateKeyOut , KeyAttributes ,
5
- KeyLifetime , KeyPolicy , OpenKeyIn , OpenKeyOut ,
4
+ CloseKeyIn , DestroyKeyIn , DestroyKeyOut , ExportPublicKeyIn , GenerateKeyIn , GenerateKeyOut ,
5
+ ImportKeyIn , ImportKeyOut , KeyAttributes , KeyLifetime , KeyPolicy , OpenKeyIn , OpenKeyOut ,
6
6
} ;
7
7
use super :: Context ;
8
8
use log:: info;
9
9
use parsec_interface:: operations:: psa_key_attributes:: Attributes ;
10
10
use parsec_interface:: requests:: ResponseStatus ;
11
11
use psa_crypto:: types:: status:: Error ;
12
12
use std:: convert:: { TryFrom , TryInto } ;
13
+ use zeroize:: Zeroize ;
13
14
14
15
impl Context {
15
16
pub fn generate_key ( & self , key_attrs : Attributes , id : u32 ) -> Result < ( ) , ResponseStatus > {
16
17
info ! ( "Handling GenerateKey request" ) ;
17
- let proto_req = GenerateKeyIn {
18
+ let generate_req = GenerateKeyIn {
18
19
attributes : Some ( KeyAttributes {
19
20
r#type : u16:: try_from ( key_attrs. key_type ) ? as u32 ,
20
21
key_bits : key_attrs. bits . try_into ( ) ?,
@@ -26,34 +27,66 @@ impl Context {
26
27
} ) ,
27
28
} ) ,
28
29
} ;
29
- let GenerateKeyOut { handle } = self . send_request ( & proto_req ) ?;
30
+ let GenerateKeyOut { handle } = self . send_request ( & generate_req ) ?;
30
31
31
- let proto_req = CloseKeyIn { handle } ;
32
- self . send_request ( & proto_req ) ?;
32
+ let close_req = CloseKeyIn { handle } ;
33
+ self . send_request ( & close_req ) ?;
33
34
34
35
Ok ( ( ) )
35
36
}
36
37
38
+ pub fn import_key (
39
+ & self ,
40
+ key_attrs : Attributes ,
41
+ id : u32 ,
42
+ key_data : & [ u8 ] ,
43
+ ) -> Result < ( ) , ResponseStatus > {
44
+ let mut import_req = ImportKeyIn {
45
+ attributes : Some ( KeyAttributes {
46
+ r#type : u16:: try_from ( key_attrs. key_type ) ? as u32 ,
47
+ key_bits : key_attrs. bits . try_into ( ) ?,
48
+ lifetime : KeyLifetime :: Persistent as u32 ,
49
+ id,
50
+ policy : Some ( KeyPolicy {
51
+ usage : key_attrs. policy . usage_flags . try_into ( ) ?,
52
+ alg : key_attrs. policy . permitted_algorithms . try_into ( ) ?,
53
+ } ) ,
54
+ } ) ,
55
+ data : key_data. to_vec ( ) ,
56
+ } ;
57
+ let ImportKeyOut { handle } = self . send_request ( & import_req) ?;
58
+ import_req. data . zeroize ( ) ;
59
+
60
+ let close_req = CloseKeyIn { handle } ;
61
+ self . send_request ( & close_req) ?;
62
+
63
+ Ok ( ( ) )
64
+ }
65
+
66
+ pub fn export_public_key ( & self , id : u32 ) -> Result < Vec < u8 > , ResponseStatus > {
67
+ Ok ( self . send_request_with_key ( ExportPublicKeyIn :: default ( ) , id) ?)
68
+ }
69
+
37
70
pub fn destroy_key ( & self , key_id : u32 ) -> Result < ( ) , ResponseStatus > {
38
71
info ! ( "Handling DestroyKey request" ) ;
39
72
if !self . check_key_exists ( key_id) ? {
40
73
return Err ( ResponseStatus :: PsaErrorDoesNotExist ) ;
41
74
}
42
- let proto_req = OpenKeyIn { id : key_id } ;
43
- let OpenKeyOut { handle } = self . send_request ( & proto_req ) ?;
75
+ let open_req = OpenKeyIn { id : key_id } ;
76
+ let OpenKeyOut { handle } = self . send_request ( & open_req ) ?;
44
77
45
- let proto_req = DestroyKeyIn { handle } ;
46
- let _proto_resp: DestroyKeyOut = self . send_request ( & proto_req ) ?;
78
+ let destroy_req = DestroyKeyIn { handle } ;
79
+ let _proto_resp: DestroyKeyOut = self . send_request ( & destroy_req ) ?;
47
80
Ok ( ( ) )
48
81
}
49
82
50
83
pub fn check_key_exists ( & self , key_id : u32 ) -> Result < bool , Error > {
51
84
info ! ( "Handling CheckKey request" ) ;
52
- let proto_req = OpenKeyIn { id : key_id } ;
53
- match self . send_request ( & proto_req ) {
85
+ let open_req = OpenKeyIn { id : key_id } ;
86
+ match self . send_request ( & open_req ) {
54
87
Ok ( OpenKeyOut { handle } ) => {
55
- let proto_req = CloseKeyIn { handle } ;
56
- self . send_request ( & proto_req ) ?;
88
+ let close_req = CloseKeyIn { handle } ;
89
+ self . send_request ( & close_req ) ?;
57
90
Ok ( true )
58
91
}
59
92
Err ( e) => {
0 commit comments