Foundations for encrypted sodoku solution
This commit is contained in:
parent
bd789afbaa
commit
ca3ec9f5d4
|
@ -3,10 +3,26 @@
|
|||
|
||||
using namespace libsnark;
|
||||
|
||||
template<typename FieldT>
|
||||
class sodoku_encryption_key : public gadget<FieldT> {
|
||||
public:
|
||||
pb_variable_array<FieldT> seed_key; // 256 bit key
|
||||
unsigned int dimension;
|
||||
|
||||
std::vector<std::shared_ptr<digest_variable<FieldT>>> key; // dimension*dimension*8 bit key
|
||||
|
||||
sodoku_encryption_key(protoboard<FieldT> &pb,
|
||||
unsigned int dimension,
|
||||
pb_variable_array<FieldT> &seed_key
|
||||
);
|
||||
void generate_r1cs_constraints();
|
||||
void generate_r1cs_witness();
|
||||
};
|
||||
|
||||
template<typename FieldT>
|
||||
class sodoku_cell_gadget : public gadget<FieldT> {
|
||||
public:
|
||||
pb_linear_combination<FieldT> &number;
|
||||
pb_linear_combination<FieldT> number;
|
||||
unsigned int dimension;
|
||||
|
||||
/*
|
||||
|
@ -67,6 +83,9 @@ public:
|
|||
std::vector<std::shared_ptr<sodoku_closure_gadget<FieldT>>> closure_cols;
|
||||
std::vector<std::shared_ptr<sodoku_closure_gadget<FieldT>>> closure_groups;
|
||||
|
||||
std::shared_ptr<digest_variable<FieldT>> seed_key;
|
||||
std::shared_ptr<sodoku_encryption_key<FieldT>> key;
|
||||
|
||||
pb_variable_array<FieldT> puzzle_enforce;
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,31 @@
|
|||
template<typename FieldT>
|
||||
sodoku_encryption_key<FieldT>::sodoku_encryption_key(protoboard<FieldT> &pb,
|
||||
unsigned int dimension,
|
||||
pb_variable_array<FieldT> &seed_key
|
||||
) : gadget<FieldT>(pb, FMT(annotation_prefix, " sodoku_closure_gadget")),
|
||||
seed_key(seed_key), dimension(dimension)
|
||||
{
|
||||
unsigned int num_key_digests = div_ceil(dimension * dimension * 8, 256);
|
||||
|
||||
key.resize(num_key_digests);
|
||||
|
||||
for (unsigned int i = 0; i < num_key_digests; i++) {
|
||||
key[i].reset(new digest_variable<FieldT>(pb, 256, "key[i]"));
|
||||
}
|
||||
}
|
||||
|
||||
template<typename FieldT>
|
||||
void sodoku_encryption_key<FieldT>::generate_r1cs_constraints()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
template<typename FieldT>
|
||||
void sodoku_encryption_key<FieldT>::generate_r1cs_witness()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
template<typename FieldT>
|
||||
sodoku_closure_gadget<FieldT>::sodoku_closure_gadget(protoboard<FieldT> &pb,
|
||||
unsigned int dimension,
|
||||
|
@ -127,6 +155,9 @@ sodoku_gadget<FieldT>::sodoku_gadget(protoboard<FieldT> &pb, unsigned int n) :
|
|||
closure_groups[gi].reset(new sodoku_closure_gadget<FieldT>(this->pb, dimension, group_flags));
|
||||
}
|
||||
|
||||
seed_key.reset(new digest_variable<FieldT>(pb, 256, "seed_key"));
|
||||
key.reset(new sodoku_encryption_key<FieldT>(pb, dimension, seed_key->bits));
|
||||
|
||||
assert(input_as_bits.size() == input_size_in_bits);
|
||||
unpack_inputs.reset(new multipacking_gadget<FieldT>(this->pb, input_as_bits, input_as_field_elements, FieldT::capacity(), FMT(this->annotation_prefix, " unpack_inputs")));
|
||||
}
|
||||
|
@ -161,6 +192,9 @@ void sodoku_gadget<FieldT>::generate_r1cs_constraints()
|
|||
closure_groups[i]->generate_r1cs_constraints();
|
||||
}
|
||||
|
||||
seed_key->generate_r1cs_constraints();
|
||||
key->generate_r1cs_constraints();
|
||||
|
||||
unpack_inputs->generate_r1cs_constraints(true);
|
||||
}
|
||||
|
||||
|
@ -195,6 +229,8 @@ void sodoku_gadget<FieldT>::generate_r1cs_witness(std::vector<bit_vector> &input
|
|||
cells[i]->generate_r1cs_witness();
|
||||
}
|
||||
|
||||
key->generate_r1cs_witness();
|
||||
|
||||
unpack_inputs->generate_r1cs_witness_from_bits();
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,16 @@
|
|||
|
||||
using namespace libsnark;
|
||||
|
||||
std::vector<std::vector<bool>> convertPuzzleToBool(std::vector<uint8_t>);
|
||||
std::vector<bool> convertIntToVector(uint8_t val) {
|
||||
std::vector<bool> ret;
|
||||
|
||||
for(unsigned int i = 0; i < sizeof(val) * 8; ++i, val >>= 1) {
|
||||
ret.push_back(val & 0x01);
|
||||
}
|
||||
|
||||
reverse(ret.begin(), ret.end());
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<typename ppzksnark_ppT>
|
||||
r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair();
|
||||
|
|
|
@ -2,17 +2,6 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
std::vector<bool> convertIntToVector(uint8_t val) {
|
||||
std::vector<bool> ret;
|
||||
|
||||
for(unsigned int i = 0; i < sizeof(val) * 8; ++i, val >>= 1) {
|
||||
ret.push_back(val & 0x01);
|
||||
}
|
||||
|
||||
reverse(ret.begin(), ret.end());
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::vector<std::vector<bool>> convertPuzzleToBool(std::vector<uint8_t> puzzle) {
|
||||
std::vector<vector<bool>> new_puzzle;
|
||||
|
||||
|
|
Loading…
Reference in New Issue