zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp
Go to the documentation of this file.
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2021 Mikhail Komarov <nemo@nil.foundation>
3 // Copyright (c) 2021 Ilias Khairullin <ilias@nil.foundation>
4 //
5 // MIT License
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in all
15 // copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 // SOFTWARE.
24 //---------------------------------------------------------------------------//
25 // @file Declaration of interfaces for a ppzkSNARK for BACS.
26 //
27 // This includes:
28 // - class for proving key
29 // - class for verification key
30 // - class for processed verification key
31 // - class for key pair (proving key & verification key)
32 // - class for proof
33 // - generator algorithm
34 // - prover algorithm
35 // - verifier algorithm (with strong or weak input consistency)
36 // - online verifier algorithm (with strong or weak input consistency)
37 //
38 // The implementation is a straightforward combination of:
39 // (1) a BACS-to-R1CS reduction, and
40 // (2) a ppzkSNARK for R1CS.
41 //
42 //
43 // Acronyms:
44 //
45 // - BACS = "Bilinear Arithmetic Circuit Satisfiability"
46 // - R1CS = "Rank-1 Constraint System"
47 // - ppzkSNARK = "PreProcessing Zero-Knowledge Succinct Non-interactive ARgument of Knowledge"
48 //---------------------------------------------------------------------------//
49 
50 #ifndef CRYPTO3_ZK_R1CS_GG_PPZKSNARK_ENCRYPTED_INPUT_VERIFIER_HPP
51 #define CRYPTO3_ZK_R1CS_GG_PPZKSNARK_ENCRYPTED_INPUT_VERIFIER_HPP
52 
54 
55 namespace nil {
56  namespace crypto3 {
57  namespace zk {
58  namespace snark {
59  template<typename CurveType>
63 
64  typedef typename CurveType::scalar_field_type scalar_field_type;
65  typedef typename CurveType::template g1_type<> g1_type;
66  typedef typename CurveType::template g2_type<> g2_type;
67  typedef typename CurveType::gt_type gt_type;
68  typedef typename pairing::pairing_policy<CurveType>::g1_precomputed_type g1_precomputed_type;
69  typedef typename pairing::pairing_policy<CurveType>::g2_precomputed_type g2_precomputed_type;
70 
71  public:
76 
77  // TODO: add type constraints on PublicKey
78  template<typename CipherTextIterator, typename PublicKey>
79  static inline typename std::enable_if<
80  std::is_same<typename g1_type::value_type,
81  typename std::iterator_traits<CipherTextIterator>::value_type>::value,
82  bool>::type
83  process(CipherTextIterator first, CipherTextIterator last, const verification_key_type &gg_vk,
84  const PublicKey &pubkey, const primary_input_type &unencrypted_primary_input,
85  const proof_type &proof) {
86 
87  const std::size_t input_size = gg_vk.gamma_ABC_g1.rest.size();
88  const std::size_t ct_size = std::distance(first, last);
89  assert(input_size - 1 > ct_size - 2);
90  assert(unencrypted_primary_input.size() + (ct_size - 2) == input_size);
91  assert(ct_size - 2 == pubkey.delta_s_g1.size());
92  assert(ct_size - 2 == pubkey.t_g1.size());
93  assert(ct_size - 2 == pubkey.t_g2.size() - 1);
94  typename g1_type::value_type acc = gg_vk.gamma_ABC_g1.first;
95  typename gt_type::value_type sum_cipher = gt_type::value_type::one();
96 
97  auto it1 = first;
98  auto it2 = std::cbegin(pubkey.t_g2);
99  while (it1 != last - 1 && it2 != std::cend(pubkey.t_g2)) {
100  acc = acc + *it1;
101  sum_cipher = sum_cipher * algebra::pair_reduced<CurveType>(*it1++, *it2++);
102  }
103  assert((it1 == last - 1) && (it2 == std::cend(pubkey.t_g2)));
104 
105  for (std::size_t i = ct_size - 2; i < input_size; ++i) {
106  acc = acc + unencrypted_primary_input[i - ct_size + 2] * gg_vk.gamma_ABC_g1.rest[i];
107  }
108  typename gt_type::value_type presum_cipher =
109  algebra::pair_reduced<CurveType>(*(last - 1), g2_type::value_type::one());
110  bool ans1 = (sum_cipher == presum_cipher);
111 
112  // TODO: optimize
113  typename gt_type::value_type QAPl = algebra::pair_reduced<CurveType>(proof.g_A, proof.g_B);
114  typename gt_type::value_type QAPr = gg_vk.alpha_g1_beta_g2 *
115  algebra::pair_reduced<CurveType>(acc, gg_vk.gamma_g2) *
116  algebra::pair_reduced<CurveType>(proof.g_C, gg_vk.delta_g2);
117  // const g1_precomputed_type proof_g1_A_precomp = precompute_g1<CurveType>(proof.g_A);
118  // const g2_precomputed_type proof_g2_B_precomp = precompute_g2<CurveType>(proof.g_B);
119  //
120  // const g1_precomputed_type pk_g1_alpha_precomp =
121  // precompute_g1<CurveType>(gg_keypair.first.alpha_g1);
122  // const g2_precomputed_type pk_g2_beta_precomp =
123  // precompute_g2<CurveType>(gg_keypair.first.beta_g2);
124  //
125  // const g1_precomputed_type proof_g1_C_precomp = precompute_g1<CurveType>(proof.g_C);
126  // const g2_precomputed_type vk_g2_delta_precomp =
127  // precompute_g2<CurveType>(gg_keypair.second.delta_g2);
128  //
129  // const g1_precomputed_type proof_g1_cn_precomp = precompute_g1<CurveType>(acc);
130  // const g2_precomputed_type vk_g2_gamma_precomp =
131  // precompute_g2<CurveType>(gg_keypair.second.gamma_g2);
132  //
133  // typename gt_type::value_type QAPl_1 =
134  // miller_loop<CurveType>(proof_g1_A_precomp, proof_g2_B_precomp);
135  // typename gt_type::value_type QAPl_2 = double_miller_loop<CurveType>(
136  // proof_g1_C_precomp, vk_g2_delta_precomp, pk_g1_alpha_precomp, pk_g2_beta_precomp);
137  //
138  // typename gt_type::value_type QAPr_2 =
139  // miller_loop<CurveType>(proof_g1_cn_precomp, vk_g2_gamma_precomp);
140  //
141  // typename gt_type::value_type QAPl = final_exponentiation<CurveType>(QAPl_1 *
142  // QAPl_2.inversed()); typename gt_type::value_type QAPr =
143  // final_exponentiation<CurveType>(QAPr_2);
144 
145  bool ans2 = (QAPl == QAPr);
146 
147  return (ans1 && ans2);
148  }
149  };
150  } // namespace snark
151  } // namespace zk
152  } // namespace crypto3
153 } // namespace nil
154 
155 #endif // CRYPTO3_ZK_R1CS_GG_PPZKSNARK_ENCRYPTED_INPUT_VERIFIER_HPP
sparse_vector< Type > rest
Definition: accumulation_vector.hpp:53
underlying_value_type first
Definition: accumulation_vector.hpp:52
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
Definition: snark/proof.hpp:37
policy_type::proof_type proof_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp:75
policy_type::keypair_type keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp:73
policy_type::primary_input_type primary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp:72
policy_type::verification_key_type verification_key_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp:74
static std::enable_if< std::is_same< typename g1_type::value_type, typename std::iterator_traits< CipherTextIterator >::value_type >::value, bool >::type process(CipherTextIterator first, CipherTextIterator last, const verification_key_type &gg_vk, const PublicKey &pubkey, const primary_input_type &unencrypted_primary_input, const proof_type &proof)
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/encrypted_input/verifier.hpp:83
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verifier.hpp:75
boost::mpl::apply< AccumulatorSet, tag::pubkey< ProcessingMode > >::type::result_type pubkey(const AccumulatorSet &acc)
Definition: accumulators/pubkey.hpp:106
ProvingMode
Definition: modes.hpp:33
Definition: pair.hpp:31
Definition: pairing_policy.hpp:35
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:78
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:121
g2_type::value_type gamma_g2
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:129
accumulation_vector< g1_type > gamma_ABC_g1
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:132
gt_type::value_type alpha_g1_beta_g2
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:128
g2_type::value_type delta_g2
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:130
Definition: snark/systems/ppzksnark/r1cs_gg_ppzksnark/proof.hpp:40