Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
sha256_gadget.hpp
Go to the documentation of this file.
1 
12 #ifndef SHA256_GADGET_HPP_
13 #define SHA256_GADGET_HPP_
14 
19 
20 namespace libsnark
21 {
22 
26 template<typename FieldT>
28 {
29 public:
30  std::vector<pb_linear_combination_array<FieldT>> round_a;
31  std::vector<pb_linear_combination_array<FieldT>> round_b;
32  std::vector<pb_linear_combination_array<FieldT>> round_c;
33  std::vector<pb_linear_combination_array<FieldT>> round_d;
34  std::vector<pb_linear_combination_array<FieldT>> round_e;
35  std::vector<pb_linear_combination_array<FieldT>> round_f;
36  std::vector<pb_linear_combination_array<FieldT>> round_g;
37  std::vector<pb_linear_combination_array<FieldT>> round_h;
38 
40  std::shared_ptr<sha256_message_schedule_gadget<FieldT>> message_schedule;
41  std::vector<sha256_round_function_gadget<FieldT>> round_functions;
42 
45  std::vector<lastbits_gadget<FieldT>> reduce_output;
46 
47 public:
51 
57  const std::string &annotation_prefix);
59  void generate_r1cs_witness();
60 };
61 
69 template<typename FieldT>
70 class sha256_two_to_one_hash_gadget : public gadget<FieldT>
71 {
72 public:
73  typedef libff::bit_vector hash_value_type;
75 
76  std::shared_ptr<sha256_compression_function_gadget<FieldT>> f;
77 
80  const digest_variable<FieldT> &left,
81  const digest_variable<FieldT> &right,
82  const digest_variable<FieldT> &output,
83  const std::string &annotation_prefix);
86  const size_t block_length,
87  const block_variable<FieldT> &input_block,
88  const digest_variable<FieldT> &output,
89  const std::string &annotation_prefix);
90 
92  const bool ensure_output_bitness = true); // TODO: ignored for now
93  void generate_r1cs_witness();
94 
95  static size_t get_block_len();
96  static size_t get_digest_len();
97  static libff::bit_vector get_hash(const libff::bit_vector &input);
98 
99  static size_t expected_constraints(
100  const bool ensure_output_bitness = true); // TODO: ignored for now
101 };
102 
103 } // namespace libsnark
104 
106 
107 #endif // SHA256_GADGET_HPP_
libsnark::sha256_compression_function_gadget::packed_W
pb_variable_array< FieldT > packed_W
Definition: sha256_gadget.hpp:39
libsnark::sha256_two_to_one_hash_gadget::merkle_authentication_path_type
merkle_authentication_path merkle_authentication_path_type
Definition: sha256_gadget.hpp:74
libsnark::gadget::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark
Definition: accumulation_vector.hpp:18
libsnark::sha256_compression_function_gadget::reduce_output
std::vector< lastbits_gadget< FieldT > > reduce_output
Definition: sha256_gadget.hpp:45
libsnark::sha256_compression_function_gadget::message_schedule
std::shared_ptr< sha256_message_schedule_gadget< FieldT > > message_schedule
Definition: sha256_gadget.hpp:40
libsnark::sha256_two_to_one_hash_gadget::f
std::shared_ptr< sha256_compression_function_gadget< FieldT > > f
Definition: sha256_gadget.hpp:76
libsnark::sha256_compression_function_gadget::unreduced_output
pb_variable_array< FieldT > unreduced_output
Definition: sha256_gadget.hpp:43
libsnark::sha256_two_to_one_hash_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::gadget::pb
protoboard< FieldT > & pb
Definition: gadget.hpp:19
libsnark::sha256_compression_function_gadget::reduced_output
pb_variable_array< FieldT > reduced_output
Definition: sha256_gadget.hpp:44
libsnark::sha256_compression_function_gadget::round_c
std::vector< pb_linear_combination_array< FieldT > > round_c
Definition: sha256_gadget.hpp:32
sha256_components.hpp
libsnark::sha256_compression_function_gadget::sha256_compression_function_gadget
sha256_compression_function_gadget(protoboard< FieldT > &pb, const pb_linear_combination_array< FieldT > &prev_output, const pb_variable_array< FieldT > &new_block, const digest_variable< FieldT > &output, const std::string &annotation_prefix)
libsnark::sha256_compression_function_gadget::round_h
std::vector< pb_linear_combination_array< FieldT > > round_h
Definition: sha256_gadget.hpp:37
libsnark::sha256_compression_function_gadget::round_functions
std::vector< sha256_round_function_gadget< FieldT > > round_functions
Definition: sha256_gadget.hpp:41
libsnark::sha256_two_to_one_hash_gadget
Definition: sha256_gadget.hpp:70
libsnark::sha256_compression_function_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::sha256_compression_function_gadget::round_a
std::vector< pb_linear_combination_array< FieldT > > round_a
Definition: sha256_gadget.hpp:30
libsnark::gadget
Definition: gadget.hpp:16
hash_io.hpp
libsnark::sha256_compression_function_gadget::round_e
std::vector< pb_linear_combination_array< FieldT > > round_e
Definition: sha256_gadget.hpp:34
libsnark::sha256_two_to_one_hash_gadget::expected_constraints
static size_t expected_constraints(const bool ensure_output_bitness=true)
merkle_tree.hpp
libsnark::sha256_compression_function_gadget::output
digest_variable< FieldT > output
Definition: sha256_gadget.hpp:50
libsnark::sha256_compression_function_gadget::round_g
std::vector< pb_linear_combination_array< FieldT > > round_g
Definition: sha256_gadget.hpp:36
libsnark::sha256_compression_function_gadget::round_f
std::vector< pb_linear_combination_array< FieldT > > round_f
Definition: sha256_gadget.hpp:35
libsnark::sha256_two_to_one_hash_gadget::get_hash
static libff::bit_vector get_hash(const libff::bit_vector &input)
libsnark::sha256_compression_function_gadget::round_b
std::vector< pb_linear_combination_array< FieldT > > round_b
Definition: sha256_gadget.hpp:31
libsnark::pb_linear_combination_array
Definition: pb_variable.hpp:118
libsnark::sha256_two_to_one_hash_gadget::generate_r1cs_constraints
void generate_r1cs_constraints(const bool ensure_output_bitness=true)
libsnark::block_variable
Definition: hash_io.hpp:39
libsnark::digest_variable
Definition: hash_io.hpp:16
libsnark::sha256_two_to_one_hash_gadget::get_block_len
static size_t get_block_len()
libsnark::sha256_compression_function_gadget::prev_output
pb_linear_combination_array< FieldT > prev_output
Definition: sha256_gadget.hpp:48
basic_gadgets.hpp
libsnark::sha256_compression_function_gadget::round_d
std::vector< pb_linear_combination_array< FieldT > > round_d
Definition: sha256_gadget.hpp:33
libsnark::pb_variable_array
Definition: pb_variable.hpp:44
libsnark::sha256_compression_function_gadget::new_block
pb_variable_array< FieldT > new_block
Definition: sha256_gadget.hpp:49
sha256_gadget.tcc
libsnark::sha256_compression_function_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::sha256_two_to_one_hash_gadget::sha256_two_to_one_hash_gadget
sha256_two_to_one_hash_gadget(protoboard< FieldT > &pb, const digest_variable< FieldT > &left, const digest_variable< FieldT > &right, const digest_variable< FieldT > &output, const std::string &annotation_prefix)
libsnark::sha256_compression_function_gadget
Definition: sha256_gadget.hpp:27
libsnark::merkle_authentication_path
std::vector< merkle_authentication_node > merkle_authentication_path
Definition: merkle_tree.hpp:36
libsnark::sha256_two_to_one_hash_gadget::hash_value_type
libff::bit_vector hash_value_type
Definition: sha256_gadget.hpp:73
libsnark::sha256_two_to_one_hash_gadget::get_digest_len
static size_t get_digest_len()
libsnark::protoboard
Definition: pb_variable.hpp:22