Foundations for encrypted sodoku solution
This commit is contained in:
parent
bd789afbaa
commit
ca3ec9f5d4
|
@ -3,10 +3,26 @@
|
||||||
|
|
||||||
using namespace libsnark;
|
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>
|
template<typename FieldT>
|
||||||
class sodoku_cell_gadget : public gadget<FieldT> {
|
class sodoku_cell_gadget : public gadget<FieldT> {
|
||||||
public:
|
public:
|
||||||
pb_linear_combination<FieldT> &number;
|
pb_linear_combination<FieldT> number;
|
||||||
unsigned int dimension;
|
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_cols;
|
||||||
std::vector<std::shared_ptr<sodoku_closure_gadget<FieldT>>> closure_groups;
|
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;
|
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>
|
template<typename FieldT>
|
||||||
sodoku_closure_gadget<FieldT>::sodoku_closure_gadget(protoboard<FieldT> &pb,
|
sodoku_closure_gadget<FieldT>::sodoku_closure_gadget(protoboard<FieldT> &pb,
|
||||||
unsigned int dimension,
|
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));
|
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);
|
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")));
|
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();
|
closure_groups[i]->generate_r1cs_constraints();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
seed_key->generate_r1cs_constraints();
|
||||||
|
key->generate_r1cs_constraints();
|
||||||
|
|
||||||
unpack_inputs->generate_r1cs_constraints(true);
|
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();
|
cells[i]->generate_r1cs_witness();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
key->generate_r1cs_witness();
|
||||||
|
|
||||||
unpack_inputs->generate_r1cs_witness_from_bits();
|
unpack_inputs->generate_r1cs_witness_from_bits();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,16 @@
|
||||||
|
|
||||||
using namespace libsnark;
|
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>
|
template<typename ppzksnark_ppT>
|
||||||
r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair();
|
r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair();
|
||||||
|
|
|
@ -2,17 +2,6 @@
|
||||||
|
|
||||||
using namespace std;
|
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<std::vector<bool>> convertPuzzleToBool(std::vector<uint8_t> puzzle) {
|
||||||
std::vector<vector<bool>> new_puzzle;
|
std::vector<vector<bool>> new_puzzle;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue