1
1
use hex:: ToHex ;
2
- use rand_chacha:: ChaCha20Rng ;
3
- use rand_core:: { RngCore , SeedableRng } ;
2
+ use rand_core:: { CryptoRng , RngCore } ;
4
3
use serde:: { Deserialize , Serialize } ;
5
4
use std:: collections:: HashMap ;
6
5
use std:: env;
@@ -42,14 +41,16 @@ struct MultiSignatureArtifact {
42
41
}
43
42
44
43
/// Party represents a signing protocol participant
45
- #[ derive( Debug ) ]
44
+ #[ derive( Debug , Clone ) ]
46
45
pub struct Party {
47
46
/// Party's identifier
48
47
party_id : ProtocolPartyId ,
49
48
/// Party's stake
50
49
stake : ProtocolStake ,
51
50
/// Protocol parameters
52
51
params : Option < ProtocolParameters > ,
52
+ /// Protocol initializer
53
+ initializer : Option < ProtocolInitializerNotCertified > ,
53
54
/// Protocol signer
54
55
signer : Option < ProtocolSigner > ,
55
56
/// Protocol clerk
@@ -66,6 +67,7 @@ impl Party {
66
67
party_id : format ! ( "{}" , party_id) as ProtocolPartyId ,
67
68
stake : stake as ProtocolStake ,
68
69
params : None ,
70
+ initializer : None ,
69
71
signer : None ,
70
72
clerk : None ,
71
73
msigs : HashMap :: new ( ) ,
@@ -105,10 +107,13 @@ impl Party {
105
107
}
106
108
let closed_reg = key_reg. close ( ) ;
107
109
108
- let seed = [ 0u8 ; 32 ] ;
109
- let mut rng = ChaCha20Rng :: from_seed ( seed) ;
110
- let p = ProtocolInitializerNotCertified :: setup ( self . params . unwrap ( ) , self . stake , & mut rng) ;
111
- self . signer = Some ( p. new_signer ( closed_reg) . unwrap ( ) ) ;
110
+ let signer = self
111
+ . initializer
112
+ . clone ( )
113
+ . unwrap ( )
114
+ . new_signer ( closed_reg)
115
+ . unwrap ( ) ;
116
+ self . signer = Some ( signer) ;
112
117
self . clerk = Some ( ProtocolClerk :: from_signer ( self . signer . as_ref ( ) . unwrap ( ) ) ) ;
113
118
}
114
119
@@ -296,10 +301,8 @@ pub struct Demonstrator {
296
301
297
302
impl Demonstrator {
298
303
/// Demonstrator factory
299
- pub fn new ( config : & crate :: Config ) -> Self {
304
+ pub fn new < R : RngCore + CryptoRng > ( config : & crate :: Config , rng : & mut R ) -> Self {
300
305
// Generate parties
301
- let seed = [ 0u8 ; 32 ] ;
302
- let mut rng = ChaCha20Rng :: from_seed ( seed) ;
303
306
let parties = ( 0 ..config. nparties )
304
307
. into_iter ( )
305
308
. map ( |party_id| Party :: new ( party_id, 1 + rng. next_u64 ( ) % 999 ) )
@@ -328,7 +331,7 @@ pub trait ProtocolDemonstrator {
328
331
fn establish ( & mut self ) ;
329
332
330
333
/// Initialization phase of the protocol
331
- fn initialize ( & mut self ) ;
334
+ fn initialize < R : RngCore + CryptoRng > ( & mut self , rng : & mut R ) ;
332
335
333
336
/// Issue certificates
334
337
fn issue_certificates ( & mut self ) ;
@@ -349,7 +352,7 @@ impl ProtocolDemonstrator for Demonstrator {
349
352
}
350
353
351
354
/// Initialization phase of the protocol
352
- fn initialize ( & mut self ) {
355
+ fn initialize < R : RngCore + CryptoRng > ( & mut self , rng : & mut R ) {
353
356
// Retrieve protocol parameters
354
357
let mut verifier = Verifier :: new ( ) ;
355
358
verifier. update_params ( & self . params . unwrap ( ) ) ;
@@ -358,25 +361,17 @@ impl ProtocolDemonstrator for Demonstrator {
358
361
}
359
362
360
363
// Register keys
361
- let seed = [ 0u8 ; 32 ] ;
362
- let mut rng = ChaCha20Rng :: from_seed ( seed) ;
363
- let players = self
364
- . parties
365
- . iter ( )
366
- . map ( |party| ( party. party_id . to_owned ( ) , party. stake ) )
367
- . collect :: < Vec < _ > > ( ) ;
368
364
let mut players_artifacts = Vec :: new ( ) ;
369
- for ( party_id , stake ) in players {
365
+ for party in self . parties . iter_mut ( ) {
370
366
let protocol_initializer =
371
- ProtocolInitializerNotCertified :: setup ( self . params . unwrap ( ) , stake, & mut rng) ;
372
- let verification_key: ProtocolSignerVerificationKey =
373
- protocol_initializer. verification_key ( ) ;
367
+ ProtocolInitializerNotCertified :: setup ( self . params . unwrap ( ) , party. stake , rng) ;
374
368
players_artifacts. push ( PlayerArtifact {
375
- party_id,
376
- stake,
377
- verification_key : key_encode_hex ( verification_key) . unwrap ( ) ,
378
- initializer : key_encode_hex ( protocol_initializer) . unwrap ( ) ,
379
- } )
369
+ party_id : party. clone ( ) . party_id ,
370
+ stake : party. stake ,
371
+ verification_key : key_encode_hex ( protocol_initializer. verification_key ( ) ) . unwrap ( ) ,
372
+ initializer : key_encode_hex ( protocol_initializer. clone ( ) ) . unwrap ( ) ,
373
+ } ) ;
374
+ party. initializer = Some ( protocol_initializer) ;
380
375
}
381
376
let players_with_keys = players_artifacts
382
377
. iter ( )
@@ -487,6 +482,8 @@ pub fn write_artifacts<T: Serialize>(artifact_name: &str, value: &T) {
487
482
#[ cfg( test) ]
488
483
mod tests {
489
484
use super :: * ;
485
+ use rand_chacha:: ChaCha20Rng ;
486
+ use rand_core:: SeedableRng ;
490
487
491
488
fn setup_protocol_parameters ( ) -> ProtocolParameters {
492
489
ProtocolParameters {
@@ -510,14 +507,18 @@ mod tests {
510
507
#[ test]
511
508
fn test_demonstrator_new ( ) {
512
509
let config = default_config ( ) ;
513
- let demo = Demonstrator :: new ( & config) ;
510
+ let seed = [ 0u8 ; 32 ] ;
511
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
512
+ let demo = Demonstrator :: new ( & config, & mut rng) ;
514
513
assert_eq ! ( demo. config, config) ;
515
514
}
516
515
517
516
#[ test]
518
517
fn test_demonstrator_establish ( ) {
519
518
let config = default_config ( ) ;
520
- let mut demo = Demonstrator :: new ( & config) ;
519
+ let seed = [ 0u8 ; 32 ] ;
520
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
521
+ let mut demo = Demonstrator :: new ( & config, & mut rng) ;
521
522
demo. establish ( ) ;
522
523
assert_eq ! ( demo. params. unwrap( ) . m, config. m) ;
523
524
assert_eq ! ( demo. params. unwrap( ) . k, config. k) ;
@@ -527,9 +528,11 @@ mod tests {
527
528
#[ test]
528
529
fn test_demonstrator_initialize ( ) {
529
530
let config = default_config ( ) ;
530
- let mut demo = Demonstrator :: new ( & config) ;
531
+ let seed = [ 0u8 ; 32 ] ;
532
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
533
+ let mut demo = Demonstrator :: new ( & config, & mut rng) ;
531
534
demo. establish ( ) ;
532
- demo. initialize ( ) ;
535
+ demo. initialize ( & mut rng ) ;
533
536
assert_eq ! ( demo. parties. len( ) , config. nparties) ;
534
537
assert_eq ! ( demo. messages. len( ) , config. nmessages) ;
535
538
for party in demo. parties {
@@ -543,9 +546,11 @@ mod tests {
543
546
#[ test]
544
547
fn test_demonstrator_issue_certificates_ok ( ) {
545
548
let config = default_config ( ) ;
546
- let mut demo = Demonstrator :: new ( & config) ;
549
+ let seed = [ 0u8 ; 32 ] ;
550
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
551
+ let mut demo = Demonstrator :: new ( & config, & mut rng) ;
547
552
demo. establish ( ) ;
548
- demo. initialize ( ) ;
553
+ demo. initialize ( & mut rng ) ;
549
554
demo. issue_certificates ( ) ;
550
555
assert_eq ! ( demo. parties. len( ) , config. nparties) ;
551
556
assert_eq ! ( demo. messages. len( ) , config. nmessages) ;
@@ -559,9 +564,11 @@ mod tests {
559
564
let mut config = default_config ( ) ;
560
565
config. k = 10000 ;
561
566
config. m = 10 ;
562
- let mut demo = Demonstrator :: new ( & config) ;
567
+ let seed = [ 0u8 ; 32 ] ;
568
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
569
+ let mut demo = Demonstrator :: new ( & config, & mut rng) ;
563
570
demo. establish ( ) ;
564
- demo. initialize ( ) ;
571
+ demo. initialize ( & mut rng ) ;
565
572
demo. issue_certificates ( ) ;
566
573
assert_eq ! ( demo. parties. len( ) , config. nparties) ;
567
574
assert_eq ! ( demo. messages. len( ) , config. nmessages) ;
@@ -573,9 +580,11 @@ mod tests {
573
580
#[ test]
574
581
fn test_demonstrator_verify_certificates_ok ( ) {
575
582
let config = default_config ( ) ;
576
- let mut demo = Demonstrator :: new ( & config) ;
583
+ let seed = [ 0u8 ; 32 ] ;
584
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
585
+ let mut demo = Demonstrator :: new ( & config, & mut rng) ;
577
586
demo. establish ( ) ;
578
- demo. initialize ( ) ;
587
+ demo. initialize ( & mut rng ) ;
579
588
demo. issue_certificates ( ) ;
580
589
assert_eq ! ( demo. parties. len( ) , config. nparties) ;
581
590
assert_eq ! ( demo. messages. len( ) , config. nmessages) ;
@@ -587,9 +596,11 @@ mod tests {
587
596
let mut config = default_config ( ) ;
588
597
config. k = 10000 ;
589
598
config. m = 10 ;
590
- let mut demo = Demonstrator :: new ( & config) ;
599
+ let seed = [ 0u8 ; 32 ] ;
600
+ let mut rng = ChaCha20Rng :: from_seed ( seed) ;
601
+ let mut demo = Demonstrator :: new ( & config, & mut rng) ;
591
602
demo. establish ( ) ;
592
- demo. initialize ( ) ;
603
+ demo. initialize ( & mut rng ) ;
593
604
demo. issue_certificates ( ) ;
594
605
assert_eq ! ( demo. parties. len( ) , config. nparties) ;
595
606
assert_eq ! ( demo. messages. len( ) , config. nmessages) ;
0 commit comments