@@ -157,9 +157,7 @@ use rand_core::{CryptoRng, RngCore};
157
157
use digest:: generic_array:: typenum:: U64 ;
158
158
use digest:: Digest ;
159
159
160
- use subtle:: Choice ;
161
- use subtle:: ConditionallySelectable ;
162
- use subtle:: ConstantTimeEq ;
160
+ use subtle:: { Choice , ConstantTimeGreater , ConditionallySelectable , ConstantTimeEq } ;
163
161
164
162
use zeroize:: Zeroize ;
165
163
@@ -237,9 +235,7 @@ impl Scalar {
237
235
/// if `bytes` is a canonical byte representation;
238
236
/// - `None` if `bytes` is not a canonical byte representation.
239
237
pub fn from_canonical_bytes ( bytes : [ u8 ; 32 ] ) -> Option < Scalar > {
240
- // Check that the high bit is not set
241
- if ( bytes[ 31 ] >> 7 ) != 0u8 { return None ; }
242
- let candidate = Scalar :: from_bits ( bytes) ;
238
+ let candidate = Scalar { bytes} ;
243
239
244
240
if candidate. is_canonical ( ) {
245
241
Some ( candidate)
@@ -1127,7 +1123,15 @@ impl Scalar {
1127
1123
/// # }
1128
1124
/// ```
1129
1125
pub fn is_canonical ( & self ) -> bool {
1130
- * self == self . reduce ( )
1126
+ let mut over = Choice :: from ( 0 ) ;
1127
+ let mut under = Choice :: from ( 0 ) ;
1128
+ for ( this, l) in self . unpack ( ) . 0 . iter ( ) . zip ( & constants:: L . 0 ) . rev ( ) {
1129
+ let gt = this. ct_gt ( & l) ;
1130
+ let eq = this. ct_eq ( & l) ;
1131
+ under |= ( !gt & !eq) & !over;
1132
+ over |= gt;
1133
+ }
1134
+ under. into ( )
1131
1135
}
1132
1136
}
1133
1137
0 commit comments