@@ -145,18 +145,48 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_has(
145145    } 
146146} 
147147
148+ /* 
149+ should import data indicated by selection into keydata with values taken from the OSSL_PARAM array params 
150+ */ 
148151pub  unsafe  extern  "C"  fn  parsec_provider_kmgmt_import ( 
149152    key_data :  VOID_PTR , 
150153    selection :  std:: os:: raw:: c_int , 
151154    params :  * mut  OSSL_PARAM , 
152155)  -> std:: os:: raw:: c_int  { 
153-     //TODO: Query the parsec service and get a list of keys, check if the requested import is for a known key and then 
154-     // set the parameter 
155156    if  selection &  OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS  as  std:: os:: raw:: c_int  != 0  { 
156-         return  parsec_provider_kmgmt_set_params ( key_data,  params) ; 
157-     } 
157+         let  result = super :: r#catch ( Some ( || super :: Error :: PROVIDER_KEYMGMT_IMPORT ) ,  || { 
158+             let  keydata_ptr = key_data as  * const  ParsecProviderKeyObject ; 
159+             Arc :: increment_strong_count ( keydata_ptr) ; 
160+             let  arc_keydata = Arc :: from_raw ( keydata_ptr) ; 
161+             let  param:  openssl_bindings:: OSSL_PARAM  =
162+                 * openssl_returns_nonnull ( openssl_bindings:: OSSL_PARAM_locate ( 
163+                     params, 
164+                     PARSEC_PROVIDER_KEY_NAME . as_ptr ( )  as  * const  std:: os:: raw:: c_char , 
165+                 ) ) ?; 
158166
159-     OPENSSL_SUCCESS 
167+             let  key_name = std:: str:: from_utf8_unchecked ( core:: slice:: from_raw_parts ( 
168+                 param. data  as  * mut  u8 , 
169+                 param. data_size , 
170+             ) ) ; 
171+ 
172+             match  arc_keydata. provctx . get_client ( ) . list_keys ( )  { 
173+                 Ok ( keys)  => { 
174+                     if  keys. iter ( ) . any ( |kinfo| kinfo. name  == key_name)  { 
175+                         Ok ( OPENSSL_SUCCESS ) 
176+                     }  else  { 
177+                         Err ( "Failed to list Parsec Provider's Keys" . into ( ) ) 
178+                     } 
179+                 } 
180+                 Err ( _)  => Err ( "Failed to list client keys." . into ( ) ) , 
181+             } 
182+         } ) ; 
183+         match  result { 
184+             Ok ( _)  => parsec_provider_kmgmt_set_params ( key_data,  params) , 
185+             Err ( ( ) )  => OPENSSL_ERROR , 
186+         } 
187+     }  else  { 
188+         OPENSSL_SUCCESS 
189+     } 
160190} 
161191
162192/* 
0 commit comments