// (C) 2018 University of Bristol. See License.txt /* * Input.cpp * */ #include "Input.h" #include "Processor.h" template Input::Input(Processor& proc, MAC_Check& mc) : proc(proc), MC(mc), shares(proc.P.num_players()), values_input(0) { buffer.setup(&proc.private_input, -1, proc.private_input_filename); } template Input::~Input() { if (timer.elapsed() > 0) cerr << T::type_string() << " inputs: " << timer.elapsed() << endl; } template void Input::adjust_mac(Share& share, T& value) { T tmp; tmp.mul(MC.get_alphai(), value); tmp.add(share.get_mac(),tmp); share.set_mac(tmp); } template void Input::start(int player, int n_inputs) { shares[player].resize(n_inputs); vector rr(n_inputs); if (player == proc.P.my_num()) { octetStream o; for (int i = 0; i < n_inputs; i++) { T rr, t; Share& share = shares[player][i]; proc.DataF.get_input(share, rr, player); T xi; try { buffer.input(t); } catch (not_enough_to_buffer& e) { throw runtime_error("Insufficient input data to buffer"); } t.sub(t, rr); t.pack(o); xi.add(t, share.get_share()); share.set_share(xi); adjust_mac(share, t); } proc.P.send_all(o, true); values_input += n_inputs; } else { T t; for (int i = 0; i < n_inputs; i++) proc.DataF.get_input(shares[player][i], t, player); } } template void Input::stop(int player, vector targets) { for (unsigned int i = 0; i < targets.size(); i++) proc.get_S_ref(targets[i]) = shares[player][i]; if (proc.P.my_num() != player) { T t; octetStream o; timer.start(); proc.P.receive_player(player, o, true); timer.stop(); for (unsigned int i = 0; i < targets.size(); i++) { Share& share = proc.get_S_ref(targets[i]); t.unpack(o); adjust_mac(share, t); } } } template class Input; template class Input;