emp-toolkit
iterated.h
Go to the documentation of this file.
1 #ifndef OT_ITERATED_H__
2 #define OT_ITERATED_H__
3 #include "emp-ot.h"
8 template<typename OTExtension>
9 class OTIterated: public OT<OTIterated<OTExtension>> { public:
10  OTExtension *seed_ot;
11  OTExtension *ot;
12  block * k0 = nullptr, *k1 = nullptr;
13  bool * sel = nullptr, is_sender;
14  int buffer_size, size = 0;
16  OTIterated(NetIO* io, bool is_sender, int buffer_size = 1<<10) : OT<OTIterated<OTExtension>>(io) {
17  seed_ot = new OTExtension(io);
18  ot = new OTExtension(io);
19  this->buffer_size = buffer_size;
20  this->is_sender = is_sender;
21  k0 = new block[buffer_size];
22  k1 = new block[buffer_size];
23  sel = new bool[buffer_size];
24  fill();
25  }
27  delete[] k0;
28  delete[] k1;
29  delete[] sel;
30  delete seed_ot;
31  delete ot;
32  }
33  void fill() {
34  if(is_sender) {
35  if( size != 0) {
36  ot->setup_send(k0, sel);
37  }
38  ot->send_rot(k0, k1, seed_ot->l);
39  seed_ot->setup_recv(k0, k1);
40  prg.random_bool(sel, buffer_size);
41  seed_ot->recv_rot(k0, sel, buffer_size);
42  } else {
43  if( size != 0)
44  ot->setup_recv(k0 ,k1);
45  prg.random_bool(sel, seed_ot->l);
46  ot->recv_rot(k0, sel, seed_ot->l);
47  seed_ot->setup_send(k0, sel);
48  seed_ot->send_rot(k0, k1, buffer_size);
49  }
50  size = ot->l;
51  }
52  void send_impl(const block* data0, const block* data1, int length) {
53  if(size + ot->l > buffer_size)
54  fill();
55  ot->setup_send(k0+size, sel+size);
56  ot->send(data0, data1, length);
57  size+=ot->l;
58  }
59  void recv_impl(block* data, const bool* b, int length) {
60  if(size + ot->l > buffer_size)
61  fill();
62  ot->setup_recv(k0+size, k1+size);
63  ot->recv(data, b, length);
64  size+=ot->l;
65  }
66  void send_cot(block * data0, block delta, int length) {
67  if(size + ot->l > buffer_size)
68  fill();
69 
70  ot->setup_send(k0+size, sel+size);
71  ot->send_cot(data0, delta, length);
72  size+=ot->l;
73  }
74  void recv_cot(block* data, const bool* b, int length) {
75  if(size + ot->l > buffer_size)
76  fill();
77  ot->setup_recv(k0+size, k1+size);
78  ot->recv_cot(data, b, length);
79  size+=ot->l;
80  }
81  void send_rot(block * data0, block * data1, int length) {
82  if(size + ot->l > buffer_size)
83  fill();
84  ot->setup_send(k0+size, sel+size);
85  ot->send_rot(data0, data1, length);
86  size+=ot->l;
87  }
88  void recv_rot(block* data, const bool* b, int length) {
89  if(size + ot->l > buffer_size)
90  fill();
91  ot->setup_recv(k0+size, k1+size);
92  ot->recv_rot(data, b, length);
93  size+=ot->l;
94  }
95 };
99 #endif// OT_ITERATED_H__
void recv_impl(block *data, const bool *b, int length)
Definition: iterated.h:59
void random_bool(bool *data, int length)
Definition: prg.h:57
block * k1
Definition: iterated.h:12
void fill()
Definition: iterated.h:33
__m128i block
Definition: block.h:8
OTIterated< MOTExtension > MOTIterated
Definition: iterated.h:97
void send_cot(block *data0, block delta, int length)
Definition: iterated.h:66
int buffer_size
Definition: iterated.h:14
Definition: net_io_channel.h:22
OTIterated(NetIO *io, bool is_sender, int buffer_size=1<< 10)
Definition: iterated.h:16
~OTIterated()
Definition: iterated.h:26
OTIterated< SHOTExtension > SHOTIterated
Definition: iterated.h:96
OTExtension * seed_ot
Definition: iterated.h:10
bool * sel
Definition: iterated.h:13
void recv_rot(block *data, const bool *b, int length)
Definition: iterated.h:88
void send_impl(const block *data0, const block *data1, int length)
Definition: iterated.h:52
NetIO * io
Definition: ot.h:9
Definition: prg.h:16
PRG prg
Definition: iterated.h:15
bool is_sender
Definition: iterated.h:13
void send_rot(block *data0, block *data1, int length)
Definition: iterated.h:81
OTExtension * ot
Definition: iterated.h:11
block * k0
Definition: iterated.h:12
int size
Definition: iterated.h:14
Definition: ot.h:6
Definition: iterated.h:9
void recv_cot(block *data, const bool *b, int length)
Definition: iterated.h:74