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_