1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
 
    3 // SPDX-License-Identifier: LGPL-3.0+
 
    5 #ifndef __ZETH_SNARKS_PGHR13_PGHR13_SNARK_TCC__
 
    6 #define __ZETH_SNARKS_PGHR13_PGHR13_SNARK_TCC__
 
    8 #include "libzeth/core/field_element_utils.hpp"
 
    9 #include "libzeth/core/group_element_utils.hpp"
 
   10 #include "libzeth/snarks/pghr13/pghr13_snark.hpp"
 
   15 template<typename ppT> const std::string pghr13_snark<ppT>::name("PGHR13");
 
   17 template<typename ppT>
 
   18 typename pghr13_snark<ppT>::keypair pghr13_snark<ppT>::generate_setup(
 
   19     const libsnark::protoboard<libff::Fr<ppT>> &pb)
 
   21     return libsnark::r1cs_ppzksnark_generator<ppT>(pb.get_constraint_system());
 
   24 template<typename ppT>
 
   25 typename pghr13_snark<ppT>::proof pghr13_snark<ppT>::generate_proof(
 
   26     const pghr13_snark<ppT>::proving_key &proving_key,
 
   27     const libsnark::protoboard<libff::Fr<ppT>> &pb)
 
   29     return generate_proof(
 
   30         proving_key, pb.primary_input(), pb.auxiliary_input());
 
   33 template<typename ppT>
 
   34 typename pghr13_snark<ppT>::proof pghr13_snark<ppT>::generate_proof(
 
   35     const pghr13_snark<ppT>::proving_key &proving_key,
 
   36     const libsnark::r1cs_primary_input<libff::Fr<ppT>> &primary_input,
 
   37     const libsnark::r1cs_auxiliary_input<libff::Fr<ppT>> auxiliary_input)
 
   39     // Generate proof from public input, auxiliary input (private/secret data),
 
   41     return libsnark::r1cs_ppzksnark_prover(
 
   42         proving_key, primary_input, auxiliary_input);
 
   45 template<typename ppT>
 
   46 bool pghr13_snark<ppT>::verify(
 
   47     const libsnark::r1cs_primary_input<libff::Fr<ppT>> &primary_inputs,
 
   48     const pghr13_snark<ppT>::proof &proof,
 
   49     const pghr13_snark<ppT>::verification_key &verification_key)
 
   51     return libsnark::r1cs_ppzksnark_verifier_strong_IC<ppT>(
 
   52         verification_key, primary_inputs, proof);
 
   55 template<typename ppT>
 
   56 void pghr13_snark<ppT>::verification_key_write_json(
 
   57     const pghr13_snark<ppT>::verification_key &vk, std::ostream &os)
 
   59     unsigned ic_length = vk.encoded_IC_query.rest.indices.size() + 1;
 
   62     os << " \"a\": " << group_element_to_json(vk.alphaA_g2) << ",\n";
 
   63     os << " \"b\": " << group_element_to_json(vk.alphaB_g1) << ",\n";
 
   64     os << " \"c\": " << group_element_to_json(vk.alphaC_g2) << ",\n";
 
   65     os << " \"g\": " << group_element_to_json(vk.gamma_g2) << ",\n";
 
   66     os << " \"gb1\": " << group_element_to_json(vk.gamma_beta_g1) << ",\n";
 
   67     os << " \"gb2\": " << group_element_to_json(vk.gamma_beta_g2) << ",\n";
 
   68     os << " \"z\": " << group_element_to_json(vk.rC_Z_g2) << ",\n";
 
   70     os << "\"IC\" :[" << group_element_to_json(vk.encoded_IC_query.first);
 
   72     for (size_t i = 1; i < ic_length; ++i) {
 
   74            << group_element_to_json(vk.encoded_IC_query.rest.values[i - 1]);
 
   81 template<typename ppT>
 
   82 void pghr13_snark<ppT>::verification_key_write_bytes(
 
   83     const typename pghr13_snark<ppT>::verification_key &vk, std::ostream &os)
 
   88 template<typename ppT>
 
   89 void pghr13_snark<ppT>::verification_key_read_bytes(
 
   90     typename pghr13_snark<ppT>::verification_key &vk, std::istream &in_s)
 
   95 template<typename ppT>
 
   96 void pghr13_snark<ppT>::proving_key_write_bytes(
 
   97     const typename pghr13_snark<ppT>::proving_key &pk, std::ostream &os)
 
  102 template<typename ppT>
 
  103 void pghr13_snark<ppT>::proving_key_read_bytes(
 
  104     typename pghr13_snark<ppT>::proving_key &pk, std::istream &in_s)
 
  109 template<typename ppT>
 
  110 void pghr13_snark<ppT>::proof_write_json(
 
  111     const typename pghr13_snark<ppT>::proof &proof, std::ostream &os)
 
  114     os << " \"a\": " << group_element_to_json(proof.g_A.g) << ",\n";
 
  115     os << " \"a_p\": " << group_element_to_json(proof.g_A.h) << ",\n";
 
  116     os << " \"b\": " << group_element_to_json(proof.g_B.g) << ",\n";
 
  117     os << " \"b_p\": " << group_element_to_json(proof.g_B.h) << ",\n";
 
  118     os << " \"c\": " << group_element_to_json(proof.g_C.g) << ",\n";
 
  119     os << " \"c_p\": " << group_element_to_json(proof.g_C.h) << ",\n";
 
  120     os << " \"h\": " << group_element_to_json(proof.g_H) << ",\n";
 
  121     os << " \"k\": " << group_element_to_json(proof.g_K) << "\n";
 
  125 template<typename ppT>
 
  126 void pghr13_snark<ppT>::proof_write_bytes(
 
  127     const typename pghr13_snark<ppT>::proof &proof, std::ostream &out_s)
 
  129     knowledge_commitment_write_bytes(proof.g_A, out_s);
 
  130     knowledge_commitment_write_bytes(proof.g_B, out_s);
 
  131     knowledge_commitment_write_bytes(proof.g_C, out_s);
 
  132     group_element_write_bytes(proof.g_H, out_s);
 
  133     group_element_write_bytes(proof.g_K, out_s);
 
  136 template<typename ppT>
 
  137 void pghr13_snark<ppT>::proof_read_bytes(
 
  138     typename pghr13_snark<ppT>::proof &proof, std::istream &in_s)
 
  140     knowledge_commitment_read_bytes(proof.g_A, in_s);
 
  141     knowledge_commitment_read_bytes(proof.g_B, in_s);
 
  142     knowledge_commitment_read_bytes(proof.g_C, in_s);
 
  143     group_element_read_bytes(proof.g_H, in_s);
 
  144     group_element_read_bytes(proof.g_K, in_s);
 
  147 template<typename ppT>
 
  148 void pghr13_snark<ppT>::keypair_write_bytes(
 
  149     const typename pghr13_snark<ppT>::keypair &keypair, std::ostream &os)
 
  151     proving_key_write_bytes(keypair.pk, os);
 
  152     verification_key_write_bytes(keypair.vk, os);
 
  155 template<typename ppT>
 
  156 void pghr13_snark<ppT>::keypair_read_bytes(
 
  157     typename pghr13_snark<ppT>::keypair &keypair, std::istream &in_s)
 
  159     proving_key_read_bytes(keypair.pk, in_s);
 
  160     verification_key_read_bytes(keypair.vk, in_s);
 
  163 } // namespace libzeth
 
  165 #endif // __ZETH_SNARKS_PGHR13_PGHR13_SNARK_TCC__