Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
blake2s_comp.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_BLAKE2S_COMP_HPP__
6 #define __ZETH_CIRCUITS_BLAKE2S_COMP_HPP__
7 
11 #include "libzeth/core/bits.hpp"
12 #include "libzeth/core/utils.hpp"
13 
14 #include <libsnark/gadgetlib1/gadget.hpp>
15 #include <libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
16 #include <libsnark/gadgetlib1/gadgets/hashes/hash_io.hpp>
17 #include <math.h>
18 
19 namespace libzeth
20 {
21 
22 const size_t BLAKE2s_digest_size = 256;
23 const size_t BLAKE2s_block_size = 512;
24 
26 const size_t BLAKE2s_word_number = 16;
28 const size_t BLAKE2s_word_size = 32;
29 
32 template<typename FieldT>
33 class BLAKE2s_256_comp : public libsnark::gadget<FieldT>
34 {
35 private:
36  // See: Appendix A.2 of https://blake2.net/blake2.pdf for the specification
37  // of the IV used in BLAKE2s
38  static const std::array<bits<BLAKE2s_word_size>, 8> BLAKE2s_IV;
39 
40  // Section 2.1 of https://blake2.net/blake2.pdf specifies that BLAKE2s has
41  // 10 rounds
42  static const int rounds = 10;
43 
44  // Low and High words of the offset
45  std::array<bits<BLAKE2s_word_size>, 2> t;
46 
47  // Chaining values
48  libsnark::digest_variable<FieldT> h;
49  std::array<libsnark::pb_variable_array<FieldT>, 8> h_array;
50  std::array<
51  std::array<libsnark::pb_variable_array<FieldT>, BLAKE2s_word_number>,
52  rounds + 1>
53  v;
54  std::array<
55  std::array<libsnark::pb_variable_array<FieldT>, BLAKE2s_word_number>,
56  rounds>
57  v_temp;
58 
59  libsnark::block_variable<FieldT> input_block;
60  std::array<libsnark::pb_variable_array<FieldT>, BLAKE2s_word_number> block;
61 
62  std::array<libsnark::pb_variable_array<FieldT>, 8> output_bytes;
63  std::array<libsnark::pb_variable_array<FieldT>, 8> out_temp;
64 
65  // Array of mixing functions G used in each rounds in the compression
66  // function
67  std::array<std::vector<g_primitive<FieldT>>, rounds> g_arrays;
68  std::vector<xor_gadget<FieldT>> xor_vector;
69 
70 public:
71  libsnark::digest_variable<FieldT> output;
72 
74  libsnark::protoboard<FieldT> &pb,
75  const libsnark::digest_variable<FieldT> &h,
76  const libsnark::block_variable<FieldT> &input_block,
77  const libsnark::digest_variable<FieldT> &output,
78  const std::string &annotation_prefix = "BLAKE2sCompression_gadget");
79 
80  // //!\\ Beware we do not check the booleaness of the input block
81  // Unused ensure_output_bitness
82  // This gadget ensures automatically the booleaness of the digest output
83  void generate_r1cs_constraints(const bool ensure_output_bitness = true);
84 
85  // We set the flags' and counters' default value for one compression
86  // function with full block length input
88  size_t len_byte_total = 32, bool is_last_block = true);
89 
90  static size_t get_block_len();
91  static size_t get_digest_len();
92  static libff::bit_vector get_hash(const libff::bit_vector &input);
93 
94  static size_t expected_constraints(const bool ensure_output_bitness);
95 
96  // Helper functions to initialize the compression function parameters
97  void setup_h();
98  void setup_counter(size_t len_byte_total);
99  void setup_v(bool is_last_block);
100  void setup_mixing_gadgets();
101 };
102 
103 } // namespace libzeth
104 
107 
108 #endif // __ZETH_CIRCUITS_BLAKE2S_COMP_HPP__
libzeth::BLAKE2s_256_comp::setup_counter
void setup_counter(size_t len_byte_total)
libzeth::BLAKE2s_256_comp::expected_constraints
static size_t expected_constraints(const bool ensure_output_bitness)
blake2s_comp_setup.tcc
utils.hpp
libzeth::BLAKE2s_word_size
const size_t BLAKE2s_word_size
Bit-length of the words composing the state of BLAKE2s.
Definition: blake2s_comp.hpp:28
binary_operation.hpp
libzeth::BLAKE2s_256_comp::output
libsnark::digest_variable< FieldT > output
Definition: blake2s_comp.hpp:71
libzeth
Definition: binary_operation.hpp:15
libzeth::BLAKE2s_256_comp::setup_h
void setup_h()
circuit_utils.hpp
libzeth::BLAKE2s_digest_size
const size_t BLAKE2s_digest_size
Definition: blake2s_comp.hpp:22
libzeth::BLAKE2s_256_comp::get_block_len
static size_t get_block_len()
libzeth::BLAKE2s_256_comp::setup_v
void setup_v(bool is_last_block)
libzeth::BLAKE2s_word_number
const size_t BLAKE2s_word_number
Number of words composing the state of BLAKE2s.
Definition: blake2s_comp.hpp:26
libzeth::BLAKE2s_256_comp::setup_mixing_gadgets
void setup_mixing_gadgets()
blake2s_comp.tcc
libzeth::BLAKE2s_256_comp
Definition: blake2s_comp.hpp:33
g_primitive.hpp
libzeth::BLAKE2s_256_comp::get_hash
static libff::bit_vector get_hash(const libff::bit_vector &input)
libzeth::BLAKE2s_block_size
const size_t BLAKE2s_block_size
Definition: blake2s_comp.hpp:23
bits.hpp
libzeth::BLAKE2s_256_comp::get_digest_len
static size_t get_digest_len()
libzeth::BLAKE2s_256_comp::BLAKE2s_256_comp
BLAKE2s_256_comp(libsnark::protoboard< FieldT > &pb, const libsnark::digest_variable< FieldT > &h, const libsnark::block_variable< FieldT > &input_block, const libsnark::digest_variable< FieldT > &output, const std::string &annotation_prefix="BLAKE2sCompression_gadget")
libzeth::BLAKE2s_256_comp::generate_r1cs_witness
void generate_r1cs_witness(size_t len_byte_total=32, bool is_last_block=true)
libzeth::BLAKE2s_256_comp::generate_r1cs_constraints
void generate_r1cs_constraints(const bool ensure_output_bitness=true)