@@ -57,6 +57,7 @@ void random_group_element_test(secp256k1_ge_t *ge) {
57
57
do {
58
58
random_field_element_test (& fe );
59
59
if (secp256k1_ge_set_xo_var (ge , & fe , secp256k1_rand32 () & 1 )) {
60
+ secp256k1_fe_normalize (& ge -> y );
60
61
break ;
61
62
}
62
63
} while (1 );
@@ -914,7 +915,7 @@ void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) {
914
915
return ;
915
916
}
916
917
CHECK (secp256k1_fe_equal_var (& a -> x , & b -> x ));
917
- CHECK (secp256k1_fe_equal_var (& b -> y , & b -> y ));
918
+ CHECK (secp256k1_fe_equal_var (& a -> y , & b -> y ));
918
919
}
919
920
920
921
/* This compares jacobian points including their Z, not just their geometric meaning. */
@@ -1305,6 +1306,8 @@ void test_point_times_order(const secp256k1_gej_t *point) {
1305
1306
/* X * (point + G) + (order-X) * (pointer + G) = 0 */
1306
1307
secp256k1_scalar_t x ;
1307
1308
secp256k1_scalar_t nx ;
1309
+ secp256k1_scalar_t zero = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
1310
+ secp256k1_scalar_t one = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 );
1308
1311
secp256k1_gej_t res1 , res2 ;
1309
1312
secp256k1_ge_t res3 ;
1310
1313
unsigned char pub [65 ];
@@ -1322,6 +1325,16 @@ void test_point_times_order(const secp256k1_gej_t *point) {
1322
1325
CHECK (secp256k1_eckey_pubkey_serialize (& res3 , pub , & psize , 0 ) == 0 );
1323
1326
psize = 65 ;
1324
1327
CHECK (secp256k1_eckey_pubkey_serialize (& res3 , pub , & psize , 1 ) == 0 );
1328
+ /* check zero/one edge cases */
1329
+ secp256k1_ecmult (& ctx -> ecmult_ctx , & res1 , point , & zero , & zero );
1330
+ secp256k1_ge_set_gej (& res3 , & res1 );
1331
+ CHECK (secp256k1_ge_is_infinity (& res3 ));
1332
+ secp256k1_ecmult (& ctx -> ecmult_ctx , & res1 , point , & one , & zero );
1333
+ secp256k1_ge_set_gej (& res3 , & res1 );
1334
+ ge_equals_gej (& res3 , point );
1335
+ secp256k1_ecmult (& ctx -> ecmult_ctx , & res1 , point , & zero , & one );
1336
+ secp256k1_ge_set_gej (& res3 , & res1 );
1337
+ ge_equals_ge (& res3 , & secp256k1_ge_const_g );
1325
1338
}
1326
1339
1327
1340
void run_point_times_order (void ) {
@@ -1469,6 +1482,33 @@ void run_ecmult_gen_blind(void) {
1469
1482
}
1470
1483
}
1471
1484
1485
+ #ifdef USE_ENDOMORPHISM
1486
+ /***** ENDOMORPHISH TESTS *****/
1487
+ void test_scalar_split (void ) {
1488
+ secp256k1_scalar_t full ;
1489
+ secp256k1_scalar_t s1 , slam ;
1490
+ const unsigned char zero [32 ] = {0 };
1491
+ unsigned char tmp [32 ];
1492
+
1493
+ random_scalar_order_test (& full );
1494
+ secp256k1_scalar_split_lambda_var (& s1 , & slam , & full );
1495
+
1496
+ /* check that both are <= 128 bits in size */
1497
+ if (secp256k1_scalar_is_high (& s1 ))
1498
+ secp256k1_scalar_negate (& s1 , & s1 );
1499
+ if (secp256k1_scalar_is_high (& slam ))
1500
+ secp256k1_scalar_negate (& slam , & slam );
1501
+
1502
+ secp256k1_scalar_get_b32 (tmp , & s1 );
1503
+ CHECK (memcmp (zero , tmp , 16 ) == 0 );
1504
+ secp256k1_scalar_get_b32 (tmp , & slam );
1505
+ CHECK (memcmp (zero , tmp , 16 ) == 0 );
1506
+ }
1507
+
1508
+ void run_endomorphism_tests (void ) {
1509
+ test_scalar_split ();
1510
+ }
1511
+ #endif
1472
1512
1473
1513
void random_sign (secp256k1_ecdsa_sig_t * sig , const secp256k1_scalar_t * key , const secp256k1_scalar_t * msg , int * recid ) {
1474
1514
secp256k1_scalar_t nonce ;
@@ -2228,6 +2268,11 @@ int main(int argc, char **argv) {
2228
2268
run_ecmult_constants ();
2229
2269
run_ecmult_gen_blind ();
2230
2270
2271
+ /* endomorphism tests */
2272
+ #ifdef USE_ENDOMORPHISM
2273
+ run_endomorphism_tests ();
2274
+ #endif
2275
+
2231
2276
/* ecdsa tests */
2232
2277
run_random_pubkeys ();
2233
2278
run_ecdsa_sign_verify ();
0 commit comments