1 #ifndef OT_M_EXTENSION_ALSZ_H__ 2 #define OT_M_EXTENSION_ALSZ_H__ 26 this->base_ot =
new OTCO(io);
27 this->s =
new bool[
l];
30 block_s =
new uint8_t[l/8];
40 if(data_open !=
nullptr) {
45 void xor_arr (uint8_t * a, uint8_t * b, uint8_t * c,
int n) {
49 uint8_t* end_a = a + n;
51 *(a++) = *(b++) ^ *(c++);
55 block H(uint8_t* in,
long id,
int len) {
57 for(
int i = 0; i < len/16; ++i) {
65 for(
int i = 0; i < len/8; ++i)
67 for(
int i = 0; i < len; ++i)
74 memcpy(k0, in_k0, l*
sizeof(
block));
80 base_ot->
recv(k0, s, l);
86 memcpy(k0, in_k0, l*
sizeof(
block));
87 memcpy(k1, in_k1, l*
sizeof(
block));
92 base_ot->
send(k0, k1, l);
98 if (length%128 !=0) length = (length/128 + 1)*128;
100 q =
new uint8_t[length/8*
l];
108 qT =
new uint8_t[length/8*
l];
109 uint8_t * q2 =
new uint8_t[length/8*
l];
110 uint8_t*tmp =
new uint8_t[length/8];
112 for(
int i = 0; i <
l; ++i) {
117 xor_arr(q2+(i*length/8), q+(i*length/8), tmp, length/8);
119 memcpy(q2+(i*length/8), q+(i*length/8), length/8);
127 int old_length = length;
128 if (length%128 !=0) length = (length/128 + 1)*128;
134 uint8_t *block_r =
new uint8_t[length/8];
138 t[0] =
new uint8_t[length/8*
l];
139 t[1] =
new uint8_t[length/8*
l];
140 tT =
new uint8_t[length/8*
l];
141 uint8_t* tmp =
new uint8_t[length/8];
143 for(
int i = 0; i <
l; ++i) {
148 xor_arr(tmp,
t[0]+(i*length/8),
t[1]+(i*length/8), length/8);
149 xor_arr(tmp, block_r, tmp, length/8);
160 int old_length = length;
161 if (length%128 !=0) length = (length/128 + 1)*128;
163 uint8_t *pad1 =
new uint8_t[l/8];
165 for(
int i = 0; i < old_length; ++i) {
166 xor_arr(pad1, qT+i*l/8, block_s, l/8);
167 pad[0] =
xorBlocks(
H(qT+i*l/8, i, l/8), data0[i]);
168 pad[1] =
xorBlocks(
H(pad1, i, l/8), data1[i]);
176 if (length%128 !=0) length = (length/128 + 1)*128;
178 uint8_t * tmp =
new uint8_t[length/8];
180 for(
int i = 0; i <
u; ++i) {
183 for(
int j = 0; j <
l; ++j) {
185 beta = beta>0?beta:-1*beta;
187 for(
int k = 0; k < 2; ++k)
188 for(
int l = 0; l < 2; ++
l) {
189 xor_arr(tmp,
t[k]+(j*length/8),
t[l]+(beta*length/8), length/8);
199 int old_length = length;
200 data_open =
new block[length];
201 if (length%128 !=0) length = (length/128 + 1)*128;
203 for(
int i = 0; i < old_length; ++i) {
205 block tmp =
H(tT+i*l/8, i, l/8);
208 data_open[i] = res[0];
211 data_open[i] = res[1];
220 if (length%128 !=0) length = (length/128 + 1)*128;
223 char dgst[2][2][20];
char dgstchk[20];
224 uint8_t * tmp =
new uint8_t[length/8];
225 for(
int i = 0; i <
u; ++i) {
229 for(
int j = 0; j <
l; ++j) {
231 beta = beta>0?beta:-1*beta;
238 int ind1 = s[j]? 1:0;
239 int ind2 = s[beta]? 1:0;
240 xor_arr(tmp, q+(j*length/8), q+(beta*length/8), length/8);
242 if (strncmp(dgstchk, dgst[ind1][ind2], 20)!=0)
253 delete[]
q; q =
nullptr;
274 if (strncmp(com_recv, com, 10)!= 0)
277 for(
int i = 0; i < length; ++i) {
278 xor_arr(tT+i*l/8, tT+i*l/8, block_s, l/8);
279 block tmp =
H(tT+i*l/8, i, l/8);
289 #endif// OT_M_EXTENSION_ALSZ_H__ void bool_to_uint8(uint8_t *out, const bool *in, int len)
Definition: mextension_alsz.h:64
void send_data(const void *data, int nbyte)
Definition: io_channel.h:14
void recv_data(void *data, int nbyte)
Definition: io_channel.h:17
void open(block *data, const bool *r, int length)
Definition: mextension_alsz.h:270
void random_bool(bool *data, int length)
Definition: prg.h:57
void setup_recv(block *in_k0=nullptr, block *in_k1=nullptr)
Definition: mextension_alsz.h:83
__m128i block
Definition: block.h:8
void ot_extension_send_post(const block *data0, const block *data1, int length)
Definition: mextension_alsz.h:159
uint8_t * tT
Definition: mextension_alsz.h:18
void send(const block *data0, const block *data1, int length)
Definition: ot.h:10
void ot_extension_recv_post(block *data, const bool *r, int length)
Definition: mextension_alsz.h:198
void open()
Definition: mextension_alsz.h:266
OTCO * base_ot
Definition: mextension_alsz.h:10
bool committing
Definition: mextension_alsz.h:21
bool * s
Definition: mextension_alsz.h:16
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
PRP pi
Definition: mextension_alsz.h:12
bool setup
Definition: mextension_alsz.h:20
#define zero_block()
Definition: block.h:66
int ssp
Definition: mextension_alsz.h:13
void xor_arr(uint8_t *a, uint8_t *b, uint8_t *c, int n)
Definition: mextension_alsz.h:45
MOTExtension_ALSZ(NetIO *io, bool committing=false, int ssp=40)
Definition: mextension_alsz.h:23
block * data_open
Definition: mextension_alsz.h:15
char com[Hash::DIGEST_SIZE]
Definition: mextension_alsz.h:22
void random_block(block *data, int nblocks=1)
Definition: prg.h:75
block H(block in, uint64_t id)
Definition: prp.h:48
void reseed(const void *key, uint64_t id=0)
Definition: prg.h:41
void ot_extension_recv_pre(block *data, const bool *r, int length)
Definition: mextension_alsz.h:126
NetIO * io
Definition: ot.h:9
int l
Definition: mextension_alsz.h:13
uint8_t * q
Definition: mextension_alsz.h:18
uint8_t * qT
Definition: mextension_alsz.h:18
int u
Definition: mextension_alsz.h:19
void recv(block *data, const bool *b, int length)
Definition: ot.h:13
PRG prg
Definition: mextension_alsz.h:11
uint8_t * block_s
Definition: mextension_alsz.h:18
void recv_impl(block *data, const bool *b, int length)
Definition: mextension_alsz.h:257
void random_data(void *data, int nbytes)
Definition: prg.h:49
void send_impl(const block *data0, const block *data1, int length)
Definition: mextension_alsz.h:250
void ot_extension_recv_check(int length)
Definition: mextension_alsz.h:175
block * k0
Definition: mextension_alsz.h:15
block * k1
Definition: mextension_alsz.h:15
void send_block(const block *data, int nblock)
Definition: io_channel.h:132
~MOTExtension_ALSZ()
Definition: mextension_alsz.h:34
void ot_extension_send_pre(int length)
Definition: mextension_alsz.h:96
void recv_block(block *data, int nblock)
Definition: io_channel.h:136
Definition: mextension_alsz.h:9
void setup_send(block *in_k0=nullptr, bool *in_s=nullptr)
Definition: mextension_alsz.h:71
block H(uint8_t *in, long id, int len)
Definition: mextension_alsz.h:55
static const int DIGEST_SIZE
Definition: hash.h:17
void xorBlocks_arr(block *res, const block *x, const block *y, int nblocks)
Definition: block.h:37
uint8_t ** t
Definition: mextension_alsz.h:18
bool ot_extension_send_check(int length)
Definition: mextension_alsz.h:219
static void hash_once(void *digest, const void *data, int nbyte)
Definition: hash.h:49