Skip to content

Commit 7893506

Browse files
signature: ECDSA OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT
Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent 3f73751 commit 7893506

File tree

1 file changed

+39
-22
lines changed
  • parsec-openssl-provider/src/signature

1 file changed

+39
-22
lines changed

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

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -182,32 +182,49 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign_init(
182182
provkey: VOID_PTR,
183183
params: *const OSSL_PARAM,
184184
) -> std::os::raw::c_int {
185-
let result = super::r#catch(
186-
Some(|| super::Error::PROVIDER_SIGNATURE_DIGEST_SIGN_INIT),
187-
|| {
188-
if ctx.is_null() || provkey.is_null() {
189-
return Err("Neither ctx nor provkey pointers should be NULL.".into());
190-
}
191-
192-
Arc::increment_strong_count(ctx as *const RwLock<ParsecProviderSignatureContext>);
193-
let sig_ctx = Arc::from_raw(ctx as *const RwLock<ParsecProviderSignatureContext>);
194-
let mut reader_sig_ctx = sig_ctx.write().unwrap();
195-
Arc::increment_strong_count(provkey as *const RwLock<ParsecProviderKeyObject>);
196-
let prov_key = Arc::from_raw(provkey as *const RwLock<ParsecProviderKeyObject>);
185+
let result = super::r#catch(Some(|| super::Error::PROVIDER_SIGNATURE_DIGEST_SIGN_INIT), || {
186+
if ctx.is_null() || provkey.is_null() {
187+
return Err("Neither ctx nor provkey pointers should be NULL.".into());
188+
}
197189

198-
reader_sig_ctx.keyobj = Some(prov_key.clone());
190+
Arc::increment_strong_count(ctx as *const RwLock<ParsecProviderSignatureContext>);
191+
let sig_ctx = Arc::from_raw(ctx as *const RwLock<ParsecProviderSignatureContext>);
192+
let mut writer_sig_ctx = sig_ctx.write().unwrap();
193+
Arc::increment_strong_count(provkey as *const RwLock<ParsecProviderKeyObject>);
194+
let prov_key = Arc::from_raw(provkey as *const RwLock<ParsecProviderKeyObject>);
199195

200-
// Currently we only support SHA256 hash function.
201-
// Return error if any other function is selected.
202-
if let Ok(hash_function) = CStr::from_ptr(mdname).to_str() {
203-
if hash_function != "SHA256" && hash_function != "SHA2-256" {
204-
return Err("Invalid hash function".into());
205-
}
196+
writer_sig_ctx.keyobj = Some(prov_key.clone());
197+
let key_data = match writer_sig_ctx.keyobj {
198+
None => {
199+
return Err("Key Object not set.".into())
206200
}
201+
Some(ref keyobj) => keyobj.read().unwrap(),
202+
};
207203

208-
Ok(parsec_provider_signature_set_params(ctx, params))
209-
},
210-
);
204+
let key_name = match key_data.get_key_name() {
205+
None => return Err("Key name not set in the Key Object".into()),
206+
Some(ref name) => name,
207+
};
208+
// Currently we only support SHA256 hash function.
209+
// Return error if any other function is selected.
210+
if let Ok(hash_function) = CStr::from_ptr(mdname).to_str() {
211+
if hash_function != "SHA256" && hash_function != "SHA2-256" {
212+
return Err("Invalid hash function".into());
213+
}
214+
}
215+
let key_attributes = key_data
216+
.get_provctx()
217+
.get_client()
218+
.key_attributes(key_name)
219+
.map_err(|e| format!("Failed to get specified key's attributes: {}", e))?;
220+
match key_attributes.key_type {
221+
Type::RsaKeyPair => Ok(parsec_provider_signature_set_params(ctx, params)),
222+
Type::EccKeyPair {
223+
curve_family: EccFamily::SecpR1,
224+
} => Ok(parsec_provider_signature_ecdsa_set_params(ctx, params)),
225+
_ => Err("Key type not recognized".to_string().into()),
226+
}
227+
});
211228

212229
match result {
213230
Ok(result) => result,

0 commit comments

Comments
 (0)