Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
bacs_ppzksnark.tcc
Go to the documentation of this file.
1 /** @file
2  *****************************************************************************
3 
4  Implementation of interfaces for a ppzkSNARK for BACS.
5 
6  See bacs_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 BACS_PPZKSNARK_TCC_
15 #define BACS_PPZKSNARK_TCC_
16 
17 #include <libsnark/reductions/bacs_to_r1cs/bacs_to_r1cs.hpp>
18 
19 namespace libsnark
20 {
21 
22 template<typename ppT>
23 bool bacs_ppzksnark_proving_key<ppT>::operator==(
24  const bacs_ppzksnark_proving_key<ppT> &other) const
25 {
26  return (this->circuit == other.circuit && this->r1cs_pk == other.r1cs_pk);
27 }
28 
29 template<typename ppT>
30 std::ostream &operator<<(
31  std::ostream &out, const bacs_ppzksnark_proving_key<ppT> &pk)
32 {
33  out << pk.circuit << OUTPUT_NEWLINE;
34  out << pk.r1cs_pk << OUTPUT_NEWLINE;
35 
36  return out;
37 }
38 
39 template<typename ppT>
40 std::istream &operator>>(std::istream &in, bacs_ppzksnark_proving_key<ppT> &pk)
41 {
42  in >> pk.circuit;
43  libff::consume_OUTPUT_NEWLINE(in);
44  in >> pk.r1cs_pk;
45  libff::consume_OUTPUT_NEWLINE(in);
46 
47  return in;
48 }
49 
50 template<typename ppT>
51 bacs_ppzksnark_keypair<ppT> bacs_ppzksnark_generator(
52  const bacs_ppzksnark_circuit<ppT> &circuit)
53 {
54  typedef libff::Fr<ppT> FieldT;
55 
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");
62 
63  return bacs_ppzksnark_keypair<ppT>(
64  bacs_ppzksnark_proving_key<ppT>(circuit, r1cs_keypair.pk),
65  r1cs_keypair.vk);
66 }
67 
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)
73 {
74  typedef libff::Fr<ppT> FieldT;
75 
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
83  // into two :(
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");
87 
88  return r1cs_proof;
89 }
90 
91 template<typename ppT>
92 bacs_ppzksnark_processed_verification_key<ppT> bacs_ppzksnark_verifier_process_vk(
93  const bacs_ppzksnark_verification_key<ppT> &vk)
94 {
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");
99 
100  return pvk;
101 }
102 
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)
108 {
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);
112  const bool bit =
113  r1cs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, primary_input, proof);
114  libff::leave_block("Call to bacs_ppzksnark_verifier_weak_IC");
115 
116  return bit;
117 }
118 
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)
124 {
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");
131 
132  return bit;
133 }
134 
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)
140 {
141  libff::enter_block("Call to bacs_ppzksnark_online_verifier_weak_IC");
142  const bool bit =
143  r1cs_ppzksnark_online_verifier_weak_IC<ppT>(pvk, primary_input, proof);
144  libff::leave_block("Call to bacs_ppzksnark_online_verifier_weak_IC");
145 
146  return bit;
147 }
148 
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)
154 {
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");
159 
160  return bit;
161 }
162 
163 } // namespace libsnark
164 
165 #endif // BACS_PPZKSNARK_TCC_