44use crate :: openssl_binding:: {
55 OSSL_ALGORITHM , OSSL_DISPATCH , OSSL_FUNC_KEYMGMT_FREE , OSSL_FUNC_KEYMGMT_IMPORT ,
66 OSSL_FUNC_KEYMGMT_NEW , OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS , OSSL_FUNC_KEYMGMT_SET_PARAMS ,
7- OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS , OSSL_PARAM , OSSL_PARAM_UTF8_PTR ,
7+ OSSL_FUNC_KEYMGMT_VALIDATE , OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS , OSSL_PARAM ,
8+ OSSL_PARAM_UTF8_PTR ,
89} ;
910use crate :: ParsecProviderContext ;
1011use parsec_openssl2:: types:: VOID_PTR ;
@@ -111,22 +112,50 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_import(
111112 1
112113}
113114
115+ // Should check if the keydata contains valid data subsets indicated by selection.
116+ pub unsafe extern "C" fn parsec_provider_kmgmt_validate (
117+ keydata : VOID_PTR ,
118+ selection : std:: os:: raw:: c_int ,
119+ _checktype : std:: os:: raw:: c_int ,
120+ ) -> std:: os:: raw:: c_int {
121+ if keydata. is_null ( ) {
122+ return 1 ;
123+ }
124+
125+ if selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as std:: os:: raw:: c_int != 0 {
126+ let keydata_ptr = keydata as * const ParsecProviderKeyObject ;
127+ Arc :: increment_strong_count ( keydata_ptr) ;
128+ let arc_keydata = Arc :: from_raw ( keydata_ptr) ;
129+ let key_name = arc_keydata. key_name . lock ( ) . unwrap ( ) ;
130+ if key_name. is_some ( ) {
131+ 0
132+ } else {
133+ 1
134+ }
135+ } else {
136+ 1
137+ }
138+ }
139+
114140pub type KeyMgmtNewPtr = unsafe extern "C" fn ( VOID_PTR ) -> VOID_PTR ;
115141pub type KeyMgmtFreePtr = unsafe extern "C" fn ( VOID_PTR ) ;
116142pub type KeyMgmtImportPtr =
117143 unsafe extern "C" fn ( VOID_PTR , std:: os:: raw:: c_int , * mut OSSL_PARAM ) -> std:: os:: raw:: c_int ;
118144pub type KeyMgmtSetParamsPtr =
119145 unsafe extern "C" fn ( VOID_PTR , * mut OSSL_PARAM ) -> std:: os:: raw:: c_int ;
120146pub type KeyMgmtSettableParamsPtr = unsafe extern "C" fn ( VOID_PTR ) -> * const OSSL_PARAM ;
147+ pub type KeyMgmtValidatePtr =
148+ unsafe extern "C" fn ( VOID_PTR , std:: os:: raw:: c_int , std:: os:: raw:: c_int ) -> std:: os:: raw:: c_int ;
121149
122150const OSSL_FUNC_KEYMGMT_NEW_PTR : KeyMgmtNewPtr = parsec_provider_kmgmt_new;
123151const OSSL_FUNC_KEYMGMT_FREE_PTR : KeyMgmtFreePtr = parsec_provider_kmgmt_free;
124152const OSSL_FUNC_KEYMGMT_IMPORT_PTR : KeyMgmtImportPtr = parsec_provider_kmgmt_import;
125153const OSSL_FUNC_KEYMGMT_SET_PARAMS_PTR : KeyMgmtSetParamsPtr = parsec_provider_kmgmt_set_params;
126154const OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR : KeyMgmtSettableParamsPtr =
127155 parsec_provider_kmgmt_settable_params;
156+ const OSSL_FUNC_KEYMGMT_VALIDATE_PTR : KeyMgmtValidatePtr = parsec_provider_kmgmt_validate;
128157
129- const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 5 ] = [
158+ const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 6 ] = [
130159 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_NEW , OSSL_FUNC_KEYMGMT_NEW_PTR ) } ,
131160 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_FREE , OSSL_FUNC_KEYMGMT_FREE_PTR ) } ,
132161 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_IMPORT , OSSL_FUNC_KEYMGMT_IMPORT_PTR ) } ,
@@ -142,6 +171,7 @@ const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL: [OSSL_DISPATCH; 5] = [
142171 OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR
143172 )
144173 } ,
174+ unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_VALIDATE , OSSL_FUNC_KEYMGMT_VALIDATE_PTR ) } ,
145175] ;
146176
147177pub const PARSEC_PROVIDER_KEYMGMT : [ OSSL_ALGORITHM ; 1 ] = [ ossl_algorithm ! (
0 commit comments