@@ -570,6 +570,63 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_match(
570
570
}
571
571
}
572
572
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
+
573
630
/*
574
631
should duplicate data subsets indicated by selection or the whole key data keydata_from and create a new provider side
575
632
key object with the data.
@@ -644,6 +701,7 @@ const OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS_PTR: KeyMgmtGettableParamsPtr =
644
701
parsec_provider_kmgmt_gettable_params;
645
702
646
703
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;
647
705
648
706
const PARSEC_PROVIDER_KEYMGMT_IMPL : [ OSSL_DISPATCH ; 13 ] = [
649
707
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] = [
732
790
OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS_PTR
733
791
)
734
792
} ,
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 ) } ,
736
794
ossl_dispatch ! ( ) ,
737
795
] ;
738
796
0 commit comments