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 :: {
1011 ParsecProviderContext , PARSEC_PROVIDER_DESCRIPTION_RSA , PARSEC_PROVIDER_DFLT_PROPERTIES ,
@@ -123,22 +124,50 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_import(
123124 OPENSSL_SUCCESS
124125}
125126
127+ // Should check if the keydata contains valid data subsets indicated by selection.
128+ pub unsafe extern "C" fn parsec_provider_kmgmt_validate (
129+ keydata : VOID_PTR ,
130+ selection : std:: os:: raw:: c_int ,
131+ _checktype : std:: os:: raw:: c_int ,
132+ ) -> std:: os:: raw:: c_int {
133+ if keydata. is_null ( ) {
134+ return OPENSSL_ERROR ;
135+ }
136+
137+ if selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as std:: os:: raw:: c_int != 0 {
138+ let keydata_ptr = keydata as * const ParsecProviderKeyObject ;
139+ Arc :: increment_strong_count ( keydata_ptr) ;
140+ let arc_keydata = Arc :: from_raw ( keydata_ptr) ;
141+ let key_name = arc_keydata. key_name . lock ( ) . unwrap ( ) ;
142+ if key_name. is_some ( ) {
143+ OPENSSL_SUCCESS
144+ } else {
145+ OPENSSL_ERROR
146+ }
147+ } else {
148+ OPENSSL_SUCCESS
149+ }
150+ }
151+
126152pub type KeyMgmtNewPtr = unsafe extern "C" fn ( VOID_PTR ) -> VOID_PTR ;
127153pub type KeyMgmtFreePtr = unsafe extern "C" fn ( VOID_PTR ) ;
128154pub type KeyMgmtImportPtr =
129155 unsafe extern "C" fn ( VOID_PTR , std:: os:: raw:: c_int , * mut OSSL_PARAM ) -> std:: os:: raw:: c_int ;
130156pub type KeyMgmtSetParamsPtr =
131157 unsafe extern "C" fn ( VOID_PTR , * mut OSSL_PARAM ) -> std:: os:: raw:: c_int ;
132158pub type KeyMgmtSettableParamsPtr = unsafe extern "C" fn ( VOID_PTR ) -> * const OSSL_PARAM ;
159+ pub type KeyMgmtValidatePtr =
160+ unsafe extern "C" fn ( VOID_PTR , std:: os:: raw:: c_int , std:: os:: raw:: c_int ) -> std:: os:: raw:: c_int ;
133161
134162const OSSL_FUNC_KEYMGMT_NEW_PTR : KeyMgmtNewPtr = parsec_provider_kmgmt_new;
135163const OSSL_FUNC_KEYMGMT_FREE_PTR : KeyMgmtFreePtr = parsec_provider_kmgmt_free;
136164const OSSL_FUNC_KEYMGMT_IMPORT_PTR : KeyMgmtImportPtr = parsec_provider_kmgmt_import;
137165const OSSL_FUNC_KEYMGMT_SET_PARAMS_PTR : KeyMgmtSetParamsPtr = parsec_provider_kmgmt_set_params;
138166const OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR : KeyMgmtSettableParamsPtr =
139167 parsec_provider_kmgmt_settable_params;
168+ const OSSL_FUNC_KEYMGMT_VALIDATE_PTR : KeyMgmtValidatePtr = parsec_provider_kmgmt_validate;
140169
141- const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 6 ] = [
170+ const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 7 ] = [
142171 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_NEW , OSSL_FUNC_KEYMGMT_NEW_PTR ) } ,
143172 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_FREE , OSSL_FUNC_KEYMGMT_FREE_PTR ) } ,
144173 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_IMPORT , OSSL_FUNC_KEYMGMT_IMPORT_PTR ) } ,
@@ -154,6 +183,7 @@ const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL: [OSSL_DISPATCH; 6] = [
154183 OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR
155184 )
156185 } ,
186+ unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_VALIDATE , OSSL_FUNC_KEYMGMT_VALIDATE_PTR ) } ,
157187 ossl_dispatch ! ( ) ,
158188] ;
159189
0 commit comments