1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
 
    3 // SPDX-License-Identifier: LGPL-3.0+
 
    5 #ifndef __ZETH_SNARKS_PGHR13_PGHR13_API_HANDLER_TCC__
 
    6 #define __ZETH_SNARKS_PGHR13_PGHR13_API_HANDLER_TCC__
 
    8 #include "libzeth/core/field_element_utils.hpp"
 
    9 #include "libzeth/core/group_element_utils.hpp"
 
   10 #include "libzeth/serialization/proto_utils.hpp"
 
   11 #include "libzeth/serialization/r1cs_serialization.hpp"
 
   12 #include "libzeth/snarks/pghr13/pghr13_api_handler.hpp"
 
   17 template<typename ppT>
 
   18 void pghr13_api_handler<ppT>::verification_key_to_proto(
 
   19     const typename snark::verification_key &vk,
 
   20     zeth_proto::VerificationKey *message)
 
   22     zeth_proto::Group2Point *a = new zeth_proto::Group2Point();
 
   23     zeth_proto::Group1Point *b = new zeth_proto::Group1Point();
 
   24     zeth_proto::Group2Point *c = new zeth_proto::Group2Point();
 
   25     zeth_proto::Group2Point *g = new zeth_proto::Group2Point();
 
   26     zeth_proto::Group1Point *gb1 = new zeth_proto::Group1Point();
 
   27     zeth_proto::Group2Point *gb2 = new zeth_proto::Group2Point();
 
   28     zeth_proto::Group2Point *z = new zeth_proto::Group2Point();
 
   30     a->CopyFrom(point_g2_affine_to_proto<ppT>(vk.alphaA_g2));
 
   31     b->CopyFrom(point_g1_affine_to_proto<ppT>(vk.alphaB_g1));
 
   32     c->CopyFrom(point_g2_affine_to_proto<ppT>(vk.alphaC_g2));
 
   33     g->CopyFrom(point_g2_affine_to_proto<ppT>(vk.gamma_g2));
 
   34     gb1->CopyFrom(point_g1_affine_to_proto<ppT>(vk.gamma_beta_g1));
 
   35     gb2->CopyFrom(point_g2_affine_to_proto<ppT>(vk.gamma_beta_g2));
 
   36     z->CopyFrom(point_g2_affine_to_proto<ppT>(vk.rC_Z_g2));
 
   38     std::string ic_json = accumulation_vector_to_json<ppT>(vk.encoded_IC_query);
 
   40     // Note on memory safety: set_allocated deleted the allocated objects
 
   42     //   https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
 
   43     zeth_proto::VerificationKeyPGHR13 *grpc_verification_key_pghr13 =
 
   44         message->mutable_pghr13_verification_key();
 
   46     grpc_verification_key_pghr13->set_allocated_a(a);
 
   47     grpc_verification_key_pghr13->set_allocated_b(b);
 
   48     grpc_verification_key_pghr13->set_allocated_c(c);
 
   49     grpc_verification_key_pghr13->set_allocated_gamma(g);
 
   50     grpc_verification_key_pghr13->set_allocated_gamma_beta_g1(gb1);
 
   51     grpc_verification_key_pghr13->set_allocated_gamma_beta_g2(gb2);
 
   52     grpc_verification_key_pghr13->set_allocated_z(z);
 
   53     grpc_verification_key_pghr13->set_ic(ic_json);
 
   56 template<typename ppT>
 
   57 typename pghr13_snark<ppT>::verification_key pghr13_api_handler<
 
   58     ppT>::verification_key_from_proto(const zeth_proto::VerificationKey
 
   61     const zeth_proto::VerificationKeyPGHR13 &verif_key =
 
   62         verification_key.pghr13_verification_key();
 
   63     libff::G2<ppT> a = point_g2_affine_from_proto<ppT>(verif_key.a());
 
   64     libff::G1<ppT> b = point_g1_affine_from_proto<ppT>(verif_key.b());
 
   65     libff::G2<ppT> c = point_g2_affine_from_proto<ppT>(verif_key.c());
 
   66     libff::G2<ppT> gamma = point_g2_affine_from_proto<ppT>(verif_key.gamma());
 
   67     libff::G1<ppT> gamma_beta_g1 =
 
   68         point_g1_affine_from_proto<ppT>(verif_key.gamma_beta_g1());
 
   69     libff::G2<ppT> gamma_beta_g2 =
 
   70         point_g2_affine_from_proto<ppT>(verif_key.gamma_beta_g2());
 
   71     libff::G2<ppT> z = point_g2_affine_from_proto<ppT>(verif_key.z());
 
   73     libsnark::accumulation_vector<libff::G1<ppT>> ic =
 
   74         accumulation_vector_from_json<ppT>(verif_key.ic());
 
   76     libsnark::r1cs_ppzksnark_verification_key<ppT> vk(
 
   77         a, b, c, gamma, gamma_beta_g1, gamma_beta_g2, z, ic);
 
   82 template<typename ppT>
 
   83 void pghr13_api_handler<ppT>::extended_proof_to_proto(
 
   84     const extended_proof<ppT, snark> &ext_proof,
 
   85     zeth_proto::ExtendedProof *message)
 
   87     libsnark::r1cs_ppzksnark_proof<ppT> proofObj = ext_proof.get_proof();
 
   89     zeth_proto::Group1Point *a = new zeth_proto::Group1Point();
 
   90     zeth_proto::Group1Point *a_p = new zeth_proto::Group1Point();
 
   91     zeth_proto::Group2Point *b = new zeth_proto::Group2Point();
 
   92     zeth_proto::Group1Point *b_p = new zeth_proto::Group1Point();
 
   93     zeth_proto::Group1Point *c = new zeth_proto::Group1Point();
 
   94     zeth_proto::Group1Point *c_p = new zeth_proto::Group1Point();
 
   95     zeth_proto::Group1Point *h = new zeth_proto::Group1Point();
 
   96     zeth_proto::Group1Point *k = new zeth_proto::Group1Point();
 
   98     a->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_A.g));
 
   99     a_p->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_A.h));
 
  100     b->CopyFrom(point_g2_affine_to_proto<ppT>(proofObj.g_B.g));
 
  101     b_p->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_B.h));
 
  102     c->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_C.g));
 
  103     c_p->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_C.h));
 
  104     h->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_H));
 
  105     k->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_K));
 
  107     libsnark::r1cs_ppzksnark_primary_input<ppT> pub_inputs =
 
  108         ext_proof.get_primary_inputs();
 
  110     std::stringstream ss;
 
  111     primary_inputs_write_json(pub_inputs, ss);
 
  113     // Note on memory safety: set_allocated deleted the allocated objects
 
  115     //   https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
 
  116     zeth_proto::ExtendedProofPGHR13 *grpc_extended_pghr13_proof_obj =
 
  117         message->mutable_pghr13_extended_proof();
 
  119     grpc_extended_pghr13_proof_obj->set_allocated_a(a);
 
  120     grpc_extended_pghr13_proof_obj->set_allocated_a_p(a_p);
 
  121     grpc_extended_pghr13_proof_obj->set_allocated_b(b);
 
  122     grpc_extended_pghr13_proof_obj->set_allocated_b_p(b_p);
 
  123     grpc_extended_pghr13_proof_obj->set_allocated_c(c);
 
  124     grpc_extended_pghr13_proof_obj->set_allocated_c_p(c_p);
 
  125     grpc_extended_pghr13_proof_obj->set_allocated_h(h);
 
  126     grpc_extended_pghr13_proof_obj->set_allocated_k(k);
 
  127     grpc_extended_pghr13_proof_obj->set_inputs(ss.str());
 
  130 template<typename ppT>
 
  131 libzeth::extended_proof<ppT, pghr13_snark<ppT>> pghr13_api_handler<
 
  132     ppT>::extended_proof_from_proto(const zeth_proto::ExtendedProof &ext_proof)
 
  134     const zeth_proto::ExtendedProofPGHR13 &e_proof =
 
  135         ext_proof.pghr13_extended_proof();
 
  137     libff::G1<ppT> a = point_g1_affine_from_proto<ppT>(e_proof.a());
 
  138     libff::G1<ppT> a_p = point_g1_affine_from_proto<ppT>(e_proof.a_p());
 
  139     libsnark::knowledge_commitment<libff::G1<ppT>, libff::G1<ppT>> g_A(a, a_p);
 
  141     libff::G2<ppT> b = point_g2_affine_from_proto<ppT>(e_proof.b());
 
  142     libff::G1<ppT> b_p = point_g1_affine_from_proto<ppT>(e_proof.b_p());
 
  143     libsnark::knowledge_commitment<libff::G2<ppT>, libff::G1<ppT>> g_B(b, b_p);
 
  145     libff::G1<ppT> c = point_g1_affine_from_proto<ppT>(e_proof.c());
 
  146     libff::G1<ppT> c_p = point_g1_affine_from_proto<ppT>(e_proof.c_p());
 
  147     libsnark::knowledge_commitment<libff::G1<ppT>, libff::G1<ppT>> g_C(c, c_p);
 
  149     libff::G1<ppT> h = point_g1_affine_from_proto<ppT>(e_proof.h());
 
  150     libff::G1<ppT> k = point_g1_affine_from_proto<ppT>(e_proof.k());
 
  152     libsnark::r1cs_ppzksnark_proof<ppT> proof(
 
  158     libsnark::r1cs_primary_input<libff::Fr<ppT>> inputs;
 
  159     std::stringstream ss(e_proof.inputs());
 
  160     primary_inputs_read_json(inputs, ss);
 
  162     return libzeth::extended_proof<ppT, pghr13_snark<ppT>>(
 
  163         std::move(proof), std::move(inputs));
 
  166 } // namespace libzeth
 
  168 #endif // __ZETH_SNARKS_PGHR13_PGHR13_API_HANDLER_TCC__