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__