Skip to content

Commit c3df296

Browse files
Implement ecdsa OSSL_FUNC_KEYMGMT_MATCH
Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent 99c6920 commit c3df296

File tree

1 file changed

+59
-1
lines changed
  • parsec-openssl-provider/src/keymgmt

1 file changed

+59
-1
lines changed

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,63 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_match(
570570
}
571571
}
572572

573+
/*
574+
should check if the data subset indicated by selection in keydata1 and keydata2 match.
575+
It is assumed that the caller has ensured that keydata1 and keydata2 are both owned by the implementation of this function.
576+
*/
577+
pub unsafe extern "C" fn parsec_provider_ecdsa_kmgmt_match(
578+
keydata1: VOID_PTR,
579+
keydata2: VOID_PTR,
580+
selection: std::os::raw::c_int,
581+
) -> std::os::raw::c_int {
582+
let result = super::r#catch(Some(|| super::Error::PROVIDER_KEYMGMT_MATCH), || {
583+
if keydata1 == keydata2 {
584+
return Ok(OPENSSL_SUCCESS);
585+
}
586+
if keydata1.is_null() ^ keydata2.is_null() {
587+
return Err("One of the keydatas to compare is null".into());
588+
}
589+
590+
if selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY as std::os::raw::c_int != 0 {
591+
Arc::increment_strong_count(keydata1 as *const RwLock<ParsecProviderKeyObject>);
592+
Arc::increment_strong_count(keydata2 as *const RwLock<ParsecProviderKeyObject>);
593+
594+
let key_data1 = Arc::from_raw(keydata1 as *const RwLock<ParsecProviderKeyObject>);
595+
let key_data2 = Arc::from_raw(keydata2 as *const RwLock<ParsecProviderKeyObject>);
596+
597+
let reader_key_data1 = key_data1.read().unwrap();
598+
let reader_key_data2 = key_data2.read().unwrap();
599+
600+
match (
601+
reader_key_data1.get_ecdsa_key(),
602+
reader_key_data2.get_ecdsa_key(),
603+
) {
604+
(Some(a), Some(b)) => {
605+
let curve = EcCurve::NistP256.as_nid();
606+
let mut group = openssl::ec::EcGroup::from_curve_name(curve)?;
607+
group.set_asn1_flag(openssl::ec::Asn1Flag::NAMED_CURVE);
608+
609+
let mut big_num_context = openssl::bn::BigNumContext::new()?;
610+
let are_equal = a.eq(group.as_ref(), b, &mut big_num_context).map_err(|e| format!("Failed to match keys: {}", e))?;
611+
if are_equal {
612+
Ok(OPENSSL_SUCCESS)
613+
} else {
614+
Err("Keys do not match".into())
615+
}
616+
},
617+
_ => Err("Keys do not match".into()),
618+
}
619+
} else {
620+
Err("Keys do not match".into())
621+
}
622+
});
623+
624+
match result {
625+
Ok(result) => result,
626+
Err(()) => OPENSSL_ERROR,
627+
}
628+
}
629+
573630
/*
574631
should duplicate data subsets indicated by selection or the whole key data keydata_from and create a new provider side
575632
key object with the data.
@@ -644,6 +701,7 @@ const OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS_PTR: KeyMgmtGettableParamsPtr =
644701
parsec_provider_kmgmt_gettable_params;
645702

646703
const OSSL_FUNC_KEYMGMT_MATCH_PTR: KeyMgmtMatchPtr = parsec_provider_kmgmt_match;
704+
const OSSL_FUNC_KEYMGMT_ECDSA_MATCH_PTR: KeyMgmtMatchPtr = parsec_provider_ecdsa_kmgmt_match;
647705

648706
const PARSEC_PROVIDER_KEYMGMT_IMPL: [OSSL_DISPATCH; 13] = [
649707
unsafe { ossl_dispatch!(OSSL_FUNC_KEYMGMT_DUP, OSSL_FUNC_KEYMGMT_DUP_PTR) },
@@ -732,7 +790,7 @@ const PARSEC_PROVIDER_KEYMGMT_ECDSA_IMPL: [OSSL_DISPATCH; 12] = [
732790
OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS_PTR
733791
)
734792
},
735-
unsafe { ossl_dispatch!(OSSL_FUNC_KEYMGMT_MATCH, OSSL_FUNC_KEYMGMT_MATCH_PTR) },
793+
unsafe { ossl_dispatch!(OSSL_FUNC_KEYMGMT_MATCH, OSSL_FUNC_KEYMGMT_ECDSA_MATCH_PTR) },
736794
ossl_dispatch!(),
737795
];
738796

0 commit comments

Comments
 (0)