@@ -109,25 +109,35 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const se
109109 return 1 ;
110110}
111111
112- static int secp256k1_ecdsa_sig_recompute ( secp256k1_scalar_t * r2 , const secp256k1_ecdsa_sig_t * sig , const secp256k1_ge_t * pubkey , const secp256k1_scalar_t * message ) {
112+ static int secp256k1_ecdsa_sig_verify ( const secp256k1_ecdsa_sig_t * sig , const secp256k1_ge_t * pubkey , const secp256k1_scalar_t * message ) {
113113 if (secp256k1_scalar_is_zero (& sig -> r ) || secp256k1_scalar_is_zero (& sig -> s ))
114114 return 0 ;
115115
116- int ret = 0 ;
117116 secp256k1_scalar_t sn , u1 , u2 ;
118117 secp256k1_scalar_inverse_var (& sn , & sig -> s );
119118 secp256k1_scalar_mul (& u1 , & sn , message );
120119 secp256k1_scalar_mul (& u2 , & sn , & sig -> r );
121120 secp256k1_gej_t pubkeyj ; secp256k1_gej_set_ge (& pubkeyj , pubkey );
122121 secp256k1_gej_t pr ; secp256k1_ecmult (& pr , & pubkeyj , & u2 , & u1 );
123- if (!secp256k1_gej_is_infinity (& pr )) {
124- secp256k1_fe_t xr ; secp256k1_gej_get_x_var (& xr , & pr );
125- secp256k1_fe_normalize_var (& xr );
126- unsigned char xrb [32 ]; secp256k1_fe_get_b32 (xrb , & xr );
127- secp256k1_scalar_set_b32 (r2 , xrb , NULL );
128- ret = 1 ;
122+ if (secp256k1_gej_is_infinity (& pr )) {
123+ return 0 ;
124+ }
125+ unsigned char c [32 ];
126+ secp256k1_scalar_get_b32 (c , & sig -> r );
127+ secp256k1_fe_t xr ;
128+ secp256k1_fe_set_b32 (& xr , c );
129+ if (secp256k1_gej_eq_x_var (& xr , & pr )) {
130+ return 1 ;
131+ }
132+ if (secp256k1_fe_cmp_var (& xr , & secp256k1_ecdsa_consts -> p_minus_order ) >= 0 ) {
133+ // We can't add the order to r. This will be the case for almost every r.
134+ return 0 ;
129135 }
130- return ret ;
136+ secp256k1_fe_add (& xr , & secp256k1_ecdsa_consts -> order_as_fe );
137+ if (secp256k1_gej_eq_x_var (& xr , & pr )) {
138+ return 1 ;
139+ }
140+ return 0 ;
131141}
132142
133143static int secp256k1_ecdsa_sig_recover (const secp256k1_ecdsa_sig_t * sig , secp256k1_ge_t * pubkey , const secp256k1_scalar_t * message , int recid ) {
@@ -159,13 +169,6 @@ static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256
159169 return !secp256k1_gej_is_infinity (& qj );
160170}
161171
162- static int secp256k1_ecdsa_sig_verify (const secp256k1_ecdsa_sig_t * sig , const secp256k1_ge_t * pubkey , const secp256k1_scalar_t * message ) {
163- secp256k1_scalar_t r2 ;
164- int ret = 0 ;
165- ret = secp256k1_ecdsa_sig_recompute (& r2 , sig , pubkey , message ) && secp256k1_scalar_eq (& sig -> r , & r2 );
166- return ret ;
167- }
168-
169172static int secp256k1_ecdsa_sig_sign (secp256k1_ecdsa_sig_t * sig , const secp256k1_scalar_t * seckey , const secp256k1_scalar_t * message , const secp256k1_scalar_t * nonce , int * recid ) {
170173 secp256k1_gej_t rp ;
171174 secp256k1_ecmult_gen (& rp , nonce );
0 commit comments