@@ -2471,6 +2471,55 @@ int fe_identical(const secp256k1_fe *a, const secp256k1_fe *b) {
24712471 return ret ;
24722472}
24732473
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+
24742523void run_field_misc (void ) {
24752524 secp256k1_fe x ;
24762525 secp256k1_fe y ;
@@ -6924,6 +6973,7 @@ int main(int argc, char **argv) {
69246973 run_scalar_tests ();
69256974
69266975 /* field tests */
6976+ run_field_half ();
69276977 run_field_misc ();
69286978 run_field_convert ();
69296979 run_fe_mul ();
0 commit comments