2 *****************************************************************************
4 Implementation of interfaces for a ppzkSNARK for TBCS.
6 See tbcs_ppzksnark.hpp .
8 *****************************************************************************
9 * @author This file is part of libsnark, developed by SCIPR Lab
10 * and contributors (see AUTHORS).
11 * @copyright MIT license (see LICENSE file)
12 *****************************************************************************/
14 #ifndef TBCS_PPZKSNARK_TCC_
15 #define TBCS_PPZKSNARK_TCC_
17 #include <libsnark/reductions/tbcs_to_uscs/tbcs_to_uscs.hpp>
22 template<typename ppT>
23 bool tbcs_ppzksnark_proving_key<ppT>::operator==(
24 const tbcs_ppzksnark_proving_key<ppT> &other) const
26 return (this->circuit == other.circuit && this->uscs_pk == other.uscs_pk);
29 template<typename ppT>
30 std::ostream &operator<<(
31 std::ostream &out, const tbcs_ppzksnark_proving_key<ppT> &pk)
33 out << pk.circuit << OUTPUT_NEWLINE;
34 out << pk.uscs_pk << OUTPUT_NEWLINE;
39 template<typename ppT>
40 std::istream &operator>>(std::istream &in, tbcs_ppzksnark_proving_key<ppT> &pk)
43 libff::consume_OUTPUT_NEWLINE(in);
45 libff::consume_OUTPUT_NEWLINE(in);
50 template<typename ppT>
51 tbcs_ppzksnark_keypair<ppT> tbcs_ppzksnark_generator(
52 const tbcs_ppzksnark_circuit &circuit)
54 typedef libff::Fr<ppT> FieldT;
56 libff::enter_block("Call to tbcs_ppzksnark_generator");
57 const uscs_constraint_system<FieldT> uscs_cs =
58 tbcs_to_uscs_instance_map<FieldT>(circuit);
59 const uscs_ppzksnark_keypair<ppT> uscs_keypair =
60 uscs_ppzksnark_generator<ppT>(uscs_cs);
61 libff::leave_block("Call to tbcs_ppzksnark_generator");
63 return tbcs_ppzksnark_keypair<ppT>(
64 tbcs_ppzksnark_proving_key<ppT>(circuit, uscs_keypair.pk),
68 template<typename ppT>
69 tbcs_ppzksnark_proof<ppT> tbcs_ppzksnark_prover(
70 const tbcs_ppzksnark_proving_key<ppT> &pk,
71 const tbcs_ppzksnark_primary_input &primary_input,
72 const tbcs_ppzksnark_auxiliary_input &auxiliary_input)
74 typedef libff::Fr<ppT> FieldT;
76 libff::enter_block("Call to tbcs_ppzksnark_prover");
77 const uscs_variable_assignment<FieldT> uscs_va =
78 tbcs_to_uscs_witness_map<FieldT>(
79 pk.circuit, primary_input, auxiliary_input);
80 const uscs_primary_input<FieldT> uscs_pi =
81 libff::convert_bit_vector_to_field_element_vector<FieldT>(
83 const uscs_auxiliary_input<FieldT> uscs_ai(
84 uscs_va.begin() + primary_input.size(),
85 uscs_va.end()); // TODO: faster to just change bacs_to_r1cs_witness_map
87 const uscs_ppzksnark_proof<ppT> uscs_proof =
88 uscs_ppzksnark_prover<ppT>(pk.uscs_pk, uscs_pi, uscs_ai);
89 libff::leave_block("Call to tbcs_ppzksnark_prover");
94 template<typename ppT>
95 tbcs_ppzksnark_processed_verification_key<ppT> tbcs_ppzksnark_verifier_process_vk(
96 const tbcs_ppzksnark_verification_key<ppT> &vk)
98 libff::enter_block("Call to tbcs_ppzksnark_verifier_process_vk");
99 const tbcs_ppzksnark_processed_verification_key<ppT> pvk =
100 uscs_ppzksnark_verifier_process_vk<ppT>(vk);
101 libff::leave_block("Call to tbcs_ppzksnark_verifier_process_vk");
106 template<typename ppT>
107 bool tbcs_ppzksnark_verifier_weak_IC(
108 const tbcs_ppzksnark_verification_key<ppT> &vk,
109 const tbcs_ppzksnark_primary_input &primary_input,
110 const tbcs_ppzksnark_proof<ppT> &proof)
112 typedef libff::Fr<ppT> FieldT;
113 libff::enter_block("Call to tbcs_ppzksnark_verifier_weak_IC");
114 const uscs_primary_input<FieldT> uscs_input =
115 libff::convert_bit_vector_to_field_element_vector<FieldT>(
117 const tbcs_ppzksnark_processed_verification_key<ppT> pvk =
118 tbcs_ppzksnark_verifier_process_vk<ppT>(vk);
120 uscs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, uscs_input, proof);
121 libff::leave_block("Call to tbcs_ppzksnark_verifier_weak_IC");
126 template<typename ppT>
127 bool tbcs_ppzksnark_verifier_strong_IC(
128 const tbcs_ppzksnark_verification_key<ppT> &vk,
129 const tbcs_ppzksnark_primary_input &primary_input,
130 const tbcs_ppzksnark_proof<ppT> &proof)
132 typedef libff::Fr<ppT> FieldT;
133 libff::enter_block("Call to tbcs_ppzksnark_verifier_strong_IC");
134 const tbcs_ppzksnark_processed_verification_key<ppT> pvk =
135 tbcs_ppzksnark_verifier_process_vk<ppT>(vk);
136 const uscs_primary_input<FieldT> uscs_input =
137 libff::convert_bit_vector_to_field_element_vector<FieldT>(
140 uscs_ppzksnark_online_verifier_strong_IC<ppT>(pvk, uscs_input, proof);
141 libff::leave_block("Call to tbcs_ppzksnark_verifier_strong_IC");
146 template<typename ppT>
147 bool tbcs_ppzksnark_online_verifier_weak_IC(
148 const tbcs_ppzksnark_processed_verification_key<ppT> &pvk,
149 const tbcs_ppzksnark_primary_input &primary_input,
150 const tbcs_ppzksnark_proof<ppT> &proof)
152 typedef libff::Fr<ppT> FieldT;
153 libff::enter_block("Call to tbcs_ppzksnark_online_verifier_weak_IC");
154 const uscs_primary_input<FieldT> uscs_input =
155 libff::convert_bit_vector_to_field_element_vector<FieldT>(
158 uscs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, uscs_input, proof);
159 libff::leave_block("Call to tbcs_ppzksnark_online_verifier_weak_IC");
164 template<typename ppT>
165 bool tbcs_ppzksnark_online_verifier_strong_IC(
166 const tbcs_ppzksnark_processed_verification_key<ppT> &pvk,
167 const tbcs_ppzksnark_primary_input &primary_input,
168 const tbcs_ppzksnark_proof<ppT> &proof)
170 typedef libff::Fr<ppT> FieldT;
171 libff::enter_block("Call to tbcs_ppzksnark_online_verifier_strong_IC");
172 const uscs_primary_input<FieldT> uscs_input =
173 libff::convert_bit_vector_to_field_element_vector<FieldT>(
176 uscs_ppzksnark_online_verifier_strong_IC<ppT>(pvk, uscs_input, proof);
177 libff::leave_block("Call to tbcs_ppzksnark_online_verifier_strong_IC");
182 } // namespace libsnark
184 #endif // TBCS_PPZKSNARK_TCC_