Skip to content

Commit 8f57f89

Browse files
Add Key Objects Data validation
Implement: 1. OSSL_FUNC_KEYMGMT_VALIDATE for key objects as indicated by https://www.openssl.org/docs/man3.0/man7/provider-keymgmt.html This currently only checks whether selection is 'OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS' and the key_name has been filled, as currently we don't support any other selection/data in Key Objects. Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent 4e75a16 commit 8f57f89

File tree

2 files changed

+35
-2
lines changed
  • parsec-openssl-provider/src/keymgmt
  • parsec-openssl-sys2/src/c

2 files changed

+35
-2
lines changed

parsec-openssl-provider/src/keymgmt/mod.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
use 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
};
910
use crate::ParsecProviderContext;
1011
use 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+
114140
pub type KeyMgmtNewPtr = unsafe extern "C" fn(VOID_PTR) -> VOID_PTR;
115141
pub type KeyMgmtFreePtr = unsafe extern "C" fn(VOID_PTR);
116142
pub type KeyMgmtImportPtr =
117143
unsafe extern "C" fn(VOID_PTR, std::os::raw::c_int, *mut OSSL_PARAM) -> std::os::raw::c_int;
118144
pub type KeyMgmtSetParamsPtr =
119145
unsafe extern "C" fn(VOID_PTR, *mut OSSL_PARAM) -> std::os::raw::c_int;
120146
pub 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

122150
const OSSL_FUNC_KEYMGMT_NEW_PTR: KeyMgmtNewPtr = parsec_provider_kmgmt_new;
123151
const OSSL_FUNC_KEYMGMT_FREE_PTR: KeyMgmtFreePtr = parsec_provider_kmgmt_free;
124152
const OSSL_FUNC_KEYMGMT_IMPORT_PTR: KeyMgmtImportPtr = parsec_provider_kmgmt_import;
125153
const OSSL_FUNC_KEYMGMT_SET_PARAMS_PTR: KeyMgmtSetParamsPtr = parsec_provider_kmgmt_set_params;
126154
const 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

147177
pub const PARSEC_PROVIDER_KEYMGMT: [OSSL_ALGORITHM; 1] = [ossl_algorithm!(

parsec-openssl-sys2/src/c/openssl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
/* Basic key object destruction */
3434
# define OSSL_FUNC_KEYMGMT_FREE 10
3535

36+
/* Key checks - validation */
37+
# define OSSL_FUNC_KEYMGMT_VALIDATE 22
38+
3639
/* Operations */
3740

3841
# define OSSL_OP_KEYMGMT 10

0 commit comments

Comments
 (0)