From ca3ec9f5d4f1582fc18a3be7da973e63b60fde63 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Sat, 5 Dec 2015 15:03:33 -0700 Subject: [PATCH] Foundations for encrypted sodoku solution --- src/gadget.hpp | 21 ++++++++++++++++++++- src/gadget.tcc | 36 ++++++++++++++++++++++++++++++++++++ src/snark.hpp | 11 ++++++++++- src/snark.tcc | 11 ----------- 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/gadget.hpp b/src/gadget.hpp index be07323..e372de4 100644 --- a/src/gadget.hpp +++ b/src/gadget.hpp @@ -3,10 +3,26 @@ using namespace libsnark; +template +class sodoku_encryption_key : public gadget { +public: + pb_variable_array seed_key; // 256 bit key + unsigned int dimension; + + std::vector>> key; // dimension*dimension*8 bit key + + sodoku_encryption_key(protoboard &pb, + unsigned int dimension, + pb_variable_array &seed_key + ); + void generate_r1cs_constraints(); + void generate_r1cs_witness(); +}; + template class sodoku_cell_gadget : public gadget { public: - pb_linear_combination &number; + pb_linear_combination number; unsigned int dimension; /* @@ -67,6 +83,9 @@ public: std::vector>> closure_cols; std::vector>> closure_groups; + std::shared_ptr> seed_key; + std::shared_ptr> key; + pb_variable_array puzzle_enforce; diff --git a/src/gadget.tcc b/src/gadget.tcc index 35f034f..d1d09c9 100644 --- a/src/gadget.tcc +++ b/src/gadget.tcc @@ -1,3 +1,31 @@ +template +sodoku_encryption_key::sodoku_encryption_key(protoboard &pb, + unsigned int dimension, + pb_variable_array &seed_key + ) : gadget(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(pb, 256, "key[i]")); + } +} + +template +void sodoku_encryption_key::generate_r1cs_constraints() +{ + +} + +template +void sodoku_encryption_key::generate_r1cs_witness() +{ + +} + template sodoku_closure_gadget::sodoku_closure_gadget(protoboard &pb, unsigned int dimension, @@ -127,6 +155,9 @@ sodoku_gadget::sodoku_gadget(protoboard &pb, unsigned int n) : closure_groups[gi].reset(new sodoku_closure_gadget(this->pb, dimension, group_flags)); } + seed_key.reset(new digest_variable(pb, 256, "seed_key")); + key.reset(new sodoku_encryption_key(pb, dimension, seed_key->bits)); + assert(input_as_bits.size() == input_size_in_bits); unpack_inputs.reset(new multipacking_gadget(this->pb, input_as_bits, input_as_field_elements, FieldT::capacity(), FMT(this->annotation_prefix, " unpack_inputs"))); } @@ -161,6 +192,9 @@ void sodoku_gadget::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::generate_r1cs_witness(std::vector &input cells[i]->generate_r1cs_witness(); } + key->generate_r1cs_witness(); + unpack_inputs->generate_r1cs_witness_from_bits(); } diff --git a/src/snark.hpp b/src/snark.hpp index 4e480e0..569c6ab 100644 --- a/src/snark.hpp +++ b/src/snark.hpp @@ -6,7 +6,16 @@ using namespace libsnark; -std::vector> convertPuzzleToBool(std::vector); +std::vector convertIntToVector(uint8_t val) { + std::vector 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 r1cs_ppzksnark_keypair generate_keypair(); diff --git a/src/snark.tcc b/src/snark.tcc index bfbdded..a9b17f9 100644 --- a/src/snark.tcc +++ b/src/snark.tcc @@ -2,17 +2,6 @@ using namespace std; -std::vector convertIntToVector(uint8_t val) { - std::vector 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> convertPuzzleToBool(std::vector puzzle) { std::vector> new_puzzle;