11// Copyright 2020 Contributors to the Parsec project.
22// SPDX-License-Identifier: Apache-2.0
33use 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 ,
66} ;
77use super :: Context ;
88use log:: info;
99use parsec_interface:: operations:: psa_key_attributes:: Attributes ;
1010use parsec_interface:: requests:: ResponseStatus ;
1111use psa_crypto:: types:: status:: Error ;
1212use std:: convert:: { TryFrom , TryInto } ;
13+ use zeroize:: Zeroize ;
1314
1415impl Context {
1516 pub fn generate_key ( & self , key_attrs : Attributes , id : u32 ) -> Result < ( ) , ResponseStatus > {
1617 info ! ( "Handling GenerateKey request" ) ;
17- let proto_req = GenerateKeyIn {
18+ let generate_req = GenerateKeyIn {
1819 attributes : Some ( KeyAttributes {
1920 r#type : u16:: try_from ( key_attrs. key_type ) ? as u32 ,
2021 key_bits : key_attrs. bits . try_into ( ) ?,
@@ -26,34 +27,66 @@ impl Context {
2627 } ) ,
2728 } ) ,
2829 } ;
29- let GenerateKeyOut { handle } = self . send_request ( & proto_req ) ?;
30+ let GenerateKeyOut { handle } = self . send_request ( & generate_req ) ?;
3031
31- let proto_req = CloseKeyIn { handle } ;
32- self . send_request ( & proto_req ) ?;
32+ let close_req = CloseKeyIn { handle } ;
33+ self . send_request ( & close_req ) ?;
3334
3435 Ok ( ( ) )
3536 }
3637
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+
3770 pub fn destroy_key ( & self , key_id : u32 ) -> Result < ( ) , ResponseStatus > {
3871 info ! ( "Handling DestroyKey request" ) ;
3972 if !self . check_key_exists ( key_id) ? {
4073 return Err ( ResponseStatus :: PsaErrorDoesNotExist ) ;
4174 }
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 ) ?;
4477
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 ) ?;
4780 Ok ( ( ) )
4881 }
4982
5083 pub fn check_key_exists ( & self , key_id : u32 ) -> Result < bool , Error > {
5184 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 ) {
5487 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 ) ?;
5790 Ok ( true )
5891 }
5992 Err ( e) => {
0 commit comments