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
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_
|
|
|