@@ -672,6 +672,147 @@ extern "C" {
672
672
hashfp : EllswiftEcdhHashFn ,
673
673
data : * mut c_void )
674
674
-> c_int ;
675
+
676
+ #[ cfg_attr( not( rust_secp_no_symbol_renaming) , link_name = "rustsecp256k1_v0_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_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_10_0_ec_pubkey_sort" ) ]
811
+ pub fn secp256k1_ec_pubkey_sort (
812
+ ctx : * const Context ,
813
+ pubkeys : * const * const PublicKey ,
814
+ n_pubkeys : size_t
815
+ ) -> c_int ;
675
816
}
676
817
677
818
#[ cfg( not( secp256k1_fuzz) ) ]
@@ -1098,6 +1239,133 @@ impl <T: CPtr> CPtr for Option<T> {
1098
1239
}
1099
1240
}
1100
1241
1242
+ pub const MUSIG_KEYAGG_LEN : usize = 197 ;
1243
+ pub const MUSIG_SECNONCE_LEN : usize = 132 ;
1244
+ pub const MUSIG_PUBNONCE_LEN : usize = 132 ;
1245
+ pub const MUSIG_AGGNONCE_LEN : usize = 132 ;
1246
+ pub const MUSIG_AGGNONCE_SERIALIZED_LEN : usize = 66 ;
1247
+ pub const MUSIG_PUBNONCE_SERIALIZED_LEN : usize = 66 ;
1248
+ pub const MUSIG_SESSION_LEN : usize = 133 ;
1249
+ pub const MUSIG_PART_SIG_LEN : usize = 36 ;
1250
+
1251
+ #[ repr( C ) ]
1252
+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
1253
+ pub struct MusigKeyAggCache ( [ c_uchar ; MUSIG_KEYAGG_LEN ] ) ;
1254
+ impl_array_newtype ! ( MusigKeyAggCache , c_uchar, MUSIG_KEYAGG_LEN ) ;
1255
+ impl_raw_debug ! ( MusigKeyAggCache ) ;
1256
+
1257
+ impl MusigKeyAggCache {
1258
+ pub fn new ( ) -> Self {
1259
+ MusigKeyAggCache ( [ 0 ; MUSIG_KEYAGG_LEN ] )
1260
+ }
1261
+ }
1262
+
1263
+ impl Default for MusigKeyAggCache {
1264
+ fn default ( ) -> Self {
1265
+ Self :: new ( )
1266
+ }
1267
+ }
1268
+
1269
+ #[ repr( C ) ]
1270
+ #[ derive( Copy , Clone , PartialEq , Eq ) ]
1271
+ pub struct MusigSecNonce ( pub ( crate ) [ c_uchar ; MUSIG_SECNONCE_LEN ] ) ;
1272
+ impl_array_newtype ! ( MusigSecNonce , c_uchar, MUSIG_SECNONCE_LEN ) ;
1273
+ impl_raw_debug ! ( MusigSecNonce ) ;
1274
+
1275
+ impl MusigSecNonce {
1276
+ pub fn new ( ) -> Self {
1277
+ MusigSecNonce ( [ 0 ; MUSIG_SECNONCE_LEN ] )
1278
+ }
1279
+
1280
+ // No need for strong warning here, the user cannot use the ffi types directly in any of the APIs
1281
+ pub fn dangerous_from_bytes ( bytes : [ c_uchar ; MUSIG_SECNONCE_LEN ] ) -> Self {
1282
+ MusigSecNonce ( bytes)
1283
+ }
1284
+
1285
+ // No need for strong warning here, the user cannot use the ffi types directly in any of the high level APIs
1286
+ pub fn dangerous_into_bytes ( self ) -> [ c_uchar ; MUSIG_SECNONCE_LEN ] {
1287
+ self . 0
1288
+ }
1289
+ }
1290
+
1291
+ impl Default for MusigSecNonce {
1292
+ fn default ( ) -> Self {
1293
+ Self :: new ( )
1294
+ }
1295
+ }
1296
+
1297
+ #[ repr( C ) ]
1298
+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
1299
+ pub struct MusigPubNonce ( [ c_uchar ; MUSIG_PUBNONCE_LEN ] ) ;
1300
+ impl_array_newtype ! ( MusigPubNonce , c_uchar, MUSIG_PUBNONCE_LEN ) ;
1301
+ impl_raw_debug ! ( MusigPubNonce ) ;
1302
+
1303
+ impl MusigPubNonce {
1304
+ pub fn new ( ) -> Self {
1305
+ MusigPubNonce ( [ 0 ; MUSIG_PUBNONCE_LEN ] )
1306
+ }
1307
+ }
1308
+
1309
+ impl Default for MusigPubNonce {
1310
+ fn default ( ) -> Self {
1311
+ Self :: new ( )
1312
+ }
1313
+ }
1314
+
1315
+ #[ repr( C ) ]
1316
+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
1317
+ pub struct MusigAggNonce ( [ c_uchar ; MUSIG_AGGNONCE_LEN ] ) ;
1318
+ impl_array_newtype ! ( MusigAggNonce , c_uchar, MUSIG_AGGNONCE_LEN ) ;
1319
+ impl_raw_debug ! ( MusigAggNonce ) ;
1320
+
1321
+ impl MusigAggNonce {
1322
+ pub fn new ( ) -> Self {
1323
+ MusigAggNonce ( [ 0 ; MUSIG_AGGNONCE_LEN ] )
1324
+ }
1325
+ }
1326
+
1327
+ impl Default for MusigAggNonce {
1328
+ fn default ( ) -> Self {
1329
+ Self :: new ( )
1330
+ }
1331
+ }
1332
+
1333
+ #[ repr( C ) ]
1334
+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
1335
+ pub struct MusigSession ( [ c_uchar ; MUSIG_SESSION_LEN ] ) ;
1336
+ impl_array_newtype ! ( MusigSession , c_uchar, MUSIG_SESSION_LEN ) ;
1337
+ impl_raw_debug ! ( MusigSession ) ;
1338
+
1339
+ impl MusigSession {
1340
+ pub fn new ( ) -> Self {
1341
+ MusigSession ( [ 0 ; MUSIG_SESSION_LEN ] )
1342
+ }
1343
+ }
1344
+
1345
+ impl Default for MusigSession {
1346
+ fn default ( ) -> Self {
1347
+ Self :: new ( )
1348
+ }
1349
+ }
1350
+
1351
+ #[ repr( C ) ]
1352
+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
1353
+ pub struct MusigPartialSignature ( [ c_uchar ; MUSIG_PART_SIG_LEN ] ) ;
1354
+ impl_array_newtype ! ( MusigPartialSignature , c_uchar, MUSIG_PART_SIG_LEN ) ;
1355
+ impl_raw_debug ! ( MusigPartialSignature ) ;
1356
+
1357
+ impl MusigPartialSignature {
1358
+ pub fn new ( ) -> Self {
1359
+ MusigPartialSignature ( [ 0 ; MUSIG_PART_SIG_LEN ] )
1360
+ }
1361
+ }
1362
+
1363
+ impl Default for MusigPartialSignature {
1364
+ fn default ( ) -> Self {
1365
+ Self :: new ( )
1366
+ }
1367
+ }
1368
+
1101
1369
#[ cfg( secp256k1_fuzz) ]
1102
1370
mod fuzz_dummy {
1103
1371
use super :: * ;
0 commit comments