3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
15using ::testing::ElementsAre;
16using ::testing::ElementsAreArray;
17using ::testing::Field;
18using ::testing::StrictMock;
20class Poseidon2SimulationTest :
public ::testing::Test {
22 Poseidon2SimulationTest()
24 EXPECT_CALL(execution_id_manager, get_execution_id())
25 .WillRepeatedly(testing::Return(0));
36 Poseidon2(execution_id_manager, gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter);
39TEST_F(Poseidon2SimulationTest, Hash)
42 FF a(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
43 FF b(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
44 FF c(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
45 FF d(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
47 std::vector<FF> input = {
a,
b, c, d };
50 FF expected(
"0x2f43a0f83b51a6f5fc839dea0ecec74947637802a579fa9841930a25a0bcec11");
51 EXPECT_EQ(result, expected);
55 EXPECT_THAT(event_result,
64 FF a(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
65 FF b(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
66 FF c(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
67 FF d(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789");
69 std::array<FF, 4> input = {
a,
b, c, d };
70 auto result =
poseidon2.permutation(input);
72 std::array<FF, 4> expected = {
73 FF(
"0x2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"),
74 FF(
"0x0c01fa1b8d0748becafbe452c0cb0231c38224ea824554c9362518eebdd5701f"),
75 FF(
"0x018555a8eb50cf07f64b019ebaf3af3c925c93e631f3ecd455db07bbb52bbdd3"),
76 FF(
"0x0cbea457c91c22c6c31fd89afd2541efc2edf31736b9f721e823b2165c90fd41"),
78 EXPECT_THAT(result, ElementsAreArray(expected));
82 EXPECT_THAT(event_results,
88TEST_F(Poseidon2SimulationTest, RandomHash)
90 std::vector<FF> input;
93 for (
int i = 0; i < 14; i++) {
98 FF bb_result = crypto::Poseidon2<crypto::Poseidon2Bn254ScalarFieldParams>::hash(input);
100 EXPECT_EQ(result, bb_result);
103TEST_F(Poseidon2SimulationTest, PermutationWithMemory)
109 std::array<FF, 4> inputs = {
FF(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"),
110 FF(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"),
111 FF(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"),
112 FF(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789") };
114 for (uint32_t i = 0; i < 4; ++i) {
115 mem.
set(src_address + i, MemoryValue::from<FF>(inputs[i]));
122 std::array<FF, 4> expected = {
123 FF(
"0x2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"),
124 FF(
"0x0c01fa1b8d0748becafbe452c0cb0231c38224ea824554c9362518eebdd5701f"),
125 FF(
"0x018555a8eb50cf07f64b019ebaf3af3c925c93e631f3ecd455db07bbb52bbdd3"),
126 FF(
"0x0cbea457c91c22c6c31fd89afd2541efc2edf31736b9f721e823b2165c90fd41"),
130 for (uint32_t i = 0; i < expected.size(); ++i) {
131 EXPECT_EQ(
mem.
get(dst_address + i).
as_ff(), expected[i]);
135TEST_F(Poseidon2SimulationTest, PermutationWithMemoryAddressOutOfRange)
141 EXPECT_THROW(
poseidon2.permutation(
mem, src_address, dst_address), std::runtime_error);
144TEST_F(Poseidon2SimulationTest, PermutationWithMemoryInvalidMemTag)
152 MemoryValue::from<FF>(
FF(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")),
153 MemoryValue::from<FF>(
FF(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")),
154 MemoryValue::from<uint64_t>(123456789),
155 MemoryValue::from<FF>(
FF(
"0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"))
159 for (uint32_t i = 0; i < inputs.size(); ++i) {
160 mem.
set(src_address + i, inputs[i]);
163 EXPECT_THROW(
poseidon2.permutation(
mem, src_address, dst_address), Poseidon2Exception);
#define AVM_HIGHEST_MEM_ADDRESS
void set(MemoryAddress index, MemoryValue value) override
const MemoryValue & get(MemoryAddress index) const override
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
ExecutionIdManager execution_id_manager
NoopEventEmitter< Poseidon2PermutationEvent > perm_event_emitter
NoopEventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
TEST_F(IPATest, ChallengesAreZero)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< std::array< FF, 4 > > intermediate_states
std::array< FF, 4 > input
std::array< FF, 4 > output
static field random_element(numeric::RNG *engine=nullptr) noexcept