emp-toolkit
shextension.h
Go to the documentation of this file.
1 #ifndef OT_SH_EXTENSION_H__
2 #define OT_SH_EXTENSION_H__
3 #include "ot.h"
4 #include "np.h"
9 class SHOTExtension: public OT<SHOTExtension> { public:
13  const int l = 128;
14  block *k0, *k1;
15  bool *s;
16 
18  bool setup = false;
20  this->base_ot = new OTNP(io);
21  this->s = new bool[l];
22  this->k0 = new block[l];
23  this->k1 = new block[l];
24  }
25 
27  delete base_ot;
28  delete[] s;
29  delete[] k0;
30  delete[] k1;
31  }
32 
33  void setup_send(block * in_k0 = nullptr, bool * in_s = nullptr){
34  setup = true;
35  if(in_s != nullptr) {
36  memcpy(k0, in_k0, l*sizeof(block));
37  memcpy(s, in_s, l);
38  block_s = bool_to128(s);
39  return;
40  }
41  prg.random_bool(s, l);
42  base_ot->recv(k0, s, l);
43  block_s = bool_to128(s);
44  }
45 
46  void setup_recv(block * in_k0 = nullptr, block * in_k1 =nullptr) {
47  setup = true;
48  if(in_k0 !=nullptr) {
49  memcpy(k0, in_k0, l*sizeof(block));
50  memcpy(k1, in_k1, l*sizeof(block));
51  return;
52  }
53  prg.random_block(k0, l);
54  prg.random_block(k1, l);
55  base_ot->send(k0, k1, l);
56  }
57 
58  void send_pre(int length) {
59  if (length%128 !=0) length = (length/128 + 1)*128;
60 
61  if(!setup) setup_send();
62  setup = false;
63  block * q = new block[length];
64  qT = new block[length];
65  //get u, compute q
66  block *tmp = new block[length/128];
67  PRG G;
68  for(int i = 0; i < l; ++i) {
69  io->recv_data(tmp, length/8);
70  G.reseed(&k0[i]);
71  G.random_data(q+(i*length/128), length/8);
72  if (s[i])
73  xorBlocks_arr(q+(i*length/128), q+(i*length/128), tmp, length/128);
74  }
75  sse_trans((uint8_t *)(qT), (uint8_t*)q, l, length);
76  delete[] tmp;
77  delete[] q;
78  }
79 
80  void recv_pre(const bool* r, int length) {
81  int old_length = length;
82  if (length%128 !=0) length = (length/128 + 1)*128;
83 
84  if(!setup)setup_recv();
85  setup = false;
86  bool * r2 = new bool[length];
87  memcpy(r2, r, old_length);
88  block *block_r = new block[length/128];
89  for(int i = 0; i < length/128; ++i) {
90  block_r[i] = bool_to128(r2+i*128);
91  }
92  // send u
93  block* t = new block[length];
94  tT = new block[length];
95  block* tmp = new block[length/128];
96  PRG G;
97  for(int i = 0; i < l; ++i) {
98  G.reseed(&k0[i]);
99  G.random_data(t+i*length/128, length/8);
100  G.reseed(&k1[i]);
101  G.random_data(tmp, length/8);
102  xorBlocks_arr(tmp, t+(i*length/128), tmp, length/128);
103  xorBlocks_arr(tmp, block_r, tmp, length/128);
104  io->send_data(tmp, length/8);
105  }
106 
107  sse_trans((uint8_t *)tT, (uint8_t*)t, l, length);
108 
109  delete[] t;
110  delete[] tmp;
111  delete[] block_r;
112  delete[] r2;
113  }
114 
115  void got_send_post(const block* data0, const block* data1, int length) {
116  block pad[2];
117  for(int i = 0; i < length; ++i) {
118  pad[0] = qT[i];
119  pad[1] = xorBlocks(qT[i], block_s);
120  pi.H<2>(pad, pad, 2*i);
121  pad[0] = xorBlocks(pad[0], data0[i]);
122  pad[1] = xorBlocks(pad[1], data1[i]);
123  io->send_data(pad, 2*sizeof(block));
124  }
125  delete[] qT;
126  }
127 
128  void got_recv_post(block* data, const bool* r, int length) {
129  block res[2];
130  for(int i = 0; i < length; ++i) {
131  io->recv_data(res, 2*sizeof(block));
132  if(r[i]) {
133  data[i] = xorBlocks(res[1], pi.H(tT[i], 2*i+1));
134  } else {
135  data[i] = xorBlocks(res[0], pi.H(tT[i], 2*i));
136  }
137  }
138  delete[] tT;
139  }
140  void send_impl(const block* data0, const block* data1, int length) {
141  send_pre(length);
142  got_send_post(data0, data1, length);
143  }
144 
145  void recv_impl(block* data, const bool* b, int length) {
146  recv_pre(b, length);
147  got_recv_post(data, b, length);
148  }
149 
150  void send_cot(block * data0, block delta, int length) {
151  send_pre(length);
152  cot_send_post(data0, delta, length);
153  }
154  void recv_cot(block* data, const bool* b, int length) {
155  recv_pre(b, length);
156  cot_recv_post(data, b, length);
157  }
158  void send_rot(block * data0, block * data1, int length) {
159  send_pre(length);
160  rot_send_post(data0, data1, length);
161  }
162  void recv_rot(block* data, const bool* b, int length) {
163  recv_pre(b, length);
164  rot_recv_post(data, b, length);
165  }
166 
167  void cot_send_post(block* data0, block delta, int length) {
168  block pad[2];
169  for(int i = 0; i < length; ++i) {
170  pad[0] = qT[i];
171  pad[1] = xorBlocks(qT[i], block_s);
172  pi.H<2>(pad, pad, 2*i);
173  data0[i] = pad[0];
174  pad[0] = xorBlocks(pad[0], delta);
175  pad[0] = xorBlocks(pad[1], pad[0]);
176  io->send_data(pad, sizeof(block));
177  }
178  delete[] qT;
179  }
180 
181  void cot_recv_post(block* data, const bool* r, int length) {
182  block res;
183  for(int i = 0; i < length; ++i) {
184  io->recv_data(&res, sizeof(block));
185  if(r[i])
186  data[i] = xorBlocks(res, pi.H(tT[i], 2*i+1));
187  else
188  data[i] = pi.H(tT[i], 2*i);
189  }
190  delete[] tT;
191  }
192 
193  void rot_send_post(block* data0, block* data1, int length) {
194  block pad[2];
195  for(int i = 0; i < length; ++i) {
196  pad[0] = qT[i];
197  pad[1] = xorBlocks(qT[i], block_s);
198  pi.H<2>(pad, pad, 2*i);
199  data0[i] = pad[0];
200  data1[i] = pad[1];
201  }
202  delete[] qT;
203  }
204 
205  void rot_recv_post(block* data, const bool* r, int length) {
206  for(int i = 0; i < length; ++i)
207  data[i] = pi.H(tT[i], 2*i+r[i]);
208  delete[] tT;
209  }
210 };
212 #endif// OT_EXTENSION_H__
void send_cot(block *data0, block delta, int length)
Definition: shextension.h:150
block block_s
Definition: shextension.h:17
void cot_send_post(block *data0, block delta, int length)
Definition: shextension.h:167
void setup_send(block *in_k0=nullptr, bool *in_s=nullptr)
Definition: shextension.h:33
PRP pi
Definition: shextension.h:12
void send_data(const void *data, int nbyte)
Definition: io_channel.h:14
void send_rot(block *data0, block *data1, int length)
Definition: shextension.h:158
block * k0
Definition: shextension.h:14
void recv_data(void *data, int nbyte)
Definition: io_channel.h:17
void random_bool(bool *data, int length)
Definition: prg.h:57
void recv_rot(block *data, const bool *b, int length)
Definition: shextension.h:162
__m128i block
Definition: block.h:8
void send(const block *data0, const block *data1, int length)
Definition: ot.h:10
block xorBlocks(block x, block y)
Definition: block.h:35
Definition: net_io_channel.h:22
void sse_trans(uint8_t *out, uint8_t const *inp, int nrows, int ncols)
Definition: block.h:85
void recv_impl(block *data, const bool *b, int length)
Definition: shextension.h:145
void recv_pre(const bool *r, int length)
Definition: shextension.h:80
void got_recv_post(block *data, const bool *r, int length)
Definition: shextension.h:128
bool * s
Definition: shextension.h:15
SHOTExtension(NetIO *io)
Definition: shextension.h:19
void recv_cot(block *data, const bool *b, int length)
Definition: shextension.h:154
void setup_recv(block *in_k0=nullptr, block *in_k1=nullptr)
Definition: shextension.h:46
void random_block(block *data, int nblocks=1)
Definition: prg.h:75
block * k1
Definition: shextension.h:14
void rot_send_post(block *data0, block *data1, int length)
Definition: shextension.h:193
Definition: np.h:9
block H(block in, uint64_t id)
Definition: prp.h:48
void reseed(const void *key, uint64_t id=0)
Definition: prg.h:41
block * tT
Definition: shextension.h:17
Definition: prp.h:11
void got_send_post(const block *data0, const block *data1, int length)
Definition: shextension.h:115
OTNP * base_ot
Definition: shextension.h:10
NetIO * io
Definition: ot.h:9
const int l
Definition: shextension.h:13
void recv(block *data, const bool *b, int length)
Definition: ot.h:13
~SHOTExtension()
Definition: shextension.h:26
void rot_recv_post(block *data, const bool *r, int length)
Definition: shextension.h:205
Definition: prg.h:16
void random_data(void *data, int nbytes)
Definition: prg.h:49
bool setup
Definition: shextension.h:18
Definition: shextension.h:9
void send_pre(int length)
Definition: shextension.h:58
Definition: ot.h:6
PRG prg
Definition: shextension.h:11
block bool_to128(const bool *data)
Definition: utils.hpp:76
void xorBlocks_arr(block *res, const block *x, const block *y, int nblocks)
Definition: block.h:37
void cot_recv_post(block *data, const bool *r, int length)
Definition: shextension.h:181
void send_impl(const block *data0, const block *data1, int length)
Definition: shextension.h:140
block * qT
Definition: shextension.h:17