// (C) 2016 University of Bristol. See License.txt #include "Math/gf2n.h" #include "Math/gfp.h" #include "Math/Share.h" #include "Math/Setup.h" #include "Auth/fake-stuff.h" #include "Exceptions/Exceptions.h" #include "Math/Setup.h" #include "Processor/Data_Files.h" #include "Tools/mkpath.h" #include "Tools/ezOptionParser.h" #include #include using namespace std; string prep_data_prefix; /* N = Number players * ntrip = Number triples needed * str = "2" or "p" */ template void make_mult_triples(const T& key,int N,int ntrip,const string& str,bool zero) { PRNG G; G.ReSeed(); ofstream* outf=new ofstream[N]; T a,b,c; vector > Sa(N),Sb(N),Sc(N); /* Generate Triples */ for (int i=0; i > Sa(N),Sb(N),Sc(N); /* Generate Triples */ for (int i=0; i void make_square_tuples(const T& key,int N,int ntrip,const string& str,bool zero) { PRNG G; G.ReSeed(); ofstream* outf=new ofstream[N]; T a,c; vector > Sa(N),Sc(N); /* Generate Squares */ for (int i=0; i void make_bits(const T& key,int N,int ntrip,const string& str,bool zero) { PRNG G; G.ReSeed(); ofstream* outf=new ofstream[N]; T a; vector > Sa(N); /* Generate Bits */ for (int i=0; i void make_inputs(const T& key,int N,int ntrip,const string& str,bool zero) { PRNG G; G.ReSeed(); ofstream* outf=new ofstream[N]; T a; vector > Sa(N); /* Generate Inputs */ for (int player=0; player void make_inverse(const T& key,int N,int ntrip,bool zero) { PRNG G; G.ReSeed(); ofstream* outf=new ofstream[N]; T a,b; vector > Sa(N),Sb(N); /* Generate Triples */ for (int i=0; i void make_PreMulC(const T& key, int N, int ntrip, bool zero) { stringstream ss; ss << prep_data_prefix << "PreMulC-" << T::type_char(); Files files(N, key, ss.str()); PRNG G; G.ReSeed(); T a, b, c; c = 1; for (int i=0; i badOptions; string usage; unsigned int i; if(!opt.gotRequired(badOptions)) { for (i=0; i < badOptions.size(); ++i) cerr << "ERROR: Missing required option " << badOptions[i] << "."; opt.getUsage(usage); cout << usage; return 1; } if(!opt.gotExpected(badOptions)) { for(i=0; i < badOptions.size(); ++i) cerr << "ERROR: Got unexpected number of arguments for option " << badOptions[i] << "."; opt.getUsage(usage); cout << usage; return 1; } int nplayers; if (opt.firstArgs.size() == 2) { nplayers = atoi(opt.firstArgs[1]->c_str()); } else if (opt.lastArgs.size() == 1) { nplayers = atoi(opt.lastArgs[0]->c_str()); } else { cerr << "ERROR: invalid number of arguments\n"; opt.getUsage(usage); cout << usage; return 1; } int default_num = 0; int ntrip2=0, ntripp=0, nbits2=0,nbitsp=0,nsqr2=0,nsqrp=0,ninp2=0,ninpp=0,ninv=0, nbittrip=0, nbitgf2ntrip=0; vector list_options; int lg2, lgp; opt.get("--lgp")->getInt(lgp); opt.get("--lg2")->getInt(lg2); opt.get("--default")->getInt(default_num); ntrip2 = ntripp = nbits2 = nbitsp = nsqr2 = nsqrp = ninp2 = ninpp = ninv = nbittrip = nbitgf2ntrip = default_num; if (opt.isSet("--ntriples")) { opt.get("--ntriples")->getInts(list_options); ntrip2 = list_options[0]; ntripp = list_options[1]; } if (opt.isSet("--nbits")) { opt.get("--nbits")->getInts(list_options); nbits2 = list_options[0]; nbitsp = list_options[1]; } if (opt.isSet("--ninputs")) { opt.get("--ninputs")->getInts(list_options); ninp2 = list_options[0]; ninpp = list_options[1]; } if (opt.isSet("--nsquares")) { opt.get("--nsquares")->getInts(list_options); nsqr2 = list_options[0]; nsqrp = list_options[1]; } if (opt.isSet("--ninverses")) opt.get("--ninverses")->getInt(ninv); if (opt.isSet("--nbittriples")) opt.get("--nbittriples")->getInt(nbittrip); if (opt.isSet("--nbitgf2ntriples")) opt.get("--nbitgf2ntriples")->getInt(nbitgf2ntrip); bool zero = opt.isSet("--zero"); if (zero) cout << "Set all values to zero" << endl; PRNG G; G.ReSeed(); prep_data_prefix = get_prep_dir(nplayers, lgp, lg2); // Set up the fields ofstream outf; bigint p; generate_online_setup(outf, prep_data_prefix, p, lgp, lg2); generate_keys(prep_data_prefix, nplayers); /* Find number players and MAC keys etc*/ gfp keyp,pp; keyp.assign_zero(); gf2n key2,p2; key2.assign_zero(); int tmpN = 0; ifstream inpf; // create Player-Data if not there if (mkdir_p("Player-Data") == -1) { cerr << "mkdir_p(Player-Data) failed\n"; throw file_error(); } for (i = 0; i < (unsigned int)nplayers; i++) { stringstream filename; filename << prep_data_prefix << "Player-MAC-Keys-P" << i; inpf.open(filename.str().c_str()); if (inpf.fail()) { inpf.close(); cout << "No MAC key share for player " << i << ", generating a fresh one\n"; pp.randomize(G); p2.randomize(G); ofstream outf(filename.str().c_str()); if (outf.fail()) throw file_error(filename.str().c_str()); outf << nplayers << " " << pp << " " << p2; outf.close(); cout << "Written new MAC key share to " << filename.str() << endl; } else { inpf >> tmpN; // not needed here pp.input(inpf,true); p2.input(inpf,true); inpf.close(); } cout << " Key " << i << "\t p: " << pp << "\n\t 2: " << p2 << endl; keyp.add(pp); key2.add(p2); } cout << "--------------\n"; cout << "Final Keys :\t p: " << keyp << "\n\t\t 2: " << key2 << endl; make_mult_triples(key2,nplayers,ntrip2,"2",zero); make_mult_triples(keyp,nplayers,ntripp,"p",zero); make_bits(key2,nplayers,nbits2,"2",zero); make_bits(keyp,nplayers,nbitsp,"p",zero); make_square_tuples(key2,nplayers,nsqr2,"2",zero); make_square_tuples(keyp,nplayers,nsqrp,"p",zero); make_inputs(key2,nplayers,ninp2,"2",zero); make_inputs(keyp,nplayers,ninpp,"p",zero); make_inverse(key2,nplayers,ninv,zero); make_inverse(keyp,nplayers,ninv,zero); make_bit_triples(key2,nplayers,nbittrip,DATA_BITTRIPLE,zero); make_bit_triples(key2,nplayers,nbitgf2ntrip,DATA_BITGF2NTRIPLE,zero); make_PreMulC(key2,nplayers,ninv,zero); make_PreMulC(keyp,nplayers,ninv,zero); }