/** ***************************************************************************** * @author This file is part of libsnark, developed by SCIPR Lab * and contributors (see AUTHORS). * @copyright MIT license (see LICENSE file) *****************************************************************************/ #ifndef HASH_IO_TCC_ #define HASH_IO_TCC_ namespace libsnark { template digest_variable::digest_variable(protoboard &pb, const size_t digest_size, const std::string &annotation_prefix) : gadget(pb, annotation_prefix), digest_size(digest_size) { bits.allocate(pb, digest_size, FMT(this->annotation_prefix, " bits")); } template digest_variable::digest_variable(protoboard &pb, const size_t digest_size, const pb_variable_array &partial_bits, const pb_variable &padding, const std::string &annotation_prefix) : gadget(pb, annotation_prefix), digest_size(digest_size) { assert(bits.size() <= digest_size); bits = partial_bits; while (bits.size() != digest_size) { bits.emplace_back(padding); } } template void digest_variable::generate_r1cs_constraints() { for (size_t i = 0; i < digest_size; ++i) { generate_boolean_r1cs_constraint(this->pb, bits[i], FMT(this->annotation_prefix, " bits_%zu", i)); } } template void digest_variable::generate_r1cs_witness(const bit_vector& contents) { bits.fill_with_bits(this->pb, contents); } template bit_vector digest_variable::get_digest() const { return bits.get_bits(this->pb); } template block_variable::block_variable(protoboard &pb, const size_t block_size, const std::string &annotation_prefix) : gadget(pb, annotation_prefix), block_size(block_size) { bits.allocate(pb, block_size, FMT(this->annotation_prefix, " bits")); } template block_variable::block_variable(protoboard &pb, const std::vector > &parts, const std::string &annotation_prefix) : gadget(pb, annotation_prefix) { for (auto &part : parts) { bits.insert(bits.end(), part.begin(), part.end()); } } template block_variable::block_variable(protoboard &pb, const digest_variable &left, const digest_variable &right, const std::string &annotation_prefix) : gadget(pb, annotation_prefix) { assert(left.bits.size() == right.bits.size()); block_size = 2 * left.bits.size(); bits.insert(bits.end(), left.bits.begin(), left.bits.end()); bits.insert(bits.end(), right.bits.begin(), right.bits.end()); } template void block_variable::generate_r1cs_witness(const bit_vector& contents) { bits.fill_with_bits(this->pb, contents); } template bit_vector block_variable::get_block() const { return bits.get_bits(this->pb); } } // libsnark #endif // HASH_IO_TCC_