@@ -3320,6 +3320,72 @@ void run_group_decompress(void) {
3320
3320
3321
3321
/***** ECMULT TESTS *****/
3322
3322
3323
+ void test_pre_g_table (const secp256k1_ge_storage * pre_g , size_t n ) {
3324
+ secp256k1_gej g2 ;
3325
+ secp256k1_ge p , q , gg ;
3326
+ secp256k1_fe dpx , dpy , dqx , dqy ;
3327
+ size_t i ;
3328
+
3329
+ CHECK (0 < n );
3330
+ secp256k1_ge_from_storage (& p , & pre_g [0 ]);
3331
+ secp256k1_gej_set_ge (& g2 , & p );
3332
+ secp256k1_gej_double_var (& g2 , & g2 , NULL );
3333
+ secp256k1_ge_set_gej_var (& gg , & g2 );
3334
+ secp256k1_fe_verify (& p .x );
3335
+ secp256k1_fe_verify (& p .y );
3336
+ CHECK (secp256k1_ge_is_valid_var (& p ));
3337
+ for (i = 1 ; i < n ; ++ i ) {
3338
+ secp256k1_fe_negate (& dpx , & p .x , 1 ); secp256k1_fe_add (& dpx , & gg .x ); secp256k1_fe_normalize_weak (& dpx );
3339
+ secp256k1_fe_negate (& dpy , & p .y , 1 ); secp256k1_fe_add (& dpy , & gg .y ); secp256k1_fe_normalize_weak (& dpy );
3340
+ /* Check that p is not equal to gg */
3341
+ CHECK (!secp256k1_fe_normalizes_to_zero_var (& dpx ) || !secp256k1_fe_normalizes_to_zero_var (& dpy ));
3342
+
3343
+ secp256k1_ge_from_storage (& q , & pre_g [i ]);
3344
+ secp256k1_fe_verify (& q .x );
3345
+ secp256k1_fe_verify (& q .y );
3346
+ CHECK (secp256k1_ge_is_valid_var (& q ));
3347
+
3348
+ secp256k1_fe_negate (& dqx , & q .x , 1 ); secp256k1_fe_add (& dqx , & gg .x ); secp256k1_fe_normalize_weak (& dqx );
3349
+ dqy = q .y ; secp256k1_fe_add (& dqy , & gg .y ); secp256k1_fe_normalize_weak (& dqy );
3350
+ /* Check that -q is not equal to gg */
3351
+ CHECK (!secp256k1_fe_normalizes_to_zero_var (& dqx ) || !secp256k1_fe_normalizes_to_zero_var (& dqy ));
3352
+
3353
+ /* Check that -q is not equal to p */
3354
+ CHECK (!secp256k1_fe_equal_var (& dpx , & dqx ) || !secp256k1_fe_equal_var (& dpy , & dqy ));
3355
+
3356
+ /* Check that p, -q and gg are colinear */
3357
+ secp256k1_fe_mul (& dpx , & dpx , & dqy );
3358
+ secp256k1_fe_mul (& dpy , & dpy , & dqx );
3359
+ CHECK (secp256k1_fe_equal_var (& dpx , & dpy ));
3360
+
3361
+ p = q ;
3362
+ }
3363
+ }
3364
+
3365
+ void run_ecmult_pre_g (void ) {
3366
+ secp256k1_ge_storage gs ;
3367
+ secp256k1_gej gj ;
3368
+ secp256k1_ge g ;
3369
+ size_t i ;
3370
+
3371
+ /* Check that the pre_g and pre_g_128 tables are consistent. */
3372
+ test_pre_g_table (secp256k1_pre_g , ECMULT_TABLE_SIZE (WINDOW_G ));
3373
+ test_pre_g_table (secp256k1_pre_g_128 , ECMULT_TABLE_SIZE (WINDOW_G ));
3374
+
3375
+ /* Check the first entry from the pre_g table. */
3376
+ secp256k1_ge_to_storage (& gs , & secp256k1_ge_const_g );
3377
+ CHECK (secp256k1_memcmp_var (& gs , & secp256k1_pre_g [0 ], sizeof (gs )) == 0 );
3378
+
3379
+ /* Check the first entry from the pre_g_128 table. */
3380
+ secp256k1_gej_set_ge (& gj , & secp256k1_ge_const_g );
3381
+ for (i = 0 ; i < 128 ; ++ i ) {
3382
+ secp256k1_gej_double_var (& gj , & gj , NULL );
3383
+ }
3384
+ secp256k1_ge_set_gej (& g , & gj );
3385
+ secp256k1_ge_to_storage (& gs , & g );
3386
+ CHECK (secp256k1_memcmp_var (& gs , & secp256k1_pre_g_128 [0 ], sizeof (gs )) == 0 );
3387
+ }
3388
+
3323
3389
void run_ecmult_chain (void ) {
3324
3390
/* random starting point A (on the curve) */
3325
3391
secp256k1_gej a = SECP256K1_GEJ_CONST (
@@ -6520,6 +6586,7 @@ int main(int argc, char **argv) {
6520
6586
run_group_decompress ();
6521
6587
6522
6588
/* ecmult tests */
6589
+ run_ecmult_pre_g ();
6523
6590
run_wnaf ();
6524
6591
run_point_times_order ();
6525
6592
run_ecmult_near_split_bound ();
0 commit comments