@@ -6607,6 +6607,203 @@ static void run_pubkey_comparison(void) {
6607
6607
CHECK (secp256k1_ec_pubkey_cmp (CTX , & pk2 , & pk1 ) > 0 );
6608
6608
}
6609
6609
6610
+
6611
+ static void test_hsort_is_sorted (int * ints , size_t n ) {
6612
+ size_t i ;
6613
+ for (i = 1 ; i < n ; i ++ ) {
6614
+ CHECK (ints [i - 1 ] <= ints [i ]);
6615
+ }
6616
+ }
6617
+
6618
+ static int test_hsort_cmp (const void * i1 , const void * i2 , void * counter ) {
6619
+ * (size_t * )counter += 1 ;
6620
+ return * (int * )i1 - * (int * )i2 ;
6621
+ }
6622
+
6623
+ #define NUM 64
6624
+ static void test_hsort (void ) {
6625
+ int ints [NUM ] = { 0 };
6626
+ size_t counter = 0 ;
6627
+ int i , j ;
6628
+
6629
+ secp256k1_hsort (ints , 0 , sizeof (ints [0 ]), test_hsort_cmp , & counter );
6630
+ CHECK (counter == 0 );
6631
+ secp256k1_hsort (ints , 1 , sizeof (ints [0 ]), test_hsort_cmp , & counter );
6632
+ CHECK (counter == 0 );
6633
+ secp256k1_hsort (ints , NUM , sizeof (ints [0 ]), test_hsort_cmp , & counter );
6634
+ CHECK (counter > 0 );
6635
+ test_hsort_is_sorted (ints , NUM );
6636
+
6637
+ /* Test hsort with length n array and random elements in
6638
+ * [-interval/2, interval/2] */
6639
+ for (i = 0 ; i < COUNT ; i ++ ) {
6640
+ int n = secp256k1_testrand_int (NUM );
6641
+ int interval = secp256k1_testrand_int (63 ) + 1 ;
6642
+ for (j = 0 ; j < n ; j ++ ) {
6643
+ ints [j ] = secp256k1_testrand_int (interval ) - interval /2 ;
6644
+ }
6645
+ secp256k1_hsort (ints , n , sizeof (ints [0 ]), test_hsort_cmp , & counter );
6646
+ test_hsort_is_sorted (ints , n );
6647
+ }
6648
+ }
6649
+ #undef NUM
6650
+
6651
+ static void test_sort_helper (secp256k1_pubkey * pk , size_t * pk_order , size_t n_pk ) {
6652
+ size_t i ;
6653
+ const secp256k1_pubkey * pk_test [5 ];
6654
+
6655
+ for (i = 0 ; i < n_pk ; i ++ ) {
6656
+ pk_test [i ] = & pk [pk_order [i ]];
6657
+ }
6658
+ secp256k1_ec_pubkey_sort (CTX , pk_test , n_pk );
6659
+ for (i = 0 ; i < n_pk ; i ++ ) {
6660
+ CHECK (secp256k1_memcmp_var (pk_test [i ], & pk [i ], sizeof (* pk_test [i ])) == 0 );
6661
+ }
6662
+ }
6663
+
6664
+ static void permute (size_t * arr , size_t n ) {
6665
+ size_t i ;
6666
+ for (i = n - 1 ; i >= 1 ; i -- ) {
6667
+ size_t tmp , j ;
6668
+ j = secp256k1_testrand_int (i + 1 );
6669
+ tmp = arr [i ];
6670
+ arr [i ] = arr [j ];
6671
+ arr [j ] = tmp ;
6672
+ }
6673
+ }
6674
+
6675
+ static void rand_pk (secp256k1_pubkey * pk ) {
6676
+ unsigned char seckey [32 ];
6677
+ secp256k1_keypair keypair ;
6678
+ secp256k1_testrand256 (seckey );
6679
+ CHECK (secp256k1_keypair_create (CTX , & keypair , seckey ) == 1 );
6680
+ CHECK (secp256k1_keypair_pub (CTX , pk , & keypair ) == 1 );
6681
+ }
6682
+
6683
+ static void test_sort_api (void ) {
6684
+ secp256k1_pubkey pks [2 ];
6685
+ const secp256k1_pubkey * pks_ptr [2 ];
6686
+
6687
+ pks_ptr [0 ] = & pks [0 ];
6688
+ pks_ptr [1 ] = & pks [1 ];
6689
+
6690
+ rand_pk (& pks [0 ]);
6691
+ rand_pk (& pks [1 ]);
6692
+
6693
+ CHECK (secp256k1_ec_pubkey_sort (CTX , pks_ptr , 2 ) == 1 );
6694
+ CHECK_ILLEGAL (CTX , secp256k1_ec_pubkey_sort (CTX , NULL , 2 ));
6695
+ CHECK (secp256k1_ec_pubkey_sort (CTX , pks_ptr , 0 ) == 1 );
6696
+ /* Test illegal public keys */
6697
+ memset (& pks [0 ], 0 , sizeof (pks [0 ]));
6698
+ CHECK_ILLEGAL_VOID (CTX , CHECK (secp256k1_ec_pubkey_sort (CTX , pks_ptr , 2 ) == 1 ));
6699
+ memset (& pks [1 ], 0 , sizeof (pks [1 ]));
6700
+ {
6701
+ int32_t ecount = 0 ;
6702
+ secp256k1_context_set_illegal_callback (CTX , counting_callback_fn , & ecount );
6703
+ CHECK (secp256k1_ec_pubkey_sort (CTX , pks_ptr , 2 ) == 1 );
6704
+ CHECK (ecount == 2 );
6705
+ secp256k1_context_set_illegal_callback (CTX , NULL , NULL );
6706
+ }
6707
+ }
6708
+
6709
+ static void test_sort (void ) {
6710
+ secp256k1_pubkey pk [5 ];
6711
+ unsigned char pk_ser [5 ][33 ] = {
6712
+ { 0x02 , 0x08 },
6713
+ { 0x02 , 0x0b },
6714
+ { 0x02 , 0x0c },
6715
+ { 0x03 , 0x05 },
6716
+ { 0x03 , 0x0a },
6717
+ };
6718
+ int i ;
6719
+ size_t pk_order [5 ] = { 0 , 1 , 2 , 3 , 4 };
6720
+
6721
+ for (i = 0 ; i < 5 ; i ++ ) {
6722
+ CHECK (secp256k1_ec_pubkey_parse (CTX , & pk [i ], pk_ser [i ], sizeof (pk_ser [i ])));
6723
+ }
6724
+
6725
+ permute (pk_order , 1 );
6726
+ test_sort_helper (pk , pk_order , 1 );
6727
+ permute (pk_order , 2 );
6728
+ test_sort_helper (pk , pk_order , 2 );
6729
+ permute (pk_order , 3 );
6730
+ test_sort_helper (pk , pk_order , 3 );
6731
+ for (i = 0 ; i < COUNT ; i ++ ) {
6732
+ permute (pk_order , 4 );
6733
+ test_sort_helper (pk , pk_order , 4 );
6734
+ }
6735
+ for (i = 0 ; i < COUNT ; i ++ ) {
6736
+ permute (pk_order , 5 );
6737
+ test_sort_helper (pk , pk_order , 5 );
6738
+ }
6739
+ /* Check that sorting also works for random pubkeys */
6740
+ for (i = 0 ; i < COUNT ; i ++ ) {
6741
+ int j ;
6742
+ const secp256k1_pubkey * pk_ptr [5 ];
6743
+ for (j = 0 ; j < 5 ; j ++ ) {
6744
+ rand_pk (& pk [j ]);
6745
+ pk_ptr [j ] = & pk [j ];
6746
+ }
6747
+ secp256k1_ec_pubkey_sort (CTX , pk_ptr , 5 );
6748
+ for (j = 1 ; j < 5 ; j ++ ) {
6749
+ CHECK (secp256k1_ec_pubkey_sort_cmp (& pk_ptr [j - 1 ], & pk_ptr [j ], CTX ) <= 0 );
6750
+ }
6751
+ }
6752
+ }
6753
+
6754
+ /* Test vectors from BIP-MuSig2 */
6755
+ static void test_sort_vectors (void ) {
6756
+ enum { N_PUBKEYS = 6 };
6757
+ unsigned char pk_ser [N_PUBKEYS ][33 ] = {
6758
+ { 0x02 , 0xDD , 0x30 , 0x8A , 0xFE , 0xC5 , 0x77 , 0x7E , 0x13 , 0x12 , 0x1F ,
6759
+ 0xA7 , 0x2B , 0x9C , 0xC1 , 0xB7 , 0xCC , 0x01 , 0x39 , 0x71 , 0x53 , 0x09 ,
6760
+ 0xB0 , 0x86 , 0xC9 , 0x60 , 0xE1 , 0x8F , 0xD9 , 0x69 , 0x77 , 0x4E , 0xB8 },
6761
+ { 0x02 , 0xF9 , 0x30 , 0x8A , 0x01 , 0x92 , 0x58 , 0xC3 , 0x10 , 0x49 , 0x34 ,
6762
+ 0x4F , 0x85 , 0xF8 , 0x9D , 0x52 , 0x29 , 0xB5 , 0x31 , 0xC8 , 0x45 , 0x83 ,
6763
+ 0x6F , 0x99 , 0xB0 , 0x86 , 0x01 , 0xF1 , 0x13 , 0xBC , 0xE0 , 0x36 , 0xF9 },
6764
+ { 0x03 , 0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F , 0x36 , 0x18 ,
6765
+ 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE , 0x58 , 0xFE , 0xAE , 0x1D , 0xA2 ,
6766
+ 0xDE , 0xCE , 0xD8 , 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59 },
6767
+ { 0x02 , 0x35 , 0x90 , 0xA9 , 0x4E , 0x76 , 0x8F , 0x8E , 0x18 , 0x15 , 0xC2 ,
6768
+ 0xF2 , 0x4B , 0x4D , 0x80 , 0xA8 , 0xE3 , 0x14 , 0x93 , 0x16 , 0xC3 , 0x51 ,
6769
+ 0x8C , 0xE7 , 0xB7 , 0xAD , 0x33 , 0x83 , 0x68 , 0xD0 , 0x38 , 0xCA , 0x66 },
6770
+ { 0x02 , 0xDD , 0x30 , 0x8A , 0xFE , 0xC5 , 0x77 , 0x7E , 0x13 , 0x12 , 0x1F ,
6771
+ 0xA7 , 0x2B , 0x9C , 0xC1 , 0xB7 , 0xCC , 0x01 , 0x39 , 0x71 , 0x53 , 0x09 ,
6772
+ 0xB0 , 0x86 , 0xC9 , 0x60 , 0xE1 , 0x8F , 0xD9 , 0x69 , 0x77 , 0x4E , 0xFF },
6773
+ { 0x02 , 0xDD , 0x30 , 0x8A , 0xFE , 0xC5 , 0x77 , 0x7E , 0x13 , 0x12 , 0x1F ,
6774
+ 0xA7 , 0x2B , 0x9C , 0xC1 , 0xB7 , 0xCC , 0x01 , 0x39 , 0x71 , 0x53 , 0x09 ,
6775
+ 0xB0 , 0x86 , 0xC9 , 0x60 , 0xE1 , 0x8F , 0xD9 , 0x69 , 0x77 , 0x4E , 0xB8 }
6776
+ };
6777
+ secp256k1_pubkey pubkeys [N_PUBKEYS ];
6778
+ secp256k1_pubkey * sorted [N_PUBKEYS ];
6779
+ const secp256k1_pubkey * pks_ptr [N_PUBKEYS ];
6780
+ int i ;
6781
+
6782
+ sorted [0 ] = & pubkeys [3 ];
6783
+ sorted [1 ] = & pubkeys [0 ];
6784
+ sorted [2 ] = & pubkeys [0 ];
6785
+ sorted [3 ] = & pubkeys [4 ];
6786
+ sorted [4 ] = & pubkeys [1 ];
6787
+ sorted [5 ] = & pubkeys [2 ];
6788
+
6789
+ for (i = 0 ; i < N_PUBKEYS ; i ++ ) {
6790
+ CHECK (secp256k1_ec_pubkey_parse (CTX , & pubkeys [i ], pk_ser [i ], sizeof (pk_ser [i ])));
6791
+ pks_ptr [i ] = & pubkeys [i ];
6792
+ }
6793
+ CHECK (secp256k1_ec_pubkey_sort (CTX , pks_ptr , N_PUBKEYS ) == 1 );
6794
+ for (i = 0 ; i < N_PUBKEYS ; i ++ ) {
6795
+ CHECK (secp256k1_memcmp_var (pks_ptr [i ], sorted [i ], sizeof (secp256k1_pubkey )) == 0 );
6796
+ }
6797
+ }
6798
+
6799
+ static void run_pubkey_sort (void ) {
6800
+ test_hsort ();
6801
+ test_sort_api ();
6802
+ test_sort ();
6803
+ test_sort_vectors ();
6804
+ }
6805
+
6806
+
6610
6807
static void run_random_pubkeys (void ) {
6611
6808
int i ;
6612
6809
for (i = 0 ; i < 10 * COUNT ; i ++ ) {
@@ -7622,6 +7819,7 @@ int main(int argc, char **argv) {
7622
7819
/* ecdsa tests */
7623
7820
run_ec_illegal_argument_tests ();
7624
7821
run_pubkey_comparison ();
7822
+ run_pubkey_sort ();
7625
7823
run_random_pubkeys ();
7626
7824
run_ecdsa_der_parse ();
7627
7825
run_ecdsa_sign_verify ();
0 commit comments