40#include <gtest/gtest.h>
46class Poseidon2QuadInternalSoundnessTests :
public ::testing::Test {
56 const auto& block =
b.blocks.poseidon2;
57 for (
size_t i = 0; i < block.size(); ++i) {
67 template <
typename Relation>
static bool relation_fires(
Builder&
builder,
size_t idx)
69 return !UltraCircuitChecker::check_relation_at_row<Relation>(
builder,
builder.blocks.poseidon2, idx);
89TEST_F(Poseidon2QuadInternalSoundnessTests, DoesNotMaterializeUnusedNonTerminalStateLimbs)
92 const size_t initial_num_variables =
builder->get_num_variables();
108 constexpr size_t input_witnesses = 4;
109 constexpr size_t initial_external_output_witnesses = 4;
110 constexpr size_t external_output_witnesses = 8 * 4;
111 constexpr size_t compressed_intermediate_witnesses = 14 * 3;
112 constexpr size_t compressed_next_state_zero_witnesses = 14;
113 constexpr size_t compressed_terminal_standard_limbs = 3;
114 constexpr size_t expected_num_variables = input_witnesses + initial_external_output_witnesses +
115 external_output_witnesses + compressed_intermediate_witnesses +
116 compressed_next_state_zero_witnesses + compressed_terminal_standard_limbs;
118 EXPECT_EQ(
builder->get_num_variables() - initial_num_variables, expected_num_variables);
126TEST_F(Poseidon2QuadInternalSoundnessTests, EntryBoundaryRejectsTamperedIntermediateS0)
131 auto& quad =
builder->blocks.poseidon2;
132 const size_t entry_row = selector_row(*
builder, GateKind::Poseidon2TransitionEntry);
134 const size_t first_interior_row = entry_row + 1;
137 const uint32_t w_r_idx = quad.w_r()[first_interior_row];
149TEST_F(Poseidon2QuadInternalSoundnessTests, EntryBoundaryRejectsTamperedStateOne)
154 auto& quad =
builder->blocks.poseidon2;
155 const size_t entry_row = selector_row(*
builder, GateKind::Poseidon2TransitionEntry);
158 const uint32_t w_r_idx = quad.w_r()[entry_row];
169TEST_F(Poseidon2QuadInternalSoundnessTests, ExitBoundaryRejectsTamperedStateOne)
174 auto& quad =
builder->blocks.poseidon2;
175 const size_t terminal_row = selector_row(*
builder, GateKind::Poseidon2QuadIntTerminal);
176 const size_t first_final_external_row = terminal_row + 1;
179 const uint32_t state1_idx = quad.w_r()[first_final_external_row];
180 builder->set_variable(state1_idx,
builder->get_variable(state1_idx) +
FF(1));
189TEST_F(Poseidon2QuadInternalSoundnessTests, InteriorRelationRejectsTamperedWire)
194 auto& quad =
builder->blocks.poseidon2;
196 const size_t interior_row = selector_row(*
builder, GateKind::Poseidon2TransitionEntry) + 1 + 5;
199 const uint32_t w_o_idx = quad.w_o()[interior_row];
215TEST_F(Poseidon2QuadInternalSoundnessTests, CrossRowVandermondeEncodingMismatchRejected)
220 auto& quad =
builder->blocks.poseidon2;
221 const size_t row_i_plus_1 = selector_row(*
builder, GateKind::Poseidon2TransitionEntry) + 1 + 6;
222 const size_t row_i = row_i_plus_1 - 1;
225 const uint32_t idx = quad.w_o()[row_i_plus_1];
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Circuit form of Poseidon2 permutation from https://eprint.iacr.org/2023/323.
std::array< field_t< Builder >, t > State
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
FF read_gate_selector(const ExecutionTraceBlock< FF, NUM_WIRES > &block, GateKind kind, size_t idx)
Gate-selector value at (block, idx) for kind, returning zero if the block does not own this kind or t...
GateKind
Tag identifying which gate selector a block owns. Used by cross-block readers to decide whether (bloc...
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr field zero()
void throw_or_abort(std::string const &err)