2 *****************************************************************************
4 Implementation of interfaces for a ppzkSNARK for BACS.
6 See bacs_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 BACS_PPZKSNARK_TCC_
15 #define BACS_PPZKSNARK_TCC_
17 #include <libsnark/reductions/bacs_to_r1cs/bacs_to_r1cs.hpp>
22 template<typename ppT>
23 bool bacs_ppzksnark_proving_key<ppT>::operator==(
24 const bacs_ppzksnark_proving_key<ppT> &other) const
26 return (this->circuit == other.circuit && this->r1cs_pk == other.r1cs_pk);
29 template<typename ppT>
30 std::ostream &operator<<(
31 std::ostream &out, const bacs_ppzksnark_proving_key<ppT> &pk)
33 out << pk.circuit << OUTPUT_NEWLINE;
34 out << pk.r1cs_pk << OUTPUT_NEWLINE;
39 template<typename ppT>
40 std::istream &operator>>(std::istream &in, bacs_ppzksnark_proving_key<ppT> &pk)
43 libff::consume_OUTPUT_NEWLINE(in);
45 libff::consume_OUTPUT_NEWLINE(in);
50 template<typename ppT>
51 bacs_ppzksnark_keypair<ppT> bacs_ppzksnark_generator(
52 const bacs_ppzksnark_circuit<ppT> &circuit)
54 typedef libff::Fr<ppT> FieldT;
56 libff::enter_block("Call to bacs_ppzksnark_generator");
57 const r1cs_constraint_system<FieldT> r1cs_cs =
58 bacs_to_r1cs_instance_map<FieldT>(circuit);
59 const r1cs_ppzksnark_keypair<ppT> r1cs_keypair =
60 r1cs_ppzksnark_generator<ppT>(r1cs_cs);
61 libff::leave_block("Call to bacs_ppzksnark_generator");
63 return bacs_ppzksnark_keypair<ppT>(
64 bacs_ppzksnark_proving_key<ppT>(circuit, r1cs_keypair.pk),
68 template<typename ppT>
69 bacs_ppzksnark_proof<ppT> bacs_ppzksnark_prover(
70 const bacs_ppzksnark_proving_key<ppT> &pk,
71 const bacs_ppzksnark_primary_input<ppT> &primary_input,
72 const bacs_ppzksnark_auxiliary_input<ppT> &auxiliary_input)
74 typedef libff::Fr<ppT> FieldT;
76 libff::enter_block("Call to bacs_ppzksnark_prover");
77 const r1cs_variable_assignment<FieldT> r1cs_va =
78 bacs_to_r1cs_witness_map<FieldT>(
79 pk.circuit, primary_input, auxiliary_input);
80 const r1cs_auxiliary_input<FieldT> r1cs_ai(
81 r1cs_va.begin() + primary_input.size(),
82 r1cs_va.end()); // TODO: faster to just change bacs_to_r1cs_witness_map
84 const r1cs_ppzksnark_proof<ppT> r1cs_proof =
85 r1cs_ppzksnark_prover<ppT>(pk.r1cs_pk, primary_input, r1cs_ai);
86 libff::leave_block("Call to bacs_ppzksnark_prover");
91 template<typename ppT>
92 bacs_ppzksnark_processed_verification_key<ppT> bacs_ppzksnark_verifier_process_vk(
93 const bacs_ppzksnark_verification_key<ppT> &vk)
95 libff::enter_block("Call to bacs_ppzksnark_verifier_process_vk");
96 const bacs_ppzksnark_processed_verification_key<ppT> pvk =
97 r1cs_ppzksnark_verifier_process_vk<ppT>(vk);
98 libff::leave_block("Call to bacs_ppzksnark_verifier_process_vk");
103 template<typename ppT>
104 bool bacs_ppzksnark_verifier_weak_IC(
105 const bacs_ppzksnark_verification_key<ppT> &vk,
106 const bacs_ppzksnark_primary_input<ppT> &primary_input,
107 const bacs_ppzksnark_proof<ppT> &proof)
109 libff::enter_block("Call to bacs_ppzksnark_verifier_weak_IC");
110 const bacs_ppzksnark_processed_verification_key<ppT> pvk =
111 bacs_ppzksnark_verifier_process_vk<ppT>(vk);
113 r1cs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, primary_input, proof);
114 libff::leave_block("Call to bacs_ppzksnark_verifier_weak_IC");
119 template<typename ppT>
120 bool bacs_ppzksnark_verifier_strong_IC(
121 const bacs_ppzksnark_verification_key<ppT> &vk,
122 const bacs_ppzksnark_primary_input<ppT> &primary_input,
123 const bacs_ppzksnark_proof<ppT> &proof)
125 libff::enter_block("Call to bacs_ppzksnark_verifier_strong_IC");
126 const bacs_ppzksnark_processed_verification_key<ppT> pvk =
127 bacs_ppzksnark_verifier_process_vk<ppT>(vk);
128 const bool bit = r1cs_ppzksnark_online_verifier_strong_IC<ppT>(
129 pvk, primary_input, proof);
130 libff::leave_block("Call to bacs_ppzksnark_verifier_strong_IC");
135 template<typename ppT>
136 bool bacs_ppzksnark_online_verifier_weak_IC(
137 const bacs_ppzksnark_processed_verification_key<ppT> &pvk,
138 const bacs_ppzksnark_primary_input<ppT> &primary_input,
139 const bacs_ppzksnark_proof<ppT> &proof)
141 libff::enter_block("Call to bacs_ppzksnark_online_verifier_weak_IC");
143 r1cs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, primary_input, proof);
144 libff::leave_block("Call to bacs_ppzksnark_online_verifier_weak_IC");
149 template<typename ppT>
150 bool bacs_ppzksnark_online_verifier_strong_IC(
151 const bacs_ppzksnark_processed_verification_key<ppT> &pvk,
152 const bacs_ppzksnark_primary_input<ppT> &primary_input,
153 const bacs_ppzksnark_proof<ppT> &proof)
155 libff::enter_block("Call to bacs_ppzksnark_online_verifier_strong_IC");
156 const bool bit = r1cs_ppzksnark_online_verifier_strong_IC<ppT>(
157 pvk, primary_input, proof);
158 libff::leave_block("Call to bacs_ppzksnark_online_verifier_strong_IC");
163 } // namespace libsnark
165 #endif // BACS_PPZKSNARK_TCC_