@@ -22,7 +22,7 @@ use core::{
22
22
} ;
23
23
use elliptic_curve:: {
24
24
Curve as _, Error , FieldBytesEncoding , Result ,
25
- bigint:: { self , Integer } ,
25
+ bigint:: { self , Integer , NonZero } ,
26
26
ff:: { self , Field , PrimeField } ,
27
27
ops:: { Invert , Reduce , ReduceNonZero } ,
28
28
rand_core:: TryRngCore ,
@@ -575,11 +575,8 @@ impl Reduce<U576> for Scalar {
575
575
impl ReduceNonZero < U576 > for Scalar {
576
576
fn reduce_nonzero ( w : U576 ) -> Self {
577
577
const ORDER_MINUS_ONE : U576 = NistP521 :: ORDER . wrapping_sub ( & U576 :: ONE ) ;
578
- let ( r, underflow) = w. borrowing_sub ( & ORDER_MINUS_ONE , bigint:: Limb :: ZERO ) ;
579
- let underflow = Choice :: from ( ( underflow. 0 >> ( bigint:: Limb :: BITS - 1 ) ) as u8 ) ;
580
- Self :: from_uint_unchecked (
581
- U576 :: conditional_select ( & w, & r, !underflow) . wrapping_add ( & U576 :: ONE ) ,
582
- )
578
+ let r = w. rem ( & NonZero :: new ( ORDER_MINUS_ONE ) . unwrap ( ) ) ;
579
+ Self :: from_uint_unchecked ( r. wrapping_add ( & U576 :: ONE ) )
583
580
}
584
581
585
582
fn reduce_nonzero_bytes ( bytes : & FieldBytes ) -> Self {
@@ -707,6 +704,13 @@ mod tests {
707
704
) ) ,
708
705
U576 :: from_u8( 4 ) ,
709
706
) ;
707
+
708
+ assert_eq ! (
709
+ U576 :: from( Scalar :: reduce_nonzero(
710
+ NistP521 :: ORDER . wrapping_mul( & U576 :: from_u8( 3 ) )
711
+ ) ) ,
712
+ U576 :: from_u8( 4 ) ,
713
+ ) ;
710
714
}
711
715
712
716
prop_compose ! {
0 commit comments