Skip to content

Commit c49e476

Browse files
Keymgmt import: Add a key presence check
The kmgmt_import function loads certain data in the keydata. Before doing this, check if the reffered to key is present in the provider. Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent 718e821 commit c49e476

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

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

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,18 +145,48 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_has(
145145
}
146146
}
147147

148+
/*
149+
should import data indicated by selection into keydata with values taken from the OSSL_PARAM array params
150+
*/
148151
pub unsafe extern "C" fn parsec_provider_kmgmt_import(
149152
key_data: VOID_PTR,
150153
selection: std::os::raw::c_int,
151154
params: *mut OSSL_PARAM,
152155
) -> std::os::raw::c_int {
153-
//TODO: Query the parsec service and get a list of keys, check if the requested import is for a known key and then
154-
// set the parameter
155156
if selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS as std::os::raw::c_int != 0 {
156-
return parsec_provider_kmgmt_set_params(key_data, params);
157-
}
157+
let result = super::r#catch(Some(|| super::Error::PROVIDER_KEYMGMT_IMPORT), || {
158+
let keydata_ptr = key_data as *const ParsecProviderKeyObject;
159+
Arc::increment_strong_count(keydata_ptr);
160+
let arc_keydata = Arc::from_raw(keydata_ptr);
161+
let param: openssl_bindings::OSSL_PARAM =
162+
*openssl_returns_nonnull(openssl_bindings::OSSL_PARAM_locate(
163+
params,
164+
PARSEC_PROVIDER_KEY_NAME.as_ptr() as *const std::os::raw::c_char,
165+
))?;
158166

159-
OPENSSL_SUCCESS
167+
let key_name = std::str::from_utf8_unchecked(core::slice::from_raw_parts(
168+
param.data as *mut u8,
169+
param.data_size,
170+
));
171+
172+
match arc_keydata.provctx.get_client().list_keys() {
173+
Ok(keys) => {
174+
if keys.iter().any(|kinfo| kinfo.name == key_name) {
175+
Ok(OPENSSL_SUCCESS)
176+
} else {
177+
Err("Failed to list Parsec Provider's Keys".into())
178+
}
179+
}
180+
Err(_) => Err("Failed to list client keys.".into()),
181+
}
182+
});
183+
match result {
184+
Ok(_) => parsec_provider_kmgmt_set_params(key_data, params),
185+
Err(()) => OPENSSL_ERROR,
186+
}
187+
} else {
188+
OPENSSL_SUCCESS
189+
}
160190
}
161191

162192
/*

parsec-openssl-provider/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,11 @@ openssl_errors::openssl_errors! {
111111
PROVIDER_GETTABLE_PARAMS("parsec_provider_gettable_params");
112112
PROVIDER_GET_PARAMS("parsec_provider_get_params");
113113
PROVIDER_KEYMGMT_HAS("parsec_provider_kmgmt_has");
114+
PROVIDER_KEYMGMT_IMPORT("parsec_provider_kmgmt_import");
114115
PROVIDER_KEYMGMT_SET_PARAMS("parsec_provider_kmgmt_set_params");
116+
PROVIDER_KEYMGMT_VALIDATE("parsec_provider_kmgmt_validate");
115117
PROVIDER_QUERY("parsec_provider_query");
116118
PROVIDER_TEARDOWN("parsec_provider_teardown");
117-
PROVIDER_KEYMGMT_VALIDATE("parsec_provider_kmgmt_validate");
118119
}
119120

120121
reasons {

0 commit comments

Comments
 (0)