@@ -26,7 +26,7 @@ use std::{error, fmt};
26
26
27
27
use curve25519_dalek:: constants:: ED25519_BASEPOINT_POINT ;
28
28
use curve25519_dalek:: edwards:: { CompressedEdwardsY , EdwardsPoint } ;
29
- use curve25519_dalek:: scalar:: Scalar as ed25519_Scalar;
29
+ use curve25519_dalek:: scalar:: { clamp_integer , Scalar as ed25519_Scalar} ;
30
30
use rand;
31
31
use sha2:: { Digest , Sha512 } ;
32
32
@@ -246,7 +246,7 @@ impl VRFProof {
246
246
247
247
#[ allow( clippy:: needless_range_loop) ]
248
248
pub fn check_c ( c : & ed25519_Scalar ) -> bool {
249
- let c_bytes = c. reduce ( ) . to_bytes ( ) ;
249
+ let c_bytes = c. to_bytes ( ) ;
250
250
251
251
// upper 16 bytes of c must be 0's
252
252
for c_byte in c_bytes[ 16 ..32 ] . iter ( ) {
@@ -281,7 +281,9 @@ impl VRFProof {
281
281
// 0 32 48 80
282
282
// |----------------------------|----------|---------------------------|
283
283
// Gamma point c scalar s scalar
284
- let gamma_opt = CompressedEdwardsY :: from_slice ( & bytes[ 0 ..32 ] ) . decompress ( ) ;
284
+ let gamma_opt = CompressedEdwardsY :: from_slice ( & bytes[ 0 ..32 ] )
285
+ . unwrap ( )
286
+ . decompress ( ) ;
285
287
if gamma_opt. is_none ( ) {
286
288
test_debug ! ( "Invalid Gamma" ) ;
287
289
return None ;
@@ -297,8 +299,8 @@ impl VRFProof {
297
299
298
300
c_buf[ ..16 ] . copy_from_slice ( & bytes[ 32 ..( 16 + 32 ) ] ) ;
299
301
s_buf[ ..32 ] . copy_from_slice ( & bytes[ 48 ..( 32 + 48 ) ] ) ;
300
- let c = ed25519_Scalar:: from_canonical_bytes ( c_buf) ? ;
301
- let s = ed25519_Scalar:: from_canonical_bytes ( s_buf) ? ;
302
+ let c = ed25519_Scalar:: from_canonical_bytes ( c_buf) . expect ( "Invalid C scalar" ) ;
303
+ let s = ed25519_Scalar:: from_canonical_bytes ( s_buf) . expect ( "Invalid S scalar" ) ;
302
304
303
305
Some ( VRFProof { Gamma : gamma, c, s } )
304
306
}
@@ -324,7 +326,7 @@ impl VRFProof {
324
326
"FATAL ERROR: somehow constructed an invalid ECVRF proof"
325
327
) ;
326
328
327
- let c_bytes = self . c . reduce ( ) . to_bytes ( ) ;
329
+ let c_bytes = self . c . to_bytes ( ) ;
328
330
c_bytes_16[ 0 ..16 ] . copy_from_slice ( & c_bytes[ 0 ..16 ] ) ;
329
331
330
332
let gamma_bytes = self . Gamma . compress ( ) . to_bytes ( ) ;
@@ -386,7 +388,7 @@ impl VRF {
386
388
}
387
389
388
390
let y = CompressedEdwardsY :: from_slice ( & hasher. finalize ( ) [ 0 ..32 ] ) ;
389
- if let Some ( h) = y. decompress ( ) {
391
+ if let Some ( h) = y. unwrap ( ) . decompress ( ) {
390
392
break h;
391
393
}
392
394
@@ -445,8 +447,7 @@ impl VRF {
445
447
let mut h_32 = [ 0u8 ; 32 ] ;
446
448
h_32. copy_from_slice ( & h[ 0 ..32 ] ) ;
447
449
448
- let x_scalar_raw = ed25519_Scalar:: from_bits ( h_32) ;
449
- let x_scalar = x_scalar_raw. reduce ( ) ; // use the canonical scalar for the private key
450
+ let x_scalar = ed25519_Scalar:: from_bytes_mod_order ( clamp_integer ( h_32) ) ;
450
451
451
452
trunc_hash. copy_from_slice ( & h[ 32 ..64 ] ) ;
452
453
@@ -473,7 +474,7 @@ impl VRF {
473
474
let mut scalar_buf = [ 0u8 ; 32 ] ;
474
475
scalar_buf[ 0 ..16 ] . copy_from_slice ( hash128) ;
475
476
476
- ed25519_Scalar:: from_bits ( scalar_buf)
477
+ ed25519_Scalar:: from_canonical_bytes ( scalar_buf) . expect ( "Invalid scalar" )
477
478
}
478
479
479
480
/// ECVRF proof routine
@@ -492,8 +493,7 @@ impl VRF {
492
493
let c_hashbuf = VRF :: hash_points ( & H_point , & Gamma_point , & kB_point, & kH_point) ;
493
494
let c_scalar = VRF :: ed25519_scalar_from_hash128 ( & c_hashbuf) ;
494
495
495
- let s_full_scalar = & k_scalar + & c_scalar * & x_scalar;
496
- let s_scalar = s_full_scalar. reduce ( ) ;
496
+ let s_scalar = & k_scalar + & c_scalar * & x_scalar;
497
497
498
498
// NOTE: expect() won't panic because c_scalar is guaranteed to have
499
499
// its upper 16 bytes as 0
@@ -509,16 +509,16 @@ impl VRF {
509
509
#[ allow( clippy:: op_ref) ]
510
510
pub fn verify ( Y_point : & VRFPublicKey , proof : & VRFProof , alpha : & [ u8 ] ) -> Result < bool , Error > {
511
511
let H_point = VRF :: hash_to_curve ( Y_point , alpha) ;
512
- let s_reduced = proof. s ( ) . reduce ( ) ;
512
+ let s_reduced = proof. s ( ) ;
513
513
let Y_point_ed = CompressedEdwardsY ( Y_point . to_bytes ( ) )
514
514
. decompress ( )
515
515
. ok_or ( Error :: InvalidPublicKey ) ?;
516
516
if proof. Gamma ( ) . is_small_order ( ) {
517
517
return Err ( Error :: InvalidPublicKey ) ;
518
518
}
519
519
520
- let U_point = & s_reduced * & ED25519_BASEPOINT_POINT - proof. c ( ) * Y_point_ed ;
521
- let V_point = & s_reduced * & H_point - proof. c ( ) * proof. Gamma ( ) ;
520
+ let U_point = s_reduced * & ED25519_BASEPOINT_POINT - proof. c ( ) * Y_point_ed ;
521
+ let V_point = s_reduced * & H_point - proof. c ( ) * proof. Gamma ( ) ;
522
522
523
523
let c_prime_hashbuf = VRF :: hash_points ( & H_point , proof. Gamma ( ) , & U_point , & V_point ) ;
524
524
let c_prime = VRF :: ed25519_scalar_from_hash128 ( & c_prime_hashbuf) ;
0 commit comments