Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
Functions
libff::ffi Namespace Reference

Functions

template<typename ppT >
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)
 
template<typename ppT >
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)
 
template<typename ppT >
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)
 
template<typename T >
bool object_read_from_buffer (T &object, const void *buffer, size_t buffer_size)
 
template<typename T >
bool object_write_to_buffer (const T &object, void *buffer, size_t buffer_size)
 
template<typename FieldT >
bool field_element_read (FieldT &f, const void *buffer, size_t buffer_size)
 
template<typename FieldT >
bool field_element_write (const FieldT &f, void *buffer, size_t buffer_size)
 
template<typename GroupT >
bool group_element_read (GroupT &g, const void *buffer, size_t buffer_size)
 
template<typename GroupT >
bool group_element_write (const GroupT &g, const void *buffer, size_t buffer_size)
 

Function Documentation

◆ field_element_read()

template<typename FieldT >
bool libff::ffi::field_element_read ( FieldT &  f,
const void *  buffer,
size_t  buffer_size 
)

Read a field element, checking that the buffer size is as expected. Returns true on success.

Here is the caller graph for this function:

◆ field_element_write()

template<typename FieldT >
bool libff::ffi::field_element_write ( const FieldT &  f,
void *  buffer,
size_t  buffer_size 
)

Write a field element to a buffer, checking that the size is as expected. Returns true on success.

◆ g1_add()

template<typename ppT >
bool libff::ffi::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 at line 17 of file ffi.cpp.

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 }
Here is the call graph for this function:

◆ g1_mul()

template<typename ppT >
bool libff::ffi::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 at line 37 of file ffi.cpp.

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 }
Here is the call graph for this function:

◆ group_element_read()

template<typename GroupT >
bool libff::ffi::group_element_read ( GroupT &  g,
const void *  buffer,
size_t  buffer_size 
)

Read a group element (in affine form), checking that the buffer size is as expected. Returns true on success.

Here is the caller graph for this function:

◆ group_element_write()

template<typename GroupT >
bool libff::ffi::group_element_write ( const GroupT &  g,
const void *  buffer,
size_t  buffer_size 
)

Write a group element to a buffer (in affine form), checking that the size is as expected. Returns true on success.

Here is the caller graph for this function:

◆ object_read_from_buffer()

template<typename T >
bool libff::ffi::object_read_from_buffer ( T &  object,
const void *  buffer,
size_t  buffer_size 
)

Check the buffer size and copy in reverse-byte order. Returns true on success.

◆ object_write_to_buffer()

template<typename T >
bool libff::ffi::object_write_to_buffer ( const T &  object,
void *  buffer,
size_t  buffer_size 
)

Check the buffer size and write in reverse-byte order. Returns true on success.

◆ pairing()

template<typename ppT >
bool libff::ffi::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 at line 57 of file ffi.cpp.

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 }
Here is the call graph for this function:
libff::GT
typename EC_ppT::GT_type GT
Definition: public_params.hpp:87
libff::ffi::group_element_write
bool group_element_write(const GroupT &g, const void *buffer, size_t buffer_size)
libff::G1
typename EC_ppT::G1_type G1
Definition: public_params.hpp:76
libff::G2
typename EC_ppT::G2_type G2
Definition: public_params.hpp:77
libff::Fr
typename EC_ppT::Fp_type Fr
Definition: public_params.hpp:75
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)