22// SPDX-License-Identifier: Apache-2.0
33
44use crate :: openssl_bindings:: {
5- OSSL_ALGORITHM , OSSL_DISPATCH , OSSL_FUNC_KEYMGMT_FREE , OSSL_FUNC_KEYMGMT_IMPORT ,
6- OSSL_FUNC_KEYMGMT_IMPORT_TYPES , OSSL_FUNC_KEYMGMT_NEW , OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS ,
7- OSSL_FUNC_KEYMGMT_SET_PARAMS , OSSL_FUNC_KEYMGMT_VALIDATE , OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS ,
8- OSSL_PARAM , OSSL_PARAM_UTF8_PTR ,
5+ OSSL_ALGORITHM , OSSL_DISPATCH , OSSL_FUNC_KEYMGMT_FREE , OSSL_FUNC_KEYMGMT_HAS ,
6+ OSSL_FUNC_KEYMGMT_IMPORT , OSSL_FUNC_KEYMGMT_IMPORT_TYPES , OSSL_FUNC_KEYMGMT_NEW ,
7+ OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS , OSSL_FUNC_KEYMGMT_SET_PARAMS , OSSL_FUNC_KEYMGMT_VALIDATE ,
8+ OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS , OSSL_PARAM , OSSL_PARAM_UTF8_PTR ,
99} ;
1010use crate :: {
1111 ParsecProviderContext , PARSEC_PROVIDER_DESCRIPTION_RSA , PARSEC_PROVIDER_DFLT_PROPERTIES ,
@@ -110,6 +110,34 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_set_params(
110110 }
111111}
112112
113+ /*
114+ should return 1 if all the selected data subsets are contained in the given keydata or 0 otherwise.
115+ For algorithms where some selection is not meaningful the function should just return 1 as the
116+ selected subset is not really missing in the key.
117+ */
118+ pub unsafe extern "C" fn parsec_provider_kmgmt_has (
119+ keydata : VOID_PTR ,
120+ selection : std:: os:: raw:: c_int ,
121+ ) -> std:: os:: raw:: c_int {
122+ if keydata. is_null ( ) {
123+ return OPENSSL_ERROR ;
124+ }
125+
126+ if selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as std:: os:: raw:: c_int != 0 {
127+ let keydata_ptr = keydata as * const ParsecProviderKeyObject ;
128+ Arc :: increment_strong_count ( keydata_ptr) ;
129+ let arc_keydata = Arc :: from_raw ( keydata_ptr) ;
130+ let key_name = arc_keydata. key_name . lock ( ) . unwrap ( ) ;
131+ if key_name. is_some ( ) {
132+ OPENSSL_SUCCESS
133+ } else {
134+ OPENSSL_ERROR
135+ }
136+ } else {
137+ OPENSSL_SUCCESS
138+ }
139+ }
140+
113141pub unsafe extern "C" fn parsec_provider_kmgmt_import (
114142 key_data : VOID_PTR ,
115143 selection : std:: os:: raw:: c_int ,
@@ -175,6 +203,7 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_validate(
175203
176204pub type KeyMgmtNewPtr = unsafe extern "C" fn ( VOID_PTR ) -> VOID_PTR ;
177205pub type KeyMgmtFreePtr = unsafe extern "C" fn ( VOID_PTR ) ;
206+ pub type KeyMgmtHasPtr = unsafe extern "C" fn ( VOID_PTR , std:: os:: raw:: c_int ) -> std:: os:: raw:: c_int ;
178207pub type KeyMgmtImportPtr =
179208 unsafe extern "C" fn ( VOID_PTR , std:: os:: raw:: c_int , * mut OSSL_PARAM ) -> std:: os:: raw:: c_int ;
180209pub type KeyMgmtImportTypesPtr = unsafe extern "C" fn ( std:: os:: raw:: c_int ) -> * const OSSL_PARAM ;
@@ -186,6 +215,7 @@ pub type KeyMgmtValidatePtr =
186215
187216const OSSL_FUNC_KEYMGMT_NEW_PTR : KeyMgmtNewPtr = parsec_provider_kmgmt_new;
188217const OSSL_FUNC_KEYMGMT_FREE_PTR : KeyMgmtFreePtr = parsec_provider_kmgmt_free;
218+ const OSSL_FUNC_KEYMGMT_HAS_PTR : KeyMgmtHasPtr = parsec_provider_kmgmt_has;
189219const OSSL_FUNC_KEYMGMT_IMPORT_PTR : KeyMgmtImportPtr = parsec_provider_kmgmt_import;
190220const OSSL_FUNC_KEYMGMT_IMPORT_TYPES_PTR : KeyMgmtImportTypesPtr =
191221 parsec_provider_kmgmt_import_types;
@@ -194,9 +224,10 @@ const OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR: KeyMgmtSettableParamsPtr =
194224 parsec_provider_kmgmt_settable_params;
195225const OSSL_FUNC_KEYMGMT_VALIDATE_PTR : KeyMgmtValidatePtr = parsec_provider_kmgmt_validate;
196226
197- const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 8 ] = [
227+ const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 9 ] = [
198228 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_NEW , OSSL_FUNC_KEYMGMT_NEW_PTR ) } ,
199229 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_FREE , OSSL_FUNC_KEYMGMT_FREE_PTR ) } ,
230+ unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_HAS , OSSL_FUNC_KEYMGMT_HAS_PTR ) } ,
200231 unsafe { ossl_dispatch ! ( OSSL_FUNC_KEYMGMT_IMPORT , OSSL_FUNC_KEYMGMT_IMPORT_PTR ) } ,
201232 unsafe {
202233 ossl_dispatch ! (
0 commit comments