Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
hash_io.tcc
Go to the documentation of this file.
1 /**
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  *****************************************************************************/
7 #ifndef HASH_IO_TCC_
8 #define HASH_IO_TCC_
9 
10 namespace libsnark
11 {
12 
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)
19 {
20  bits.allocate(pb, digest_size, FMT(this->annotation_prefix, " bits"));
21 }
22 
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)
31 {
32  assert(bits.size() <= digest_size);
33  bits = partial_bits;
34  while (bits.size() != digest_size) {
35  bits.emplace_back(padding);
36  }
37 }
38 
39 template<typename FieldT>
40 void digest_variable<FieldT>::generate_r1cs_constraints()
41 {
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));
45  }
46 }
47 
48 template<typename FieldT>
49 void digest_variable<FieldT>::generate_r1cs_witness(
50  const libff::bit_vector &contents)
51 {
52  bits.fill_with_bits(this->pb, contents);
53 }
54 
55 template<typename FieldT>
56 libff::bit_vector digest_variable<FieldT>::get_digest() const
57 {
58  return bits.get_bits(this->pb);
59 }
60 
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)
67 {
68  bits.allocate(pb, block_size, FMT(this->annotation_prefix, " bits"));
69 }
70 
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)
77 {
78  for (auto &part : parts) {
79  bits.insert(bits.end(), part.begin(), part.end());
80  }
81 }
82 
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)
90 {
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());
95 }
96 
97 template<typename FieldT>
98 void block_variable<FieldT>::generate_r1cs_witness(
99  const libff::bit_vector &contents)
100 {
101  bits.fill_with_bits(this->pb, contents);
102 }
103 
104 template<typename FieldT>
105 libff::bit_vector block_variable<FieldT>::get_block() const
106 {
107  return bits.get_bits(this->pb);
108 }
109 
110 } // namespace libsnark
111 #endif // HASH_IO_TCC_