@@ -260,3 +260,62 @@ pub const PARSEC_PROVIDER_KEYMGMT: [OSSL_ALGORITHM; 2] = [
260260 ) ,
261261 ossl_algorithm ! ( ) ,
262262] ;
263+
264+ #[ test]
265+ fn test_kmgmt_has ( ) {
266+ use crate :: openssl_bindings:: OSSL_KEYMGMT_SELECT_PRIVATE_KEY ;
267+ use crate :: parsec_provider_provider_init;
268+
269+ let out: * const OSSL_DISPATCH = std:: ptr:: null ( ) ;
270+ let mut provctx: types:: VOID_PTR = std:: ptr:: null_mut ( ) ;
271+
272+ // Initialize the provider
273+ let result: Result < ( ) , parsec_openssl2:: Error > = unsafe {
274+ parsec_provider_provider_init (
275+ std:: ptr:: null ( ) ,
276+ std:: ptr:: null ( ) ,
277+ & out as * const _ as * mut _ ,
278+ & mut provctx as * mut VOID_PTR ,
279+ )
280+ } ;
281+ assert ! ( result. is_ok( ) ) ;
282+
283+ // Test parsec_provider_kmgmt_has when keyctx is null. Selection should not matter in this case
284+ let selec_w_null = unsafe {
285+ parsec_provider_kmgmt_has (
286+ std:: ptr:: null_mut ( ) ,
287+ OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as i32 ,
288+ )
289+ } ;
290+ assert_eq ! ( selec_w_null, OPENSSL_ERROR ) ;
291+
292+ let keyctx = unsafe { parsec_provider_kmgmt_new ( provctx) } ;
293+ // Test parsec_provider_kmgmt_has when keyctx has not been completed and the correct selection is used
294+ let selec_no_init =
295+ unsafe { parsec_provider_kmgmt_has ( keyctx, OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as i32 ) } ;
296+ assert_eq ! ( selec_no_init, OPENSSL_ERROR ) ;
297+
298+ // Test parsec_provider_kmgmt_has when keyctx has not been completed but the a superfluous selection is used
299+ let no_selec_no_init =
300+ unsafe { parsec_provider_kmgmt_has ( keyctx, OSSL_KEYMGMT_SELECT_PRIVATE_KEY as i32 ) } ;
301+ assert_eq ! ( no_selec_no_init, OPENSSL_SUCCESS ) ;
302+
303+ // Set the key data with the correct name
304+ let my_key_name = "PARSEC_TEST_KEYNAME" . to_string ( ) ;
305+ let mut params = [
306+ ossl_param ! ( PARSEC_PROVIDER_KEY_NAME , OSSL_PARAM_UTF8_PTR , my_key_name) ,
307+ ossl_param ! ( ) ,
308+ ] ;
309+
310+ let set_params_res = unsafe { parsec_provider_kmgmt_set_params ( keyctx, & mut params as _ ) } ;
311+ assert_eq ! ( set_params_res, OPENSSL_SUCCESS ) ;
312+
313+ // Check parsec_provider_kmgmt_has confirms that keyctx now has the correct data
314+ let selec_init =
315+ unsafe { parsec_provider_kmgmt_has ( keyctx, OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as i32 ) } ;
316+ assert_eq ! ( selec_init, OPENSSL_SUCCESS ) ;
317+
318+ unsafe {
319+ parsec_provider_kmgmt_free ( keyctx) ;
320+ }
321+ }
0 commit comments