@@ -672,6 +672,147 @@ extern "C" {
672672                                  hashfp :  EllswiftEcdhHashFn , 
673673                                  data :  * mut  c_void ) 
674674                                  -> c_int ; 
675+ 
676+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_pubnonce_parse" ) ]  
677+     pub  fn  secp256k1_musig_pubnonce_parse ( 
678+         cx :  * const  Context , 
679+         nonce :  * mut  MusigPubNonce , 
680+         in66 :  * const  c_uchar , 
681+     )  -> c_int ; 
682+ 
683+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_pubnonce_serialize" ) ]  
684+     pub  fn  secp256k1_musig_pubnonce_serialize ( 
685+         cx :  * const  Context , 
686+         out66 :  * mut  c_uchar , 
687+         nonce :  * const  MusigPubNonce , 
688+     )  -> c_int ; 
689+ 
690+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_aggnonce_parse" ) ]  
691+     pub  fn  secp256k1_musig_aggnonce_parse ( 
692+         cx :  * const  Context , 
693+         nonce :  * mut  MusigAggNonce , 
694+         in66 :  * const  c_uchar , 
695+     )  -> c_int ; 
696+ 
697+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_aggnonce_serialize" ) ]  
698+     pub  fn  secp256k1_musig_aggnonce_serialize ( 
699+         cx :  * const  Context , 
700+         out66 :  * mut  c_uchar , 
701+         nonce :  * const  MusigAggNonce , 
702+     )  -> c_int ; 
703+ 
704+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_partial_sig_parse" ) ]  
705+     pub  fn  secp256k1_musig_partial_sig_parse ( 
706+         cx :  * const  Context , 
707+         sig :  * mut  MusigPartialSignature , 
708+         in32 :  * const  c_uchar , 
709+     )  -> c_int ; 
710+ 
711+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_partial_sig_serialize" ) ]  
712+     pub  fn  secp256k1_musig_partial_sig_serialize ( 
713+         cx :  * const  Context , 
714+         out32 :  * mut  c_uchar , 
715+         sig :  * const  MusigPartialSignature , 
716+     )  -> c_int ; 
717+ 
718+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_pubkey_agg" ) ]  
719+     pub  fn  secp256k1_musig_pubkey_agg ( 
720+         cx :  * const  Context , 
721+         agg_pk :  * mut  XOnlyPublicKey , 
722+         keyagg_cache :  * mut  MusigKeyAggCache , 
723+         pubkeys :  * const  * const  PublicKey , 
724+         n_pubkeys :  size_t , 
725+     )  -> c_int ; 
726+ 
727+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_11_musig_pubkey_get" ) ]  
728+     pub  fn  secp256k1_musig_pubkey_get ( 
729+         cx :  * const  Context , 
730+         agg_pk :  * mut  PublicKey , 
731+         keyagg_cache :  * const  MusigKeyAggCache , 
732+     )  -> c_int ; 
733+ 
734+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_pubkey_ec_tweak_add" ) ]  
735+     pub  fn  secp256k1_musig_pubkey_ec_tweak_add ( 
736+         cx :  * const  Context , 
737+         output_pubkey :  * mut  PublicKey , 
738+         keyagg_cache :  * mut  MusigKeyAggCache , 
739+         tweak32 :  * const  c_uchar , 
740+     )  -> c_int ; 
741+ 
742+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_pubkey_xonly_tweak_add" ) ]  
743+     pub  fn  secp256k1_musig_pubkey_xonly_tweak_add ( 
744+         cx :  * const  Context , 
745+         output_pubkey :  * mut  PublicKey , 
746+         keyagg_cache :  * mut  MusigKeyAggCache , 
747+         tweak32 :  * const  c_uchar , 
748+     )  -> c_int ; 
749+ 
750+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_nonce_gen" ) ]  
751+     pub  fn  secp256k1_musig_nonce_gen ( 
752+         cx :  * const  Context , 
753+         secnonce :  * mut  MusigSecNonce , 
754+         pubnonce :  * mut  MusigPubNonce , 
755+         session_secrand32 :  * const  c_uchar , 
756+         seckey :  * const  c_uchar , 
757+         pubkey :  * const  PublicKey , 
758+         msg32 :  * const  c_uchar , 
759+         keyagg_cache :  * const  MusigKeyAggCache , 
760+         extra_input32 :  * const  c_uchar , 
761+     )  -> c_int ; 
762+ 
763+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_nonce_agg" ) ]  
764+     pub  fn  secp256k1_musig_nonce_agg ( 
765+         cx :  * const  Context , 
766+         aggnonce :  * mut  MusigAggNonce , 
767+         pubnonces :  * const  * const  MusigPubNonce , 
768+         n_pubnonces :  size_t , 
769+     )  -> c_int ; 
770+ 
771+ 
772+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_nonce_process" ) ]  
773+     pub  fn  secp256k1_musig_nonce_process ( 
774+         cx :  * const  Context , 
775+         session :  * mut  MusigSession , 
776+         aggnonce :  * const  MusigAggNonce , 
777+         msg32 :  * const  c_uchar , 
778+         keyagg_cache :  * const  MusigKeyAggCache , 
779+     )  -> c_int ; 
780+ 
781+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_partial_sign" ) ]  
782+     pub  fn  secp256k1_musig_partial_sign ( 
783+         cx :  * const  Context , 
784+         partial_sig :  * mut  MusigPartialSignature , 
785+         secnonce :  * mut  MusigSecNonce , 
786+         keypair :  * const  Keypair , 
787+         keyagg_cache :  * const  MusigKeyAggCache , 
788+         session :  * const  MusigSession , 
789+     )  -> c_int ; 
790+ 
791+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_partial_sig_verify" ) ]  
792+     pub  fn  secp256k1_musig_partial_sig_verify ( 
793+         cx :  * const  Context , 
794+         partial_sig :  * const  MusigPartialSignature , 
795+         pubnonce :  * const  MusigPubNonce , 
796+         pubkey :  * const  PublicKey , 
797+         keyagg_cache :  * const  MusigKeyAggCache , 
798+         session :  * const  MusigSession , 
799+     )  -> c_int ; 
800+ 
801+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_musig_partial_sig_agg" ) ]  
802+     pub  fn  secp256k1_musig_partial_sig_agg ( 
803+         cx :  * const  Context , 
804+         sig64 :  * mut  c_uchar , 
805+         session :  * const  MusigSession , 
806+         partial_sigs :  * const  * const  MusigPartialSignature , 
807+         n_sigs :  size_t , 
808+     )  -> c_int ; 
809+ 
810+     #[ cfg_attr( not( rust_secp_no_symbol_renaming) ,  link_name = "rustsecp256k1_v0_11_ec_pubkey_sort" ) ]  
811+     pub  fn  secp256k1_ec_pubkey_sort ( 
812+         ctx :  * const  Context , 
813+         pubkeys :  * mut  * const  PublicKey , 
814+         n_pubkeys :  size_t 
815+     )  -> c_int ; 
675816} 
676817
677818#[ cfg( not( secp256k1_fuzz) ) ]  
@@ -1097,6 +1238,94 @@ impl <T: CPtr> CPtr for Option<T> {
10971238        } 
10981239    } 
10991240} 
1241+ /// Total length (in bytes) of the key aggregation context. 
1242+ /// This structure packs all metadata needed for aggregating individual public keys 
1243+ /// into a single MuSig2 aggregated key (including coefficients and any extra metadata). 
1244+ pub  const  MUSIG_KEYAGG_LEN :  usize  = 197 ; 
1245+ 
1246+ /// Length (in bytes) of the secret nonce structure used in a MuSig2 session. 
1247+ /// It holds the secret (ephemeral) nonces used internally for nonce derivation 
1248+ /// before the corresponding public nonces are computed. 
1249+ pub  const  MUSIG_SECNONCE_LEN :  usize  = 132 ; 
1250+ 
1251+ /// Length (in bytes) of the public nonce structure. 
1252+ /// This is derived from the secret nonce and shared among participants to build 
1253+ /// nonce commitments in the MuSig2 protocol. 
1254+ pub  const  MUSIG_PUBNONCE_LEN :  usize  = 132 ; 
1255+ 
1256+ /// Length (in bytes) of the aggregated nonce structure. 
1257+ /// Represents the combined nonce obtained by aggregating the individual public nonces 
1258+ /// from all participants for the final signature computation. 
1259+ pub  const  MUSIG_AGGNONCE_LEN :  usize  = 132 ; 
1260+ 
1261+ /// Serialized length (in bytes) of the aggregated nonce. 
1262+ /// This is the compact form (typically using a compressed representation) used for 
1263+ /// transmitting or storing the aggregated nonce. 
1264+ pub  const  MUSIG_AGGNONCE_SERIALIZED_LEN :  usize  = 66 ; 
1265+ 
1266+ /// Serialized length (in bytes) of an individual public nonce. 
1267+ /// This compact serialized form is what gets exchanged between signers. 
1268+ pub  const  MUSIG_PUBNONCE_SERIALIZED_LEN :  usize  = 66 ; 
1269+ 
1270+ /// Length (in bytes) of the session structure. 
1271+ /// The session object holds all state needed for a MuSig2 signing session (e.g. aggregated nonce, 
1272+ /// key aggregation info, and other state necessary for computing partial signatures). 
1273+ pub  const  MUSIG_SESSION_LEN :  usize  = 133 ; 
1274+ 
1275+ /// Length (in bytes) of the internal representation of a partial signature. 
1276+ /// This structure include magic bytes ([0xeb, 0xfb, 0x1a, 0x32]) alongside the actual signature scalar. 
1277+ pub  const  MUSIG_PART_SIG_LEN :  usize  = 36 ; 
1278+ 
1279+ /// Serialized length (in bytes) of a partial signature. 
1280+ /// This is the compact form (typically just the 32-byte scalar) that is used when communicating 
1281+ /// partial signatures to be combined into the final signature. 
1282+ pub  const  MUSIG_PART_SIG_SERIALIZED_LEN :  usize  = 32 ; 
1283+ 
1284+ #[ repr( C ) ]  
1285+ #[ derive( Copy ,  Clone ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Hash ) ]  
1286+ pub  struct  MusigKeyAggCache ( [ c_uchar ;  MUSIG_KEYAGG_LEN ] ) ; 
1287+ impl_array_newtype ! ( MusigKeyAggCache ,  c_uchar,  MUSIG_KEYAGG_LEN ) ; 
1288+ impl_raw_debug ! ( MusigKeyAggCache ) ; 
1289+ 
1290+ #[ repr( C ) ]  
1291+ #[ derive( Copy ,  Clone ,  PartialEq ,  Eq ) ]  
1292+ pub  struct  MusigSecNonce ( [ c_uchar ;  MUSIG_SECNONCE_LEN ] ) ; 
1293+ impl_array_newtype ! ( MusigSecNonce ,  c_uchar,  MUSIG_SECNONCE_LEN ) ; 
1294+ impl_raw_debug ! ( MusigSecNonce ) ; 
1295+ 
1296+ impl  MusigSecNonce  { 
1297+     pub  fn  dangerous_from_bytes ( bytes :  [ c_uchar ;  MUSIG_SECNONCE_LEN ] )  -> Self  { 
1298+         MusigSecNonce ( bytes) 
1299+     } 
1300+ 
1301+     pub  fn  dangerous_into_bytes ( self )  -> [ c_uchar ;  MUSIG_SECNONCE_LEN ]  { 
1302+         self . 0 
1303+     } 
1304+ } 
1305+ 
1306+ #[ repr( C ) ]  
1307+ #[ derive( Copy ,  Clone ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Hash ) ]  
1308+ pub  struct  MusigPubNonce ( [ c_uchar ;  MUSIG_PUBNONCE_LEN ] ) ; 
1309+ impl_array_newtype ! ( MusigPubNonce ,  c_uchar,  MUSIG_PUBNONCE_LEN ) ; 
1310+ impl_raw_debug ! ( MusigPubNonce ) ; 
1311+ 
1312+ #[ repr( C ) ]  
1313+ #[ derive( Copy ,  Clone ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Hash ) ]  
1314+ pub  struct  MusigAggNonce ( [ c_uchar ;  MUSIG_AGGNONCE_LEN ] ) ; 
1315+ impl_array_newtype ! ( MusigAggNonce ,  c_uchar,  MUSIG_AGGNONCE_LEN ) ; 
1316+ impl_raw_debug ! ( MusigAggNonce ) ; 
1317+ 
1318+ #[ repr( C ) ]  
1319+ #[ derive( Copy ,  Clone ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Hash ) ]  
1320+ pub  struct  MusigSession ( [ c_uchar ;  MUSIG_SESSION_LEN ] ) ; 
1321+ impl_array_newtype ! ( MusigSession ,  c_uchar,  MUSIG_SESSION_LEN ) ; 
1322+ impl_raw_debug ! ( MusigSession ) ; 
1323+ 
1324+ #[ repr( C ) ]  
1325+ #[ derive( Copy ,  Clone ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Hash ) ]  
1326+ pub  struct  MusigPartialSignature ( [ c_uchar ;  MUSIG_PART_SIG_LEN ] ) ; 
1327+ impl_array_newtype ! ( MusigPartialSignature ,  c_uchar,  MUSIG_PART_SIG_LEN ) ; 
1328+ impl_raw_debug ! ( MusigPartialSignature ) ; 
11001329
11011330#[ cfg( secp256k1_fuzz) ]  
11021331mod  fuzz_dummy { 
0 commit comments