@@ -2285,6 +2285,13 @@ static void scalar_test(void) {
2285
2285
CHECK (secp256k1_scalar_eq (& r1 , & secp256k1_scalar_zero ));
2286
2286
}
2287
2287
2288
+ {
2289
+ /* Test halving. */
2290
+ secp256k1_scalar r ;
2291
+ secp256k1_scalar_add (& r , & s , & s );
2292
+ secp256k1_scalar_half (& r , & r );
2293
+ CHECK (secp256k1_scalar_eq (& r , & s ));
2294
+ }
2288
2295
}
2289
2296
2290
2297
static void run_scalar_set_b32_seckey_tests (void ) {
@@ -2337,6 +2344,38 @@ static void run_scalar_tests(void) {
2337
2344
CHECK (secp256k1_scalar_is_zero (& o ));
2338
2345
}
2339
2346
2347
+ {
2348
+ /* Test that halving and doubling roundtrips on some fixed values. */
2349
+ static const secp256k1_scalar HALF_TESTS [] = {
2350
+ /* 0 */
2351
+ SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
2352
+ /* 1 */
2353
+ SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
2354
+ /* -1 */
2355
+ SECP256K1_SCALAR_CONST (0xfffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffeul , 0xbaaedce6ul , 0xaf48a03bul , 0xbfd25e8cul , 0xd0364140ul ),
2356
+ /* -2 (largest odd value) */
2357
+ SECP256K1_SCALAR_CONST (0xfffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffeul , 0xbaaedce6ul , 0xaf48a03bul , 0xbfd25e8cul , 0xd036413Ful ),
2358
+ /* Half the secp256k1 order */
2359
+ SECP256K1_SCALAR_CONST (0x7ffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful , 0x5d576e73ul , 0x57a4501dul , 0xdfe92f46ul , 0x681b20a0ul ),
2360
+ /* Half the secp256k1 order + 1 */
2361
+ SECP256K1_SCALAR_CONST (0x7ffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful , 0x5d576e73ul , 0x57a4501dul , 0xdfe92f46ul , 0x681b20a1ul ),
2362
+ /* 2^255 */
2363
+ SECP256K1_SCALAR_CONST (0x80000000ul , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
2364
+ /* 2^255 - 1 */
2365
+ SECP256K1_SCALAR_CONST (0x7ffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful , 0xfffffffful ),
2366
+ };
2367
+ unsigned n ;
2368
+ for (n = 0 ; n < sizeof (HALF_TESTS ) / sizeof (HALF_TESTS [0 ]); ++ n ) {
2369
+ secp256k1_scalar s ;
2370
+ secp256k1_scalar_half (& s , & HALF_TESTS [n ]);
2371
+ secp256k1_scalar_add (& s , & s , & s );
2372
+ CHECK (secp256k1_scalar_eq (& s , & HALF_TESTS [n ]));
2373
+ secp256k1_scalar_add (& s , & s , & s );
2374
+ secp256k1_scalar_half (& s , & s );
2375
+ CHECK (secp256k1_scalar_eq (& s , & HALF_TESTS [n ]));
2376
+ }
2377
+ }
2378
+
2340
2379
{
2341
2380
/* Does check_overflow check catch all ones? */
2342
2381
static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST (
0 commit comments