Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
keccak_constraint.test.cpp
Go to the documentation of this file.
2#include "acir_format.hpp"
8
9#include <gtest/gtest.h>
10#include <vector>
11
12using namespace bb;
13using namespace acir_format;
14
15template <class BuilderType> class KeccakTestingFunctions {
16 public:
17 using Builder = BuilderType;
19
21 enum class Target : uint8_t {
22 None,
23 Input, // Tamper with an input lane witness
24 Output, // Tamper with an output lane witness
25 };
26
28
29 static std::vector<std::string> get_labels() { return { "None", "Input", "Output" }; }
30 };
31
33
35 Keccakf1600 constraint, WitnessVector witness_values, const InvalidWitness::Target& invalid_witness_target)
36 {
37 switch (invalid_witness_target) {
39 // Tamper with the first input element
40 witness_values[constraint.state[0].index] += bb::fr(1);
41 break;
43 // Tamper with the first output element
44 witness_values[constraint.result[0]] += bb::fr(1);
45 break;
47 break;
48 }
49
50 return { constraint, witness_values };
51 }
52
60 static void generate_constraints(Keccakf1600& keccak_constraint, WitnessVector& witness_values)
61 {
62 // Start with the zero variable at index 0
63 witness_values.emplace_back(bb::fr(0));
64
65 // Use a reproducible input state
66 std::array<uint64_t, KECCAKF1600_LANES> input_state{};
67 for (size_t i = 0; i < input_state.size(); ++i) {
68 input_state[i] = static_cast<uint64_t>(i);
69 }
70
71 // Compute expected output state using a native Keccak-f[1600] permutation
72 std::array<uint64_t, KECCAKF1600_LANES> output_state = input_state;
73 ethash_keccakf1600(output_state.data());
74
75 // Add input/output states to witness
76 auto input_indices =
77 add_to_witness_and_track_indices<std::array<uint64_t, KECCAKF1600_LANES>, KECCAKF1600_LANES>(witness_values,
78 input_state);
79 auto output_indices =
80 add_to_witness_and_track_indices<std::array<uint64_t, KECCAKF1600_LANES>, KECCAKF1600_LANES>(witness_values,
81 output_state);
82
83 // Create the constraint
84 for (size_t i = 0; i < KECCAKF1600_LANES; ++i) {
85 keccak_constraint.state[i] = WitnessOrConstant<bb::fr>::from_index(input_indices[i]);
86 keccak_constraint.result[i] = output_indices[i];
87 }
88 }
89};
90
91template <class Builder>
92class KeccakConstraintsTest : public ::testing::Test, public TestClass<KeccakTestingFunctions<Builder>> {
93 protected:
95};
96
97using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
98
100
101TYPED_TEST(KeccakConstraintsTest, GenerateVKFromConstraints)
102{
104 TestFixture::template test_vk_independence<Flavor>();
105}
106
108{
110 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_tampering();
111}
#define BB_DISABLE_ASSERTS()
Definition assert.hpp:33
static ProgramMetadata generate_metadata()
static void generate_constraints(Keccakf1600 &keccak_constraint, WitnessVector &witness_values)
Generate a valid Keccakf1600 constraint with correct witness values.
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(Keccakf1600 constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
void ethash_keccakf1600(uint64_t state[KECCAKF1600_LANES]) NOEXCEPT
@ KECCAKF1600_LANES
std::vector< bb::fr > WitnessVector
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:174
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
static std::vector< std::string > get_labels()
std::array< uint32_t, 25 > result
std::array< WitnessOrConstant< bb::fr >, 25 > state
Metadata required to create a circuit.
static WitnessOrConstant from_index(uint32_t index)