5
5
use crate :: checksum:: Checksum ;
6
6
use crate :: checksum:: ChecksumHasher ;
7
7
use crate :: checksum:: CHECKSUM_LEN ;
8
- use crate :: dkg:: error:: Error ;
9
8
use crate :: dkg:: group_key:: GroupSecretKeyShard ;
9
+ use crate :: error:: IronfishFrostError ;
10
10
use crate :: frost;
11
11
use crate :: frost:: keys:: dkg:: round1:: Package ;
12
12
use crate :: frost:: keys:: dkg:: round1:: SecretPackage ;
@@ -15,7 +15,6 @@ use crate::frost::Field;
15
15
use crate :: frost:: Identifier ;
16
16
use crate :: frost:: JubjubScalarField ;
17
17
use crate :: multienc;
18
- use crate :: multienc:: read_encrypted_blob;
19
18
use crate :: participant;
20
19
use crate :: participant:: Identity ;
21
20
use crate :: serde:: read_u16;
@@ -80,23 +79,24 @@ impl<'a> From<&'a SerializableSecretPackage> for &'a SecretPackage {
80
79
}
81
80
82
81
impl SerializableSecretPackage {
83
- fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> io :: Result < ( ) > {
82
+ fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> Result < ( ) , IronfishFrostError > {
84
83
writer. write_all ( & self . identifier . serialize ( ) ) ?;
85
84
write_variable_length ( & mut writer, & self . coefficients , |writer, scalar| {
86
85
writer. write_all ( & scalar. to_bytes ( ) )
87
86
} ) ?;
88
- write_variable_length ( & mut writer, self . commitment . serialize ( ) , |writer, array| {
87
+ let serialized = self . commitment . serialize ( ) ?;
88
+ write_variable_length ( & mut writer, serialized, |writer, array| {
89
89
writer. write_all ( & array)
90
90
} ) ?;
91
91
write_u16 ( & mut writer, self . min_signers ) ?;
92
92
write_u16 ( & mut writer, self . max_signers ) ?;
93
93
Ok ( ( ) )
94
94
}
95
95
96
- fn deserialize_from < R : io:: Read > ( mut reader : R ) -> io :: Result < Self > {
96
+ fn deserialize_from < R : io:: Read > ( mut reader : R ) -> Result < Self , IronfishFrostError > {
97
97
let mut identifier = [ 0u8 ; 32 ] ;
98
98
reader. read_exact ( & mut identifier) ?;
99
- let identifier = Identifier :: deserialize ( & identifier) . map_err ( io :: Error :: other ) ?;
99
+ let identifier = Identifier :: deserialize ( & identifier) ?;
100
100
101
101
let coefficients = read_variable_length ( & mut reader, |reader| {
102
102
let mut scalar = [ 0u8 ; 32 ] ;
@@ -112,8 +112,7 @@ impl SerializableSecretPackage {
112
112
reader. read_exact ( & mut array) ?;
113
113
Ok ( array)
114
114
} ,
115
- ) ?)
116
- . map_err ( io:: Error :: other) ?;
115
+ ) ?) ?;
117
116
118
117
let min_signers = read_u16 ( & mut reader) ?;
119
118
let max_signers = read_u16 ( & mut reader) ?;
@@ -153,8 +152,8 @@ pub fn export_secret_package<R: RngCore + CryptoRng>(
153
152
pub fn import_secret_package (
154
153
exported : & [ u8 ] ,
155
154
secret : & participant:: Secret ,
156
- ) -> io :: Result < SecretPackage > {
157
- let serialized = multienc:: decrypt ( secret, & exported) . map_err ( io:: Error :: other) ?;
155
+ ) -> Result < SecretPackage , IronfishFrostError > {
156
+ let serialized = multienc:: decrypt ( secret, exported) . map_err ( io:: Error :: other) ?;
158
157
SerializableSecretPackage :: deserialize_from ( & serialized[ ..] ) . map ( |pkg| pkg. into ( ) )
159
158
}
160
159
@@ -247,22 +246,22 @@ impl PublicPackage {
247
246
buf
248
247
}
249
248
250
- pub fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> io :: Result < ( ) > {
249
+ pub fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> Result < ( ) , IronfishFrostError > {
251
250
self . identity . serialize_into ( & mut writer) ?;
252
- let frost_package = self . frost_package . serialize ( ) . map_err ( io :: Error :: other ) ?;
251
+ let frost_package = self . frost_package . serialize ( ) ?;
253
252
write_variable_length_bytes ( & mut writer, & frost_package) ?;
254
- writer . write_all ( & self . group_secret_key_shard_encrypted [ .. ] ) ?;
253
+ write_variable_length_bytes ( & mut writer , & self . group_secret_key_shard_encrypted ) ?;
255
254
writer. write_all ( & self . checksum . to_le_bytes ( ) ) ?;
256
255
Ok ( ( ) )
257
256
}
258
257
259
- pub fn deserialize_from < R : io:: Read > ( mut reader : R ) -> io :: Result < Self > {
258
+ pub fn deserialize_from < R : io:: Read > ( mut reader : R ) -> Result < Self , IronfishFrostError > {
260
259
let identity = Identity :: deserialize_from ( & mut reader) . expect ( "reading identity failed" ) ;
261
260
262
261
let frost_package = read_variable_length_bytes ( & mut reader) ?;
263
- let frost_package = Package :: deserialize ( & frost_package) . map_err ( io :: Error :: other ) ?;
262
+ let frost_package = Package :: deserialize ( & frost_package) ?;
264
263
265
- let group_secret_key_shard_encrypted = read_encrypted_blob ( & mut reader) ?;
264
+ let group_secret_key_shard_encrypted = read_variable_length_bytes ( & mut reader) ?;
266
265
267
266
let mut checksum = [ 0u8 ; CHECKSUM_LEN ] ;
268
267
reader. read_exact ( & mut checksum) ?;
@@ -282,7 +281,7 @@ pub fn round1<'a, I, R>(
282
281
min_signers : u16 ,
283
282
participants : I ,
284
283
mut csrng : R ,
285
- ) -> Result < ( Vec < u8 > , PublicPackage ) , Error >
284
+ ) -> Result < ( Vec < u8 > , PublicPackage ) , IronfishFrostError >
286
285
where
287
286
I : IntoIterator < Item = & ' a Identity > ,
288
287
R : RngCore + CryptoRng ,
@@ -294,25 +293,21 @@ where
294
293
let participants = participants;
295
294
296
295
if !participants. contains ( & self_identity) {
297
- return Err ( Error :: InvalidInput (
298
- "participants must include self_identity" . to_string ( ) ,
299
- ) ) ;
296
+ return Err ( IronfishFrostError :: InvalidInput ) ;
300
297
}
301
298
302
- let max_signers = u16 :: try_from ( participants . len ( ) )
303
- . map_err ( |_| Error :: InvalidInput ( "too many participants" . to_string ( ) ) ) ?;
299
+ let max_signers =
300
+ u16 :: try_from ( participants . len ( ) ) . map_err ( |_| IronfishFrostError :: InvalidInput ) ?;
304
301
305
302
let ( secret_package, public_package) = frost:: keys:: dkg:: part1 (
306
303
self_identity. to_frost_identifier ( ) ,
307
304
max_signers,
308
305
min_signers,
309
306
& mut csrng,
310
- )
311
- . map_err ( Error :: FrostError ) ?;
307
+ ) ?;
312
308
313
309
let encrypted_secret_package =
314
- export_secret_package ( & secret_package, self_identity, & mut csrng)
315
- . map_err ( Error :: EncryptionError ) ?;
310
+ export_secret_package ( & secret_package, self_identity, & mut csrng) ?;
316
311
317
312
let group_secret_key_shard = GroupSecretKeyShard :: random ( & mut csrng) ;
318
313
@@ -492,6 +487,13 @@ mod tests {
492
487
let deserialized = PublicPackage :: deserialize_from ( & serialized[ ..] )
493
488
. expect ( "package deserialization failed" ) ;
494
489
490
+ assert_eq ! ( public_package. identity, deserialized. identity) ;
491
+ assert_eq ! ( public_package. checksum, deserialized. checksum) ;
492
+ assert_eq ! ( public_package. frost_package, deserialized. frost_package) ;
493
+ assert_eq ! (
494
+ public_package. group_secret_key_shard_encrypted,
495
+ deserialized. group_secret_key_shard_encrypted
496
+ ) ;
495
497
assert_eq ! ( public_package, deserialized) ;
496
498
}
497
499
0 commit comments