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