Make the key an auxillary input to the proof.

This commit is contained in:
Sean Bowe 2015-12-05 16:19:25 -07:00
parent d3ac3f897d
commit bbc60f62dc
5 changed files with 46 additions and 6 deletions

View File

@ -99,7 +99,8 @@ public:
sodoku_gadget(protoboard<FieldT> &pb, unsigned int n);
void generate_r1cs_constraints();
void generate_r1cs_witness(std::vector<bit_vector> &puzzle_values,
std::vector<bit_vector> &input_solution_values);
std::vector<bit_vector> &input_solution_values,
bit_vector &input_seed_key);
};
template<typename FieldT>

View File

@ -267,11 +267,16 @@ void sodoku_gadget<FieldT>::generate_r1cs_constraints()
template<typename FieldT>
void sodoku_gadget<FieldT>::generate_r1cs_witness(std::vector<bit_vector> &input_puzzle_values,
std::vector<bit_vector> &input_solution_values
std::vector<bit_vector> &input_solution_values,
bit_vector &input_seed_key
)
{
assert(input_puzzle_values.size() == dimension*dimension);
assert(input_solution_values.size() == dimension*dimension);
assert(input_seed_key.size() == 256);
seed_key->bits.fill_with_bits(this->pb, input_seed_key);
for (unsigned int i = 0; i < dimension*dimension; i++) {
assert(input_puzzle_values[i].size() == 8);
assert(input_solution_values[i].size() == 8);

View File

@ -17,13 +17,39 @@ std::vector<bool> convertIntToVector(uint8_t val) {
return ret;
}
void convertBytesVectorToBytes(const std::vector<unsigned char>& v, unsigned char* bytes) {
for(size_t i = 0; i < v.size(); i++) {
bytes[i] = v.at(i);
}
}
void convertBytesToVector(const unsigned char* bytes, std::vector<bool>& v) {
int numBytes = v.size() / 8;
unsigned char c;
for(int i = 0; i < numBytes; i++) {
c = bytes[i];
for(int j = 0; j < 8; j++) {
v.at((i*8)+j) = ((c >> (7-j)) & 1);
}
}
}
void convertBytesVectorToVector(const std::vector<unsigned char>& bytes, std::vector<bool>& v) {
v.resize(bytes.size() * 8);
unsigned char bytesArr[bytes.size()];
convertBytesVectorToBytes(bytes, bytesArr);
convertBytesToVector(bytesArr, v);
}
template<typename ppzksnark_ppT>
r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair();
template<typename ppzksnark_ppT>
boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksnark_proving_key<ppzksnark_ppT> proving_key,
std::vector<uint8_t> &puzzle,
std::vector<uint8_t> &solution
std::vector<uint8_t> &solution,
std::vector<unsigned char> &key
);
template<typename ppzksnark_ppT>

View File

@ -30,7 +30,8 @@ r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair()
template<typename ppzksnark_ppT>
boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksnark_proving_key<ppzksnark_ppT> proving_key,
vector<uint8_t> &puzzle,
vector<uint8_t> &solution
vector<uint8_t> &solution,
vector<unsigned char> &key
)
{
typedef Fr<ppzksnark_ppT> FieldT;
@ -42,7 +43,11 @@ boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksna
auto new_puzzle = convertPuzzleToBool(puzzle);
auto new_solution = convertPuzzleToBool(solution);
g.generate_r1cs_witness(new_puzzle, new_solution);
vector<bool> new_key(256);
convertBytesVectorToVector(key, new_key);
g.generate_r1cs_witness(new_puzzle, new_solution, new_key);
if (!pb.is_satisfied()) {
return boost::none;

View File

@ -157,7 +157,10 @@ bool run_test(r1cs_ppzksnark_keypair<default_r1cs_ppzksnark_pp>& keypair,
std::vector<uint8_t> puzzle,
std::vector<uint8_t> solution
) {
auto proof = generate_proof<default_r1cs_ppzksnark_pp>(keypair.pk, puzzle, solution);
std::vector<unsigned char> key(32, 0);
auto proof = generate_proof<default_r1cs_ppzksnark_pp>(keypair.pk, puzzle, solution, key);
if (!proof) {
return false;