Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
tbcs_ppzksnark.tcc
Go to the documentation of this file.
1 /** @file
2  *****************************************************************************
3 
4  Implementation of interfaces for a ppzkSNARK for TBCS.
5 
6  See tbcs_ppzksnark.hpp .
7 
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  *****************************************************************************/
13 
14 #ifndef TBCS_PPZKSNARK_TCC_
15 #define TBCS_PPZKSNARK_TCC_
16 
17 #include <libsnark/reductions/tbcs_to_uscs/tbcs_to_uscs.hpp>
18 
19 namespace libsnark
20 {
21 
22 template<typename ppT>
23 bool tbcs_ppzksnark_proving_key<ppT>::operator==(
24  const tbcs_ppzksnark_proving_key<ppT> &other) const
25 {
26  return (this->circuit == other.circuit && this->uscs_pk == other.uscs_pk);
27 }
28 
29 template<typename ppT>
30 std::ostream &operator<<(
31  std::ostream &out, const tbcs_ppzksnark_proving_key<ppT> &pk)
32 {
33  out << pk.circuit << OUTPUT_NEWLINE;
34  out << pk.uscs_pk << OUTPUT_NEWLINE;
35 
36  return out;
37 }
38 
39 template<typename ppT>
40 std::istream &operator>>(std::istream &in, tbcs_ppzksnark_proving_key<ppT> &pk)
41 {
42  in >> pk.circuit;
43  libff::consume_OUTPUT_NEWLINE(in);
44  in >> pk.uscs_pk;
45  libff::consume_OUTPUT_NEWLINE(in);
46 
47  return in;
48 }
49 
50 template<typename ppT>
51 tbcs_ppzksnark_keypair<ppT> tbcs_ppzksnark_generator(
52  const tbcs_ppzksnark_circuit &circuit)
53 {
54  typedef libff::Fr<ppT> FieldT;
55 
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");
62 
63  return tbcs_ppzksnark_keypair<ppT>(
64  tbcs_ppzksnark_proving_key<ppT>(circuit, uscs_keypair.pk),
65  uscs_keypair.vk);
66 }
67 
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)
73 {
74  typedef libff::Fr<ppT> FieldT;
75 
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>(
82  primary_input);
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
86  // into two :(
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");
90 
91  return uscs_proof;
92 }
93 
94 template<typename ppT>
95 tbcs_ppzksnark_processed_verification_key<ppT> tbcs_ppzksnark_verifier_process_vk(
96  const tbcs_ppzksnark_verification_key<ppT> &vk)
97 {
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");
102 
103  return pvk;
104 }
105 
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)
111 {
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>(
116  primary_input);
117  const tbcs_ppzksnark_processed_verification_key<ppT> pvk =
118  tbcs_ppzksnark_verifier_process_vk<ppT>(vk);
119  const bool bit =
120  uscs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, uscs_input, proof);
121  libff::leave_block("Call to tbcs_ppzksnark_verifier_weak_IC");
122 
123  return bit;
124 }
125 
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)
131 {
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>(
138  primary_input);
139  const bool bit =
140  uscs_ppzksnark_online_verifier_strong_IC<ppT>(pvk, uscs_input, proof);
141  libff::leave_block("Call to tbcs_ppzksnark_verifier_strong_IC");
142 
143  return bit;
144 }
145 
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)
151 {
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>(
156  primary_input);
157  const bool bit =
158  uscs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, uscs_input, proof);
159  libff::leave_block("Call to tbcs_ppzksnark_online_verifier_weak_IC");
160 
161  return bit;
162 }
163 
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)
169 {
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>(
174  primary_input);
175  const bool bit =
176  uscs_ppzksnark_online_verifier_strong_IC<ppT>(pvk, uscs_input, proof);
177  libff::leave_block("Call to tbcs_ppzksnark_online_verifier_strong_IC");
178 
179  return bit;
180 }
181 
182 } // namespace libsnark
183 
184 #endif // TBCS_PPZKSNARK_TCC_