@@ -4809,6 +4809,55 @@ void test_random_pubkeys(void) {
48094809 }
48104810}
48114811
4812+ void run_pubkey_comparison (void ) {
4813+ unsigned char pk1_ser [33 ] = {
4814+ 0x02 ,
4815+ 0x58 , 0x84 , 0xb3 , 0xa2 , 0x4b , 0x97 , 0x37 , 0x88 , 0x92 , 0x38 , 0xa6 , 0x26 , 0x62 , 0x52 , 0x35 , 0x11 ,
4816+ 0xd0 , 0x9a , 0xa1 , 0x1b , 0x80 , 0x0b , 0x5e , 0x93 , 0x80 , 0x26 , 0x11 , 0xef , 0x67 , 0x4b , 0xd9 , 0x23
4817+ };
4818+ const unsigned char pk2_ser [33 ] = {
4819+ 0x02 ,
4820+ 0xde , 0x36 , 0x0e , 0x87 , 0x59 , 0x8f , 0x3c , 0x01 , 0x36 , 0x2a , 0x2a , 0xb8 , 0xc6 , 0xf4 , 0x5e , 0x4d ,
4821+ 0xb2 , 0xc2 , 0xd5 , 0x03 , 0xa7 , 0xf9 , 0xf1 , 0x4f , 0xa8 , 0xfa , 0x95 , 0xa8 , 0xe9 , 0x69 , 0x76 , 0x1c
4822+ };
4823+ secp256k1_pubkey pk1 ;
4824+ secp256k1_pubkey pk2 ;
4825+ int32_t ecount = 0 ;
4826+
4827+ CHECK (secp256k1_ec_pubkey_parse (ctx , & pk1 , pk1_ser , sizeof (pk1_ser )) == 1 );
4828+ CHECK (secp256k1_ec_pubkey_parse (ctx , & pk2 , pk2_ser , sizeof (pk2_ser )) == 1 );
4829+
4830+ secp256k1_context_set_illegal_callback (ctx , counting_illegal_callback_fn , & ecount );
4831+ CHECK (secp256k1_ec_pubkey_cmp (ctx , NULL , & pk2 ) < 0 );
4832+ CHECK (ecount == 1 );
4833+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk1 , NULL ) > 0 );
4834+ CHECK (ecount == 2 );
4835+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk1 , & pk2 ) < 0 );
4836+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk2 , & pk1 ) > 0 );
4837+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk1 , & pk1 ) == 0 );
4838+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk2 , & pk2 ) == 0 );
4839+ CHECK (ecount == 2 );
4840+ {
4841+ secp256k1_pubkey pk_tmp ;
4842+ memset (& pk_tmp , 0 , sizeof (pk_tmp )); /* illegal pubkey */
4843+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk_tmp , & pk2 ) < 0 );
4844+ CHECK (ecount == 3 );
4845+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk_tmp , & pk_tmp ) == 0 );
4846+ CHECK (ecount == 5 );
4847+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk2 , & pk_tmp ) > 0 );
4848+ CHECK (ecount == 6 );
4849+ }
4850+
4851+ secp256k1_context_set_illegal_callback (ctx , NULL , NULL );
4852+
4853+ /* Make pk2 the same as pk1 but with 3 rather than 2. Note that in
4854+ * an uncompressed encoding, these would have the opposite ordering */
4855+ pk1_ser [0 ] = 3 ;
4856+ CHECK (secp256k1_ec_pubkey_parse (ctx , & pk2 , pk1_ser , sizeof (pk1_ser )) == 1 );
4857+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk1 , & pk2 ) < 0 );
4858+ CHECK (secp256k1_ec_pubkey_cmp (ctx , & pk2 , & pk1 ) > 0 );
4859+ }
4860+
48124861void run_random_pubkeys (void ) {
48134862 int i ;
48144863 for (i = 0 ; i < 10 * count ; i ++ ) {
@@ -5860,6 +5909,7 @@ int main(int argc, char **argv) {
58605909#endif
58615910
58625911 /* ecdsa tests */
5912+ run_pubkey_comparison ();
58635913 run_random_pubkeys ();
58645914 run_ecdsa_der_parse ();
58655915 run_ecdsa_sign_verify ();
0 commit comments