// (C) 2017 University of Bristol. See License.txt #include "Share.h" //#include "Tools/random.h" #include "Math/gfp.h" #include "Math/gf2n.h" #include "Math/operators.h" template Share::Share(const T& aa, int my_num, const T& alphai) { if (my_num == 0) a = aa; else a.assign_zero(); mac = aa * alphai; } template void Share::mul_by_bit(const Share& S,const T& aa) { a.mul(S.a,aa); mac.mul(S.mac,aa); } template<> void Share::mul_by_bit(const Share& S, const gf2n& aa) { a.mul_by_bit(S.a,aa); mac.mul_by_bit(S.mac,aa); } template void Share::add(const Share& S,const T& aa,bool playerone,const T& alphai) { if (playerone) { a.add(S.a,aa); } else { a=S.a; } T tmp; tmp.mul(alphai,aa); mac.add(S.mac,tmp); } template void Share::sub(const Share& S,const T& aa,bool playerone,const T& alphai) { if (playerone) { a.sub(S.a,aa); } else { a=S.a; } T tmp; tmp.mul(alphai,aa); mac.sub(S.mac,tmp); } template void Share::sub(const T& aa,const Share& S,bool playerone,const T& alphai) { if (playerone) { a.sub(aa,S.a); } else { a=S.a; a.negate(); } T tmp; tmp.mul(alphai,aa); mac.sub(tmp,S.mac); } template void Share::sub(const Share& S1,const Share& S2) { a.sub(S1.a,S2.a); mac.sub(S1.mac,S2.mac); } template T combine(const vector< Share >& S) { T ans=S[0].a; for (unsigned int i=1; i inline void Share::pack(octetStream& os) const { a.pack(os); mac.pack(os); } template inline void Share::unpack(octetStream& os) { a.unpack(os); mac.unpack(os); } template bool check_macs(const vector< Share >& S,const T& key) { T val=combine(S); // Now check the MAC is valid val.mul(val,key); for (unsigned i=0; i; template class Share; template gf2n combine(const vector< Share >& S); template gfp combine(const vector< Share >& S); template bool check_macs(const vector< Share >& S,const gf2n& key); template bool check_macs(const vector< Share >& S,const gfp& key); #ifdef USE_GF2N_LONG template class Share; template gf2n_short combine(const vector< Share >& S); template bool check_macs(const vector< Share >& S,const gf2n_short& key); #endif