@@ -54,37 +54,38 @@ fn try_apply_keystream(key: [u8; 16], iv: [u8; 16], buffer: &mut [u8]) -> Option
54
54
. ok ( )
55
55
}
56
56
57
+ type Round2PackageSerialization < C > =
58
+ <<<C as Ciphersuite >:: Group as Group >:: Field as Field >:: Serialization ;
59
+
57
60
fn encrypt_round2_package < C : Ciphersuite , H : Clone + BlockSizeUser + Digest > (
58
61
round2_package : round2:: Package < C > ,
59
62
receiver_temp_public_key : & VerifyingKey < C > ,
60
63
sender_temp_secret_key : & SigningKey < C > ,
61
- ) -> Option < Vec < u8 > > {
64
+ ) -> Option < Round2PackageSerialization < C > > {
62
65
let shared_secret_bytes = diffie_hellman ( sender_temp_secret_key, receiver_temp_public_key) ?;
63
66
let ( key, iv) = hkdf :: < C , H > ( shared_secret_bytes) ?;
64
67
65
68
let signing_share = round2_package. signing_share ( ) . to_scalar ( ) ;
66
- let singing_share_bytes = <<C :: Group as Group >:: Field as Field >:: serialize ( & signing_share) ;
69
+ let mut singing_share_bytes = <<C :: Group as Group >:: Field as Field >:: serialize ( & signing_share) ;
67
70
68
- let mut buffer = singing_share_bytes. as_ref ( ) . to_vec ( ) ;
69
- try_apply_keystream ( key, iv, & mut buffer) ?;
71
+ try_apply_keystream ( key, iv, singing_share_bytes. as_mut ( ) ) ?;
70
72
71
- Some ( buffer )
73
+ Some ( singing_share_bytes )
72
74
}
73
75
74
76
fn decrypt_round2_package < C : Ciphersuite , H : Clone + BlockSizeUser + Digest > (
75
- round2_package_encrypted : Vec < u8 > ,
77
+ mut round2_package_encrypted : Round2PackageSerialization < C > ,
76
78
sender_temp_public_key : & VerifyingKey < C > ,
77
79
receiver_temp_secret_key : & SigningKey < C > ,
78
80
) -> Option < round2:: Package < C > > {
79
81
let shared_secret_bytes = diffie_hellman ( receiver_temp_secret_key, sender_temp_public_key) ?;
80
82
let ( key, iv) = hkdf :: < C , H > ( shared_secret_bytes) ?;
81
83
82
- let mut buffer = round2_package_encrypted;
83
- try_apply_keystream ( key, iv, & mut buffer) ?;
84
+ try_apply_keystream ( key, iv, round2_package_encrypted. as_mut ( ) ) ?;
84
85
85
- let buffer_serialized = buffer . try_into ( ) . ok ( ) ? ;
86
- let signing_share =
87
- SigningShare :: new ( << C :: Group as Group > :: Field > :: deserialize ( & buffer_serialized ) . ok ( ) ? ) ;
86
+ let signing_share = SigningShare :: new (
87
+ << C :: Group as Group > :: Field > :: deserialize ( & round2_package_encrypted ) . ok ( ) ? ,
88
+ ) ;
88
89
89
90
Some ( round2:: Package :: new ( signing_share) )
90
91
}
@@ -112,7 +113,8 @@ pub struct Dealer<C: Ciphersuite, H: Clone + BlockSizeUser + Digest> {
112
113
participants : Vec < Identifier < C > > ,
113
114
participants_set : BTreeSet < Identifier < C > > ,
114
115
round1_packages : BTreeMap < Identifier < C > , Round1Package < C > > ,
115
- round2_packages_encrypted : BTreeMap < Identifier < C > , BTreeMap < Identifier < C > , Vec < u8 > > > ,
116
+ round2_packages_encrypted :
117
+ BTreeMap < Identifier < C > , BTreeMap < Identifier < C > , Round2PackageSerialization < C > > > ,
116
118
round2_participants_set : BTreeSet < Identifier < C > > ,
117
119
round2_culprits_set : BTreeSet < Identifier < C > > ,
118
120
phantom : PhantomData < H > ,
@@ -169,7 +171,7 @@ impl<C: Ciphersuite, H: Clone + BlockSizeUser + Digest> Dealer<C, H> {
169
171
pub fn round2_packages_encrypted (
170
172
& self ,
171
173
receiver_identifier : Identifier < C > ,
172
- ) -> Option < & BTreeMap < Identifier < C > , Vec < u8 > > > {
174
+ ) -> Option < & BTreeMap < Identifier < C > , Round2PackageSerialization < C > > > {
173
175
self . round2_packages_encrypted . get ( & receiver_identifier)
174
176
}
175
177
@@ -220,7 +222,7 @@ impl<C: Ciphersuite, H: Clone + BlockSizeUser + Digest> Dealer<C, H> {
220
222
pub fn receive_round2_packages_encrypted (
221
223
& mut self ,
222
224
identifier : Identifier < C > ,
223
- round2_packages_encrypted : BTreeMap < Identifier < C > , Vec < u8 > > ,
225
+ round2_packages_encrypted : BTreeMap < Identifier < C > , Round2PackageSerialization < C > > ,
224
226
) -> Result < DkgStatus , DkgDealerError < C > > {
225
227
if !self . participants_set . contains ( & identifier) {
226
228
return Err ( DkgDealerError :: UnknownParticipant ) ;
@@ -230,25 +232,11 @@ impl<C: Ciphersuite, H: Clone + BlockSizeUser + Digest> Dealer<C, H> {
230
232
return Err ( DkgDealerError :: Frost ( FrostError :: IncorrectNumberOfPackages ) ) ;
231
233
}
232
234
233
- let zero = <<C :: Group as Group >:: Field >:: zero ( ) ;
234
- let serialization = <<C :: Group as Group >:: Field >:: serialize ( & zero) ;
235
- let expected_len = serialization. as_ref ( ) . len ( ) ;
236
-
237
- // check that `round2_packages_encrypted` keys contain all identifiers except
238
- // sender identifier
239
235
if self
240
236
. participants
241
237
. iter ( )
242
238
. filter ( |id| identifier. ne ( id) )
243
- . any ( |id| {
244
- // value must be `Some(_)` and must also have length of `expected_len`
245
- round2_packages_encrypted
246
- . get ( id)
247
- . filter ( |round2_package_encrypted| {
248
- round2_package_encrypted. len ( ) == expected_len
249
- } )
250
- . is_none ( )
251
- } )
239
+ . any ( |id| !round2_packages_encrypted. contains_key ( id) )
252
240
{
253
241
return Err ( DkgDealerError :: Frost ( FrostError :: IncorrectPackage ) ) ;
254
242
}
@@ -461,7 +449,8 @@ impl<C: Ciphersuite, H: Clone + BlockSizeUser + Digest> Participant<C, H> {
461
449
pub fn receive_round1_packages (
462
450
& mut self ,
463
451
mut round1_packages : BTreeMap < Identifier < C > , Round1Package < C > > ,
464
- ) -> Result < BTreeMap < Identifier < C > , Vec < u8 > > , DkgParticipantError < C > > {
452
+ ) -> Result < BTreeMap < Identifier < C > , Round2PackageSerialization < C > > , DkgParticipantError < C > >
453
+ {
465
454
let round1_secret_package = self
466
455
. round1_secret_package
467
456
. take ( )
@@ -501,7 +490,7 @@ impl<C: Ciphersuite, H: Clone + BlockSizeUser + Digest> Participant<C, H> {
501
490
/// Receives `round2_packages_encrypted` from the dealer.
502
491
pub fn receive_round2_packages_encrypted (
503
492
& mut self ,
504
- round2_packages_encrypted : BTreeMap < Identifier < C > , Vec < u8 > > ,
493
+ round2_packages_encrypted : BTreeMap < Identifier < C > , Round2PackageSerialization < C > > ,
505
494
) -> Result < ( KeyPackage < C > , PublicKeyPackage < C > ) , DkgParticipantError < C > > {
506
495
let round2_secret_package = self
507
496
. round2_secret_package
0 commit comments