1 #ifndef OT_M_EXTENSION_KOS_H__ 2 #define OT_M_EXTENSION_KOS_H__ 24 this->base_ot =
new OTCO(io);
26 this->s =
new bool[
l];
47 memcpy(k0, in_k0, l*
sizeof(
block));
53 base_ot->
recv(k0, s, l);
60 memcpy(k0, in_k0, l*
sizeof(
block));
61 memcpy(
k1, in_k1, l*
sizeof(
block));
70 length = ((length+128+ssp+127)/128)*128;
80 qT =
new block[length];
84 for(
int i = 0; i <
l; ++i) {
89 xorBlocks_arr(q+(i*length/128), q+(i*length/128), tmp, length/128);
91 sse_trans((uint8_t *)(qT), (uint8_t*)q, l, length);
97 int old_length = length;
98 length = ((length+128+ssp+127)/128)*128;
105 bool * r2 =
new bool[length];
106 memcpy(r2, r, old_length);
108 extended_r =
new bool[length - old_length];
110 memcpy(r2+old_length, extended_r, length - old_length);
113 for(
int i = 0; i < length/128; ++i) {
119 tT =
new block[length];
122 for(
int i = 0; i <
l; ++i) {
132 sse_trans((uint8_t *)tT, (uint8_t*)t, l, length);
141 int extended_length = ((length+128+ssp+127)/128)*128;
142 block seed2, x, t[2], q[2], tmp1, tmp2;
150 for(
int i = 0; i < extended_length; ++i) {
151 mul128(qT[i], chi[i], &tmp1, &tmp2);
166 int extended_length = ((length+128+ssp+127)/128)*128;
174 for(
int i = 0 ; i < length; ++i) {
178 for(
int i = 0 ; i < extended_length - length; ++i) {
184 for(
int i = 0 ; i < extended_length; ++i) {
185 mul128(chi[i], tT[i], &tmp1, &tmp2);
195 for(
int i = 0; i < length; ++i) {
198 pi.
H<2>(pad, pad, 2*i);
203 delete[]
qT; qT =
nullptr;
210 for(
int i = 0; i < length; ++i) {
213 data[i] =
xorBlocks(res[1], pi.
H(tT[i], 2*i+1));
216 data[i] =
xorBlocks(res[0], pi.
H(tT[i], 2*i));
224 error(
"OT Extension check failed");
237 error(
"OT Extension check failed");
248 for(
int i = 0; i < length; ++i) {
251 pi.
H<2> (pad, pad, 2*i);
258 for(
int i = 0; i < length; ++i)
259 data[i] = pi.
H(tT[i], 2*i+r[i]);
264 error(
"Committing not enabled");
270 error(
"Committing not enabled");
274 if (strncmp(com_recv, dgst, 20)!= 0)
275 error(
"invalid commitment");
277 for(
int i = 0; i < length; ++i) {
308 inline void mul128(__m128i a, __m128i b, __m128i *res1, __m128i *res2) {
321 __m128i tmp3, tmp4, tmp5, tmp6;
322 tmp3 = _mm_clmulepi64_si128(a, b, 0x00);
323 tmp4 = _mm_clmulepi64_si128(a, b, 0x10);
324 tmp5 = _mm_clmulepi64_si128(a, b, 0x01);
325 tmp6 = _mm_clmulepi64_si128(a, b, 0x11);
327 tmp4 = _mm_xor_si128(tmp4, tmp5);
328 tmp5 = _mm_slli_si128(tmp4, 8);
329 tmp4 = _mm_srli_si128(tmp4, 8);
330 tmp3 = _mm_xor_si128(tmp3, tmp5);
331 tmp6 = _mm_xor_si128(tmp6, tmp4);
339 #endif// OT_M_EXTENSION_KOS_H__ void send_data(const void *data, int nbyte)
Definition: io_channel.h:14
void recv_check(const bool *r, int length)
Definition: mextension_kos.h:165
void recv_data(void *data, int nbyte)
Definition: io_channel.h:17
void random_bool(bool *data, int length)
Definition: prg.h:57
void send_pre(int length)
Definition: mextension_kos.h:69
void delete_array_null(T *ptr)
Definition: utils.h:20
__m128i block
Definition: block.h:8
block * k0
Definition: mextension_kos.h:14
void error(const char *s, int line=0, const char *file=nullptr)
Definition: utils.h:27
void send(const block *data0, const block *data1, int length)
Definition: ot.h:10
MOTExtension_KOS(NetIO *io, bool committing=false, int ssp=40)
Definition: mextension_kos.h:23
block * k1
Definition: mextension_kos.h:14
bool committing
Definition: mextension_kos.h:21
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 mul128(__m128i a, __m128i b, __m128i *res1, __m128i *res2)
Definition: mextension_kos.h:308
block * open_data
Definition: mextension_kos.h:17
void open()
Definition: mextension_kos.h:262
void open(block *data, const bool *r, int length)
Definition: mextension_kos.h:268
void recv_rot(block *data, const bool *b, int length)
Definition: mextension_kos.h:240
bool * s
Definition: mextension_kos.h:15
void rot_send_post(block *data0, block *data1, int length)
Definition: mextension_kos.h:246
#define zero_block()
Definition: block.h:66
int ssp
Definition: mextension_kos.h:19
void recv_pre(const bool *r, int length)
Definition: mextension_kos.h:96
void got_recv_post(block *data, const bool *r, int length)
Definition: mextension_kos.h:206
const int l
Definition: mextension_kos.h:13
void got_send_post(const block *data0, const block *data1, int length)
Definition: mextension_kos.h:193
block * qT
Definition: mextension_kos.h:17
void send_rot(block *data0, block *data1, int length)
Definition: mextension_kos.h:234
block * tT
Definition: mextension_kos.h:17
block block_s
Definition: mextension_kos.h:17
void random_block(block *data, int nblocks=1)
Definition: prg.h:75
block H(block in, uint64_t id)
Definition: prp.h:48
Definition: mextension_kos.h:9
char dgst[Hash::DIGEST_SIZE]
Definition: mextension_kos.h:22
void reseed(const void *key, uint64_t id=0)
Definition: prg.h:41
bool setup
Definition: mextension_kos.h:18
NetIO * io
Definition: ot.h:9
void rot_recv_post(block *data, const bool *r, int length)
Definition: mextension_kos.h:257
void recv(block *data, const bool *b, int length)
Definition: ot.h:13
void send_impl(const block *data0, const block *data1, int length)
Definition: mextension_kos.h:221
bool block_cmp(const block *x, const block *y, int nblocks)
Definition: block.h:56
bool send_check(int length)
Definition: mextension_kos.h:140
void random_data(void *data, int nbytes)
Definition: prg.h:49
void setup_send(block *in_k0=nullptr, bool *in_s=nullptr)
Definition: mextension_kos.h:44
OTCO * base_ot
Definition: mextension_kos.h:10
PRP pi
Definition: mextension_kos.h:12
void send_block(const block *data, int nblock)
Definition: io_channel.h:132
void recv_impl(block *data, const bool *b, int length)
Definition: mextension_kos.h:228
void recv_block(block *data, int nblock)
Definition: io_channel.h:136
PRG prg
Definition: mextension_kos.h:11
block bool_to128(const bool *data)
Definition: utils.hpp:76
bool * extended_r
Definition: mextension_kos.h:20
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
~MOTExtension_KOS()
Definition: mextension_kos.h:32
void setup_recv(block *in_k0=nullptr, block *in_k1=nullptr)
Definition: mextension_kos.h:57
static void hash_once(void *digest, const void *data, int nbyte)
Definition: hash.h:49