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__