36#include <gtest/gtest.h>
42class Poseidon2ExternalInternalTransitionsTests :
public ::testing::Test {
63 const auto& block =
b.blocks.poseidon2;
64 for (
size_t i = 0; i < block.size(); ++i) {
74 static size_t final_group_first_external_row(
const Builder&
b)
76 const auto& block =
b.blocks.poseidon2;
77 const size_t terminal = selector_row(
b, GateKind::Poseidon2QuadIntTerminal);
78 for (
size_t i = terminal + 1; i < block.size(); ++i) {
88 template <
typename Relation>
static bool relation_fires(
Builder&
builder,
size_t idx)
90 return !UltraCircuitChecker::check_relation_at_row<Relation>(
builder,
builder.blocks.poseidon2, idx);
95 template <
typename Relation>
96 static void expect_tamper_rejected(
const FF& input,
size_t tamper_row,
size_t wire,
size_t relation_row)
98 auto builder = build_honest_permutation(input);
100 ASSERT_FALSE(relation_fires<Relation>(*
builder, relation_row));
102 auto& block =
builder->blocks.poseidon2;
103 const uint32_t idx = block.wires[wire][tamper_row];
107 <<
"tampering wire " << wire <<
" of boundary row " << tamper_row <<
" was NOT rejected";
108 EXPECT_TRUE(relation_fires<Relation>(*
builder, relation_row))
109 <<
"tampering wire " << wire <<
" of boundary row " << tamper_row
110 <<
" did not break the pinning relation at row " << relation_row;
114TEST_F(Poseidon2ExternalInternalTransitionsTests, AllGateKindsShareOneBlock)
118 EXPECT_GT(
builder->blocks.poseidon2.size(), 0u);
119 for (
const GateKind kind : { GateKind::Poseidon2Ext,
120 GateKind::Poseidon2ExtInitial,
121 GateKind::Poseidon2QuadInt,
122 GateKind::Poseidon2QuadIntTerminal,
123 GateKind::Poseidon2TransitionEntry }) {
124 EXPECT_NO_THROW(selector_row(*
builder, kind)) <<
"gate kind missing from poseidon2 block";
130TEST_F(Poseidon2ExternalInternalTransitionsTests, EntryHandoffTamperRejected)
133 const size_t row = selector_row(*build_honest_permutation(input), GateKind::Poseidon2TransitionEntry);
135 for (
size_t wire = 0; wire < Builder::ExecutionTrace::NUM_WIRES; ++wire) {
136 expect_tamper_rejected<Poseidon2ExternalRelation<FF>>(input, row, wire, row - 1);
143TEST_F(Poseidon2ExternalInternalTransitionsTests, ExitHandoffTamperRejected)
146 auto builder = build_honest_permutation(input);
147 const size_t row = final_group_first_external_row(*
builder);
148 const size_t terminal_row = selector_row(*
builder, GateKind::Poseidon2QuadIntTerminal);
150 for (
size_t wire = 0; wire < Builder::ExecutionTrace::NUM_WIRES; ++wire) {
151 expect_tamper_rejected<Poseidon2QuadInternalTerminalRelation<FF>>(input, row, wire, terminal_row);
157TEST_F(Poseidon2ExternalInternalTransitionsTests, FinalOutputRowTamperRejected)
160 const size_t row = build_honest_permutation(input)->blocks.poseidon2.size() - 1;
162 for (
size_t wire = 0; wire < Builder::ExecutionTrace::NUM_WIRES; ++wire) {
163 expect_tamper_rejected<Poseidon2ExternalRelation<FF>>(input, row, wire, row - 1);
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)