1
1
use bc_rand:: RandomNumberGenerator ;
2
2
use bc_shamir:: { split_secret, recover_secret} ;
3
- use crate :: { SSKRError , METADATA_SIZE_BYTES , Secret , Spec , share:: SSKRShare } ;
3
+ use crate :: { Error , Result , METADATA_SIZE_BYTES , Secret , Spec , share:: SSKRShare } ;
4
4
5
5
/// Generates SSKR shares for the given `Spec` and `Secret`.
6
6
///
@@ -11,7 +11,7 @@ use crate::{SSKRError, METADATA_SIZE_BYTES, Secret, Spec, share::SSKRShare};
11
11
pub fn sskr_generate (
12
12
spec : & Spec ,
13
13
master_secret : & Secret
14
- ) -> Result < Vec < Vec < Vec < u8 > > > , SSKRError > {
14
+ ) -> Result < Vec < Vec < Vec < u8 > > > > {
15
15
let mut rng = bc_rand:: SecureRandomNumberGenerator ;
16
16
sskr_generate_using ( spec, master_secret, & mut rng)
17
17
}
@@ -29,7 +29,7 @@ pub fn sskr_generate_using(
29
29
spec : & Spec ,
30
30
master_secret : & Secret ,
31
31
random_generator : & mut impl RandomNumberGenerator
32
- ) -> Result < Vec < Vec < Vec < u8 > > > , SSKRError > {
32
+ ) -> Result < Vec < Vec < Vec < u8 > > > > {
33
33
let groups_shares = generate_shares ( spec, master_secret, random_generator) ?;
34
34
35
35
let result: Vec < Vec < Vec < u8 > > > = groups_shares. iter ( ) . map ( |group| {
@@ -49,7 +49,7 @@ pub fn sskr_generate_using(
49
49
///
50
50
/// Returns an error if the shares do not meet the necessary quorum of groups
51
51
/// and member shares within each group.
52
- pub fn sskr_combine < T > ( shares : & [ T ] ) -> Result < Secret , SSKRError >
52
+ pub fn sskr_combine < T > ( shares : & [ T ] ) -> Result < Secret >
53
53
where
54
54
T : AsRef < [ u8 ] >
55
55
{
@@ -97,24 +97,24 @@ fn serialize_share(share: &SSKRShare) -> Vec<u8> {
97
97
result
98
98
}
99
99
100
- fn deserialize_share ( source : & [ u8 ] ) -> Result < SSKRShare , SSKRError > {
100
+ fn deserialize_share ( source : & [ u8 ] ) -> Result < SSKRShare > {
101
101
if source. len ( ) < METADATA_SIZE_BYTES {
102
- return Err ( SSKRError :: ShareLengthInvalid ) ;
102
+ return Err ( Error :: ShareLengthInvalid ) ;
103
103
}
104
104
105
105
let group_threshold = ( ( source[ 2 ] >> 4 ) + 1 ) as usize ;
106
106
let group_count = ( ( source[ 2 ] & 0xf ) + 1 ) as usize ;
107
107
108
108
if group_threshold > group_count {
109
- return Err ( SSKRError :: GroupThresholdInvalid ) ;
109
+ return Err ( Error :: GroupThresholdInvalid ) ;
110
110
}
111
111
112
112
let identifier = ( ( source[ 0 ] as u16 ) << 8 ) | source[ 1 ] as u16 ;
113
113
let group_index = ( source[ 3 ] >> 4 ) as usize ;
114
114
let member_threshold = ( ( source[ 3 ] & 0xf ) + 1 ) as usize ;
115
115
let reserved = source[ 4 ] >> 4 ;
116
116
if reserved != 0 {
117
- return Err ( SSKRError :: ShareReservedBitsInvalid ) ;
117
+ return Err ( Error :: ShareReservedBitsInvalid ) ;
118
118
}
119
119
let member_index = ( source[ 4 ] & 0xf ) as usize ;
120
120
let value = Secret :: new ( & source[ METADATA_SIZE_BYTES ..] ) ?;
@@ -134,22 +134,22 @@ fn generate_shares(
134
134
spec : & Spec ,
135
135
master_secret : & Secret ,
136
136
random_generator : & mut impl RandomNumberGenerator
137
- ) -> Result < Vec < Vec < SSKRShare > > , SSKRError > {
137
+ ) -> Result < Vec < Vec < SSKRShare > > > {
138
138
// assign a random identifier
139
139
let mut identifier = [ 0u8 ; 2 ] ;
140
140
random_generator. fill_random_data ( & mut identifier) ;
141
141
let identifier: u16 = ( ( identifier[ 0 ] as u16 ) << 8 ) | identifier[ 1 ] as u16 ;
142
142
143
143
let mut groups_shares: Vec < Vec < SSKRShare > > = Vec :: with_capacity ( spec. group_count ( ) ) ;
144
144
145
- let group_secrets = split_secret ( spec. group_threshold ( ) , spec. group_count ( ) , master_secret. data ( ) , random_generator) . map_err ( SSKRError :: ShamirError ) ?;
145
+ let group_secrets = split_secret ( spec. group_threshold ( ) , spec. group_count ( ) , master_secret. data ( ) , random_generator) . map_err ( Error :: ShamirError ) ?;
146
146
147
147
for ( group_index, group) in spec. groups ( ) . iter ( ) . enumerate ( ) {
148
148
let group_secret = & group_secrets[ group_index] ;
149
149
let member_secrets = split_secret ( group. member_threshold ( ) , group. member_count ( ) , group_secret, random_generator)
150
- . map_err ( SSKRError :: ShamirError ) ?
150
+ . map_err ( Error :: ShamirError ) ?
151
151
. into_iter ( ) . map ( Secret :: new)
152
- . collect :: < Result < Vec < Secret > , _ > > ( ) ?;
152
+ . collect :: < Result < Vec < Secret > > > ( ) ?;
153
153
let member_sskr_shares: Vec < SSKRShare > = member_secrets. into_iter ( ) . enumerate ( ) . map ( |( member_index, member_secret) | {
154
154
SSKRShare :: new (
155
155
identifier,
@@ -186,13 +186,13 @@ impl Group {
186
186
}
187
187
}
188
188
189
- fn combine_shares ( shares : & [ SSKRShare ] ) -> Result < Secret , SSKRError > {
189
+ fn combine_shares ( shares : & [ SSKRShare ] ) -> Result < Secret > {
190
190
let mut identifier = 0 ;
191
191
let mut group_threshold = 0 ;
192
192
let mut group_count = 0 ;
193
193
194
194
if shares. is_empty ( ) {
195
- return Err ( SSKRError :: SharesEmpty ) ;
195
+ return Err ( Error :: SharesEmpty ) ;
196
196
}
197
197
198
198
let mut next_group = 0 ;
@@ -213,7 +213,7 @@ fn combine_shares(shares: &[SSKRShare]) -> Result<Secret, SSKRError> {
213
213
share. group_count ( ) != group_count ||
214
214
share. value ( ) . len ( ) != secret_len
215
215
{
216
- return Err ( SSKRError :: ShareSetInvalid ) ;
216
+ return Err ( Error :: ShareSetInvalid ) ;
217
217
}
218
218
}
219
219
@@ -223,11 +223,11 @@ fn combine_shares(shares: &[SSKRShare]) -> Result<Secret, SSKRError> {
223
223
if share. group_index ( ) == group. group_index {
224
224
group_found = true ;
225
225
if share. member_threshold ( ) != group. member_threshold {
226
- return Err ( SSKRError :: MemberThresholdInvalid ) ;
226
+ return Err ( Error :: MemberThresholdInvalid ) ;
227
227
}
228
228
for k in 0 ..group. member_indexes . len ( ) {
229
229
if share. member_index ( ) == group. member_indexes [ k] {
230
- return Err ( SSKRError :: DuplicateMemberIndex ) ;
230
+ return Err ( Error :: DuplicateMemberIndex ) ;
231
231
}
232
232
}
233
233
if group. member_indexes . len ( ) < group. member_threshold {
@@ -248,7 +248,7 @@ fn combine_shares(shares: &[SSKRShare]) -> Result<Secret, SSKRError> {
248
248
249
249
// Check that we have enough groups to recover the master secret
250
250
if next_group < group_threshold {
251
- return Err ( SSKRError :: NotEnoughGroups ) ;
251
+ return Err ( Error :: NotEnoughGroups ) ;
252
252
}
253
253
254
254
// Here, all of the shares are unpacked into member groups. Now we go through each
@@ -275,7 +275,7 @@ fn combine_shares(shares: &[SSKRShare]) -> Result<Secret, SSKRError> {
275
275
276
276
// If we don't have enough groups to recover the master secret, return an error
277
277
if master_indexes. len ( ) < group_threshold {
278
- return Err ( SSKRError :: NotEnoughGroups ) ;
278
+ return Err ( Error :: NotEnoughGroups ) ;
279
279
}
280
280
281
281
// Recover the master secret
0 commit comments