@@ -5,18 +5,12 @@ Sharing::Sharing(uint64_t prime_base, uint64_t extension_degree,
5
5
: prime_base_(prime_base),
6
6
extension_degree_(extension_degree),
7
7
size_coefficients_bits_(std::ceil(std::log2l(prime_base))),
8
- length_of_elements_in_bits_(size_coefficients_bits_ * extension_degree) {
8
+ length_of_elements_in_bits_(size_coefficients_bits_ * extension_degree),
9
+ dist_(0 , std::numeric_limits<uint64_t >::max()),
10
+ gen_(rng, dist_) {
11
+
9
12
fmpz_init (prime_fmpz_);
10
13
fmpz_set_ui (prime_fmpz_, prime_base_);
11
- flint_randinit (random_state_);
12
-
13
- boost::uniform_int<uint64_t > dist_ (0 , std::numeric_limits<uint64_t >::max ());
14
- boost::variate_generator<boost::mt19937&, boost::uniform_int<uint64_t >> gen_ (
15
- rng, dist_);
16
-
17
- mp_limb_t seed1 = gen_ ();
18
- mp_limb_t seed2 = gen_ ();
19
- flint_randseed (random_state_, seed1, seed2);
20
14
21
15
if (!irreducible_polynomial.empty ()) {
22
16
fmpz_mod_ctx_init (ctx_fmpz_mod_, prime_fmpz_);
@@ -42,7 +36,6 @@ Sharing::Sharing(uint64_t prime_base, uint64_t extension_degree,
42
36
Sharing::~Sharing () {
43
37
fmpz_clear (prime_fmpz_);
44
38
fq_ctx_clear (ctx_fq_);
45
- flint_randclear (random_state_);
46
39
fmpz_mod_poly_clear (fmpz_poly_, ctx_fmpz_mod_);
47
40
fmpz_mod_ctx_clear (ctx_fmpz_mod_);
48
41
}
@@ -200,40 +193,67 @@ void Sharing::ConvertFqToPolynomial(fq_t& polynomial_fq,
200
193
fmpz_clear (fmpz_coef);
201
194
}
202
195
196
+ boost::dynamic_bitset<> Sharing::ConvertPolynomialToBitset (
197
+ const Polynomial& polynomial) const {
198
+ uint64_t number_of_bits = length_of_elements_in_bits_;
199
+ uint64_t bit_index, coefficient_index;
200
+ boost::dynamic_bitset<> bitset (number_of_bits);
201
+
202
+ for (coefficient_index = 0 ; coefficient_index < polynomial.size ();
203
+ ++coefficient_index) {
204
+ for (bit_index = 0 ; bit_index < size_coefficients_bits_; ++bit_index) {
205
+ bitset[coefficient_index * size_coefficients_bits_ + bit_index] =
206
+ (polynomial[coefficient_index] >> bit_index) & 1 ;
207
+ }
208
+ }
209
+
210
+ return bitset;
211
+ }
212
+
213
+
203
214
void Sharing::SampleRandomPolynomial (fq_t & random_polynomial_fq) {
204
- fmpz_mod_poly_randtest (fmpz_poly_, random_state_, extension_degree_,
205
- ctx_fmpz_mod_);
206
- fq_set_fmpz_mod_poly (random_polynomial_fq, fmpz_poly_, ctx_fq_);
215
+ fmpz_mod_poly_t random_fmpz;
216
+ fmpz_mod_poly_init (random_fmpz, ctx_fmpz_mod_);
217
+
218
+ fmpz_t coefficient;
219
+ fmpz_init (coefficient);
220
+
221
+ for (uint64_t index = 0 ; index < extension_degree_; ++index) {
222
+ fmpz_set_ui (coefficient, gen_ ());
223
+ fmpz_mod_poly_set_coeff_fmpz (random_fmpz, index, coefficient,
224
+ ctx_fmpz_mod_);
225
+ }
226
+
227
+ fq_set_fmpz_mod_poly (random_polynomial_fq, random_fmpz, ctx_fq_);
228
+ fmpz_mod_poly_clear (random_fmpz, ctx_fmpz_mod_);
229
+ fmpz_clear (coefficient);
207
230
}
208
231
209
232
std::vector<uint64_t > Sharing::SampleRandomBitslicedPolynomial () {
210
- uint64_t bit_index, coefficient_index, simulation_index, index;
211
- std::vector<uint64_t > bitsliced_polynomial (length_of_elements_in_bits_, 0 );
233
+ uint64_t index, bit_index, bit_width = length_of_elements_in_bits_;
234
+ std::vector<uint64_t > bitsliced_polynomial (bit_width);
235
+ boost::dynamic_bitset<> bitset;
236
+ Polynomial polynomial (extension_degree_);
212
237
213
- uint64_t coefficient;
214
- fmpz_t fmpz_coef;
215
- fmpz_init (fmpz_coef);
238
+ for (index = 0 ; index < 64 ; ++index) {
239
+ fq_t polynomial_fq;
240
+ fq_init (polynomial_fq, ctx_fq_);
241
+ SampleRandomPolynomial (polynomial_fq);
242
+ ConvertFqToPolynomial (polynomial_fq, polynomial);
243
+ bitset = ConvertPolynomialToBitset (polynomial);
216
244
217
- for (simulation_index = 0 ; simulation_index < 64 ; ++simulation_index) {
218
- index = 0 ;
219
- fmpz_mod_poly_randtest (fmpz_poly_, random_state_, extension_degree_, ctx_fmpz_mod_);
220
- for (coefficient_index = 0 ; coefficient_index < extension_degree_;
221
- ++coefficient_index) {
222
- fmpz_mod_poly_get_coeff_fmpz (fmpz_coef, fmpz_poly_, index, ctx_fmpz_mod_);
223
- coefficient = fmpz_get_ui (fmpz_coef);
224
- for (bit_index = 0 ; bit_index < size_coefficients_bits_; ++bit_index) {
225
- bitsliced_polynomial[index] <<= 1 ;
226
- bitsliced_polynomial[index] |= coefficient & 1 ;
227
- coefficient >>= 1 ;
228
- ++index;
229
- }
245
+ for (bit_index = 0 ; bit_index < bit_width; ++bit_index) {
246
+ bitsliced_polynomial[bit_index] <<= 1 ;
247
+ bitsliced_polynomial[bit_index] |= bitset[bit_index];
230
248
}
249
+
250
+ fq_clear (polynomial_fq, ctx_fq_);
231
251
}
232
252
233
- fmpz_clear (fmpz_coef);
234
253
return bitsliced_polynomial;
235
254
}
236
255
256
+
237
257
std::vector<Polynomial> Sharing::Encode (fq_t & polynomial_fq,
238
258
uint64_t number_of_shares,
239
259
bool is_additive_masking) {
0 commit comments