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_