@@ -82,6 +82,15 @@ pub type SchnorrNonceFn = Option<unsafe extern "C" fn(
8282 data : * mut c_void ,
8383) -> c_int > ;
8484
85+ /// A hash function used by `ellswift_ecdh` to hash the final ECDH shared secret.
86+ pub type EllswiftEcdhHashFn = Option < unsafe extern "C" fn (
87+ output : * mut c_uchar ,
88+ x32 : * const c_uchar ,
89+ ell_a64 : * const c_uchar ,
90+ ell_b64 : * const c_uchar ,
91+ data : * mut c_void ,
92+ ) -> c_int > ;
93+
8594/// Data structure that contains additional arguments for schnorrsig_sign_custom.
8695#[ repr( C ) ]
8796pub struct SchnorrSigExtraParams {
@@ -517,11 +526,32 @@ impl core::hash::Hash for Keypair {
517526 }
518527}
519528
529+ /// Library-internal representation of a ElligatorSwift encoded group element.
530+ #[ repr( C ) ]
531+ #[ derive( Clone , Copy , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
532+ pub struct ElligatorSwift ( [ u8 ; 64 ] ) ;
533+
534+ impl ElligatorSwift {
535+ pub fn from_array ( arr : [ u8 ; 64 ] ) -> Self {
536+ ElligatorSwift ( arr)
537+ }
538+ pub fn to_array ( self ) -> [ u8 ; 64 ] {
539+ self . 0
540+ }
541+ }
542+
543+ impl_array_newtype ! ( ElligatorSwift , u8 , 64 ) ;
544+ impl_raw_debug ! ( ElligatorSwift ) ;
545+
520546extern "C" {
521547 /// Default ECDH hash function
522548 #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_ecdh_hash_function_default" ) ]
523549 pub static secp256k1_ecdh_hash_function_default: EcdhHashFn ;
524550
551+ /// Default ECDH hash function for BIP324 key establishment
552+ #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_ellswift_xdh_hash_function_bip324" ) ]
553+ pub static secp256k1_ellswift_xdh_hash_function_bip324: EllswiftEcdhHashFn ;
554+
525555 #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_nonce_function_rfc6979" ) ]
526556 pub static secp256k1_nonce_function_rfc6979: NonceFn ;
527557
@@ -600,6 +630,34 @@ extern "C" {
600630 output_pubkey : * mut PublicKey ,
601631 keypair : * const Keypair )
602632 -> c_int ;
633+ // Elligator Swift
634+ #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_ellswift_encode" ) ]
635+ pub fn secp256k1_ellswift_encode ( ctx : * const Context ,
636+ ell64 : * mut c_uchar ,
637+ pubkey : * const PublicKey ,
638+ rnd32 : * const c_uchar )
639+ -> c_int ;
640+ #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_ellswift_decode" ) ]
641+ pub fn secp256k1_ellswift_decode ( ctx : * const Context ,
642+ pubkey : * mut u8 ,
643+ ell64 : * const c_uchar )
644+ -> c_int ;
645+ #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_ellswift_create" ) ]
646+ pub fn secp256k1_ellswift_create ( ctx : * const Context ,
647+ ell64 : * mut c_uchar ,
648+ seckey32 : * const c_uchar ,
649+ aux_rand32 : * const c_uchar )
650+ -> c_int ;
651+ #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_9_0_ellswift_xdh" ) ]
652+ pub fn secp256k1_ellswift_xdh ( ctx : * const Context ,
653+ output : * mut c_uchar ,
654+ ell_a64 : * const c_uchar ,
655+ ell_b64 : * const c_uchar ,
656+ seckey32 : * const c_uchar ,
657+ party : c_int ,
658+ hashfp : EllswiftEcdhHashFn ,
659+ data : * mut c_void )
660+ -> c_int ;
603661}
604662
605663#[ cfg( not( secp256k1_fuzz) ) ]
0 commit comments