diff --git a/parsec-openssl-provider/src/keymgmt/mod.rs b/parsec-openssl-provider/src/keymgmt/mod.rs index e70815f5..86a7ed5b 100644 --- a/parsec-openssl-provider/src/keymgmt/mod.rs +++ b/parsec-openssl-provider/src/keymgmt/mod.rs @@ -2,9 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::openssl_binding::{ - OSSL_ALGORITHM, OSSL_DISPATCH, OSSL_FUNC_KEYMGMT_FREE, OSSL_FUNC_KEYMGMT_IMPORT, - OSSL_FUNC_KEYMGMT_NEW, OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, OSSL_FUNC_KEYMGMT_SET_PARAMS, - OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS, OSSL_PARAM, OSSL_PARAM_UTF8_PTR, + OSSL_ALGORITHM, OSSL_DISPATCH, OSSL_FUNC_KEYMGMT_DUP, OSSL_FUNC_KEYMGMT_FREE, + OSSL_FUNC_KEYMGMT_IMPORT, OSSL_FUNC_KEYMGMT_NEW, OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, + OSSL_FUNC_KEYMGMT_SET_PARAMS, OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS, OSSL_PARAM, + OSSL_PARAM_UTF8_PTR, }; use crate::ParsecProviderContext; use parsec_openssl2::types::VOID_PTR; @@ -22,6 +23,16 @@ struct ParsecProviderKeyObject { key_name: Mutex>, } +impl Clone for ParsecProviderKeyObject { + fn clone(&self) -> Self { + let key_name = self.key_name.lock().unwrap(); + ParsecProviderKeyObject { + _provctx: self._provctx.clone(), + key_name: Mutex::new(key_name.clone()), + } + } +} + fn kmgmt_keyobj_new(provctx: Arc) -> Arc { Arc::new(ParsecProviderKeyObject { _provctx: provctx.clone(), @@ -111,6 +122,22 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_import( 1 } +pub unsafe extern "C" fn parsec_provider_keymgmt_dup( + keydata_from: VOID_PTR, + selection: std::os::raw::c_int, +) -> VOID_PTR { + if selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as std::os::raw::c_int != 0 { + let keydata_from_ptr = keydata_from as *const ParsecProviderKeyObject; + Arc::increment_strong_count(keydata_from_ptr); + let arc_keydata_from = Arc::from_raw(keydata_from_ptr); + + let duplicate: ParsecProviderKeyObject = (*arc_keydata_from).clone(); + Arc::into_raw(Arc::new(duplicate)) as VOID_PTR + } else { + std::ptr::null_mut() + } +} + pub type KeyMgmtNewPtr = unsafe extern "C" fn(VOID_PTR) -> VOID_PTR; pub type KeyMgmtFreePtr = unsafe extern "C" fn(VOID_PTR); pub type KeyMgmtImportPtr = @@ -118,6 +145,7 @@ pub type KeyMgmtImportPtr = pub type KeyMgmtSetParamsPtr = unsafe extern "C" fn(VOID_PTR, *mut OSSL_PARAM) -> std::os::raw::c_int; pub type KeyMgmtSettableParamsPtr = unsafe extern "C" fn(VOID_PTR) -> *const OSSL_PARAM; +pub type KeyMgmtDupPtr = unsafe extern "C" fn(VOID_PTR, std::os::raw::c_int) -> VOID_PTR; const OSSL_FUNC_KEYMGMT_NEW_PTR: KeyMgmtNewPtr = parsec_provider_kmgmt_new; const OSSL_FUNC_KEYMGMT_FREE_PTR: KeyMgmtFreePtr = parsec_provider_kmgmt_free; @@ -125,8 +153,9 @@ const OSSL_FUNC_KEYMGMT_IMPORT_PTR: KeyMgmtImportPtr = parsec_provider_kmgmt_imp const OSSL_FUNC_KEYMGMT_SET_PARAMS_PTR: KeyMgmtSetParamsPtr = parsec_provider_kmgmt_set_params; const OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR: KeyMgmtSettableParamsPtr = parsec_provider_kmgmt_settable_params; +const OSSL_FUNC_KEYMGMT_DUP_PTR: KeyMgmtDupPtr = parsec_provider_keymgmt_dup; -const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL: [OSSL_DISPATCH; 5] = [ +const PARSEC_PROVIDER_RSA_KEYMGMT_IMPL: [OSSL_DISPATCH; 6] = [ unsafe { ossl_dispatch!(OSSL_FUNC_KEYMGMT_NEW, OSSL_FUNC_KEYMGMT_NEW_PTR) }, unsafe { ossl_dispatch!(OSSL_FUNC_KEYMGMT_FREE, OSSL_FUNC_KEYMGMT_FREE_PTR) }, 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] = [ OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR ) }, + unsafe { ossl_dispatch!(OSSL_FUNC_KEYMGMT_DUP, OSSL_FUNC_KEYMGMT_DUP_PTR) }, ]; pub const PARSEC_PROVIDER_KEYMGMT: [OSSL_ALGORITHM; 1] = [ossl_algorithm!( diff --git a/parsec-openssl-sys2/src/c/openssl.h b/parsec-openssl-sys2/src/c/openssl.h index 5c253dce..4e10ce0a 100644 --- a/parsec-openssl-sys2/src/c/openssl.h +++ b/parsec-openssl-sys2/src/c/openssl.h @@ -33,6 +33,9 @@ /* Basic key object destruction */ # define OSSL_FUNC_KEYMGMT_FREE 10 +/* Dup function, constructor */ +# define OSSL_FUNC_KEYMGMT_DUP 44 + /* Operations */ # define OSSL_OP_KEYMGMT 10