1
1
use core:: { fmt, hash} ;
2
- use { types:: * , Context , NonceFn , PublicKey , Signature } ;
2
+ use { types:: * , Context , KeyPair , NonceFn , PublicKey , Signature , XOnlyPublicKey } ;
3
+ use { secp256k1_xonly_pubkey_from_pubkey} ;
3
4
4
5
/// Rangeproof maximum length
5
6
pub const RANGEPROOF_MAX_LENGTH : size_t = 5134 ;
@@ -349,6 +350,19 @@ extern "C" {
349
350
input_len : size_t ,
350
351
) -> c_int ;
351
352
353
+ #[ cfg_attr(
354
+ not( feature = "external-symbols" ) ,
355
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_pubkey_agg"
356
+ ) ]
357
+ pub fn secp256k1_musig_pubkey_agg (
358
+ cx : * const Context ,
359
+ scratch : * mut ScratchSpace ,
360
+ combined_pk : * mut XOnlyPublicKey ,
361
+ pre_session : * mut MusigKeyaggCache ,
362
+ pubkeys : * const * const XOnlyPublicKey ,
363
+ n_pubkeys : size_t ,
364
+ ) -> c_int ;
365
+
352
366
#[ cfg_attr(
353
367
not( feature = "external-symbols" ) ,
354
368
link_name = "rustsecp256k1zkp_v0_4_0_whitelist_signature_serialize"
@@ -360,6 +374,17 @@ extern "C" {
360
374
sig : * const WhitelistSignature ,
361
375
) -> c_int ;
362
376
377
+ #[ cfg_attr(
378
+ not( feature = "external-symbols" ) ,
379
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_pubkey_tweak_add"
380
+ ) ]
381
+ pub fn secp256k1_musig_pubkey_tweak_add (
382
+ cx : * const Context ,
383
+ output_pubkey : * mut PublicKey ,
384
+ tweak32 : * const c_uchar ,
385
+ keyagg_cache : * mut MusigKeyaggCache ,
386
+ ) -> c_int ;
387
+
363
388
#[ cfg_attr(
364
389
not( feature = "external-symbols" ) ,
365
390
link_name = "rustsecp256k1zkp_v0_4_0_whitelist_sign"
@@ -378,6 +403,21 @@ extern "C" {
378
403
noncedata : * mut c_void ,
379
404
) -> c_int ;
380
405
406
+ #[ cfg_attr(
407
+ not( feature = "external-symbols" ) ,
408
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_nonce_gen"
409
+ ) ]
410
+ pub fn secp256k1_musig_nonce_gen (
411
+ cx : * const Context ,
412
+ secnonce : * mut MusigSecNonce ,
413
+ pubnonce : * mut MusigPubNonce ,
414
+ session_id32 : * const c_uchar ,
415
+ seckey : * const c_uchar ,
416
+ msg32 : * const c_uchar ,
417
+ keyagg_cache : * const MusigKeyaggCache ,
418
+ extra_input32 : * const c_uchar ,
419
+ ) -> c_int ;
420
+
381
421
#[ cfg_attr(
382
422
not( feature = "external-symbols" ) ,
383
423
link_name = "rustsecp256k1zkp_v0_4_0_whitelist_verify"
@@ -390,6 +430,161 @@ extern "C" {
390
430
n_keys : size_t ,
391
431
sub_pubkey : * const PublicKey ,
392
432
) -> c_int ;
433
+
434
+ #[ cfg_attr(
435
+ not( feature = "external-symbols" ) ,
436
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_nonce_agg"
437
+ ) ]
438
+ pub fn secp256k1_musig_nonce_agg (
439
+ cx : * const Context ,
440
+ aggnonce : * const MusigAggNonce ,
441
+ pubnonces : * const * const MusigPubNonce ,
442
+ n_pubnonces : size_t ,
443
+ ) -> c_int ;
444
+
445
+ #[ cfg_attr(
446
+ not( feature = "external-symbols" ) ,
447
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_nonce_process"
448
+ ) ]
449
+ pub fn secp256k1_musig_nonce_process (
450
+ cx : * const Context ,
451
+ session : * mut MusigSession ,
452
+ aggnonce : * const MusigAggNonce ,
453
+ msg32 : * const c_uchar ,
454
+ keyagg_cache : * const MusigKeyaggCache ,
455
+ adaptor : * const PublicKey ,
456
+ ) -> c_int ;
457
+
458
+ #[ cfg_attr(
459
+ not( feature = "external-symbols" ) ,
460
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_pubnonce_serialize"
461
+ ) ]
462
+ pub fn secp256k1_musig_pubnonce_serialize (
463
+ cx : * const Context ,
464
+ out32 : * mut c_uchar ,
465
+ nonce : * const MusigPubNonce ,
466
+ ) -> c_int ;
467
+
468
+ #[ cfg_attr(
469
+ not( feature = "external-symbols" ) ,
470
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_pubnonce_parse"
471
+ ) ]
472
+ pub fn secp256k1_musig_pubnonce_parse (
473
+ cx : * const Context ,
474
+ nonce : * mut MusigPubNonce ,
475
+ in32 : * const c_uchar ,
476
+ ) -> c_int ;
477
+
478
+ #[ cfg_attr(
479
+ not( feature = "external-symbols" ) ,
480
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_aggnonce_serialize"
481
+ ) ]
482
+ pub fn secp256k1_musig_aggnonce_serialize (
483
+ cx : * const Context ,
484
+ out32 : * mut c_uchar ,
485
+ nonce : * const MusigAggNonce ,
486
+ ) -> c_int ;
487
+
488
+ #[ cfg_attr(
489
+ not( feature = "external-symbols" ) ,
490
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_aggnonce_parse"
491
+ ) ]
492
+ pub fn secp256k1_musig_aggnonce_parse (
493
+ cx : * const Context ,
494
+ nonce : * mut MusigAggNonce ,
495
+ in32 : * const c_uchar ,
496
+ ) -> c_int ;
497
+
498
+ #[ cfg_attr(
499
+ not( feature = "external-symbols" ) ,
500
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_partial_sig_serialize"
501
+ ) ]
502
+ pub fn secp256k1_musig_partial_sig_serialize (
503
+ cx : * const Context ,
504
+ out32 : * mut c_uchar ,
505
+ sig : * const MusigPartialSignature ,
506
+ ) -> c_int ;
507
+
508
+ #[ cfg_attr(
509
+ not( feature = "external-symbols" ) ,
510
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_partial_sig_parse"
511
+ ) ]
512
+ pub fn secp256k1_musig_partial_sig_parse (
513
+ cx : * const Context ,
514
+ sig : * mut MusigPartialSignature ,
515
+ in32 : * const c_uchar ,
516
+ ) -> c_int ;
517
+
518
+ #[ cfg_attr(
519
+ not( feature = "external-symbols" ) ,
520
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_partial_sign"
521
+ ) ]
522
+ pub fn secp256k1_musig_partial_sign (
523
+ cx : * const Context ,
524
+ partial_sig : * mut MusigPartialSignature ,
525
+ secnonce : * mut MusigSecNonce ,
526
+ keypair : * const KeyPair ,
527
+ keyagg_cache : * const MusigKeyaggCache ,
528
+ session : * const MusigSession ,
529
+ ) -> c_int ;
530
+
531
+ #[ cfg_attr(
532
+ not( feature = "external-symbols" ) ,
533
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_partial_sig_verify"
534
+ ) ]
535
+ pub fn secp256k1_musig_partial_sig_verify (
536
+ cx : * const Context ,
537
+ partial_sig : * const MusigPartialSignature ,
538
+ pubnonce : * const MusigPubNonce ,
539
+ pubkey : * const XOnlyPublicKey ,
540
+ keyagg_cache : * const MusigKeyaggCache ,
541
+ session : * const MusigSession ,
542
+ ) -> c_int ;
543
+
544
+ #[ cfg_attr(
545
+ not( feature = "external-symbols" ) ,
546
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_partial_sig_agg"
547
+ ) ]
548
+ pub fn secp256k1_musig_partial_sig_agg (
549
+ cx : * const Context ,
550
+ sig64 : * mut c_uchar ,
551
+ session : * const MusigSession ,
552
+ partial_sigs : * const * const MusigPartialSignature ,
553
+ n_sigs : size_t ,
554
+ ) -> c_int ;
555
+
556
+ #[ cfg_attr(
557
+ not( feature = "external-symbols" ) ,
558
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_nonce_parity"
559
+ ) ]
560
+ pub fn secp256k1_musig_nonce_parity (
561
+ cx : * const Context ,
562
+ nonce_parity : * mut c_int ,
563
+ session : * mut MusigSession ,
564
+ ) -> c_int ;
565
+
566
+ #[ cfg_attr(
567
+ not( feature = "external-symbols" ) ,
568
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_adapt"
569
+ ) ]
570
+ pub fn secp256k1_musig_adapt (
571
+ cx : * const Context ,
572
+ sig64 : * mut c_uchar ,
573
+ sec_adaptor32 : * const c_uchar ,
574
+ nonce_parity : c_int ,
575
+ ) -> c_int ;
576
+
577
+ #[ cfg_attr(
578
+ not( feature = "external-symbols" ) ,
579
+ link_name = "rustsecp256k1zkp_v0_4_0_musig_extract_adaptor"
580
+ ) ]
581
+ pub fn secp256k1_musig_extract_adaptor (
582
+ cx : * const Context ,
583
+ sec_adaptor32 : * mut c_uchar ,
584
+ sig64 : * const c_uchar ,
585
+ pre_sig64 : * const c_uchar ,
586
+ nonce_parity : c_int ,
587
+ ) -> c_int ;
393
588
}
394
589
395
590
#[ repr( C ) ]
@@ -599,3 +794,94 @@ impl EcdsaAdaptorSignature {
599
794
& self . 0
600
795
}
601
796
}
797
+
798
+ #[ repr( C ) ]
799
+ pub struct ScratchSpace ( c_int ) ;
800
+
801
+ pub const MUSIG_KEYAGG_LEN : usize = 165 ;
802
+ pub const MUSIG_SECNONCE_LEN : usize = 68 ;
803
+ pub const MUSIG_PUBNONCE_LEN : usize = 132 ;
804
+ pub const MUSIG_AGGNONCE_LEN : usize = 132 ;
805
+ pub const MUSIG_SESSION_LEN : usize = 133 ;
806
+ pub const MUSIG_PART_SIG_LEN : usize = 36 ;
807
+
808
+ #[ repr( C ) ]
809
+ #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
810
+ pub struct MusigKeyaggCache {
811
+ pub data : [ c_uchar ; MUSIG_KEYAGG_LEN ] ,
812
+ }
813
+
814
+ impl MusigKeyaggCache {
815
+ pub fn new ( ) -> Self {
816
+ Self { data : [ 0 ; MUSIG_KEYAGG_LEN ] }
817
+ }
818
+ }
819
+
820
+ #[ repr( C ) ]
821
+ #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
822
+ pub struct MusigSecNonce {
823
+ pub data : [ c_uchar ; MUSIG_SECNONCE_LEN ] ,
824
+ }
825
+
826
+ impl MusigSecNonce {
827
+ pub fn new ( ) -> Self {
828
+ Self { data : [ 0 ; MUSIG_SECNONCE_LEN ] }
829
+ }
830
+ }
831
+
832
+ #[ repr( C ) ]
833
+ #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
834
+ pub struct MusigPubNonce {
835
+ pub data : [ c_uchar ; MUSIG_PUBNONCE_LEN ] ,
836
+ }
837
+
838
+ impl MusigPubNonce {
839
+ pub fn new ( ) -> Self {
840
+ Self { data : [ 0 ; MUSIG_PUBNONCE_LEN ] }
841
+ }
842
+ }
843
+
844
+ #[ repr( C ) ]
845
+ #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
846
+ pub struct MusigAggNonce {
847
+ pub data : [ c_uchar ; MUSIG_AGGNONCE_LEN ] ,
848
+ }
849
+
850
+ impl MusigAggNonce {
851
+ pub fn new ( ) -> Self {
852
+ Self { data : [ 0 ; MUSIG_AGGNONCE_LEN ] }
853
+ }
854
+ }
855
+
856
+ #[ repr( C ) ]
857
+ #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
858
+ pub struct MusigSession {
859
+ pub data : [ c_uchar ; MUSIG_SESSION_LEN ] ,
860
+ }
861
+
862
+ impl MusigSession {
863
+ pub fn new ( ) -> Self {
864
+ Self { data : [ 0 ; MUSIG_SESSION_LEN ] }
865
+ }
866
+ }
867
+
868
+ #[ repr( C ) ]
869
+ #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
870
+ pub struct MusigPartialSignature {
871
+ pub data : [ c_uchar ; MUSIG_PART_SIG_LEN ] ,
872
+ }
873
+
874
+ impl MusigPartialSignature {
875
+ pub fn new ( ) -> Self {
876
+ Self { data : [ 0 ; MUSIG_PART_SIG_LEN ] }
877
+ }
878
+ }
879
+
880
+ pub fn xonly_from_pubkey ( cx : * const Context , pubkey : * const PublicKey ) -> ( XOnlyPublicKey , c_int ) {
881
+ unsafe {
882
+ let mut xonly = XOnlyPublicKey :: new ( ) ;
883
+ let mut parity = 0 ;
884
+ secp256k1_xonly_pubkey_from_pubkey ( cx, & mut xonly, & mut parity, pubkey) ;
885
+ ( xonly, parity)
886
+ }
887
+ }
0 commit comments