Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
bls12_377_final_exponentiation.hpp
Go to the documentation of this file.
1 
9 #ifndef LIBSNARK_GADGETLIB1_GADGETS_PAIRING_BW6_761_BLS12_377_BLS12_377_FINAL_EXPONENTIATION_HPP_
10 #define LIBSNARK_GADGETLIB1_GADGETS_PAIRING_BW6_761_BLS12_377_BLS12_377_FINAL_EXPONENTIATION_HPP_
11 
17 
18 #include <libff/algebra/curves/bls12_377/bls12_377_pp.hpp>
19 
20 namespace libsnark
21 {
22 
23 template<typename ppT>
24 class bls12_377_final_exp_first_part_gadget : public gadget<libff::Fr<ppT>>
25 {
26 public:
27  using FieldT = libff::Fr<ppT>;
28  using FqkT = libff::Fqk<other_curve<ppT>>;
29 
30  // Follows the implementation used in
31  // libff::bls12_377_final_exponentiation_first_chunk() (see
32  // clearmatics/libff/libff/algebra/curves/bls12_377/bls12_377_pairing.cpp),
33  // which in turn follows:
34  // https://eprint.iacr.org/2016/130.pdf
35 
37 
38  // A = elt^(q^6)
39  // B = elt^(-1)
41  // C = A * B = elt^(q^6 - 1)
43  // D = C^(q^2) = elt^((q^6 - 1) * (q^2))
44  // result = D * C = elt^((q^6 - 1) * (q^2 + 1))
46 
51  const std::string &annotation_prefix);
52 
55  void generate_r1cs_witness();
56 };
57 
58 template<typename ppT>
59 class bls12_377_exp_by_z_gadget : public gadget<libff::Fr<ppT>>
60 {
61 public:
62  using FieldT = libff::Fr<ppT>;
63  using FqkT = libff::Fqk<other_curve<ppT>>;
67 
69  std::vector<std::shared_ptr<cyclotomic_square>> _squares;
70  std::vector<std::shared_ptr<multiply>> _multiplies;
71  std::shared_ptr<unitary_inverse> _inverse;
72 
77  const std::string &annotation_prefix);
78 
81  void generate_r1cs_witness();
82 
83 private:
84  void initialize_z_neg(
87  const std::string &annotation_prefix);
88  void initialize_z_pos(
91  const std::string &annotation_prefix);
92 };
93 
94 template<typename ppT>
95 class bls12_377_final_exp_last_part_gadget : public gadget<libff::Fr<ppT>>
96 {
97 public:
98  using FieldT = libff::Fr<ppT>;
99  using FqkT = libff::Fqk<other_curve<ppT>>;
100 
101  // Based on the implementation of
102  // libff::bls12_377_final_exponentiation_last_chunk() (see
103  // clearmatics/libff/libff/algebra/curves/bls12_377/bls12_377_pairing.cpp),
104  // which follows Algorithm 1 described in Table 1 of
105  // https://eprint.iacr.org/2016/130.pdf
106 
108 
126 
131  const std::string &annotation_prefix);
132 
135  void generate_r1cs_witness();
136 };
137 
138 // Wrapper around final_exp gadgets with interface expected by the groth16
139 // gadgets. `result_is_one` is constrained to a boolean (0 or 1), and set in
140 // 'generate_r1cs_witness' based on the output value of the final
141 // exponentiation (if final exp == 1, `result_is_one` is set to 1, otherwise
142 // `result_is_one` is set to 0).
143 //
144 // Note that the constraints on the final exp output are ONLY enforced when
145 // `result_is_one` == 1. In otherwords, it is infeasible to generate valid
146 // inputs such that the final exp output is not equal to 1 and result_is_one ==
147 // 1. However, it IS possible to generate inputs such that final_exp == 1 but
148 // `result_is_one` == 0.
149 template<typename ppT>
150 class bls12_377_final_exp_gadget : public gadget<libff::Fr<ppT>>
151 {
152 public:
153  using FieldT = libff::Fr<ppT>;
154  using FqkT = libff::Fqk<other_curve<ppT>>;
155 
159 
161  protoboard<libff::Fr<ppT>> &pb,
163  const pb_variable<FieldT> &result_is_one,
164  const std::string &annotation_prefix);
166  void generate_r1cs_witness();
167 };
168 
169 } // namespace libsnark
170 
172 
173 #endif // LIBSNARK_GADGETLIB1_GADGETS_PAIRING_BW6_761_BLS12_377_BLS12_377_FINAL_EXPONENTIATION_HPP_
libsnark::bls12_377_exp_by_z_gadget::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_final_exponentiation.hpp:62
libsnark::bls12_377_final_exp_gadget::FqkT
libff::Fqk< other_curve< ppT > > FqkT
Definition: bls12_377_final_exponentiation.hpp:154
libsnark::bls12_377_final_exp_last_part_gadget::_result
Fp12_2over3over2_variable< FqkT > _result
Definition: bls12_377_final_exponentiation.hpp:107
libsnark::bls12_377_exp_by_z_gadget::_inverse
std::shared_ptr< unitary_inverse > _inverse
Definition: bls12_377_final_exponentiation.hpp:71
libsnark::gadget< libff::Fr< ppT > >::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::bls12_377_final_exp_first_part_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark
Definition: accumulation_vector.hpp:18
libsnark::Fp12_2over3over2_cyclotomic_square_gadget< FqkT >
libsnark::bls12_377_final_exp_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::bls12_377_final_exp_gadget::_result_is_one
pb_variable< FieldT > _result_is_one
Definition: bls12_377_final_exponentiation.hpp:158
bls12_377_final_exponentiation.tcc
libsnark::bls12_377_exp_by_z_gadget::FqkT
libff::Fqk< other_curve< ppT > > FqkT
Definition: bls12_377_final_exponentiation.hpp:63
fp2_gadgets.hpp
libsnark::gadget< libff::Fr< ppT > >::pb
protoboard< libff::Fr< ppT > > & pb
Definition: gadget.hpp:19
libsnark::bls12_377_final_exp_last_part_gadget::_compute_H
Fp12_2over3over2_mul_gadget< FqkT > _compute_H
Definition: bls12_377_final_exponentiation.hpp:116
libsnark::bls12_377_final_exp_last_part_gadget::_compute_R
Fp12_2over3over2_mul_gadget< FqkT > _compute_R
Definition: bls12_377_final_exponentiation.hpp:122
libsnark::bls12_377_final_exp_last_part_gadget::_compute_C
Fp12_2over3over2_square_gadget< FqkT > _compute_C
Definition: bls12_377_final_exponentiation.hpp:111
libsnark::bls12_377_final_exp_first_part_gadget::_compute_C
Fp12_2over3over2_mul_gadget< FqkT > _compute_C
Definition: bls12_377_final_exponentiation.hpp:42
libsnark::bls12_377_final_exp_gadget::bls12_377_final_exp_gadget
bls12_377_final_exp_gadget(protoboard< libff::Fr< ppT >> &pb, const Fp12_2over3over2_variable< FqkT > &el, const pb_variable< FieldT > &result_is_one, const std::string &annotation_prefix)
libsnark::bls12_377_final_exp_first_part_gadget::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_final_exponentiation.hpp:27
libsnark::bls12_377_final_exp_last_part_gadget::_compute_I
bls12_377_exp_by_z_gadget< ppT > _compute_I
Definition: bls12_377_final_exponentiation.hpp:117
libsnark::bls12_377_exp_by_z_gadget::bls12_377_exp_by_z_gadget
bls12_377_exp_by_z_gadget(protoboard< FieldT > &pb, const Fp12_2over3over2_variable< FqkT > &in, const Fp12_2over3over2_variable< FqkT > &result, const std::string &annotation_prefix)
libsnark::bls12_377_final_exp_last_part_gadget::_compute_in_squared
Fp12_2over3over2_cyclotomic_square_gadget< FqkT > _compute_in_squared
Definition: bls12_377_final_exponentiation.hpp:109
libsnark::bls12_377_exp_by_z_gadget::_multiplies
std::vector< std::shared_ptr< multiply > > _multiplies
Definition: bls12_377_final_exponentiation.hpp:70
bw6_761_pairing_params.hpp
libsnark::gadget
Definition: gadget.hpp:16
libsnark::bls12_377_final_exp_last_part_gadget::_compute_P
Fp12_2over3over2_mul_gadget< FqkT > _compute_P
Definition: bls12_377_final_exponentiation.hpp:121
libsnark::bls12_377_final_exp_last_part_gadget::_compute_U
Fp12_2over3over2_mul_gadget< FqkT > _compute_U
Definition: bls12_377_final_exponentiation.hpp:124
libsnark::bls12_377_final_exp_gadget::_compute_last_part
bls12_377_final_exp_last_part_gadget< ppT > _compute_last_part
Definition: bls12_377_final_exponentiation.hpp:157
libsnark::bls12_377_final_exp_first_part_gadget::_compute_B
Fp12_2over3over2_inv_gadget< FqkT > _compute_B
Definition: bls12_377_final_exponentiation.hpp:40
libsnark::bls12_377_exp_by_z_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_final_exp_last_part_gadget::_compute_K
Fp12_2over3over2_mul_gadget< FqkT > _compute_K
Definition: bls12_377_final_exponentiation.hpp:118
libsnark::Fp12_2over3over2_square_gadget< FqkT >
fp12_2over3over2_gadgets.hpp
libsnark::bls12_377_exp_by_z_gadget
Definition: bls12_377_final_exponentiation.hpp:59
libsnark::bls12_377_exp_by_z_gadget::result
const Fp12_2over3over2_variable< FqkT > & result() const
libsnark::bls12_377_final_exp_first_part_gadget
Definition: bls12_377_final_exponentiation.hpp:24
libsnark::bls12_377_exp_by_z_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::bls12_377_final_exp_first_part_gadget::_compute_D_times_C
Fp12_2over3over2_mul_gadget< FqkT > _compute_D_times_C
Definition: bls12_377_final_exponentiation.hpp:45
libsnark::bls12_377_final_exp_last_part_gadget::_compute_T
Fp12_2over3over2_mul_gadget< FqkT > _compute_T
Definition: bls12_377_final_exponentiation.hpp:123
libsnark::bls12_377_final_exp_last_part_gadget::_compute_U_times_L
Fp12_2over3over2_mul_gadget< FqkT > _compute_U_times_L
Definition: bls12_377_final_exponentiation.hpp:125
libsnark::bls12_377_final_exp_last_part_gadget::FqkT
libff::Fqk< other_curve< ppT > > FqkT
Definition: bls12_377_final_exponentiation.hpp:99
weierstrass_g2_gadget.hpp
libsnark::bls12_377_final_exp_gadget::_compute_first_part
bls12_377_final_exp_first_part_gadget< ppT > _compute_first_part
Definition: bls12_377_final_exponentiation.hpp:156
libsnark::bls12_377_final_exp_last_part_gadget::bls12_377_final_exp_last_part_gadget
bls12_377_final_exp_last_part_gadget(protoboard< FieldT > &pb, const Fp12_2over3over2_variable< FqkT > &in, const Fp12_2over3over2_variable< FqkT > &result, const std::string &annotation_prefix)
libsnark::bls12_377_final_exp_gadget
Definition: bls12_377_final_exponentiation.hpp:150
libsnark::bls12_377_final_exp_last_part_gadget::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_final_exponentiation.hpp:98
libsnark::bls12_377_final_exp_last_part_gadget
Definition: bls12_377_final_exponentiation.hpp:95
libsnark::bls12_377_final_exp_first_part_gadget::FqkT
libff::Fqk< other_curve< ppT > > FqkT
Definition: bls12_377_final_exponentiation.hpp:28
libsnark::bls12_377_final_exp_last_part_gadget::_compute_N
Fp12_2over3over2_mul_gadget< FqkT > _compute_N
Definition: bls12_377_final_exponentiation.hpp:120
libsnark::bls12_377_exp_by_z_gadget::_result
Fp12_2over3over2_variable< FqkT > _result
Definition: bls12_377_final_exponentiation.hpp:68
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::bls12_377_final_exp_last_part_gadget::_compute_E
bls12_377_exp_by_z_gadget< ppT > _compute_E
Definition: bls12_377_final_exponentiation.hpp:113
libsnark::bls12_377_final_exp_first_part_gadget::_result
Fp12_2over3over2_variable< FqkT > _result
Definition: bls12_377_final_exponentiation.hpp:36
libsnark::bls12_377_final_exp_first_part_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp12_2over3over2_mul_gadget< FqkT >
libsnark::bls12_377_final_exp_last_part_gadget::_compute_F
bls12_377_exp_by_z_gadget< ppT > _compute_F
Definition: bls12_377_final_exponentiation.hpp:114
libsnark::bls12_377_final_exp_first_part_gadget::bls12_377_final_exp_first_part_gadget
bls12_377_final_exp_first_part_gadget(protoboard< FieldT > &pb, const Fp12_2over3over2_variable< FqkT > &in, const Fp12_2over3over2_variable< FqkT > &result, const std::string &annotation_prefix)
libsnark::bls12_377_final_exp_gadget::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_final_exponentiation.hpp:153
libsnark::bls12_377_final_exp_first_part_gadget::result
const Fp12_2over3over2_variable< FqkT > & result() const
libsnark::bls12_377_exp_by_z_gadget::_squares
std::vector< std::shared_ptr< cyclotomic_square > > _squares
Definition: bls12_377_final_exponentiation.hpp:69
libsnark::bls12_377_final_exp_last_part_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::bls12_377_final_exp_last_part_gadget::_compute_L
Fp12_2over3over2_mul_gadget< FqkT > _compute_L
Definition: bls12_377_final_exponentiation.hpp:119
libsnark::bls12_377_final_exp_last_part_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_final_exp_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_final_exp_last_part_gadget::_compute_B
bls12_377_exp_by_z_gadget< ppT > _compute_B
Definition: bls12_377_final_exponentiation.hpp:110
libsnark::Fp12_2over3over2_variable< FqkT >
weierstrass_g1_gadget.hpp
libsnark::bls12_377_final_exp_last_part_gadget::_compute_D
Fp12_2over3over2_mul_gadget< FqkT > _compute_D
Definition: bls12_377_final_exponentiation.hpp:112
libsnark::Fp12_2over3over2_inv_gadget< FqkT >
libsnark::bls12_377_final_exp_last_part_gadget::result
const Fp12_2over3over2_variable< FqkT > & result() const
libsnark::bls12_377_final_exp_last_part_gadget::_compute_G
bls12_377_exp_by_z_gadget< ppT > _compute_G
Definition: bls12_377_final_exponentiation.hpp:115
libsnark::protoboard
Definition: pb_variable.hpp:22