#include // arc4random_buf #include "rdpf.hpp" #include "bitutils.hpp" #include "mpcops.hpp" #include "aes.hpp" #include "prg.hpp" // Don't warn if we never actually use these functions static void dump_node(DPFnode node, const char *label = NULL) __attribute__ ((unused)); static void dump_level(DPFnode *nodes, size_t num, const char *label = NULL) __attribute__ ((unused)); static void dump_node(DPFnode node, const char *label) { if (label) printf("%s: ", label); for(int i=0;i<16;++i) { printf("%02x", ((unsigned char *)&node)[15-i]); } printf("\n"); } static void dump_level(DPFnode *nodes, size_t num, const char *label) { if (label) printf("%s:\n", label); for (size_t i=0;i coroutines; coroutines.emplace_back( [&](yield_t &yield) { tio.queue_peer(&our_parity_bit, 1); yield(); uint8_t peer_parity_byte; tio.recv_peer(&peer_parity_byte, 1); peer_parity_bit = peer_parity_byte & 1; }); coroutines.emplace_back( [&](yield_t &yield) { mpc_reconstruct_choice(tio, yield, CW, bs_choice, (R ^ our_parity), L); }); run_coroutines(yield, coroutines); bool parity_bit = our_parity_bit ^ peer_parity_bit; cfbits |= (size_t(parity_bit)< coroutines; for (int i=0;i<3;++i) { coroutines.emplace_back( [&, i](yield_t &yield) { dpf[i] = RDPF(tio, yield, xs_target, depth); }); } coroutines.emplace_back( [&](yield_t &yield) { mpc_xs_to_as(tio, yield, as_target, xs_target, depth); }); run_coroutines(yield, coroutines); }