5 #ifndef __ZETH_CIRCUITS_BLAKE2S_HPP__
6 #define __ZETH_CIRCUITS_BLAKE2S_HPP__
14 #include <libsnark/gadgetlib1/gadget.hpp>
15 #include <libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
16 #include <libsnark/gadgetlib1/gadgets/hashes/hash_io.hpp>
24 template<
typename FieldT>
class BLAKE2s_256 :
public libsnark::gadget<FieldT>
30 const std::array<const bits<BLAKE2s_word_size>, 8> parameter_block = {
33 0, 0, 0, 0, 0, 0, 0, 1,
34 0, 0, 0, 0, 0, 0, 0, 1,
35 0, 0, 0, 0, 0, 0, 0, 0,
36 0, 0, 1, 0, 0, 0, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 0, 0, 0,
47 0, 0, 0, 0, 0, 0, 0, 0,
48 0, 0, 0, 0, 0, 0, 0, 0,
49 0, 0, 0, 0, 0, 0, 0, 0,
50 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0,
57 0, 0, 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0, 0, 0, 0,
74 0, 0, 0, 0, 0, 0, 0, 0,
75 0, 0, 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0, 0, 0,
81 0, 0, 0, 0, 0, 0, 0, 0,
82 0, 0, 0, 0, 0, 0, 0, 0,
83 0, 0, 0, 0, 0, 0, 0, 0,
88 std::array<bits<BLAKE2s_word_size>, 8> BLAKE2s_IV = {
90 0, 1, 1, 0, 1, 0, 1, 0,
91 0, 0, 0, 0, 1, 0, 0, 1,
92 1, 1, 1, 0, 0, 1, 1, 0,
93 0, 1, 1, 0, 0, 1, 1, 1
96 1, 0, 1, 1, 1, 0, 1, 1,
97 0, 1, 1, 0, 0, 1, 1, 1,
98 1, 0, 1, 0, 1, 1, 1, 0,
99 1, 0, 0, 0, 0, 1, 0, 1
102 0, 0, 1, 1, 1, 1, 0, 0,
103 0, 1, 1, 0, 1, 1, 1, 0,
104 1, 1, 1, 1, 0, 0, 1, 1,
105 0, 1, 1, 1, 0, 0, 1, 0
108 1, 0, 1, 0, 0, 1, 0, 1,
109 0, 1, 0, 0, 1, 1, 1, 1,
110 1, 1, 1, 1, 0, 1, 0, 1,
111 0, 0, 1, 1, 1, 0, 1, 0
114 0, 1, 0, 1, 0, 0, 0, 1,
115 0, 0, 0, 0, 1, 1, 1, 0,
116 0, 1, 0, 1, 0, 0, 1, 0,
117 0, 1, 1, 1, 1, 1, 1, 1
120 1, 0, 0, 1, 1, 0, 1, 1,
121 0, 0, 0, 0, 0, 1, 0, 1,
122 0, 1, 1, 0, 1, 0, 0, 0,
123 1, 0, 0, 0, 1, 1, 0, 0
126 0, 0, 0, 1, 1, 1, 1, 1,
127 1, 0, 0, 0, 0, 0, 1, 1,
128 1, 1, 0, 1, 1, 0, 0, 1,
129 1, 0, 1, 0, 1, 0, 1, 1
132 0, 1, 0, 1, 1, 0, 1, 1,
133 1, 1, 1, 0, 0, 0, 0, 0,
134 1, 1, 0, 0, 1, 1, 0, 1,
135 0, 0, 0, 1, 1, 0, 0, 1
138 std::vector<libsnark::block_variable<FieldT>> block;
140 std::vector<libsnark::digest_variable<FieldT>> h;
142 libsnark::block_variable<FieldT> input;
143 libsnark::digest_variable<FieldT> output;
146 std::vector<BLAKE2s_256_comp<FieldT>> BLAKE2sC_vector;
150 libsnark::protoboard<FieldT> &pb,
151 const libsnark::block_variable<FieldT> &input,
152 const libsnark::digest_variable<FieldT> &output,
153 const std::string &annotation_prefix =
"blake2s_gadget");
163 static libff::bit_vector
get_hash(
const libff::bit_vector &input);
172 #endif // __ZETH_CIRCUITS_BLAKE2S_HPP__