Make the key an auxillary input to the proof.
This commit is contained in:
parent
d3ac3f897d
commit
bbc60f62dc
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue