@@ -18,7 +18,7 @@ use elliptic_curve::{
1818 prime:: { PrimeCurve , PrimeGroup } ,
1919 } ,
2020 ops:: { BatchInvert , LinearCombination } ,
21- point:: { Double , NonIdentity } ,
21+ point:: { DecompressPoint , Double , NonIdentity } ,
2222 rand_core:: TryRngCore ,
2323 sec1:: {
2424 CompressedPoint , EncodedPoint , FromEncodedPoint , ModulusSize , ToEncodedPoint ,
@@ -258,13 +258,24 @@ where
258258
259259impl < C > Group for ProjectivePoint < C >
260260where
261- Self : Double ,
262261 C : PrimeCurveParams ,
262+ FieldBytes < C > : Copy ,
263263{
264264 type Scalar = Scalar < C > ;
265265
266266 fn try_from_rng < R : TryRngCore + ?Sized > ( rng : & mut R ) -> core:: result:: Result < Self , R :: Error > {
267- Ok ( Self :: GENERATOR * <Scalar < C > as Field >:: try_from_rng ( rng) ?)
267+ let mut bytes = FieldBytes :: < C > :: default ( ) ;
268+ let mut sign = 0 ;
269+
270+ loop {
271+ rng. try_fill_bytes ( & mut bytes) ?;
272+ rng. try_fill_bytes ( core:: array:: from_mut ( & mut sign) ) ?;
273+ if let Some ( point) =
274+ AffinePoint :: decompress ( & bytes, Choice :: from ( sign & 1 ) ) . into_option ( )
275+ {
276+ return Ok ( point. into ( ) ) ;
277+ }
278+ }
268279 }
269280
270281 fn identity ( ) -> Self {
@@ -311,8 +322,8 @@ where
311322
312323impl < C > CurveGroup for ProjectivePoint < C >
313324where
314- Self : Double ,
315325 C : PrimeCurveParams ,
326+ FieldBytes < C > : Copy ,
316327{
317328 type AffineRepr = AffinePoint < C > ;
318329
@@ -331,8 +342,8 @@ where
331342
332343impl < const N : usize , C > BatchNormalize < [ ProjectivePoint < C > ; N ] > for ProjectivePoint < C >
333344where
334- Self : Double ,
335345 C : PrimeCurveParams ,
346+ FieldBytes < C > : Copy ,
336347{
337348 type Output = [ <Self as CurveGroup >:: AffineRepr ; N ] ;
338349
@@ -348,8 +359,8 @@ where
348359#[ cfg( feature = "alloc" ) ]
349360impl < C > BatchNormalize < [ ProjectivePoint < C > ] > for ProjectivePoint < C >
350361where
351- Self : Double ,
352362 C : PrimeCurveParams ,
363+ FieldBytes < C > : Copy ,
353364{
354365 type Output = Vec < <Self as CurveGroup >:: AffineRepr > ;
355366
@@ -400,16 +411,16 @@ where
400411
401412impl < C > LinearCombination < [ ( Self , Scalar < C > ) ] > for ProjectivePoint < C >
402413where
403- Self : Double ,
404414 C : PrimeCurveParams ,
415+ FieldBytes < C > : Copy ,
405416{
406417 // TODO(tarcieri): optimized implementation
407418}
408419
409420impl < C , const N : usize > LinearCombination < [ ( Self , Scalar < C > ) ; N ] > for ProjectivePoint < C >
410421where
411- Self : Double ,
412422 C : PrimeCurveParams ,
423+ FieldBytes < C > : Copy ,
413424{
414425 // TODO(tarcieri): optimized implementation
415426}
0 commit comments