123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #include <vector>
- #include <bsd/stdlib.h> // arc4random_buf
- #include "preproc.hpp"
- static std::ofstream openfile(const char *prefix, unsigned player,
- unsigned thread_num)
- {
- std::string filename(prefix);
- char suffix[20];
- sprintf(suffix, ".p%d.t%u", player%10, thread_num);
- filename.append(suffix);
- std::ofstream f;
- f.open(filename);
- if (f.fail()) {
- std::cerr << "Failed to open " << filename << "\n";
- exit(1);
- }
- return f;
- }
- void preprocessing_comp(MPCIO &mpcio, int num_threads, char **args)
- {
- while(1) {
- unsigned char type = 0;
- unsigned int num = 0;
- size_t res = mpcio.serverio.recv(&type, 1);
- if (res < 1 || type == 0) break;
- mpcio.serverio.recv(&num, 4);
- if (type == 0x80) {
-
- std::vector<std::ofstream> tripfiles;
- for (int i=0; i<num_threads; ++i) {
- tripfiles.push_back(openfile("triples", mpcio.player, i));
- }
- unsigned thread_num = 0;
- MultTriple T;
- for (unsigned int i=0; i<num; ++i) {
- res = mpcio.serverio.recv(&T, sizeof(T));
- if (res < sizeof(T)) break;
- tripfiles[thread_num].write((const char *)&T, sizeof(T));
- thread_num = (thread_num + 1) % num_threads;
- }
- for (int i=0; i<num_threads; ++i) {
- tripfiles[i].close();
- }
- } else if (type == 0x81) {
-
- std::vector<std::ofstream> halffiles;
- for (int i=0; i<num_threads; ++i) {
- halffiles.push_back(openfile("halves", mpcio.player, i));
- }
- unsigned thread_num = 0;
- HalfTriple H;
- for (unsigned int i=0; i<num; ++i) {
- res = mpcio.serverio.recv(&H, sizeof(H));
- if (res < sizeof(H)) break;
- halffiles[thread_num].write((const char *)&H, sizeof(H));
- thread_num = (thread_num + 1) % num_threads;
- }
- for (int i=0; i<num_threads; ++i) {
- halffiles[i].close();
- }
- }
- }
- }
- static void create_triples(MPCServerIO &mpcsrvio, unsigned num)
- {
- for (unsigned int i=0; i<num; ++i) {
- uint64_t X0, Y0, Z0, X1, Y1, Z1;
- arc4random_buf(&X0, sizeof(X0));
- arc4random_buf(&Y0, sizeof(Y0));
- arc4random_buf(&Z0, sizeof(Z0));
- arc4random_buf(&X1, sizeof(X1));
- arc4random_buf(&Y1, sizeof(Y1));
- Z1 = X0 * Y1 + X1 * Y0 - Z0;
- MultTriple T0, T1;
- T0 = std::make_tuple(X0, Y0, Z0);
- T1 = std::make_tuple(X1, Y1, Z1);
- mpcsrvio.p0io.queue(&T0, sizeof(T0));
- mpcsrvio.p1io.queue(&T1, sizeof(T1));
- }
- }
- static void create_halftriples(MPCServerIO &mpcsrvio, unsigned num)
- {
- for (unsigned int i=0; i<num; ++i) {
- uint64_t X0, Z0, Y1, Z1;
- arc4random_buf(&X0, sizeof(X0));
- arc4random_buf(&Z0, sizeof(Z0));
- arc4random_buf(&Y1, sizeof(Y1));
- Z1 = X0 * Y1 - Z0;
- HalfTriple H0, H1;
- H0 = std::make_tuple(X0, Z0);
- H1 = std::make_tuple(Y1, Z1);
- mpcsrvio.p0io.queue(&H0, sizeof(H0));
- mpcsrvio.p1io.queue(&H1, sizeof(H1));
- }
- }
- void preprocessing_server(MPCServerIO &mpcsrvio, char **args)
- {
- while (*args) {
- char *colon = strchr(*args, ':');
- if (!colon) {
- std::cerr << "Args must be type:num\n";
- ++args;
- continue;
- }
- unsigned num = atoi(colon+1);
- *colon = '\0';
- char *type = *args;
- if (!strcmp(type, "t")) {
- unsigned char typetag = 0x80;
- mpcsrvio.p0io.queue(&typetag, 1);
- mpcsrvio.p0io.queue(&num, 4);
- mpcsrvio.p1io.queue(&typetag, 1);
- mpcsrvio.p1io.queue(&num, 4);
- create_triples(mpcsrvio, num);
- } else if (!strcmp(type, "h")) {
- unsigned char typetag = 0x81;
- mpcsrvio.p0io.queue(&typetag, 1);
- mpcsrvio.p0io.queue(&num, 4);
- mpcsrvio.p1io.queue(&typetag, 1);
- mpcsrvio.p1io.queue(&num, 4);
- create_halftriples(mpcsrvio, num);
- }
- ++args;
- }
-
- unsigned char typetag = 0x00;
- mpcsrvio.p0io.queue(&typetag, 1);
- mpcsrvio.p1io.queue(&typetag, 1);
- mpcsrvio.p0io.send();
- mpcsrvio.p1io.send();
- }
|