@@ -2471,6 +2471,55 @@ int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b) {
2471
2471
return ret ;
2472
2472
}
2473
2473
2474
+ void run_field_half (void ) {
2475
+ secp256k1_fe t , u ;
2476
+ int m ;
2477
+
2478
+ /* Check magnitude 0 input */
2479
+ secp256k1_fe_get_bounds (& t , 0 );
2480
+ secp256k1_fe_half (& t );
2481
+ #ifdef VERIFY
2482
+ CHECK (t .magnitude == 1 );
2483
+ CHECK (t .normalized == 0 );
2484
+ #endif
2485
+ CHECK (secp256k1_fe_normalizes_to_zero (& t ));
2486
+
2487
+ /* Check non-zero magnitudes in the supported range */
2488
+ for (m = 1 ; m < 32 ; m ++ ) {
2489
+ /* Check max-value input */
2490
+ secp256k1_fe_get_bounds (& t , m );
2491
+
2492
+ u = t ;
2493
+ secp256k1_fe_half (& u );
2494
+ #ifdef VERIFY
2495
+ CHECK (u .magnitude == (m >> 1 ) + 1 );
2496
+ CHECK (u .normalized == 0 );
2497
+ #endif
2498
+ secp256k1_fe_normalize_weak (& u );
2499
+ secp256k1_fe_add (& u , & u );
2500
+ CHECK (check_fe_equal (& t , & u ));
2501
+
2502
+ /* Check worst-case input: ensure the LSB is 1 so that P will be added,
2503
+ * which will also cause all carries to be 1, since all limbs that can
2504
+ * generate a carry are initially even and all limbs of P are odd in
2505
+ * every existing field implementation. */
2506
+ secp256k1_fe_get_bounds (& t , m );
2507
+ CHECK (t .n [0 ] > 0 );
2508
+ CHECK ((t .n [0 ] & 1 ) == 0 );
2509
+ -- t .n [0 ];
2510
+
2511
+ u = t ;
2512
+ secp256k1_fe_half (& u );
2513
+ #ifdef VERIFY
2514
+ CHECK (u .magnitude == (m >> 1 ) + 1 );
2515
+ CHECK (u .normalized == 0 );
2516
+ #endif
2517
+ secp256k1_fe_normalize_weak (& u );
2518
+ secp256k1_fe_add (& u , & u );
2519
+ CHECK (check_fe_equal (& t , & u ));
2520
+ }
2521
+ }
2522
+
2474
2523
void run_field_misc (void ) {
2475
2524
secp256k1_fe x ;
2476
2525
secp256k1_fe y ;
@@ -6924,6 +6973,7 @@ int main(int argc, char **argv) {
6924
6973
run_scalar_tests ();
6925
6974
6926
6975
/* field tests */
6976
+ run_field_half ();
6927
6977
run_field_misc ();
6928
6978
run_field_convert ();
6929
6979
run_fe_mul ();
0 commit comments