Original HUSH source code based on ZEC 1.0.8 . For historical purposes only! https://hush.is
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
4.5 KiB

/** @file
*****************************************************************************
Declaration of interfaces for gadgets for the SHA256 message schedule and round function.
*****************************************************************************
* @author This file is part of libsnark, developed by SCIPR Lab
* and contributors (see AUTHORS).
* @copyright MIT license (see LICENSE file)
*****************************************************************************/
#ifndef SHA256_COMPONENTS_HPP_
#define SHA256_COMPONENTS_HPP_
#include "gadgetlib1/gadgets/basic_gadgets.hpp"
#include "gadgetlib1/gadgets/hashes/hash_io.hpp"
#include "gadgetlib1/gadgets/hashes/sha256/sha256_aux.hpp"
namespace libsnark {
const size_t SHA256_digest_size = 256;
const size_t SHA256_block_size = 512;
template<typename FieldT>
pb_linear_combination_array<FieldT> SHA256_default_IV(protoboard<FieldT> &pb);
template<typename FieldT>
class sha256_message_schedule_gadget : public gadget<FieldT> {
public:
std::vector<pb_variable_array<FieldT> > W_bits;
std::vector<std::shared_ptr<packing_gadget<FieldT> > > pack_W;
std::vector<pb_variable<FieldT> > sigma0;
std::vector<pb_variable<FieldT> > sigma1;
std::vector<std::shared_ptr<small_sigma_gadget<FieldT> > > compute_sigma0;
std::vector<std::shared_ptr<small_sigma_gadget<FieldT> > > compute_sigma1;
std::vector<pb_variable<FieldT> > unreduced_W;
std::vector<std::shared_ptr<lastbits_gadget<FieldT> > > mod_reduce_W;
public:
pb_variable_array<FieldT> M;
pb_variable_array<FieldT> packed_W;
sha256_message_schedule_gadget(protoboard<FieldT> &pb,
const pb_variable_array<FieldT> &M,
const pb_variable_array<FieldT> &packed_W,
const std::string &annotation_prefix);
void generate_r1cs_constraints();
void generate_r1cs_witness();
};
template<typename FieldT>
class sha256_round_function_gadget : public gadget<FieldT> {
public:
pb_variable<FieldT> sigma0;
pb_variable<FieldT> sigma1;
std::shared_ptr<big_sigma_gadget<FieldT> > compute_sigma0;
std::shared_ptr<big_sigma_gadget<FieldT> > compute_sigma1;
pb_variable<FieldT> choice;
pb_variable<FieldT> majority;
std::shared_ptr<choice_gadget<FieldT> > compute_choice;
std::shared_ptr<majority_gadget<FieldT> > compute_majority;
pb_variable<FieldT> packed_d;
std::shared_ptr<packing_gadget<FieldT> > pack_d;
pb_variable<FieldT> packed_h;
std::shared_ptr<packing_gadget<FieldT> > pack_h;
pb_variable<FieldT> unreduced_new_a;
pb_variable<FieldT> unreduced_new_e;
std::shared_ptr<lastbits_gadget<FieldT> > mod_reduce_new_a;
std::shared_ptr<lastbits_gadget<FieldT> > mod_reduce_new_e;
pb_variable<FieldT> packed_new_a;
pb_variable<FieldT> packed_new_e;
public:
pb_linear_combination_array<FieldT> a;
pb_linear_combination_array<FieldT> b;
pb_linear_combination_array<FieldT> c;
pb_linear_combination_array<FieldT> d;
pb_linear_combination_array<FieldT> e;
pb_linear_combination_array<FieldT> f;
pb_linear_combination_array<FieldT> g;
pb_linear_combination_array<FieldT> h;
pb_variable<FieldT> W;
long K;
pb_linear_combination_array<FieldT> new_a;
pb_linear_combination_array<FieldT> new_e;
sha256_round_function_gadget(protoboard<FieldT> &pb,
const pb_linear_combination_array<FieldT> &a,
const pb_linear_combination_array<FieldT> &b,
const pb_linear_combination_array<FieldT> &c,
const pb_linear_combination_array<FieldT> &d,
const pb_linear_combination_array<FieldT> &e,
const pb_linear_combination_array<FieldT> &f,
const pb_linear_combination_array<FieldT> &g,
const pb_linear_combination_array<FieldT> &h,
const pb_variable<FieldT> &W,
const long &K,
const pb_linear_combination_array<FieldT> &new_a,
const pb_linear_combination_array<FieldT> &new_e,
const std::string &annotation_prefix);
void generate_r1cs_constraints();
void generate_r1cs_witness();
};
} // libsnark
#include "gadgetlib1/gadgets/hashes/sha256/sha256_components.tcc"
#endif // SHA256_COMPONENTS_HPP_