From aa59b289e03608f211b2c6911cc33def44ec5123 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 24 May 2023 16:51:32 +0000 Subject: [PATCH 1/3] add initial KeccakVar code --- .../dsl/acir_format/acir_format.cpp | 15 +++++++++ .../dsl/acir_format/acir_format.hpp | 3 ++ .../dsl/acir_format/keccak_constraint.cpp | 33 +++++++++++++++++++ .../dsl/acir_format/keccak_constraint.hpp | 24 ++++++++++++++ 4 files changed, 75 insertions(+) diff --git a/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp b/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp index 8f2c4d17f5..933af69306 100644 --- a/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp +++ b/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp @@ -73,6 +73,9 @@ void create_circuit(Composer& composer, const acir_format& constraint_system) for (const auto& constraint : constraint_system.keccak_constraints) { create_keccak_constraints(composer, constraint); } + for (const auto& constraint : constraint_system.keccak_var_constraints) { + create_keccak_var_constraints(composer, constraint); + } // Add pedersen constraints for (const auto& constraint : constraint_system.pedersen_constraints) { @@ -161,6 +164,9 @@ Composer create_circuit(const acir_format& constraint_system, for (const auto& constraint : constraint_system.keccak_constraints) { create_keccak_constraints(composer, constraint); } + for (const auto& constraint : constraint_system.keccak_var_constraints) { + create_keccak_var_constraints(composer, constraint); + } // Add pedersen constraints for (const auto& constraint : constraint_system.pedersen_constraints) { @@ -255,6 +261,9 @@ Composer create_circuit_with_witness(const acir_format& constraint_system, for (const auto& constraint : constraint_system.keccak_constraints) { create_keccak_constraints(composer, constraint); } + for (const auto& constraint : constraint_system.keccak_var_constraints) { + create_keccak_var_constraints(composer, constraint); + } // Add pedersen constraints for (const auto& constraint : constraint_system.pedersen_constraints) { @@ -346,6 +355,9 @@ Composer create_circuit_with_witness(const acir_format& constraint_system, std:: for (const auto& constraint : constraint_system.keccak_constraints) { create_keccak_constraints(composer, constraint); } + for (const auto& constraint : constraint_system.keccak_var_constraints) { + create_keccak_var_constraints(composer, constraint); + } // Add pedersen constraints for (const auto& constraint : constraint_system.pedersen_constraints) { @@ -435,6 +447,9 @@ void create_circuit_with_witness(Composer& composer, const acir_format& constrai for (const auto& constraint : constraint_system.keccak_constraints) { create_keccak_constraints(composer, constraint); } + for (const auto& constraint : constraint_system.keccak_var_constraints) { + create_keccak_var_constraints(composer, constraint); + } // Add pedersen constraints for (const auto& constraint : constraint_system.pedersen_constraints) { diff --git a/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp b/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp index cf14558c31..26317c5298 100644 --- a/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp +++ b/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp @@ -29,6 +29,7 @@ struct acir_format { std::vector sha256_constraints; std::vector blake2s_constraints; std::vector keccak_constraints; + std::vector keccak_var_constraints; std::vector hash_to_field_constraints; std::vector pedersen_constraints; std::vector compute_merkle_root_constraints; @@ -69,6 +70,7 @@ template inline void read(B& buf, acir_format& data) read(buf, data.ecdsa_constraints); read(buf, data.blake2s_constraints); read(buf, data.keccak_constraints); + read(buf, data.keccak_var_constraints); read(buf, data.pedersen_constraints); read(buf, data.hash_to_field_constraints); read(buf, data.fixed_base_scalar_mul_constraints); @@ -89,6 +91,7 @@ template inline void write(B& buf, acir_format const& data) write(buf, data.ecdsa_constraints); write(buf, data.blake2s_constraints); write(buf, data.keccak_constraints); + write(buf, data.keccak_var_constraints); write(buf, data.pedersen_constraints); write(buf, data.hash_to_field_constraints); write(buf, data.fixed_base_scalar_mul_constraints); diff --git a/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.cpp b/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.cpp index f89e530c10..b573e57153 100644 --- a/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.cpp +++ b/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.cpp @@ -35,4 +35,37 @@ void create_keccak_constraints(Composer& composer, const KeccakConstraint& const } } +void create_keccak_var_constraints(Composer& composer, const KeccakVarConstraint& constraint) +{ + + // Create byte array struct + byte_array_ct arr(&composer); + + // Get the witness assignment for each witness index + // Write the witness assignment to the byte_array + for (const auto& witness_index_num_bits : constraint.inputs) { + auto witness_index = witness_index_num_bits.witness; + auto num_bits = witness_index_num_bits.num_bits; + + // XXX: The implementation requires us to truncate the element to the nearest byte and not bit + auto num_bytes = round_to_nearest_byte(num_bits); + + field_ct element = field_ct::from_witness_index(&composer, witness_index); + byte_array_ct element_bytes(element, num_bytes); + + arr.write(element_bytes); + } + + uint32_ct length = field_ct::from_witness_index(&composer, constraint.var_message_size); + + byte_array_ct output_bytes = proof_system::plonk::stdlib::keccak::hash(arr, length); + + // Convert byte array to vector of field_t + auto bytes = output_bytes.bytes(); + + for (size_t i = 0; i < bytes.size(); ++i) { + composer.assert_equal(bytes[i].normalize().witness_index, constraint.result[i]); + } +} + } // namespace acir_format diff --git a/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp b/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp index 15322b6562..a935bf75be 100644 --- a/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp +++ b/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp @@ -19,7 +19,15 @@ struct KeccakConstraint { friend bool operator==(KeccakConstraint const& lhs, KeccakConstraint const& rhs) = default; }; +struct KeccakVarConstraint { + std::vector inputs; + uint32_t var_message_size; + + friend bool operator==(KeccakVarConstraint const& lhs, KeccakVarConstraint const& rhs) = default; +}; + void create_keccak_constraints(Composer& composer, const KeccakConstraint& constraint); +void create_keccak_var_constraints(Composer& composer, const KeccakVarConstraint& constraint); template inline void read(B& buf, HashInput& constraint) { @@ -49,4 +57,20 @@ template inline void write(B& buf, KeccakConstraint const& constrai write(buf, constraint.result); } +template inline void read(B& buf, KeccakVarConstraint& constraint) +{ + using serialize::read; + read(buf, constraint.inputs); + read(buf, constraint.result); + read(buf, constraint.var_message_size); +} + +template inline void write(B& buf, KeccakVarConstraint const& constraint) +{ + using serialize::write; + write(buf, constraint.inputs); + write(buf, constraint.result); + write(buf, constraint.var_message_size); +} + } // namespace acir_format From 6f9e0592748140c55c16d851313cecf342b767e0 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 24 May 2023 18:06:34 +0000 Subject: [PATCH 2/3] add result field --- cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp b/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp index a935bf75be..95fabe00d5 100644 --- a/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp +++ b/cpp/src/barretenberg/dsl/acir_format/keccak_constraint.hpp @@ -22,6 +22,7 @@ struct KeccakConstraint { struct KeccakVarConstraint { std::vector inputs; uint32_t var_message_size; + std::vector result; friend bool operator==(KeccakVarConstraint const& lhs, KeccakVarConstraint const& rhs) = default; }; From f20df7d9719557d70bc27df330ae489dd28fd44b Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 24 May 2023 18:21:05 +0000 Subject: [PATCH 3/3] add keccak_var_constraints to fields --- cpp/src/barretenberg/dsl/acir_format/acir_format.test.cpp | 3 +++ cpp/src/barretenberg/dsl/acir_format/block_constraint.test.cpp | 1 + cpp/src/barretenberg/dsl/acir_format/ecdsa_secp256k1.test.cpp | 3 +++ 3 files changed, 7 insertions(+) diff --git a/cpp/src/barretenberg/dsl/acir_format/acir_format.test.cpp b/cpp/src/barretenberg/dsl/acir_format/acir_format.test.cpp index b9fed48eb9..a3b2930545 100644 --- a/cpp/src/barretenberg/dsl/acir_format/acir_format.test.cpp +++ b/cpp/src/barretenberg/dsl/acir_format/acir_format.test.cpp @@ -93,6 +93,7 @@ TEST(acir_format, test_logic_gate_from_noir_circuit) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {}, @@ -159,6 +160,7 @@ TEST(acir_format, test_schnorr_verify_pass) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {}, @@ -230,6 +232,7 @@ TEST(acir_format, test_schnorr_verify_small_range) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {}, diff --git a/cpp/src/barretenberg/dsl/acir_format/block_constraint.test.cpp b/cpp/src/barretenberg/dsl/acir_format/block_constraint.test.cpp index 66ab73e84a..ead52f5682 100644 --- a/cpp/src/barretenberg/dsl/acir_format/block_constraint.test.cpp +++ b/cpp/src/barretenberg/dsl/acir_format/block_constraint.test.cpp @@ -113,6 +113,7 @@ TEST(up_ram, TestBlockConstraint) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {}, diff --git a/cpp/src/barretenberg/dsl/acir_format/ecdsa_secp256k1.test.cpp b/cpp/src/barretenberg/dsl/acir_format/ecdsa_secp256k1.test.cpp index fb8b3711b0..b8d8574440 100644 --- a/cpp/src/barretenberg/dsl/acir_format/ecdsa_secp256k1.test.cpp +++ b/cpp/src/barretenberg/dsl/acir_format/ecdsa_secp256k1.test.cpp @@ -94,6 +94,7 @@ TEST(ECDSASecp256k1, TestECDSAConstraintSucceed) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {}, @@ -130,6 +131,7 @@ TEST(ECDSASecp256k1, TestECDSACompilesForVerifier) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {}, @@ -163,6 +165,7 @@ TEST(ECDSASecp256k1, TestECDSAConstraintFail) .sha256_constraints = {}, .blake2s_constraints = {}, .keccak_constraints = {}, + .keccak_var_constraints = {}, .hash_to_field_constraints = {}, .pedersen_constraints = {}, .compute_merkle_root_constraints = {},