@@ -907,6 +907,28 @@ void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) {
907907 CHECK (secp256k1_fe_equal_var (& b -> y , & b -> y ));
908908}
909909
910+ /* This compares jacobian points including their Z, not just their geometric meaning. */
911+ int gej_xyz_equals_gej (const secp256k1_gej_t * a , const secp256k1_gej_t * b ) {
912+ secp256k1_gej_t a2 ;
913+ secp256k1_gej_t b2 ;
914+ int ret = 1 ;
915+ ret &= a -> infinity == b -> infinity ;
916+ if (ret && !a -> infinity ) {
917+ a2 = * a ;
918+ b2 = * b ;
919+ secp256k1_fe_normalize (& a2 .x );
920+ secp256k1_fe_normalize (& a2 .y );
921+ secp256k1_fe_normalize (& a2 .z );
922+ secp256k1_fe_normalize (& b2 .x );
923+ secp256k1_fe_normalize (& b2 .y );
924+ secp256k1_fe_normalize (& b2 .z );
925+ ret &= secp256k1_fe_cmp_var (& a2 .x , & b2 .x ) == 0 ;
926+ ret &= secp256k1_fe_cmp_var (& a2 .y , & b2 .y ) == 0 ;
927+ ret &= secp256k1_fe_cmp_var (& a2 .z , & b2 .z ) == 0 ;
928+ }
929+ return ret ;
930+ }
931+
910932void ge_equals_gej (const secp256k1_ge_t * a , const secp256k1_gej_t * b ) {
911933 secp256k1_fe_t z2s ;
912934 secp256k1_fe_t u1 , u2 , s1 , s2 ;
@@ -1033,6 +1055,9 @@ void test_ge(void) {
10331055 secp256k1_ge_t * ge_set_all = (secp256k1_ge_t * )malloc ((4 * runs + 1 ) * sizeof (secp256k1_ge_t ));
10341056 secp256k1_ge_set_all_gej_var (4 * runs + 1 , ge_set_all , gej );
10351057 for (i = 0 ; i < 4 * runs + 1 ; i ++ ) {
1058+ secp256k1_fe_t s ;
1059+ random_fe_non_zero (& s );
1060+ secp256k1_gej_rescale (& gej [i ], & s );
10361061 ge_equals_gej (& ge_set_all [i ], & gej [i ]);
10371062 }
10381063 free (ge_set_all );
@@ -1203,6 +1228,87 @@ void run_wnaf(void) {
12031228 }
12041229}
12051230
1231+ void test_ecmult_constants (void ) {
1232+ /* Test ecmult_gen() for [0..36) and [order-36..0). */
1233+ secp256k1_scalar_t x ;
1234+ secp256k1_gej_t r ;
1235+ secp256k1_ge_t ng ;
1236+ int i ;
1237+ int j ;
1238+ secp256k1_ge_neg (& ng , & secp256k1_ge_const_g );
1239+ for (i = 0 ; i < 36 ; i ++ ) {
1240+ secp256k1_scalar_set_int (& x , i );
1241+ secp256k1_ecmult_gen (& ctx -> ecmult_gen_ctx , & r , & x );
1242+ for (j = 0 ; j < i ; j ++ ) {
1243+ if (j == i - 1 ) {
1244+ ge_equals_gej (& secp256k1_ge_const_g , & r );
1245+ }
1246+ secp256k1_gej_add_ge (& r , & r , & ng );
1247+ }
1248+ CHECK (secp256k1_gej_is_infinity (& r ));
1249+ }
1250+ for (i = 1 ; i <= 36 ; i ++ ) {
1251+ secp256k1_scalar_set_int (& x , i );
1252+ secp256k1_scalar_negate (& x , & x );
1253+ secp256k1_ecmult_gen (& ctx -> ecmult_gen_ctx , & r , & x );
1254+ for (j = 0 ; j < i ; j ++ ) {
1255+ if (j == i - 1 ) {
1256+ ge_equals_gej (& ng , & r );
1257+ }
1258+ secp256k1_gej_add_ge (& r , & r , & secp256k1_ge_const_g );
1259+ }
1260+ CHECK (secp256k1_gej_is_infinity (& r ));
1261+ }
1262+ }
1263+
1264+ void run_ecmult_constants (void ) {
1265+ test_ecmult_constants ();
1266+ }
1267+
1268+ void test_ecmult_gen_blind (void ) {
1269+ /* Test ecmult_gen() blinding and confirm that the blinding changes, the affline points match, and the z's don't match. */
1270+ secp256k1_scalar_t key ;
1271+ secp256k1_scalar_t b ;
1272+ unsigned char seed32 [32 ];
1273+ secp256k1_gej_t pgej ;
1274+ secp256k1_gej_t pgej2 ;
1275+ secp256k1_gej_t i ;
1276+ secp256k1_ge_t pge ;
1277+ random_scalar_order_test (& key );
1278+ secp256k1_ecmult_gen (& ctx -> ecmult_gen_ctx , & pgej , & key );
1279+ secp256k1_rand256 (seed32 );
1280+ b = ctx -> ecmult_gen_ctx .blind ;
1281+ i = ctx -> ecmult_gen_ctx .initial ;
1282+ secp256k1_ecmult_gen_blind (& ctx -> ecmult_gen_ctx , seed32 );
1283+ CHECK (!secp256k1_scalar_eq (& b , & ctx -> ecmult_gen_ctx .blind ));
1284+ secp256k1_ecmult_gen (& ctx -> ecmult_gen_ctx , & pgej2 , & key );
1285+ CHECK (!gej_xyz_equals_gej (& pgej , & pgej2 ));
1286+ CHECK (!gej_xyz_equals_gej (& i , & ctx -> ecmult_gen_ctx .initial ));
1287+ secp256k1_ge_set_gej (& pge , & pgej );
1288+ ge_equals_gej (& pge , & pgej2 );
1289+ }
1290+
1291+ void test_ecmult_gen_blind_reset (void ) {
1292+ /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */
1293+ secp256k1_scalar_t b ;
1294+ secp256k1_gej_t initial ;
1295+ secp256k1_ecmult_gen_blind (& ctx -> ecmult_gen_ctx , 0 );
1296+ b = ctx -> ecmult_gen_ctx .blind ;
1297+ initial = ctx -> ecmult_gen_ctx .initial ;
1298+ secp256k1_ecmult_gen_blind (& ctx -> ecmult_gen_ctx , 0 );
1299+ CHECK (secp256k1_scalar_eq (& b , & ctx -> ecmult_gen_ctx .blind ));
1300+ CHECK (gej_xyz_equals_gej (& initial , & ctx -> ecmult_gen_ctx .initial ));
1301+ }
1302+
1303+ void run_ecmult_gen_blind (void ) {
1304+ int i ;
1305+ test_ecmult_gen_blind_reset ();
1306+ for (i = 0 ; i < 10 ; i ++ ) {
1307+ test_ecmult_gen_blind ();
1308+ }
1309+ }
1310+
1311+
12061312void random_sign (secp256k1_ecdsa_sig_t * sig , const secp256k1_scalar_t * key , const secp256k1_scalar_t * msg , int * recid ) {
12071313 secp256k1_scalar_t nonce ;
12081314 do {
@@ -1913,6 +2019,11 @@ int main(int argc, char **argv) {
19132019 run_context_tests ();
19142020 ctx = secp256k1_context_create (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY );
19152021
2022+ if (secp256k1_rand32 () & 1 ) {
2023+ secp256k1_rand256 (run32 );
2024+ CHECK (secp256k1_context_randomize (ctx , secp256k1_rand32 () & 1 ? run32 : NULL ));
2025+ }
2026+
19162027 run_sha256_tests ();
19172028 run_hmac_sha256_tests ();
19182029 run_rfc6979_hmac_sha256_tests ();
@@ -1941,6 +2052,8 @@ int main(int argc, char **argv) {
19412052 run_wnaf ();
19422053 run_point_times_order ();
19432054 run_ecmult_chain ();
2055+ run_ecmult_constants ();
2056+ run_ecmult_gen_blind ();
19442057
19452058 /* ecdsa tests */
19462059 run_random_pubkeys ();
0 commit comments