5 #ifndef __ZETH_CIRCUITS_MIMC_ROUND_HPP__ 
    6 #define __ZETH_CIRCUITS_MIMC_ROUND_HPP__ 
   11 #include <libsnark/gadgetlib1/gadget.hpp> 
   16 template<
typename FieldT, 
size_t Exponent>
 
   20     static_assert((Exponent & 1) == 1, 
"MiMC Exponent must be odd");
 
   23     static constexpr 
size_t NUM_CONDITIONS =
 
   28     const libsnark::pb_linear_combination<FieldT> msg;
 
   31     const libsnark::pb_linear_combination<FieldT> key;
 
   34     const FieldT round_const;
 
   37     const libsnark::pb_variable<FieldT> result;
 
   40     const libsnark::pb_linear_combination<FieldT> add_to_result;
 
   43     const bool add_to_result_is_valid;
 
   46     std::vector<libsnark::pb_variable<FieldT>> exponents;
 
   53         libsnark::protoboard<FieldT> &pb,
 
   54         const libsnark::pb_linear_combination<FieldT> &msg,
 
   55         const libsnark::pb_linear_combination<FieldT> &key,
 
   56         const FieldT &round_const,
 
   57         libsnark::pb_variable<FieldT> &result,
 
   58         const std::string &annotation_prefix = 
"MiMC_round_gadget");
 
   63         libsnark::protoboard<FieldT> &pb,
 
   64         const libsnark::pb_linear_combination<FieldT> &msg,
 
   65         const libsnark::pb_linear_combination<FieldT> &key,
 
   66         const FieldT &round_const,
 
   67         libsnark::pb_variable<FieldT> &result,
 
   68         const libsnark::pb_linear_combination<FieldT> &add_to_result,
 
   69         const std::string &annotation_prefix = 
"MiMC_round_gadget");
 
   79 #endif // __ZETH_CIRCUITS_MIMC_ROUND_HPP__