void convert_shares(__m128i ** output, int8_t ** flags, size_t n_threads, size_t db_nitems, __m128i * final_correction_word, tcp::socket& sb, bool party) { for(size_t j = 0; j < db_nitems; ++j) { for(size_t k = 0; k < n_threads; ++k) { if(party) { //output[k][j] = -output[k][j]; flags[k][j] = -flags[k][j]; } } #ifdef DEBUG int8_t out = flags[0][j]; int8_t out_rec; boost::asio::write(sb, boost::asio::buffer(&out, sizeof(out))); boost::asio::read(sb, boost::asio::buffer(&out_rec, sizeof(out_rec))); out_rec = out_rec + out; __m128i out2 = output[0][j]; __m128i out_rec2; boost::asio::write(sb, boost::asio::buffer(&out2, sizeof(out2))); boost::asio::read(sb, boost::asio::buffer(&out_rec2, sizeof(out_rec2))); out_rec2 = out_rec2 + out2; #endif } for(size_t i = 0; i < n_threads; ++i) { int64_t pm = 0; int64_t rb; arc4random_buf(&rb, sizeof(rb)); for(size_t j = 0; j < db_nitems; ++j) { if(party) { if(flags[i][j] != 0) pm -= 1; } if(!party) { if(flags[i][j] != 0) pm += 1; } } int64_t rb_reconstruction; boost::asio::write(sb, boost::asio::buffer(&rb, sizeof(rb))); boost::asio::read(sb, boost::asio::buffer(&rb_reconstruction, sizeof(rb_reconstruction))); rb_reconstruction = rb_reconstruction + rb; int64_t pm_reconstruction; boost::asio::write(sb, boost::asio::buffer(&pm, sizeof(pm))); boost::asio::read(sb, boost::asio::buffer(&pm_reconstruction, sizeof(pm_reconstruction))); pm_reconstruction = pm_reconstruction + pm; int64_t finalcw_rec = 0; boost::asio::write(sb, boost::asio::buffer(&final_correction_word[i][0], sizeof(final_correction_word[i][0]))); boost::asio::read(sb, boost::asio::buffer(&finalcw_rec, sizeof(finalcw_rec))); finalcw_rec = finalcw_rec + final_correction_word[i][0]; int64_t rbpm_fcw = (final_correction_word[i][0]) * pm_reconstruction; int64_t PM = pm + rb; int64_t PM_recv; boost::asio::write(sb, boost::asio::buffer(&PM, sizeof(PM))); boost::asio::read(sb, boost::asio::buffer(&PM_recv, sizeof(PM_recv))); int64_t * flags_ = (int64_t *)std::aligned_alloc(sizeof(node_t), db_nitems * sizeof(int64_t)); for(size_t j = 0; j < db_nitems; ++j) { flags_[j] = (flags[i][j] * pm) + (flags[i][j] * PM_recv) + (flags[i][j] * rb); #ifdef DEBUG int64_t flags_rec; boost::asio::write(sb, boost::asio::buffer(&flags_[j], sizeof(flags_[j]))); boost::asio::read(sb, boost::asio::buffer(&flags_rec, sizeof(flags_rec))); flags_rec = flags_rec + flags_[j]; #endif } for(size_t j = 0; j < db_nitems; ++j) { flags_[j] += output[i][j][0]; if(!party) { if(flags[i][j] != 0) flags_[j] -= (rb_reconstruction) + rbpm_fcw; } if(party) { if(flags[i][j] != 0) flags_[j] += (rb_reconstruction) + rbpm_fcw; } #ifdef DEBUG int64_t flags_rec; boost::asio::write(sb, boost::asio::buffer(&flags_[j], sizeof(flags_[j]))); boost::asio::read(sb, boost::asio::buffer(&flags_rec, sizeof(flags_rec))); flags_rec = flags_rec + flags_[j]; if(flags_rec != 0) { std::cout << j << "---> flag_reconstruction = " << flags_rec << std::endl; } #endif } } }