ABY Framework  1.0
Arithmetic Bool Yao Framework
 All Classes Files Functions Variables Enumerations Enumerator Macros
gmp-pk-crypto.h
Go to the documentation of this file.
1 
19 #ifndef GMP_PK_CRYPTO_H_
20 #define GMP_PK_CRYPTO_H_
21 
22 #include "pk-crypto.h"
23 #include <gmp.h>
24 
25 class prime_field;
26 class gmp_fe;
27 class gmp_num;
28 class gmp_brickexp;
29 
30 #define fe2mpz(fieldele) (((gmp_fe*) (fieldele))->get_val())
31 #define num2mpz(number) (((gmp_num*) (number))->get_val())
32 
33 class prime_field: public pk_crypto {
34 public:
35  prime_field(seclvl sp, uint8_t* seed) :
36  pk_crypto(sp, seed) {
37  init(sp, seed);
38  }
39  ;
40  ~prime_field();
41 
42  num* get_num();
43  num* get_rnd_num(uint32_t bitlen = 0);
44  fe* get_fe();
45  fe* get_rnd_fe(uint32_t bitlen);
46  fe* get_generator();
47  fe* get_rnd_generator();
48 
49  mpz_t* get_p();
50  uint32_t get_size();
51  brickexp* get_brick(fe* gen);
52 
53  uint32_t num_byte_size() {
54  return ceil_divide(secparam.ifcbits, 8);
55  }
56  uint32_t get_field_size() {
57  return secparam.ifcbits;
58  }
59  ;
60 
61 protected:
62  void init(seclvl sp, uint8_t* seed);
63 private:
64  mpz_t p;
65  mpz_t g;
66  mpz_t q;
67  gmp_randstate_t rnd_state;
68 };
69 
70 class gmp_fe: public fe {
71 public:
72  gmp_fe(prime_field* fld);
73  gmp_fe(prime_field* fld, mpz_t src);
74  ~gmp_fe();
75  void set(fe* src);
76  mpz_t* get_val();
77 
78  void set_mul(fe* a, fe* b);
79  void set_pow(fe* b, num* e);
80  void set_div(fe* a, fe* b);
81  void set_double_pow_mul(fe* b1, num* e1, fe* b2, num* e2);
82  void export_to_bytes(uint8_t* buf);
83  void import_from_bytes(uint8_t* buf);
84  void sample_fe_from_bytes(uint8_t* buf, uint32_t bytelen);
85  void print() {
86  cout << val << endl;
87  }
88  ;
89 
90 private:
91  void init() {
92  mpz_init(val);
93  }
94  ;
95  mpz_t val;
96  prime_field* field;
97 
98 };
99 
100 class gmp_num: public num {
101 public:
102  gmp_num(prime_field* fld);
103  gmp_num(prime_field* fld, mpz_t src);
104  ~gmp_num();
105  void set(num* src);
106  void set_si(int32_t src);
107  void set_add(num* a, num* b);
108  void set_mul(num* a, num* b);
109 
110  mpz_t* get_val();
111 
112  void export_to_bytes(uint8_t* buf, uint32_t field_size);
113  void import_from_bytes(uint8_t* buf, uint32_t field_size);
114  void set_rnd(uint32_t bits);
115  void print() {
116  cout << val << endl;
117  }
118  ;
119 private:
120  mpz_t val;
121  prime_field* field;
122 };
123 
124 class gmp_brickexp: public brickexp {
125 public:
126  gmp_brickexp(fe* g, prime_field* pfield) {
127  init(g, pfield);
128  }
129  ;
130  ~gmp_brickexp();
131 
132  void pow(fe* result, num* e);
133  void init(fe* g, prime_field* pfield);
134 
135 private:
136  uint32_t m_numberOfElements;
137  mpz_t* m_table;
138  prime_field* field;
139 };
140 
141 // mpz_export does not fill leading zeros, thus a prepending of leading 0s is required
142 void mpz_export_padded(uint8_t* pBufIdx, uint32_t field_size, mpz_t to_export);
143 
144 #endif /* GMP_PK_CRYPTO_H_ */
Definition: pk-crypto.h:77
Definition: pk-crypto.h:99
Definition: pk-crypto.h:59
Definition: pk-crypto.h:30
Virtual class for public-key operations.
Definition: gmp-pk-crypto.h:70
Definition: gmp-pk-crypto.h:33
Definition: gmp-pk-crypto.h:100
Definition: gmp-pk-crypto.h:124
Definition: typedefs.h:79