@@ -714,3 +714,50 @@ fn test_kmgmt_import() {
714714        parsec_provider_teardown ( provctx as  * const  OSSL_PROVIDER ) ; 
715715    } 
716716} 
717+ 
718+ #[ test]  
719+ fn  test_kmgmt_dup ( )  { 
720+     use  crate :: { parsec_provider_provider_init,  parsec_provider_teardown} ; 
721+ 
722+     let  out:  * const  OSSL_DISPATCH  = std:: ptr:: null ( ) ; 
723+     let  mut  provctx:  types:: VOID_PTR  = std:: ptr:: null_mut ( ) ; 
724+ 
725+     // Initialize the provider 
726+     let  result:  Result < ( ) ,  parsec_openssl2:: Error >  = unsafe  { 
727+         parsec_provider_provider_init ( 
728+             std:: ptr:: null ( ) , 
729+             std:: ptr:: null ( ) , 
730+             & out as  * const  _  as  * mut  _ , 
731+             & mut  provctx as  * mut  VOID_PTR , 
732+         ) 
733+     } ; 
734+     assert ! ( result. is_ok( ) ) ; 
735+ 
736+     let  keyobj = unsafe  {  parsec_provider_kmgmt_new ( provctx)  } ; 
737+ 
738+     let  my_key_name = "PARSEC_TEST_KEYNAME" . to_string ( ) ; 
739+     let  mut  params = [ 
740+         ossl_param ! ( PARSEC_PROVIDER_KEY_NAME ,  OSSL_PARAM_UTF8_PTR ,  my_key_name) , 
741+         ossl_param ! ( ) , 
742+     ] ; 
743+     let  set_params_res = unsafe  {  parsec_provider_kmgmt_set_params ( keyobj,  & mut  params as  _ )  } ; 
744+     assert_eq ! ( set_params_res,  OPENSSL_SUCCESS ) ; 
745+ 
746+     let  duplicated =
747+         unsafe  {  parsec_provider_keymgmt_dup ( keyobj,  OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS  as  i32 )  } ; 
748+ 
749+     let  duplicated_ptr = duplicated as  * const  ParsecProviderKeyObject ; 
750+     unsafe  { 
751+         Arc :: increment_strong_count ( duplicated_ptr) ; 
752+         let  arc_duplicated = Arc :: from_raw ( duplicated_ptr) ; 
753+         let  duplicated_key_name = arc_duplicated. key_name . lock ( ) . unwrap ( ) ; 
754+ 
755+         assert_eq ! ( * duplicated_key_name,  Some ( my_key_name) ) 
756+     } 
757+ 
758+     unsafe  { 
759+         parsec_provider_kmgmt_free ( keyobj) ; 
760+         parsec_provider_kmgmt_free ( duplicated) ; 
761+         parsec_provider_teardown ( provctx as  _ ) ; 
762+     } 
763+ } 
0 commit comments