@@ -2508,6 +2508,70 @@ void run_field_misc(void) {
2508
2508
}
2509
2509
}
2510
2510
2511
+ void test_fe_mul (const secp256k1_fe * a , const secp256k1_fe * b , int use_sqr )
2512
+ {
2513
+ secp256k1_fe c , an , bn ;
2514
+ /* Variables in BE 32-byte format. */
2515
+ unsigned char a32 [32 ], b32 [32 ], c32 [32 ];
2516
+ /* Variables in LE 16x uint16_t format. */
2517
+ uint16_t a16 [16 ], b16 [16 ], c16 [16 ];
2518
+ /* Field modulus in LE 16x uint16_t format. */
2519
+ static const uint16_t m16 [16 ] = {
2520
+ 0xfc2f , 0xffff , 0xfffe , 0xffff , 0xffff , 0xffff , 0xffff , 0xffff ,
2521
+ 0xffff , 0xffff , 0xffff , 0xffff , 0xffff , 0xffff , 0xffff , 0xffff ,
2522
+ };
2523
+ uint16_t t16 [32 ];
2524
+ int i ;
2525
+
2526
+ /* Compute C = A * B in fe format. */
2527
+ c = * a ;
2528
+ if (use_sqr ) {
2529
+ secp256k1_fe_sqr (& c , & c );
2530
+ } else {
2531
+ secp256k1_fe_mul (& c , & c , b );
2532
+ }
2533
+
2534
+ /* Convert A, B, C into LE 16x uint16_t format. */
2535
+ an = * a ;
2536
+ bn = * b ;
2537
+ secp256k1_fe_normalize_var (& c );
2538
+ secp256k1_fe_normalize_var (& an );
2539
+ secp256k1_fe_normalize_var (& bn );
2540
+ secp256k1_fe_get_b32 (a32 , & an );
2541
+ secp256k1_fe_get_b32 (b32 , & bn );
2542
+ secp256k1_fe_get_b32 (c32 , & c );
2543
+ for (i = 0 ; i < 16 ; ++ i ) {
2544
+ a16 [i ] = a32 [31 - 2 * i ] + ((uint16_t )a32 [30 - 2 * i ] << 8 );
2545
+ b16 [i ] = b32 [31 - 2 * i ] + ((uint16_t )b32 [30 - 2 * i ] << 8 );
2546
+ c16 [i ] = c32 [31 - 2 * i ] + ((uint16_t )c32 [30 - 2 * i ] << 8 );
2547
+ }
2548
+ /* Compute T = A * B in LE 16x uint16_t format. */
2549
+ mulmod256 (t16 , a16 , b16 , m16 );
2550
+ /* Compare */
2551
+ CHECK (secp256k1_memcmp_var (t16 , c16 , 32 ) == 0 );
2552
+ }
2553
+
2554
+ void run_fe_mul (void ) {
2555
+ int i ;
2556
+ for (i = 0 ; i < 100 * count ; ++ i ) {
2557
+ secp256k1_fe a , b , c , d ;
2558
+ random_fe (& a );
2559
+ random_field_element_magnitude (& a );
2560
+ random_fe (& b );
2561
+ random_field_element_magnitude (& b );
2562
+ random_fe_test (& c );
2563
+ random_field_element_magnitude (& c );
2564
+ random_fe_test (& d );
2565
+ random_field_element_magnitude (& d );
2566
+ test_fe_mul (& a , & a , 1 );
2567
+ test_fe_mul (& c , & c , 1 );
2568
+ test_fe_mul (& a , & b , 0 );
2569
+ test_fe_mul (& a , & c , 0 );
2570
+ test_fe_mul (& c , & b , 0 );
2571
+ test_fe_mul (& c , & d , 0 );
2572
+ }
2573
+ }
2574
+
2511
2575
void run_sqr (void ) {
2512
2576
secp256k1_fe x , s ;
2513
2577
@@ -6512,6 +6576,7 @@ int main(int argc, char **argv) {
6512
6576
/* field tests */
6513
6577
run_field_misc ();
6514
6578
run_field_convert ();
6579
+ run_fe_mul ();
6515
6580
run_sqr ();
6516
6581
run_sqrt ();
6517
6582
0 commit comments