emp-toolkit
privacy_free_gen.h
Go to the documentation of this file.
1 #ifndef PRIVACY_FREE_GEN_H__
2 #define PRIVACY_FREE_GEN_H__
3 #include "io_channel.h"
4 #include "net_io_channel.h"
5 #include "block.h"
6 #include "utils.h"
7 #include "prp.h"
8 #include "hash.h"
10 #include <iostream>
11 
12 template<typename T>
13 bool privacy_free_gen_is_public(GarbleCircuit* gc, const block & b, int party);
14 
15 template<typename T>
17 
18 template<typename T>
19 block privacy_free_gen_and(GarbleCircuit* gc, const block&a, const block&b);
20 
21 template<typename T>
22 block privacy_free_gen_xor(GarbleCircuit*gc, const block&a, const block&b);
23 
24 template<typename T>
26 
27 template<typename T>
28 class PrivacyFreeGen: public GarbleCircuit{ public:
31  T * io;
33  PrivacyFreeGen(T * io) :io(io) {
34  PRG tmp;
35  block a;
36  tmp.random_block(&a, 1);
37  set_delta(a);
38  is_public_ptr = &privacy_free_gen_is_public<T>;
39  public_label_ptr = &privacy_free_gen_public_label<T>;
40  gc_and_ptr = &privacy_free_gen_and<T>;
41  gc_xor_ptr = &privacy_free_gen_xor<T>;
42  gc_not_ptr = &privacy_free_gen_not<T>;
43  }
44  bool is_public_impl(const block & b, int party) {
45  return false;
46  }
47  bool isDelta(const block & b) {
48  __m128i neq = _mm_xor_si128(b, delta);
49  return _mm_testz_si128(neq, neq);
50  }
51  void set_delta(const block &_delta) {
52  this->delta = make_delta(_delta);
53  PRG prg2(fix_key);prg2.random_block(constant, 2);
54  *((char *) &constant[0]) &= 0xfe;
55  *((char *) &constant[1]) |= 0x01;
56  constant[1] = xorBlocks(constant[1], delta);
57  }
59  return constant[b];
60  }
61  block gen_and(const block& a, const block& b) {
62  block out[2], table[2];
63  garble_gate_garble_privacy_free(GARBLE_GATE_AND, a, xorBlocks(a,delta), b, xorBlocks(b,delta),
64  &out[0], &out[1], delta, table, gid++, prp.aes);
65  io->send_block(table, 1);
66  return out[0];
67  }
68  block gen_xor(const block&a, const block& b) {
69  return xorBlocks(a, b);
70  }
71  block gen_not(const block& a) {
72  return gen_xor(a, public_label_impl(true));
73  }
74  void privacy_free_to_xor(const block* new_b0,const block * b0, const block * b1, int length){
75  block h[2];
76  for(int i = 0; i < length; ++i) {
77  h[0] = prp.H(b0[i], i);
78  h[1] = prp.H(b1[i], i);
79  h[0] = xorBlocks(new_b0[i], h[0]);
80  h[1] = xorBlocks(new_b0[i], h[1]);
81  h[1] = xorBlocks(delta, h[1]);
82  io->send_block(h, 2);
83  }
84  }
85 };
86 template<typename T>
88  return ((PrivacyFreeGen<T>*)gc)->is_public_impl(b, party);
89 }
90 template<typename T>
92  return ((PrivacyFreeGen<T>*)gc)->public_label_impl(b);
93 }
94 template<typename T>
96  return ((PrivacyFreeGen<T>*)gc)->gen_and(a, b);
97 }
98 template<typename T>
100  return ((PrivacyFreeGen<T>*)gc)->gen_xor(a, b);
101 }
102 
103 template<typename T>
105  return ((PrivacyFreeGen<T>*)gc)->gen_not(a);
106 }
107 #endif// PRIVACY_FREE_GEN_H__
block privacy_free_gen_and(GarbleCircuit *gc, const block &a, const block &b)
Definition: privacy_free_gen.h:95
block gen_xor(const block &a, const block &b)
Definition: privacy_free_gen.h:68
block public_label_impl(bool b)
Definition: privacy_free_gen.h:58
static block make_delta(const block &a)
Definition: garble_circuit.h:30
bool privacy_free_gen_is_public(GarbleCircuit *gc, const block &b, int party)
Definition: privacy_free_gen.h:87
block gen_not(const block &a)
Definition: privacy_free_gen.h:71
__m128i block
Definition: block.h:8
uint64_t gid
Definition: garble_circuit.h:8
block xorBlocks(block x, block y)
Definition: block.h:35
Definition: privacy_free_gen.h:28
bool isDelta(const block &b)
Definition: privacy_free_gen.h:47
block(* gc_and_ptr)(GarbleCircuit *gc, const block &a, const block &b)
Definition: garble_circuit.h:11
block constant[2]
Definition: privacy_free_gen.h:32
PrivacyFreeGen(T *io)
Definition: privacy_free_gen.h:33
block(* public_label_ptr)(GarbleCircuit *gc, bool b)
Definition: garble_circuit.h:10
bool is_public_impl(const block &b, int party)
Definition: privacy_free_gen.h:44
block gen_and(const block &a, const block &b)
Definition: privacy_free_gen.h:61
Definition: garble.h:28
void random_block(block *data, int nblocks=1)
Definition: prg.h:75
const char fix_key[]
Definition: block.h:130
block H(block in, uint64_t id)
Definition: prp.h:48
T * io
Definition: privacy_free_gen.h:31
Definition: prp.h:11
AES_KEY * aes
Definition: prp.h:12
block(* gc_not_ptr)(GarbleCircuit *gc, const block &a)
Definition: garble_circuit.h:13
block privacy_free_gen_xor(GarbleCircuit *gc, const block &a, const block &b)
Definition: privacy_free_gen.h:99
block(* gc_xor_ptr)(GarbleCircuit *gc, const block &a, const block &b)
Definition: garble_circuit.h:12
Definition: prg.h:16
block privacy_free_gen_not(GarbleCircuit *gc, const block &a)
Definition: privacy_free_gen.h:104
Definition: garble_circuit.h:7
void privacy_free_to_xor(const block *new_b0, const block *b0, const block *b1, int length)
Definition: privacy_free_gen.h:74
bool(* is_public_ptr)(GarbleCircuit *gc, const block &b, int party)
Definition: garble_circuit.h:9
int party
Definition: input-check-malicious.cpp:12
PRP prp
Definition: privacy_free_gen.h:30
block privacy_free_gen_public_label(GarbleCircuit *gc, bool b)
Definition: privacy_free_gen.h:91
void set_delta(const block &_delta)
Definition: privacy_free_gen.h:51
block delta
Definition: privacy_free_gen.h:29