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 ;
13
13
use crate :: frost:: keys:: VerifiableSecretSharingCommitment ;
14
14
use crate :: frost:: Field ;
15
15
use crate :: frost:: Identifier ;
16
16
use crate :: frost:: JubjubScalarField ;
17
+ use crate :: io;
17
18
use crate :: multienc;
18
- use crate :: multienc:: read_encrypted_blob;
19
19
use crate :: participant;
20
20
use crate :: participant:: Identity ;
21
21
use crate :: serde:: read_u16;
@@ -24,12 +24,21 @@ use crate::serde::read_variable_length_bytes;
24
24
use crate :: serde:: write_u16;
25
25
use crate :: serde:: write_variable_length;
26
26
use crate :: serde:: write_variable_length_bytes;
27
+ use core:: borrow:: Borrow ;
27
28
use rand_core:: CryptoRng ;
28
29
use rand_core:: RngCore ;
29
- use std:: borrow:: Borrow ;
30
- use std:: hash:: Hasher ;
31
- use std:: io;
32
- use std:: mem;
30
+
31
+ use core:: hash:: Hasher ;
32
+ use core:: mem;
33
+
34
+ #[ cfg( not( feature = "std" ) ) ]
35
+ extern crate alloc;
36
+
37
+ #[ cfg( not( feature = "std" ) ) ]
38
+ use alloc:: vec:: Vec ;
39
+
40
+ #[ cfg( not( feature = "std" ) ) ]
41
+ use alloc:: string:: ToString ;
33
42
34
43
type Scalar = <JubjubScalarField as Field >:: Scalar ;
35
44
@@ -80,23 +89,24 @@ impl<'a> From<&'a SerializableSecretPackage> for &'a SecretPackage {
80
89
}
81
90
82
91
impl SerializableSecretPackage {
83
- fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> io :: Result < ( ) > {
92
+ fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> Result < ( ) , IronfishFrostError > {
84
93
writer. write_all ( & self . identifier . serialize ( ) ) ?;
85
94
write_variable_length ( & mut writer, & self . coefficients , |writer, scalar| {
86
95
writer. write_all ( & scalar. to_bytes ( ) )
87
96
} ) ?;
88
- write_variable_length ( & mut writer, self . commitment . serialize ( ) , |writer, array| {
97
+ let serialized = self . commitment . serialize ( ) ?;
98
+ write_variable_length ( & mut writer, serialized, |writer, array| {
89
99
writer. write_all ( & array)
90
100
} ) ?;
91
101
write_u16 ( & mut writer, self . min_signers ) ?;
92
102
write_u16 ( & mut writer, self . max_signers ) ?;
93
103
Ok ( ( ) )
94
104
}
95
105
96
- fn deserialize_from < R : io:: Read > ( mut reader : R ) -> io :: Result < Self > {
106
+ fn deserialize_from < R : io:: Read > ( mut reader : R ) -> Result < Self , IronfishFrostError > {
97
107
let mut identifier = [ 0u8 ; 32 ] ;
98
108
reader. read_exact ( & mut identifier) ?;
99
- let identifier = Identifier :: deserialize ( & identifier) . map_err ( io :: Error :: other ) ?;
109
+ let identifier = Identifier :: deserialize ( & identifier) ?;
100
110
101
111
let coefficients = read_variable_length ( & mut reader, |reader| {
102
112
let mut scalar = [ 0u8 ; 32 ] ;
@@ -112,8 +122,7 @@ impl SerializableSecretPackage {
112
122
reader. read_exact ( & mut array) ?;
113
123
Ok ( array)
114
124
} ,
115
- ) ?)
116
- . map_err ( io:: Error :: other) ?;
125
+ ) ?) ?;
117
126
118
127
let min_signers = read_u16 ( & mut reader) ?;
119
128
let max_signers = read_u16 ( & mut reader) ?;
@@ -153,8 +162,9 @@ pub fn export_secret_package<R: RngCore + CryptoRng>(
153
162
pub fn import_secret_package (
154
163
exported : & [ u8 ] ,
155
164
secret : & participant:: Secret ,
156
- ) -> io:: Result < SecretPackage > {
157
- let serialized = multienc:: decrypt ( secret, & exported) . map_err ( io:: Error :: other) ?;
165
+ ) -> Result < SecretPackage , IronfishFrostError > {
166
+ let serialized =
167
+ multienc:: decrypt ( secret, exported) . map_err ( IronfishFrostError :: DecryptionError ) ?;
158
168
SerializableSecretPackage :: deserialize_from ( & serialized[ ..] ) . map ( |pkg| pkg. into ( ) )
159
169
}
160
170
@@ -247,22 +257,22 @@ impl PublicPackage {
247
257
buf
248
258
}
249
259
250
- pub fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> io :: Result < ( ) > {
260
+ pub fn serialize_into < W : io:: Write > ( & self , mut writer : W ) -> Result < ( ) , IronfishFrostError > {
251
261
self . identity . serialize_into ( & mut writer) ?;
252
- let frost_package = self . frost_package . serialize ( ) . map_err ( io :: Error :: other ) ?;
262
+ let frost_package = self . frost_package . serialize ( ) ?;
253
263
write_variable_length_bytes ( & mut writer, & frost_package) ?;
254
- writer . write_all ( & self . group_secret_key_shard_encrypted [ .. ] ) ?;
264
+ write_variable_length_bytes ( & mut writer , & self . group_secret_key_shard_encrypted ) ?;
255
265
writer. write_all ( & self . checksum . to_le_bytes ( ) ) ?;
256
266
Ok ( ( ) )
257
267
}
258
268
259
- pub fn deserialize_from < R : io:: Read > ( mut reader : R ) -> io :: Result < Self > {
269
+ pub fn deserialize_from < R : io:: Read > ( mut reader : R ) -> Result < Self , IronfishFrostError > {
260
270
let identity = Identity :: deserialize_from ( & mut reader) . expect ( "reading identity failed" ) ;
261
271
262
272
let frost_package = read_variable_length_bytes ( & mut reader) ?;
263
- let frost_package = Package :: deserialize ( & frost_package) . map_err ( io :: Error :: other ) ?;
273
+ let frost_package = Package :: deserialize ( & frost_package) ?;
264
274
265
- let group_secret_key_shard_encrypted = read_encrypted_blob ( & mut reader) ?;
275
+ let group_secret_key_shard_encrypted = read_variable_length_bytes ( & mut reader) ?;
266
276
267
277
let mut checksum = [ 0u8 ; CHECKSUM_LEN ] ;
268
278
reader. read_exact ( & mut checksum) ?;
@@ -282,7 +292,7 @@ pub fn round1<'a, I, R>(
282
292
min_signers : u16 ,
283
293
participants : I ,
284
294
mut csrng : R ,
285
- ) -> Result < ( Vec < u8 > , PublicPackage ) , Error >
295
+ ) -> Result < ( Vec < u8 > , PublicPackage ) , IronfishFrostError >
286
296
where
287
297
I : IntoIterator < Item = & ' a Identity > ,
288
298
R : RngCore + CryptoRng ,
@@ -294,25 +304,24 @@ where
294
304
let participants = participants;
295
305
296
306
if !participants. contains ( & self_identity) {
297
- return Err ( Error :: InvalidInput (
307
+ return Err ( IronfishFrostError :: InvalidInput (
298
308
"participants must include self_identity" . to_string ( ) ,
299
309
) ) ;
300
310
}
301
311
302
312
let max_signers = u16:: try_from ( participants. len ( ) )
303
- . map_err ( |_| Error :: InvalidInput ( "too many participants" . to_string ( ) ) ) ?;
313
+ . map_err ( |_| IronfishFrostError :: InvalidInput ( "too many participants" . to_string ( ) ) ) ?;
304
314
305
315
let ( secret_package, public_package) = frost:: keys:: dkg:: part1 (
306
316
self_identity. to_frost_identifier ( ) ,
307
317
max_signers,
308
318
min_signers,
309
319
& mut csrng,
310
- )
311
- . map_err ( Error :: FrostError ) ?;
320
+ ) ?;
312
321
313
322
let encrypted_secret_package =
314
323
export_secret_package ( & secret_package, self_identity, & mut csrng)
315
- . map_err ( Error :: EncryptionError ) ?;
324
+ . map_err ( IronfishFrostError :: EncryptionError ) ?;
316
325
317
326
let group_secret_key_shard = GroupSecretKeyShard :: random ( & mut csrng) ;
318
327
@@ -492,6 +501,13 @@ mod tests {
492
501
let deserialized = PublicPackage :: deserialize_from ( & serialized[ ..] )
493
502
. expect ( "package deserialization failed" ) ;
494
503
504
+ assert_eq ! ( public_package. identity, deserialized. identity) ;
505
+ assert_eq ! ( public_package. checksum, deserialized. checksum) ;
506
+ assert_eq ! ( public_package. frost_package, deserialized. frost_package) ;
507
+ assert_eq ! (
508
+ public_package. group_secret_key_shard_encrypted,
509
+ deserialized. group_secret_key_shard_encrypted
510
+ ) ;
495
511
assert_eq ! ( public_package, deserialized) ;
496
512
}
497
513
0 commit comments