Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
ffi.cpp
Go to the documentation of this file.
1 #include "ffi.h"
2 
3 #include "ffi_serialization.hpp"
4 
7 
8 namespace libff
9 {
10 
11 namespace ffi
12 {
13 
14 // Generic functions to be used by the entry points
15 
16 template<typename ppT>
17 bool g1_add(
18  const void *a_g1,
19  size_t a_g1_size,
20  const void *b_g1,
21  size_t b_g1_size,
22  void *out_g1,
23  size_t out_g1_size)
24 {
27  if (group_element_read(a, a_g1, a_g1_size) &&
28  group_element_read(b, b_g1, b_g1_size)) {
29  const libff::G1<ppT> output = a + b;
30  return group_element_write(output, out_g1, out_g1_size);
31  }
32 
33  return false;
34 }
35 
36 template<typename ppT>
37 bool g1_mul(
38  const void *p_g1,
39  size_t p_g1_size,
40  const void *s_fr,
41  size_t s_fr_size,
42  void *out_g1,
43  size_t out_g1_size)
44 {
47  if (group_element_read(p, p_g1, p_g1_size) &&
48  field_element_read(s, s_fr, s_fr_size)) {
49  const libff::G1<ppT> output = s * p;
50  return group_element_write(output, out_g1, out_g1_size);
51  }
52 
53  return false;
54 }
55 
56 template<typename ppT>
57 bool pairing(
58  const void *a_g1,
59  size_t a_g1_size,
60  const void *b_g2,
61  size_t b_g2_size,
62  const void *c_g1,
63  size_t c_g1_size,
64  const void *d_g2,
65  size_t d_g2_size,
66  const void *e_g1,
67  size_t e_g1_size,
68  const void *f_g2,
69  size_t f_g2_size,
70  const void *g_g1,
71  size_t g_g1_size,
72  const void *h_g2,
73  size_t h_g2_size)
74 {
83 
84  if (group_element_read(a, a_g1, a_g1_size) &&
85  group_element_read(b, b_g2, b_g2_size) &&
86  group_element_read(c, c_g1, c_g1_size) &&
87  group_element_read(d, d_g2, d_g2_size) &&
88  group_element_read(e, e_g1, e_g1_size) &&
89  group_element_read(f, f_g2, f_g2_size) &&
90  group_element_read(g, g_g1, g_g1_size) &&
91  group_element_read(h, h_g2, h_g2_size)) {
92  // Use the double miller loop, to compute the pairing for two
93  // pairs at a time, and apply the final_exponentiation to the
94  // product.
95 
96  // miller(a,b).miller(c,d)
97  libff::GT<ppT> miller_abcd = ppT::double_miller_loop(
98  ppT::precompute_G1(a),
99  ppT::precompute_G2(b),
100  ppT::precompute_G1(c),
101  ppT::precompute_G2(d));
102  // miller(e,f).miller(g,h)
103  libff::GT<ppT> miller_efgh = ppT::double_miller_loop(
104  ppT::precompute_G1(e),
105  ppT::precompute_G2(f),
106  ppT::precompute_G1(g),
107  ppT::precompute_G2(h));
108 
109  // e(a,b).e(c,d).e(e,f).e(g,h)
110  libff::GT<ppT> product =
111  ppT::final_exponentiation(miller_abcd * miller_efgh);
112  return libff::GT<ppT>::one() == product;
113  }
114 
115  return false;
116 }
117 
118 } // namespace ffi
119 
120 } // namespace libff
121 
122 // BLS12-377 entry points
123 
124 extern "C" bool bls12_377_init()
125 {
127  return true;
128 }
129 
130 extern "C" bool bls12_377_g1_add(
131  const void *a_g1,
132  size_t a_g1_size,
133  const void *b_g1,
134  size_t b_g1_size,
135  void *out_g1,
136  size_t out_g1_size)
137 {
138  return libff::ffi::g1_add<libff::bls12_377_pp>(
139  a_g1, a_g1_size, b_g1, b_g1_size, out_g1, out_g1_size);
140 }
141 
142 extern "C" bool bls12_377_g1_mul(
143  const void *p_g1,
144  size_t p_g1_size,
145  const void *s_fr,
146  size_t s_fr_size,
147  void *out_g1,
148  size_t out_g1_size)
149 
150 {
151  return libff::ffi::g1_mul<libff::bls12_377_pp>(
152  p_g1, p_g1_size, s_fr, s_fr_size, out_g1, out_g1_size);
153 }
154 
155 extern "C" bool bls12_377_pairing(
156  const void *a_g1,
157  size_t a_g1_size,
158  const void *b_g2,
159  size_t b_g2_size,
160  const void *c_g1,
161  size_t c_g1_size,
162  const void *d_g2,
163  size_t d_g2_size,
164  const void *e_g1,
165  size_t e_g1_size,
166  const void *f_g2,
167  size_t f_g2_size,
168  const void *g_g1,
169  size_t g_g1_size,
170  const void *h_g2,
171  size_t h_g2_size)
172 {
173  return libff::ffi::pairing<libff::bls12_377_pp>(
174  a_g1,
175  a_g1_size,
176  b_g2,
177  b_g2_size,
178  c_g1,
179  c_g1_size,
180  d_g2,
181  d_g2_size,
182  e_g1,
183  e_g1_size,
184  f_g2,
185  f_g2_size,
186  g_g1,
187  g_g1_size,
188  h_g2,
189  h_g2_size);
190 }
191 
192 // BW6-761 entry points
193 
194 extern "C" bool bw6_761_init()
195 {
197  return true;
198 }
199 
200 extern "C" bool bw6_761_g1_add(
201  const void *a_g1,
202  size_t a_g1_size,
203  const void *b_g1,
204  size_t b_g1_size,
205  void *out_g1,
206  size_t out_g1_size)
207 {
208  return libff::ffi::g1_add<libff::bw6_761_pp>(
209  a_g1, a_g1_size, b_g1, b_g1_size, out_g1, out_g1_size);
210 }
211 
212 extern "C" bool bw6_761_g1_mul(
213  const void *p_g1,
214  size_t p_g1_size,
215  const void *s_fr,
216  size_t s_fr_size,
217  void *out_g1,
218  size_t out_g1_size)
219 
220 {
221  return libff::ffi::g1_mul<libff::bw6_761_pp>(
222  p_g1, p_g1_size, s_fr, s_fr_size, out_g1, out_g1_size);
223 }
224 
225 extern "C" bool bw6_761_pairing(
226  const void *a_g1,
227  size_t a_g1_size,
228  const void *b_g2,
229  size_t b_g2_size,
230  const void *c_g1,
231  size_t c_g1_size,
232  const void *d_g2,
233  size_t d_g2_size,
234  const void *e_g1,
235  size_t e_g1_size,
236  const void *f_g2,
237  size_t f_g2_size,
238  const void *g_g1,
239  size_t g_g1_size,
240  const void *h_g2,
241  size_t h_g2_size)
242 {
243  return libff::ffi::pairing<libff::bw6_761_pp>(
244  a_g1,
245  a_g1_size,
246  b_g2,
247  b_g2_size,
248  c_g1,
249  c_g1_size,
250  d_g2,
251  d_g2_size,
252  e_g1,
253  e_g1_size,
254  f_g2,
255  f_g2_size,
256  g_g1,
257  g_g1_size,
258  h_g2,
259  h_g2_size);
260 }
bls12_377_g1_add
bool bls12_377_g1_add(const void *a_g1, size_t a_g1_size, const void *b_g1, size_t b_g1_size, void *out_g1, size_t out_g1_size)
Definition: ffi.cpp:130
libff
Definition: ffi.cpp:8
libff::GT
typename EC_ppT::GT_type GT
Definition: public_params.hpp:87
libff::ffi::g1_add
bool g1_add(const void *a_g1, size_t a_g1_size, const void *b_g1, size_t b_g1_size, void *out_g1, size_t out_g1_size)
Definition: ffi.cpp:17
ffi.h
bw6_761_pairing
bool bw6_761_pairing(const void *a_g1, size_t a_g1_size, const void *b_g2, size_t b_g2_size, const void *c_g1, size_t c_g1_size, const void *d_g2, size_t d_g2_size, const void *e_g1, size_t e_g1_size, const void *f_g2, size_t f_g2_size, const void *g_g1, size_t g_g1_size, const void *h_g2, size_t h_g2_size)
Definition: ffi.cpp:225
libff::ffi::group_element_write
bool group_element_write(const GroupT &g, const void *buffer, size_t buffer_size)
bls12_377_g1_mul
bool bls12_377_g1_mul(const void *p_g1, size_t p_g1_size, const void *s_fr, size_t s_fr_size, void *out_g1, size_t out_g1_size)
Definition: ffi.cpp:142
libff::G1
typename EC_ppT::G1_type G1
Definition: public_params.hpp:76
libff::bls12_377_pp::init_public_params
static void init_public_params()
Definition: bls12_377_pp.cpp:15
libff::G2
typename EC_ppT::G2_type G2
Definition: public_params.hpp:77
libff::bw6_761_pp::init_public_params
static void init_public_params()
Definition: bw6_761_pp.cpp:8
libff::Fr
typename EC_ppT::Fp_type Fr
Definition: public_params.hpp:75
libff::ffi::pairing
bool pairing(const void *a_g1, size_t a_g1_size, const void *b_g2, size_t b_g2_size, const void *c_g1, size_t c_g1_size, const void *d_g2, size_t d_g2_size, const void *e_g1, size_t e_g1_size, const void *f_g2, size_t f_g2_size, const void *g_g1, size_t g_g1_size, const void *h_g2, size_t h_g2_size)
Definition: ffi.cpp:57
bls12_377_pp.hpp
bw6_761_init
bool bw6_761_init()
Definition: ffi.cpp:194
bls12_377_pairing
bool bls12_377_pairing(const void *a_g1, size_t a_g1_size, const void *b_g2, size_t b_g2_size, const void *c_g1, size_t c_g1_size, const void *d_g2, size_t d_g2_size, const void *e_g1, size_t e_g1_size, const void *f_g2, size_t f_g2_size, const void *g_g1, size_t g_g1_size, const void *h_g2, size_t h_g2_size)
Definition: ffi.cpp:155
bw6_761_g1_add
bool bw6_761_g1_add(const void *a_g1, size_t a_g1_size, const void *b_g1, size_t b_g1_size, void *out_g1, size_t out_g1_size)
Definition: ffi.cpp:200
libff::ffi::g1_mul
bool g1_mul(const void *p_g1, size_t p_g1_size, const void *s_fr, size_t s_fr_size, void *out_g1, size_t out_g1_size)
Definition: ffi.cpp:37
bls12_377_init
bool bls12_377_init()
Definition: ffi.cpp:124
ffi_serialization.hpp
libff::ffi::group_element_read
bool group_element_read(GroupT &g, const void *buffer, size_t buffer_size)
libff::ffi::field_element_read
bool field_element_read(FieldT &f, const void *buffer, size_t buffer_size)
bw6_761_g1_mul
bool bw6_761_g1_mul(const void *p_g1, size_t p_g1_size, const void *s_fr, size_t s_fr_size, void *out_g1, size_t out_g1_size)
Definition: ffi.cpp:212
bw6_761_pp.hpp