@@ -147,6 +147,8 @@ impl<E: Curve, L: SecurityLevel> TrustedDealerBuilder<E, L> {
147
147
148
148
/// Generates [`IncompleteKeyShare`]s
149
149
///
150
+ /// For Shamir secret sharing, it's shared at points `1` to `n`
151
+ ///
150
152
/// Returns error if provided inputs are invalid, or if internal
151
153
/// error has occurred.
152
154
pub fn generate_core_shares (
@@ -169,11 +171,10 @@ impl<E: Curve, L: SecurityLevel> TrustedDealerBuilder<E, L> {
169
171
self ,
170
172
rng : & mut ( impl RngCore + CryptoRng ) ,
171
173
) -> Result < Vec < KeyShare < E , L > > , TrustedDealerError > {
172
- let preimages = ( 1 ..=self . n )
173
- . map ( |i| generic_ec:: NonZero :: from_scalar ( generic_ec:: Scalar :: from ( i) ) )
174
- . collect :: < Option < Vec < _ > > > ( )
175
- . ok_or ( Reason :: DeriveKeyShareIndex ) ?;
176
- self . generate_shares_at ( preimages, rng)
174
+ self . generate_shares_at_internal (
175
+ key_share:: trusted_dealer:: TrustedDealerBuilder :: generate_shares,
176
+ rng,
177
+ )
177
178
}
178
179
179
180
/// Generates [`KeyShare`]s shared at preimages provided. Each share is
@@ -184,16 +185,58 @@ impl<E: Curve, L: SecurityLevel> TrustedDealerBuilder<E, L> {
184
185
/// Returns error if provided inputs are invalid, or if internal
185
186
/// error has occurred.
186
187
pub fn generate_shares_at (
187
- mut self ,
188
+ self ,
188
189
preimages : Vec < NonZero < generic_ec:: Scalar < E > > > ,
189
190
rng : & mut ( impl RngCore + CryptoRng ) ,
190
191
) -> Result < Vec < KeyShare < E , L > > , TrustedDealerError > {
192
+ self . generate_shares_at_internal (
193
+ |builder, rng| builder. generate_shares_at ( preimages, rng) ,
194
+ rng,
195
+ )
196
+ }
197
+
198
+ /// Generates [`CoreKeyShare`]s shared at random points
199
+ ///
200
+ /// Returns error if provided inputs are invalid, or if internal
201
+ /// error has occurred.
202
+ ///
203
+ /// For Shamir secret sharing, the points at which the value is shared at
204
+ /// are chosen at random between `1` and `u16::MAX`. For additive shares,
205
+ /// this is the same as [`TrustedDealerBuilder::generate_shares`]
206
+ ///
207
+ /// Returns error if provided inputs are invalid, or if internal
208
+ /// error has occurred.
209
+ pub fn generate_shares_at_random (
210
+ self ,
211
+ rng : & mut ( impl rand_core:: RngCore + rand_core:: CryptoRng ) ,
212
+ ) -> Result < Vec < KeyShare < E , L > > , TrustedDealerError > {
213
+ self . generate_shares_at_internal (
214
+ key_share:: trusted_dealer:: TrustedDealerBuilder :: generate_shares_at_random,
215
+ rng,
216
+ )
217
+ }
218
+
219
+ fn generate_shares_at_internal < R , F > (
220
+ mut self ,
221
+ inner_generate : F ,
222
+ rng : & mut R ,
223
+ ) -> Result < Vec < KeyShare < E , L > > , TrustedDealerError >
224
+ where
225
+ F : FnOnce (
226
+ CoreBuilder < E > ,
227
+ & mut R ,
228
+ ) -> Result <
229
+ Vec < IncompleteKeyShare < E > > ,
230
+ key_share:: trusted_dealer:: TrustedDealerError ,
231
+ > ,
232
+ R : rand_core:: RngCore + rand_core:: CryptoRng ,
233
+ {
191
234
let n = self . n ;
192
235
let enable_multiexp = self . enable_mulitexp ;
193
236
let enable_crt = self . enable_crt ;
194
237
195
238
let primes = self . pregenerated_primes . take ( ) ;
196
- let core_key_shares = self . inner . generate_shares_at ( preimages , rng) . map_err ( Reason :: CoreError ) ?;
239
+ let core_key_shares = inner_generate ( self . inner , rng) . map_err ( Reason :: CoreError ) ?;
197
240
let aux_data = if let Some ( primes) = primes {
198
241
generate_aux_data_with_primes ( rng, primes, enable_multiexp, enable_crt) ?
199
242
} else {
@@ -209,30 +252,6 @@ impl<E: Curve, L: SecurityLevel> TrustedDealerBuilder<E, L> {
209
252
210
253
Ok ( key_shares)
211
254
}
212
-
213
- /// Generates [`CoreKeyShare`]s shared at random points
214
- ///
215
- /// Returns error if provided inputs are invalid, or if internal
216
- /// error has occurred.
217
- ///
218
- /// For Shamir secret sharing, the points at which the value is shared at
219
- /// are chosen at random between `1` and `u16::MAX`. For additive shares,
220
- /// this is the same as [`TrustedDealerBuilder::generate_shares`]
221
- ///
222
- /// Returns error if provided inputs are invalid, or if internal
223
- /// error has occurred.
224
- pub fn generate_shares_at_random (
225
- self ,
226
- rng : & mut ( impl rand_core:: RngCore + rand_core:: CryptoRng ) ,
227
- ) -> Result < Vec < KeyShare < E , L > > , TrustedDealerError > {
228
- let key_shares_indexes =
229
- rand:: seq:: index:: sample ( rng, usize:: from ( u16:: MAX - 1 ) , usize:: from ( self . n ) )
230
- . iter ( )
231
- . map ( |i| generic_ec:: NonZero :: from_scalar ( generic_ec:: Scalar :: from ( i + 1 ) ) )
232
- . collect :: < Option < Vec < _ > > > ( )
233
- . ok_or ( Reason :: DeriveKeyShareIndex ) ?;
234
- self . generate_shares_at ( key_shares_indexes, rng)
235
- }
236
255
}
237
256
238
257
/// Generates auxiliary data for `n` signers
@@ -334,8 +353,6 @@ enum Reason {
334
353
BuildCrt ( #[ source] InvalidKeyShare ) ,
335
354
#[ error( "couldn't build multiexp tables" ) ]
336
355
BuildMultiexp ( #[ source] InvalidKeyShare ) ,
337
- #[ error( "deriving key share index failed" ) ]
338
- DeriveKeyShareIndex ,
339
356
#[ error( transparent) ]
340
357
CoreError ( #[ from] key_share:: trusted_dealer:: TrustedDealerError ) ,
341
358
}
0 commit comments