Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
prf.hpp
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
5 #ifndef __ZETH_CIRCUITS_PRFS_PRF_HPP__
6 #define __ZETH_CIRCUITS_PRFS_PRF_HPP__
7 
8 // DISCLAIMER:
9 // Content Taken and adapted from Zcash
10 // https://github.com/zcash/zcash/blob/master/src/zcash/circuit/prfs.tcc
11 
13 
14 #include <libsnark/gadgetlib1/gadget.hpp>
15 #include <libsnark/gadgetlib1/gadgets/hashes/hash_io.hpp>
16 
17 namespace libzeth
18 {
19 
20 template<typename FieldT, typename HashT>
21 class PRF_gadget : public libsnark::gadget<FieldT>
22 {
23 private:
24  std::shared_ptr<libsnark::digest_variable<FieldT>> result;
25  libsnark::block_variable<FieldT> block;
26  HashT hasher;
27 
28 public:
29  PRF_gadget(
30  libsnark::protoboard<FieldT> &pb,
31  const libsnark::pb_variable_array<FieldT> &x,
32  const libsnark::pb_variable_array<FieldT> &y,
33  std::shared_ptr<libsnark::digest_variable<FieldT>>
34  result, // blake2sCompress(x || y)
35  const std::string &annotation_prefix = "PRF_gadget");
36 
38  void generate_r1cs_witness();
39 };
40 
41 // This function is useful as the generation of a_pk is done via a_pk =
42 // blake2sCompress(a_sk || 0^256) See Zerocash extended paper, page 22,
43 // paragraph "Instantiating the NP statement POUR"
44 template<typename FieldT, typename HashT>
45 libsnark::pb_variable_array<FieldT> gen_256_zeroes(
46  const libsnark::pb_variable<FieldT> &ZERO);
47 
48 template<typename FieldT>
49 libsnark::pb_variable_array<FieldT> get_tag_addr(
50  const libsnark::pb_variable<FieldT> &ZERO,
51  const libsnark::pb_variable_array<FieldT> &x);
52 
53 template<typename FieldT>
54 libsnark::pb_variable_array<FieldT> get_tag_nf(
55  const libsnark::pb_variable<FieldT> &ZERO,
56  const libsnark::pb_variable_array<FieldT> &a_sk);
57 
58 template<typename FieldT>
59 libsnark::pb_variable_array<FieldT> get_tag_pk(
60  const libsnark::pb_variable<FieldT> &ZERO,
61  const libsnark::pb_variable_array<FieldT> &a_sk,
62  size_t index);
63 
64 template<typename FieldT>
65 libsnark::pb_variable_array<FieldT> get_tag_rho(
66  const libsnark::pb_variable<FieldT> &ZERO,
67  const libsnark::pb_variable_array<FieldT> &phi,
68  size_t index);
69 
73 template<typename FieldT, typename HashT>
74 class PRF_addr_a_pk_gadget : public PRF_gadget<FieldT, HashT>
75 {
76 public:
78  libsnark::protoboard<FieldT> &pb,
79  const libsnark::pb_variable<FieldT> &ZERO,
80  const libsnark::pb_variable_array<FieldT> &a_sk,
81  std::shared_ptr<libsnark::digest_variable<FieldT>> result,
82  const std::string &annotation_prefix = " add_PRF_gadget");
83 };
84 
88 template<typename FieldT, typename HashT>
89 class PRF_nf_gadget : public PRF_gadget<FieldT, HashT>
90 {
91 public:
93  libsnark::protoboard<FieldT> &pb,
94  const libsnark::pb_variable<FieldT> &ZERO,
95  const libsnark::pb_variable_array<FieldT> &a_sk,
96  const libsnark::pb_variable_array<FieldT> &rho,
97  std::shared_ptr<libsnark::digest_variable<FieldT>>
98  result, // blake2sCompress(a_sk || 01 || [rho]_254)
99  const std::string &annotation_prefix = "PRF_nf_gadget");
100 };
101 
105 template<typename FieldT, typename HashT>
106 class PRF_pk_gadget : public PRF_gadget<FieldT, HashT>
107 {
108 public:
110  libsnark::protoboard<FieldT> &pb,
111  const libsnark::pb_variable<FieldT> &ZERO,
112  const libsnark::pb_variable_array<FieldT> &a_sk,
113  const libsnark::pb_variable_array<FieldT> &h_sig,
114  size_t index,
115  std::shared_ptr<libsnark::digest_variable<FieldT>> result,
116  const std::string &annotation_prefix = " pk_PRF_gadget");
117 };
118 
122 template<typename FieldT, typename HashT>
123 class PRF_rho_gadget : public PRF_gadget<FieldT, HashT>
124 {
125 public:
127  libsnark::protoboard<FieldT> &pb,
128  const libsnark::pb_variable<FieldT> &ZERO,
129  const libsnark::pb_variable_array<FieldT> &phi,
130  const libsnark::pb_variable_array<FieldT> &h_sig,
131  size_t index,
132  std::shared_ptr<libsnark::digest_variable<FieldT>> result,
133  const std::string &annotation_prefix = " rho_PRF_gadget");
134 };
135 
136 } // namespace libzeth
137 
139 
140 #endif // __ZETH_CIRCUITS_PRFS_PRF_HPP__
libzeth::get_tag_pk
libsnark::pb_variable_array< FieldT > get_tag_pk(const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &a_sk, size_t index)
libzeth::gen_256_zeroes
libsnark::pb_variable_array< FieldT > gen_256_zeroes(const libsnark::pb_variable< FieldT > &ZERO)
libzeth
Definition: binary_operation.hpp:15
libzeth::PRF_nf_gadget::PRF_nf_gadget
PRF_nf_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &a_sk, const libsnark::pb_variable_array< FieldT > &rho, std::shared_ptr< libsnark::digest_variable< FieldT >> result, const std::string &annotation_prefix="PRF_nf_gadget")
libzeth::PRF_gadget
Definition: prf.hpp:21
libzeth::PRF_addr_a_pk_gadget::PRF_addr_a_pk_gadget
PRF_addr_a_pk_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &a_sk, std::shared_ptr< libsnark::digest_variable< FieldT >> result, const std::string &annotation_prefix=" add_PRF_gadget")
circuit_utils.hpp
libzeth::PRF_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libzeth::get_tag_addr
libsnark::pb_variable_array< FieldT > get_tag_addr(const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &x)
libzeth::PRF_rho_gadget::PRF_rho_gadget
PRF_rho_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &phi, const libsnark::pb_variable_array< FieldT > &h_sig, size_t index, std::shared_ptr< libsnark::digest_variable< FieldT >> result, const std::string &annotation_prefix=" rho_PRF_gadget")
libzeth::get_tag_rho
libsnark::pb_variable_array< FieldT > get_tag_rho(const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &phi, size_t index)
libzeth::PRF_addr_a_pk_gadget
Definition: prf.hpp:74
libzeth::BLAKE2s_256
Definition: blake2s.hpp:24
libzeth::PRF_pk_gadget
Definition: prf.hpp:106
libzeth::PRF_gadget::PRF_gadget
PRF_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &x, const libsnark::pb_variable_array< FieldT > &y, std::shared_ptr< libsnark::digest_variable< FieldT >> result, const std::string &annotation_prefix="PRF_gadget")
libzeth::PRF_rho_gadget
Definition: prf.hpp:123
libzeth::PRF_nf_gadget
Definition: prf.hpp:89
prf.tcc
libzeth::get_tag_nf
libsnark::pb_variable_array< FieldT > get_tag_nf(const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &a_sk)
libzeth::PRF_pk_gadget::PRF_pk_gadget
PRF_pk_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable< FieldT > &ZERO, const libsnark::pb_variable_array< FieldT > &a_sk, const libsnark::pb_variable_array< FieldT > &h_sig, size_t index, std::shared_ptr< libsnark::digest_variable< FieldT >> result, const std::string &annotation_prefix=" pk_PRF_gadget")
libzeth::PRF_gadget::generate_r1cs_witness
void generate_r1cs_witness()