@@ -21,7 +21,7 @@ use secp256kfun::{
21
21
derive_nonce,
22
22
digest:: { generic_array:: typenum:: U32 , Digest } ,
23
23
g,
24
- hash:: HashAdd ,
24
+ hash:: { HashAdd , Tagged } ,
25
25
marker:: * ,
26
26
nonce:: { AddTag , NonceGen } ,
27
27
rand_core, s, Point , Scalar , G ,
@@ -35,12 +35,12 @@ pub struct Frost<H, NG: AddTag> {
35
35
keygen_id_hash : H ,
36
36
}
37
37
38
- impl < H : Clone , NG : AddTag + Clone > Frost < H , NG > {
38
+ impl < H : Tagged , NG : AddTag + Clone > Frost < H , NG > {
39
39
/// Generate a new Frost context from a Schnorr context.
40
40
pub fn new ( schnorr : Schnorr < H , NG > ) -> Self {
41
41
Self {
42
42
schnorr : schnorr. clone ( ) ,
43
- keygen_id_hash : schnorr . challenge_hash ,
43
+ keygen_id_hash : H :: default ( ) . tagged ( b"frost/keygenid" ) ,
44
44
}
45
45
}
46
46
}
@@ -173,7 +173,7 @@ impl<Z> PointPoly<Z> {
173
173
#[ derive( Clone , Debug ) ]
174
174
pub struct KeyGen {
175
175
point_polys : Vec < PointPoly > ,
176
- keygen_id : Scalar ,
176
+ keygen_id : [ u8 ; 32 ] ,
177
177
frost_key : FrostKey ,
178
178
}
179
179
@@ -342,7 +342,7 @@ impl<H: Digest<OutputSize = U32> + Clone, NG: AddTag + NonceGen> Frost<H, NG> {
342
342
let key_pair = self . schnorr . new_keypair ( scalar_poly. 0 [ 0 ] . clone ( ) ) ;
343
343
let pop = self . schnorr . sign (
344
344
& key_pair,
345
- Message :: < Public > :: plain ( "frost-pop" , & KeyGen . keygen_id . to_bytes ( ) ) ,
345
+ Message :: < Public > :: plain ( "frost-pop" , & KeyGen . keygen_id ) ,
346
346
) ;
347
347
348
348
let shares = ( 1 ..=KeyGen . point_polys . len ( ) )
@@ -364,7 +364,7 @@ impl<H: Digest<OutputSize = U32> + Clone, NG: AddTag> Frost<H, NG> {
364
364
365
365
self . schnorr . verify (
366
366
& even_poly_point,
367
- Message :: < Public > :: plain ( "frost-pop" , & KeyGen . keygen_id . to_bytes ( ) ) ,
367
+ Message :: < Public > :: plain ( "frost-pop" , & KeyGen . keygen_id ) ,
368
368
& pop,
369
369
)
370
370
}
@@ -381,8 +381,8 @@ impl<H: Digest<OutputSize = U32> + Clone, NG: AddTag> Frost<H, NG> {
381
381
///
382
382
/// Returns a KeyGen
383
383
pub fn new_keygen ( & self , point_polys : Vec < PointPoly > ) -> Result < KeyGen , NewKeyGenError > {
384
+ let len_first_poly = point_polys[ 0 ] . poly_len ( ) ;
384
385
{
385
- let len_first_poly = point_polys[ 0 ] . poly_len ( ) ;
386
386
if let Some ( ( i, _) ) = point_polys
387
387
. iter ( )
388
388
. enumerate ( )
@@ -406,12 +406,14 @@ impl<H: Digest<OutputSize = U32> + Clone, NG: AddTag> Frost<H, NG> {
406
406
. into_point_with_even_y ( ) ;
407
407
408
408
let mut keygen_hash = self . keygen_id_hash . clone ( ) ;
409
- for poly in point_polys. clone ( ) {
409
+ keygen_hash. update ( ( len_first_poly as u32 ) . to_be_bytes ( ) ) ;
410
+ keygen_hash. update ( ( point_polys. len ( ) as u32 ) . to_be_bytes ( ) ) ;
411
+ for poly in & point_polys {
410
412
for point in poly. 0 . iter ( ) {
411
- keygen_hash = keygen_hash . add ( point) ;
413
+ keygen_hash. update ( point. to_bytes ( ) ) ;
412
414
}
413
415
}
414
- let keygen_id = Scalar :: from_hash ( keygen_hash) ;
416
+ let keygen_id = keygen_hash. finalize ( ) . into ( ) ;
415
417
416
418
let verification_shares = ( 1 ..=point_polys. len ( ) )
417
419
. map ( |i| joint_poly. eval ( i as u32 ) . normalize ( ) . mark :: < NonZero > ( ) )
0 commit comments