Skip to content

Commit 3f73751

Browse files
Implement ecdsa OSSL_FUNC_KEYMGMT_GET_PARAMS
Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent d298800 commit 3f73751

File tree

2 files changed

+80
-5
lines changed

2 files changed

+80
-5
lines changed

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

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ impl ParsecProviderKeyObject {
5959
}
6060
}
6161

62+
// Ec supported curve name
63+
const EC_CURVE_NAME: &str = "prime256v1\0";
6264
/*
6365
should create a provider side key object. The provider context provctx is passed and may be incorporated
6466
in the key object, but that is not mandatory.
@@ -132,7 +134,7 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_gettable_params(
132134
/*
133135
should extract information data associated with the given keydata
134136
*/
135-
pub unsafe extern "C" fn parsec_provider_kmgmt_get_params(
137+
pub unsafe extern "C" fn parsec_provider_kmgmt_rsa_get_params(
136138
keydata: VOID_PTR,
137139
params: *mut OSSL_PARAM,
138140
) -> std::os::raw::c_int {
@@ -162,6 +164,76 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_get_params(
162164
}
163165
}
164166

167+
fn get_ec_secbits(bits: usize) -> usize {
168+
/* common values from various NIST documents */
169+
if bits < 224 {
170+
return 0;
171+
}
172+
if bits < 256 {
173+
return 112;
174+
}
175+
if bits < 384 {
176+
return 128;
177+
}
178+
if bits < 512 {
179+
return 192;
180+
}
181+
return 256;
182+
}
183+
184+
pub unsafe extern "C" fn parsec_provider_ecdsa_kmgmt_get_params(
185+
keydata: VOID_PTR,
186+
params: *mut OSSL_PARAM,
187+
) -> std::os::raw::c_int {
188+
let result = super::r#catch(Some(|| super::Error::PROVIDER_KEYMGMT_GET_PARAMS), || {
189+
if keydata.is_null() || params.is_null() {
190+
Err("Null pointer received as parameter".into())
191+
} else {
192+
Arc::increment_strong_count(keydata as *const RwLock<ParsecProviderKeyObject>);
193+
let key_data = Arc::from_raw(keydata as *const RwLock<ParsecProviderKeyObject>);
194+
let reader_key_data = key_data.read().unwrap();
195+
196+
let key_name = match reader_key_data.key_name {
197+
None => return Err("Key name is not set".to_string().into()),
198+
Some(ref name) => name,
199+
};
200+
201+
let key_attrs = reader_key_data
202+
.provctx
203+
.get_client()
204+
.key_attributes(key_name)
205+
.map_err(|e| format!("Failed to retrived key attributes: {}", e))?;
206+
207+
if let Ok(ptr) = openssl_returns_nonnull(openssl_bindings::OSSL_PARAM_locate(
208+
params,
209+
OSSL_PKEY_PARAM_GROUP_NAME.as_ptr() as *const std::os::raw::c_char,
210+
)) {
211+
let mut s = EC_CURVE_NAME.to_string();
212+
(*ptr).data_type = OSSL_PARAM_UTF8_STRING;
213+
(*ptr).return_size = s.len();
214+
std::ptr::copy(s.as_mut_ptr() as _, (*ptr).data, s.len());
215+
}
216+
let _ = locate_and_set_int_param(OSSL_PKEY_PARAM_BITS, key_attrs.bits, params);
217+
let _ = locate_and_set_int_param(
218+
OSSL_PKEY_PARAM_SECURITY_BITS,
219+
get_ec_secbits(key_attrs.bits),
220+
params,
221+
);
222+
let _ = locate_and_set_int_param(
223+
OSSL_PKEY_PARAM_MAX_SIZE,
224+
(3 + (key_attrs.bits + 4) * 2).try_into().unwrap(),
225+
params,
226+
);
227+
Ok(OPENSSL_SUCCESS)
228+
}
229+
});
230+
231+
match result {
232+
Ok(result) => result,
233+
Err(()) => OPENSSL_ERROR,
234+
}
235+
}
236+
165237
// should update information data associated with the given keydata
166238
pub unsafe extern "C" fn parsec_provider_kmgmt_set_params(
167239
keydata: VOID_PTR,
@@ -210,6 +282,7 @@ pub unsafe extern "C" fn parsec_provider_ecdsa_kmgmt_has(
210282
let key_data = Arc::from_raw(keydata as *const RwLock<ParsecProviderKeyObject>);
211283

212284
if selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY as std::os::raw::c_int != 0 {
285+
let reader_key_data = key_data.read().unwrap();
213286
if reader_key_data.get_ecdsa_key().is_none() {
214287
return Err("ECDSA key has not been set.".into());
215288
}
@@ -695,7 +768,9 @@ const OSSL_FUNC_KEYMGMT_IMPORT_TYPES_PTR: KeyMgmtImportTypesPtr =
695768
const OSSL_FUNC_KEYMGMT_ECDSA_IMPORT_TYPES_PTR: KeyMgmtImportTypesPtr =
696769
parsec_provider_ecdsa_kmgmt_import_types;
697770
const OSSL_FUNC_KEYMGMT_SET_PARAMS_PTR: KeyMgmtSetParamsPtr = parsec_provider_kmgmt_set_params;
698-
const OSSL_FUNC_KEYMGMT_GET_PARAMS_PTR: KeyMgmtGetParamsPtr = parsec_provider_kmgmt_get_params;
771+
const OSSL_FUNC_KEYMGMT_RSA_GET_PARAMS_PTR: KeyMgmtGetParamsPtr = parsec_provider_kmgmt_rsa_get_params;
772+
const OSSL_FUNC_KEYMGMT_ECDSA_GET_PARAMS_PTR: KeyMgmtGetParamsPtr =
773+
parsec_provider_ecdsa_kmgmt_get_params;
699774
const OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR: KeyMgmtSettableParamsPtr =
700775
parsec_provider_kmgmt_settable_params;
701776
const OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS_PTR: KeyMgmtGettableParamsPtr =
@@ -737,7 +812,7 @@ const PARSEC_PROVIDER_KEYMGMT_IMPL: [OSSL_DISPATCH; 13] = [
737812
unsafe {
738813
ossl_dispatch!(
739814
OSSL_FUNC_KEYMGMT_GET_PARAMS,
740-
OSSL_FUNC_KEYMGMT_GET_PARAMS_PTR
815+
OSSL_FUNC_KEYMGMT_RSA_GET_PARAMS_PTR
741816
)
742817
},
743818
unsafe {
@@ -782,7 +857,7 @@ const PARSEC_PROVIDER_KEYMGMT_ECDSA_IMPL: [OSSL_DISPATCH; 12] = [
782857
unsafe {
783858
ossl_dispatch!(
784859
OSSL_FUNC_KEYMGMT_GET_PARAMS,
785-
OSSL_FUNC_KEYMGMT_GET_PARAMS_PTR
860+
OSSL_FUNC_KEYMGMT_ECDSA_GET_PARAMS_PTR
786861
)
787862
},
788863
unsafe {

parsec-openssl-provider/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ openssl_errors::openssl_errors! {
116116
PROVIDER_KEYMGMT_ECDSA_IMPORT("parsec_provider_kmgmt_ecdsa_import");
117117
PROVIDER_KEYMGMT_MATCH("parsec_provider_kmgmt_match");
118118
PROVIDER_KEYMGMT_SET_PARAMS("parsec_provider_kmgmt_set_params");
119-
PROVIDER_KEYMGMT_GET_PARAMS("parsec_provider_kmgmt_get_params");
119+
PROVIDER_KEYMGMT_RSA_GET_PARAMS("parsec_provider_kmgmt_rsa_get_params");
120120
PROVIDER_KEYMGMT_VALIDATE("parsec_provider_kmgmt_validate");
121121
PROVIDER_QUERY("parsec_provider_query");
122122
PROVIDER_SIGNATURE_SIGN("parsec_provider_signature_sign");

0 commit comments

Comments
 (0)