1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
 
    3 // SPDX-License-Identifier: LGPL-3.0+
 
    5 #ifndef __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__
 
    6 #define __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__
 
    8 #include "libzeth/core/field_element_utils.hpp"
 
    9 #include "libzeth/serialization/proto_utils.hpp"
 
   10 #include "libzeth/serialization/r1cs_serialization.hpp"
 
   11 #include "libzeth/snarks/groth16/groth16_api_handler.hpp"
 
   16 template<typename ppT>
 
   17 void groth16_api_handler<ppT>::verification_key_to_proto(
 
   18     const typename groth16_api_handler<ppT>::snark::verification_key &vk,
 
   19     zeth_proto::VerificationKey *message)
 
   21     zeth_proto::Group1Point *alpha = new zeth_proto::Group1Point();
 
   22     zeth_proto::Group2Point *beta = new zeth_proto::Group2Point();
 
   23     zeth_proto::Group2Point *delta = new zeth_proto::Group2Point();
 
   25     alpha->CopyFrom(point_g1_affine_to_proto<ppT>(vk.alpha_g1));
 
   26     beta->CopyFrom(point_g2_affine_to_proto<ppT>(vk.beta_g2));
 
   27     delta->CopyFrom(point_g2_affine_to_proto<ppT>(vk.delta_g2));
 
   29     std::string abc_json_str = accumulation_vector_to_json<ppT>(vk.ABC_g1);
 
   31     // Note on memory safety: set_allocated deleted the allocated objects
 
   33     // https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
 
   34     zeth_proto::VerificationKeyGROTH16 *grpc_verification_key_groth16 =
 
   35         message->mutable_groth16_verification_key();
 
   37     grpc_verification_key_groth16->set_allocated_alpha_g1(alpha);
 
   38     grpc_verification_key_groth16->set_allocated_beta_g2(beta);
 
   39     grpc_verification_key_groth16->set_allocated_delta_g2(delta);
 
   40     grpc_verification_key_groth16->set_abc_g1(abc_json_str);
 
   43 template<typename ppT>
 
   44 typename groth16_snark<ppT>::verification_key groth16_api_handler<
 
   45     ppT>::verification_key_from_proto(const zeth_proto::VerificationKey
 
   48     const zeth_proto::VerificationKeyGROTH16 &verif_key =
 
   49         verification_key.groth16_verification_key();
 
   50     libff::G1<ppT> alpha_g1 =
 
   51         point_g1_affine_from_proto<ppT>(verif_key.alpha_g1());
 
   52     libff::G2<ppT> beta_g2 =
 
   53         point_g2_affine_from_proto<ppT>(verif_key.beta_g2());
 
   55     libff::G2<ppT> delta_g2 =
 
   56         point_g2_affine_from_proto<ppT>(verif_key.delta_g2());
 
   58     libsnark::accumulation_vector<libff::G1<ppT>> abc_g1 =
 
   59         accumulation_vector_from_json<ppT>(verif_key.abc_g1());
 
   61     libsnark::r1cs_gg_ppzksnark_verification_key<ppT> vk(
 
   62         alpha_g1, beta_g2, delta_g2, abc_g1);
 
   67 template<typename ppT>
 
   68 void groth16_api_handler<ppT>::extended_proof_to_proto(
 
   69     const extended_proof<ppT, groth16_api_handler<ppT>::snark> &ext_proof,
 
   70     zeth_proto::ExtendedProof *message)
 
   72     const libsnark::r1cs_gg_ppzksnark_proof<ppT> &proof_obj =
 
   73         ext_proof.get_proof();
 
   75     zeth_proto::Group1Point *a = new zeth_proto::Group1Point();
 
   76     zeth_proto::Group2Point *b = new zeth_proto::Group2Point();
 
   77     zeth_proto::Group1Point *c = new zeth_proto::Group1Point();
 
   79     a->CopyFrom(point_g1_affine_to_proto<ppT>(proof_obj.g_A));
 
   80     b->CopyFrom(point_g2_affine_to_proto<ppT>(proof_obj.g_B));
 
   81     c->CopyFrom(point_g1_affine_to_proto<ppT>(proof_obj.g_C));
 
   84     primary_inputs_write_json(ext_proof.get_primary_inputs(), ss);
 
   86     // Note on memory safety: set_allocated deleted the allocated objects.
 
   88     // https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
 
   89     zeth_proto::ExtendedProofGROTH16 *grpc_extended_groth16_proof_obj =
 
   90         message->mutable_groth16_extended_proof();
 
   92     grpc_extended_groth16_proof_obj->set_allocated_a(a);
 
   93     grpc_extended_groth16_proof_obj->set_allocated_b(b);
 
   94     grpc_extended_groth16_proof_obj->set_allocated_c(c);
 
   95     grpc_extended_groth16_proof_obj->set_inputs(ss.str());
 
   98 template<typename ppT>
 
   99 libzeth::extended_proof<ppT, groth16_snark<ppT>> groth16_api_handler<
 
  100     ppT>::extended_proof_from_proto(const zeth_proto::ExtendedProof &ext_proof)
 
  102     const zeth_proto::ExtendedProofGROTH16 &e_proof =
 
  103         ext_proof.groth16_extended_proof();
 
  104     libff::G1<ppT> a = point_g1_affine_from_proto<ppT>(e_proof.a());
 
  105     libff::G2<ppT> b = point_g2_affine_from_proto<ppT>(e_proof.b());
 
  106     libff::G1<ppT> c = point_g1_affine_from_proto<ppT>(e_proof.c());
 
  108     std::vector<libff::Fr<ppT>> inputs;
 
  109     std::stringstream ss(e_proof.inputs());
 
  110     primary_inputs_read_json(inputs, ss);
 
  112     libsnark::r1cs_gg_ppzksnark_proof<ppT> proof(
 
  113         std::move(a), std::move(b), std::move(c));
 
  114     libzeth::extended_proof<ppT, groth16_snark<ppT>> res(
 
  115         std::move(proof), std::move(inputs));
 
  120 } // namespace libzeth
 
  122 #endif // __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__