/* * SimpleMachine.cpp * */ #include #include #include "FHEOffline/Producer.h" #include "FHEOffline/Sacrificing.h" #include "FHE/FHE_Keys.h" #include "Tools/time-func.h" #include "Tools/ezOptionParser.h" #include "Protocols/MAC_Check.h" #include "Protocols/fake-stuff.h" #include "Protocols/fake-stuff.hpp" void* run_generator(void* generator) { ((GeneratorBase*)generator)->run(); return 0; } MachineBase::MachineBase() : throughput_loop_thread(0),portnum_base(0), data_type(DATA_TRIPLE), sec(0), drown_sec(0), field_size(0), extra_slack(0), produce_inputs(false), use_gf2n(false) { } MachineBase::MachineBase(int argc, const char** argv) : MachineBase() { parse_options(argc, argv); mult_performance(); } void MachineBase::parse_options(int argc, const char** argv) { opt.add( "localhost", // Default. 0, // Required? 1, // Number of args expected. 0, // Delimiter if expecting multiple args. "Host where party 0 is running (default: localhost)", // Help description. "-h", // Flag token. "--hostname" // Flag token. ); opt.add( "5000", // Default. 0, // Required? 1, // Number of args expected. 0, // Delimiter if expecting multiple args. "Base port number (default: 5000).", // Help description. "-pn", // Flag token. "--portnum" // Flag token. ); opt.add( "40", // Default. 0, // Required? 1, // Number of args expected. 0, // Delimiter if expecting multiple args. "Statistical security parameter (default: 40)", // Help description. "-s", // Flag token. "--security" // Flag token. ); opt.add( "128", // Default. 0, // Required? 1, // Number of args expected. 0, // Delimiter if expecting multiple args. "Logarithmic field size (default: 128)", // Help description. "-f", // Flag token. "--field-size" // Flag token. ); opt.add( "", // Default. 0, // Required? 0, // Number of args expected. 0, // Delimiter if expecting multiple args. "Use extension field GF(2^40)", // Help description. "-2", // Flag token. "--gf2n" // Flag token. ); OfflineMachineBase::parse_options(argc, argv); opt.get("-h")->getString(hostname); opt.get("-pn")->getInt(portnum_base); opt.get("-s")->getInt(sec); drown_sec = max(40, sec); opt.get("-f")->getInt(field_size); use_gf2n = opt.isSet("-2"); if (use_gf2n) { cout << "Using GF(2^40)" << endl; field_size = 40; } start_networking_with_server(hostname, portnum_base); } void MultiplicativeMachine::parse_options(int argc, const char** argv) { opt.add( "", // Default. 0, // Required? 0, // Number of args expected. 0, // Delimiter if expecting multiple args. "Produce squares instead of multiplication triples (default: false)", // Help description. "-S", // Flag token. "--squares" // Flag token. ); opt.add( "", // Default. 0, // Required? 0, // Number of args expected. 0, // Delimiter if expecting multiple args. "Produce bits instead of multiplication triples (default: false)", // Help description. "-B", // Flag token. "--bits" // Flag token. ); opt.add( "", // Default. 0, // Required? 0, // Number of args expected. 0, // Delimiter if expecting multiple args. "Produce inverses instead of multiplication triples (default: false)", // Help description. "-I", // Flag token. "--inverses" // Flag token. ); opt.add( "", // Default. 0, // Required? 0, // Number of args expected. 0, // Delimiter if expecting multiple args. "Produce input tuples instead of multiplication triples (default: false)", // Help description. "-i", // Flag token. "--inputs" // Flag token. ); MachineBase::parse_options(argc, argv); if (opt.isSet("--bits")) data_type = DATA_BIT; else if (opt.isSet("--squares")) data_type = DATA_SQUARE; else if (opt.isSet("--inverses")) data_type = DATA_INVERSE; else data_type = DATA_TRIPLE; produce_inputs = opt.isSet("--inputs"); cout << "Going to produce " << item_type() << endl; } string MachineBase::item_type() { string res; if (produce_inputs) res = "Inputs"; else res = DataPositions::dtype_names[data_type]; transform(res.begin(), res.end(), res.begin(), ::tolower); return res; } SimpleMachine::SimpleMachine(int argc, const char** argv) { opt.add( "", // Default. 0, // Required? 0, // Number of args expected. 0, // Delimiter if expecting multiple args. "Use global zero-knowledge proof", // Help description. "-g", // Flag token. "--global-proof" // Flag token. ); parse_options(argc, argv); if (opt.get("-g")->isSet) generate_setup(INTERACTIVE_SPDZ1_SLACK); else generate_setup(NONINTERACTIVE_SPDZ1_SLACK); for (int i = 0; i < nthreads; i++) if (opt.get("-g")->isSet) if (use_gf2n) generators.push_back(new_generator(i)); else generators.push_back(new_generator(i)); else if (use_gf2n) generators.push_back(new_generator(i)); else generators.push_back(new_generator(i)); } template