Foundations for encrypted sodoku solution

This commit is contained in:
Sean Bowe 2015-12-05 15:03:33 -07:00
parent bd789afbaa
commit ca3ec9f5d4
4 changed files with 66 additions and 13 deletions

View File

@ -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;

View File

@ -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();
}

View File

@ -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();

View File

@ -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;