|
@@ -5,17 +5,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
void mpc_mul(MPCTIO &tio, yield_t &yield,
|
|
|
value_t &as_z, value_t as_x, value_t as_y,
|
|
|
nbits_t nbits)
|
|
|
{
|
|
|
- value_t mask = MASKBITS(nbits);
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
+
|
|
|
+ mpc_cross(tio, yield, as_z, as_x, as_y, nbits);
|
|
|
+
|
|
|
+ as_z = (as_z + as_x * as_y) & mask;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void mpc_cross(MPCTIO &tio, yield_t &yield,
|
|
|
+ value_t &as_z, value_t as_x, value_t as_y,
|
|
|
+ nbits_t nbits)
|
|
|
+{
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
size_t nbytes = BITBYTES(nbits);
|
|
|
auto [X, Y, Z] = tio.triple();
|
|
|
|
|
@@ -33,7 +52,7 @@ void mpc_mul(MPCTIO &tio, yield_t &yield,
|
|
|
tio.recv_peer(&peer_blind_x, nbytes);
|
|
|
tio.recv_peer(&peer_blind_y, nbytes);
|
|
|
|
|
|
- as_z = ((as_x * (as_y + peer_blind_y)) - Y * peer_blind_x + Z) & mask;
|
|
|
+ as_z = ((as_x * peer_blind_y) - (Y * peer_blind_x) + Z) & mask;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -48,7 +67,7 @@ void mpc_valuemul(MPCTIO &tio, yield_t &yield,
|
|
|
value_t &as_z, value_t x,
|
|
|
nbits_t nbits)
|
|
|
{
|
|
|
- value_t mask = MASKBITS(nbits);
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
size_t nbytes = BITBYTES(nbits);
|
|
|
auto [X, Z] = tio.halftriple();
|
|
|
|
|
@@ -69,3 +88,118 @@ void mpc_valuemul(MPCTIO &tio, yield_t &yield,
|
|
|
as_z = ((-X * peer_blind_y) + Z) & mask;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void mpc_flagmult(MPCTIO &tio, yield_t &yield,
|
|
|
+ value_t &as_z, bit_t bs_f, value_t as_y,
|
|
|
+ nbits_t nbits)
|
|
|
+{
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
+
|
|
|
+
|
|
|
+ value_t bs_fval = value_t(bs_f);
|
|
|
+ mpc_cross(tio, yield, as_z, (1-2*bs_fval)*as_y, bs_fval, nbits);
|
|
|
+
|
|
|
+
|
|
|
+ as_z = (as_z + bs_fval*as_y) & mask;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void mpc_select(MPCTIO &tio, yield_t &yield,
|
|
|
+ value_t &as_z, bit_t bs_f, value_t as_x, value_t as_y,
|
|
|
+ nbits_t nbits)
|
|
|
+{
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
+
|
|
|
+
|
|
|
+ mpc_flagmult(tio, yield, as_z, bs_f, as_y-as_x, nbits);
|
|
|
+ as_z = (as_z + as_x) & mask;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void mpc_oswap(MPCTIO &tio, yield_t &yield,
|
|
|
+ value_t &as_x, value_t &as_y, bit_t bs_f,
|
|
|
+ nbits_t nbits)
|
|
|
+{
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ value_t as_s;
|
|
|
+ mpc_flagmult(tio, yield, as_s, bs_f, as_y-as_x, nbits);
|
|
|
+ as_x = (as_x + as_s) & mask;
|
|
|
+ as_y = (as_y - as_s) & mask;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void mpc_xs_to_as(MPCTIO &tio, yield_t &yield,
|
|
|
+ value_t &as_x, value_t xs_x,
|
|
|
+ nbits_t nbits)
|
|
|
+{
|
|
|
+ const value_t mask = MASKBITS(nbits);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ value_t as_bitand[nbits-1];
|
|
|
+ std::vector<coro_t> coroutines;
|
|
|
+ for (nbits_t i=0; i<nbits-1; ++i) {
|
|
|
+ coroutines.emplace_back(
|
|
|
+ [&](yield_t &yield) {
|
|
|
+ mpc_valuemul(tio, yield, as_bitand[i], (xs_x>>i)&1, nbits);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ run_coroutines(yield, coroutines);
|
|
|
+ value_t as_C = 0;
|
|
|
+ for (nbits_t i=0; i<nbits-1; ++i) {
|
|
|
+ as_C += (as_bitand[i]<<(i+1));
|
|
|
+ }
|
|
|
+ as_x = (xs_x - as_C) & mask;
|
|
|
+}
|