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_