2 *****************************************************************************
3 * @author This file is part of libsnark, developed by SCIPR Lab
4 * and contributors (see AUTHORS).
5 * @copyright MIT license (see LICENSE file)
6 *****************************************************************************/
13 template<typename FieldT>
14 digest_variable<FieldT>::digest_variable(
15 protoboard<FieldT> &pb,
16 const size_t digest_size,
17 const std::string &annotation_prefix)
18 : gadget<FieldT>(pb, annotation_prefix), digest_size(digest_size)
20 bits.allocate(pb, digest_size, FMT(this->annotation_prefix, " bits"));
23 template<typename FieldT>
24 digest_variable<FieldT>::digest_variable(
25 protoboard<FieldT> &pb,
26 const size_t digest_size,
27 const pb_variable_array<FieldT> &partial_bits,
28 const pb_variable<FieldT> &padding,
29 const std::string &annotation_prefix)
30 : gadget<FieldT>(pb, annotation_prefix), digest_size(digest_size)
32 assert(bits.size() <= digest_size);
34 while (bits.size() != digest_size) {
35 bits.emplace_back(padding);
39 template<typename FieldT>
40 void digest_variable<FieldT>::generate_r1cs_constraints()
42 for (size_t i = 0; i < digest_size; ++i) {
43 generate_boolean_r1cs_constraint<FieldT>(
44 this->pb, bits[i], FMT(this->annotation_prefix, " bits_%zu", i));
48 template<typename FieldT>
49 void digest_variable<FieldT>::generate_r1cs_witness(
50 const libff::bit_vector &contents)
52 bits.fill_with_bits(this->pb, contents);
55 template<typename FieldT>
56 libff::bit_vector digest_variable<FieldT>::get_digest() const
58 return bits.get_bits(this->pb);
61 template<typename FieldT>
62 block_variable<FieldT>::block_variable(
63 protoboard<FieldT> &pb,
64 const size_t block_size,
65 const std::string &annotation_prefix)
66 : gadget<FieldT>(pb, annotation_prefix), block_size(block_size)
68 bits.allocate(pb, block_size, FMT(this->annotation_prefix, " bits"));
71 template<typename FieldT>
72 block_variable<FieldT>::block_variable(
73 protoboard<FieldT> &pb,
74 const std::vector<pb_variable_array<FieldT>> &parts,
75 const std::string &annotation_prefix)
76 : gadget<FieldT>(pb, annotation_prefix)
78 for (auto &part : parts) {
79 bits.insert(bits.end(), part.begin(), part.end());
83 template<typename FieldT>
84 block_variable<FieldT>::block_variable(
85 protoboard<FieldT> &pb,
86 const digest_variable<FieldT> &left,
87 const digest_variable<FieldT> &right,
88 const std::string &annotation_prefix)
89 : gadget<FieldT>(pb, annotation_prefix)
91 assert(left.bits.size() == right.bits.size());
92 block_size = 2 * left.bits.size();
93 bits.insert(bits.end(), left.bits.begin(), left.bits.end());
94 bits.insert(bits.end(), right.bits.begin(), right.bits.end());
97 template<typename FieldT>
98 void block_variable<FieldT>::generate_r1cs_witness(
99 const libff::bit_vector &contents)
101 bits.fill_with_bits(this->pb, contents);
104 template<typename FieldT>
105 libff::bit_vector block_variable<FieldT>::get_block() const
107 return bits.get_bits(this->pb);
110 } // namespace libsnark
111 #endif // HASH_IO_TCC_