1010
1111#include <stdio.h>
1212#include <stdlib.h>
13+ #include <string.h>
1314
1415#include <time.h>
1516
@@ -135,6 +136,7 @@ void random_scalar_order(secp256k1_scalar *num) {
135136
136137void run_context_tests (void ) {
137138 secp256k1_pubkey pubkey ;
139+ secp256k1_pubkey zero_pubkey ;
138140 secp256k1_ecdsa_signature sig ;
139141 unsigned char ctmp [32 ];
140142 int32_t ecount ;
@@ -149,6 +151,8 @@ void run_context_tests(void) {
149151 secp256k1_scalar msg , key , nonce ;
150152 secp256k1_scalar sigr , sigs ;
151153
154+ memset (& zero_pubkey , 0 , sizeof (zero_pubkey ));
155+
152156 ecount = 0 ;
153157 ecount2 = 10 ;
154158 secp256k1_context_set_illegal_callback (vrfy , counting_illegal_callback_fn , & ecount );
@@ -201,12 +205,20 @@ void run_context_tests(void) {
201205 CHECK (ecount == 2 );
202206 CHECK (secp256k1_ec_pubkey_tweak_mul (sign , & pubkey , ctmp ) == 0 );
203207 CHECK (ecount2 == 13 );
204- CHECK (secp256k1_ec_pubkey_tweak_mul (vrfy , & pubkey , ctmp ) == 1 );
208+ CHECK (secp256k1_ec_pubkey_negate (vrfy , & pubkey ) == 1 );
205209 CHECK (ecount == 2 );
206- CHECK (secp256k1_context_randomize (vrfy , ctmp ) == 0 );
210+ CHECK (secp256k1_ec_pubkey_negate (sign , & pubkey ) == 1 );
211+ CHECK (ecount == 2 );
212+ CHECK (secp256k1_ec_pubkey_negate (sign , NULL ) == 0 );
213+ CHECK (ecount2 == 14 );
214+ CHECK (secp256k1_ec_pubkey_negate (vrfy , & zero_pubkey ) == 0 );
215+ CHECK (ecount == 3 );
216+ CHECK (secp256k1_ec_pubkey_tweak_mul (vrfy , & pubkey , ctmp ) == 1 );
207217 CHECK (ecount == 3 );
218+ CHECK (secp256k1_context_randomize (vrfy , ctmp ) == 0 );
219+ CHECK (ecount == 4 );
208220 CHECK (secp256k1_context_randomize (sign , NULL ) == 1 );
209- CHECK (ecount2 == 13 );
221+ CHECK (ecount2 == 14 );
210222 secp256k1_context_set_illegal_callback (vrfy , NULL , NULL );
211223 secp256k1_context_set_illegal_callback (sign , NULL , NULL );
212224
@@ -3436,6 +3448,7 @@ void test_ecdsa_end_to_end(void) {
34363448 unsigned char pubkeyc [65 ];
34373449 size_t pubkeyclen = 65 ;
34383450 secp256k1_pubkey pubkey ;
3451+ secp256k1_pubkey pubkey_tmp ;
34393452 unsigned char seckey [300 ];
34403453 size_t seckeylen = 300 ;
34413454
@@ -3457,6 +3470,13 @@ void test_ecdsa_end_to_end(void) {
34573470 memset (& pubkey , 0 , sizeof (pubkey ));
34583471 CHECK (secp256k1_ec_pubkey_parse (ctx , & pubkey , pubkeyc , pubkeyclen ) == 1 );
34593472
3473+ /* Verify negation changes the key and changes it back */
3474+ memcpy (& pubkey_tmp , & pubkey , sizeof (pubkey ));
3475+ CHECK (secp256k1_ec_pubkey_negate (ctx , & pubkey_tmp ) == 1 );
3476+ CHECK (memcmp (& pubkey_tmp , & pubkey , sizeof (pubkey )) != 0 );
3477+ CHECK (secp256k1_ec_pubkey_negate (ctx , & pubkey_tmp ) == 1 );
3478+ CHECK (memcmp (& pubkey_tmp , & pubkey , sizeof (pubkey )) == 0 );
3479+
34603480 /* Verify private key import and export. */
34613481 CHECK (ec_privkey_export_der (ctx , seckey , & seckeylen , privkey , secp256k1_rand_bits (1 ) == 1 ));
34623482 CHECK (ec_privkey_import_der (ctx , privkey2 , seckey , seckeylen ) == 1 );
0 commit comments