r1cs_gg_ppzksnark.hpp
Go to the documentation of this file.
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2020 Mikhail Komarov <nemo@nil.foundation>
3 // Copyright (c) 2020-2021 Nikita Kaskov <nbering@nil.foundation>
4 // Copyright (c) 2020-2021 Ilias Khairullin <ilias@nil.foundation>
5 //
6 // MIT License
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 // SOFTWARE.
25 //---------------------------------------------------------------------------//
26 
27 #ifndef CRYPTO3_R1CS_GG_PPZKSNARK_HPP
28 #define CRYPTO3_R1CS_GG_PPZKSNARK_HPP
29 
30 #include <type_traits>
31 
33 
44 
45 namespace nil {
46  namespace crypto3 {
47  namespace zk {
48  namespace snark {
49  template<typename CurveType, typename Generator, typename Prover, typename Verifier>
50  using is_basic_mode = typename std::bool_constant<
51  std::is_same<r1cs_gg_ppzksnark_generator<CurveType, ProvingMode::Basic>, Generator>::value &&
52  std::is_same<r1cs_gg_ppzksnark_prover<CurveType, ProvingMode::Basic>, Prover>::value &&
53  (std::is_same<r1cs_gg_ppzksnark_verifier_weak_input_consistency<CurveType, ProvingMode::Basic>,
54  Verifier>::value ||
55  std::is_same<r1cs_gg_ppzksnark_verifier_strong_input_consistency<CurveType, ProvingMode::Basic>,
56  Verifier>::value
57  // || std::is_same<r1cs_gg_ppzksnark_affine_verifier_weak_input_consistency<CurveType>,
58  // Verifier>::value
59  )>;
60 
61  template<typename CurveType, typename Generator, typename Prover, typename Verifier>
62  using is_aggregate_mode = typename std::bool_constant<
63  std::is_same<r1cs_gg_ppzksnark_generator<CurveType, ProvingMode::Aggregate>, Generator>::value &&
64  std::is_same<r1cs_gg_ppzksnark_prover<CurveType, ProvingMode::Aggregate>, Prover>::value &&
65  std::is_same<r1cs_gg_ppzksnark_verifier_strong_input_consistency<CurveType, ProvingMode::Aggregate>,
66  Verifier>::value>;
67 
68  template<typename CurveType, typename Generator, typename Prover, typename Verifier>
69  using is_encrypted_input_mode = typename std::bool_constant<
70  std::is_same<r1cs_gg_ppzksnark_generator<CurveType, ProvingMode::EncryptedInput>,
71  Generator>::value &&
72  std::is_same<r1cs_gg_ppzksnark_prover<CurveType, ProvingMode::EncryptedInput>, Prover>::value &&
73  std::is_same<
75  Verifier>::value>;
76 
105  template<typename CurveType, typename Generator = r1cs_gg_ppzksnark_generator<CurveType>,
106  typename Prover = r1cs_gg_ppzksnark_prover<CurveType>,
107  typename Verifier = r1cs_gg_ppzksnark_verifier_strong_input_consistency<CurveType>,
108  ProvingMode Mode = ProvingMode::Basic, typename = void>
110 
111  template<typename CurveType, typename Generator, typename Prover, typename Verifier>
113  CurveType, Generator, Prover, Verifier, ProvingMode::Basic,
114  typename std::enable_if<is_basic_mode<CurveType, Generator, Prover, Verifier>::value>::type> {
116 
117  public:
121 
125 
128 
129  template<typename KeyPairType>
130  static inline KeyPairType generate(const constraint_system_type &constraint_system) {
131  return Generator::template process<KeyPairType>(constraint_system);
132  }
133 
134  static inline proof_type prove(const proving_key_type &pk,
135  const primary_input_type &primary_input,
136  const auxiliary_input_type &auxiliary_input) {
137 
138  return Prover::process(pk, primary_input, auxiliary_input);
139  }
140 
141  template<typename VerificationKey>
142  static inline bool verify(const VerificationKey &vk,
143  const primary_input_type &primary_input,
144  const proof_type &proof) {
145  return Verifier::process(vk, primary_input, proof);
146  }
147  };
148 
149  template<typename CurveType, typename Generator, typename Prover, typename Verifier>
151  CurveType, Generator, Prover, Verifier, ProvingMode::Aggregate,
152  typename std::enable_if<is_aggregate_mode<CurveType, Generator, Prover, Verifier>::value>::type> {
153 
157 
158  public:
162 
165 
166  typedef typename policy_type::srs_type srs_type;
169 
172 
174 
175  // Generate key pair
176  template<typename DistributionType = boost::random::uniform_int_distribution<
177  typename CurveType::scalar_field_type::integral_type>,
178  typename GeneratorType = boost::random::mt19937>
179  static inline keypair_type generate(const constraint_system_type &constraint_system) {
180  return Generator::template process<DistributionType, GeneratorType>(constraint_system);
181  }
182 
183  // Generate SRS pair
184  template<typename DistributionType = boost::random::uniform_int_distribution<
185  typename CurveType::scalar_field_type::integral_type>,
186  typename GeneratorType = boost::random::mt19937>
187  static inline srs_pair_type generate(std::size_t num_proofs) {
188  return Generator::template process<DistributionType, GeneratorType>(num_proofs);
189  }
190 
191  // TODO: remove
192  // Basic proove
193  static inline basic_proof_type prove(const proving_key_type &pk,
194  const primary_input_type &primary_input,
195  const auxiliary_input_type &auxiliary_input) {
196 
197  return Prover::process(pk, primary_input, auxiliary_input);
198  }
199 
200  // Aggregate prove
201  template<typename Hash, typename InputTranscriptIncludeIterator, typename InputProofIterator>
202  static inline proof_type prove(const proving_srs_type &srs,
203  InputTranscriptIncludeIterator transcript_include_first,
204  InputTranscriptIncludeIterator transcript_include_last,
205  InputProofIterator proofs_first,
206  InputProofIterator proofs_last) {
207 
208  return Prover::template process<Hash>(srs, transcript_include_first, transcript_include_last,
209  proofs_first, proofs_last);
210  }
211 
212  // TODO: remove
213  // Basic verify
214  template<typename VerificationKey>
215  static inline bool verify(const VerificationKey &vk,
216  const primary_input_type &primary_input,
217  const basic_proof_type &proof) {
218  return Verifier::process(vk, primary_input, proof);
219  }
220 
221  // Aggregate verify
222  template<typename DistributionType = boost::random::uniform_int_distribution<
223  typename CurveType::scalar_field_type::integral_type>,
224  typename GeneratorType = boost::random::mt19937, typename Hash = hashes::sha2<256>,
225  typename InputPrimaryInputRange, typename InputIterator>
226  static inline bool verify(const verification_srs_type &ip_verifier_srs,
227  const verification_key_type &pvk,
228  const InputPrimaryInputRange &public_inputs,
229  const proof_type &proof,
230  InputIterator transcript_include_first,
231  InputIterator transcript_include_last) {
232  return Verifier::template process<DistributionType, GeneratorType, Hash>(
233  ip_verifier_srs, pvk, public_inputs, proof, transcript_include_first,
234  transcript_include_last);
235  }
236  };
237 
238  template<typename CurveType, typename Generator, typename Prover, typename Verifier>
239  class r1cs_gg_ppzksnark<CurveType, Generator, Prover, Verifier, ProvingMode::EncryptedInput,
240  typename std::enable_if<is_encrypted_input_mode<CurveType, Generator, Prover,
241  Verifier>::value>::type> {
242 
246 
247  public:
251 
256 
257  // Generate key pair
258  template<typename KeyPairType,
259  typename DistributionType = boost::random::uniform_int_distribution<
260  typename CurveType::scalar_field_type::integral_type>,
261  typename GeneratorType = boost::random::mt19937>
262  static inline KeyPairType generate(const constraint_system_type &constraint_system) {
263  return Generator::template process<KeyPairType, DistributionType, GeneratorType>(
264  constraint_system);
265  }
266 
267  // Proving
268  template<typename PublicKey>
269  static inline proof_type prove(const proving_key_type &pk,
270  const PublicKey &pubkey,
271  const primary_input_type &primary_input,
272  const auxiliary_input_type &auxiliary_input,
273  const typename CurveType::scalar_field_type::value_type &r) {
274  return Prover::process(pk, pubkey, primary_input, auxiliary_input, r);
275  }
276 
277  // Verification
278  template<typename CipherTextIterator, typename PublicKey>
279  static inline bool verify(CipherTextIterator first, CipherTextIterator last,
280  const verification_key_type &vk, const PublicKey &pubkey,
281  const primary_input_type &unencrypted_primary_input,
282  const proof_type &proof) {
283  return Verifier::process(first, last, vk, pubkey, unencrypted_primary_input, proof);
284  }
285  };
286  } // namespace snark
287  } // namespace zk
288  } // namespace crypto3
289 } // namespace nil
290 
291 #endif // CRYPTO3_R1CS_GG_PPZKSNARK_HPP
SHA2.
Definition: sha2.hpp:46
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:248
basic_policy::primary_input_type primary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:263
basic_policy::extended_keypair_type keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:288
basic_policy::auxiliary_input_type auxiliary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:265
Definition: snark/proof.hpp:37
static basic_proof_type prove(const proving_key_type &pk, const primary_input_type &primary_input, const auxiliary_input_type &auxiliary_input)
Definition: r1cs_gg_ppzksnark.hpp:193
static proof_type prove(const proving_srs_type &srs, InputTranscriptIncludeIterator transcript_include_first, InputTranscriptIncludeIterator transcript_include_last, InputProofIterator proofs_first, InputProofIterator proofs_last)
Definition: r1cs_gg_ppzksnark.hpp:202
static bool verify(const verification_srs_type &ip_verifier_srs, const verification_key_type &pvk, const InputPrimaryInputRange &public_inputs, const proof_type &proof, InputIterator transcript_include_first, InputIterator transcript_include_last)
Definition: r1cs_gg_ppzksnark.hpp:226
static bool verify(const VerificationKey &vk, const primary_input_type &primary_input, const basic_proof_type &proof)
Definition: r1cs_gg_ppzksnark.hpp:215
static bool verify(const VerificationKey &vk, const primary_input_type &primary_input, const proof_type &proof)
Definition: r1cs_gg_ppzksnark.hpp:142
static proof_type prove(const proving_key_type &pk, const primary_input_type &primary_input, const auxiliary_input_type &auxiliary_input)
Definition: r1cs_gg_ppzksnark.hpp:134
static bool verify(CipherTextIterator first, CipherTextIterator last, const verification_key_type &vk, const PublicKey &pubkey, const primary_input_type &unencrypted_primary_input, const proof_type &proof)
Definition: r1cs_gg_ppzksnark.hpp:279
static proof_type prove(const proving_key_type &pk, const PublicKey &pubkey, const primary_input_type &primary_input, const auxiliary_input_type &auxiliary_input, const typename CurveType::scalar_field_type::value_type &r)
Definition: r1cs_gg_ppzksnark.hpp:269
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp:60
ppzkSNARK for R1CS with a security proof in the generic group (GG) model
Definition: r1cs_gg_ppzksnark.hpp:109
boost::mpl::apply< AccumulatorSet, tag::pubkey< ProcessingMode > >::type::result_type pubkey(const AccumulatorSet &acc)
Definition: accumulators/pubkey.hpp:106
typename std::bool_constant< std::is_same< r1cs_gg_ppzksnark_generator< CurveType, ProvingMode::EncryptedInput >, Generator >::value &&std::is_same< r1cs_gg_ppzksnark_prover< CurveType, ProvingMode::EncryptedInput >, Prover >::value &&std::is_same< r1cs_gg_ppzksnark_verifier_strong_input_consistency< CurveType, ProvingMode::EncryptedInput >, Verifier >::value > is_encrypted_input_mode
Definition: r1cs_gg_ppzksnark.hpp:75
typename std::bool_constant< std::is_same< r1cs_gg_ppzksnark_generator< CurveType, ProvingMode::Basic >, Generator >::value &&std::is_same< r1cs_gg_ppzksnark_prover< CurveType, ProvingMode::Basic >, Prover >::value &&(std::is_same< r1cs_gg_ppzksnark_verifier_weak_input_consistency< CurveType, ProvingMode::Basic >, Verifier >::value||std::is_same< r1cs_gg_ppzksnark_verifier_strong_input_consistency< CurveType, ProvingMode::Basic >, Verifier >::value)> is_basic_mode
Definition: r1cs_gg_ppzksnark.hpp:59
ProvingMode
Definition: modes.hpp:33
typename std::bool_constant< std::is_same< r1cs_gg_ppzksnark_generator< CurveType, ProvingMode::Aggregate >, Generator >::value &&std::is_same< r1cs_gg_ppzksnark_prover< CurveType, ProvingMode::Aggregate >, Prover >::value &&std::is_same< r1cs_gg_ppzksnark_verifier_strong_input_consistency< CurveType, ProvingMode::Aggregate >, Verifier >::value > is_aggregate_mode
Definition: r1cs_gg_ppzksnark.hpp:66
Definition: pair.hpp:31
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:168
r1cs_gg_ppzksnark_keypair< proving_key_type, verification_key_type > keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:204
r1cs_auxiliary_input< typename curve_type::scalar_field_type > auxiliary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:182
r1cs_primary_input< typename curve_type::scalar_field_type > primary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:180
srs_type::srs_pair_type srs_pair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:233
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:78
r1cs_gg_ppzksnark_keypair< proving_key_type, verification_key_type > keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:135
r1cs_auxiliary_input< typename curve_type::scalar_field_type > auxiliary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:92
r1cs_primary_input< typename curve_type::scalar_field_type > primary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:90
Definition: snark/systems/ppzksnark/r1cs_gg_ppzksnark/ipp2/proof.hpp:96
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/ipp2/verification_key.hpp:38
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:121
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:102
Definition: snark/systems/ppzksnark/r1cs_gg_ppzksnark/proof.hpp:40
Definition: systems/ppzksnark/r1cs_gg_ppzksnark/proving_key.hpp:39
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:47