3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
16using ::testing::AllOf;
17using ::testing::ElementsAre;
18using ::testing::Return;
19using ::testing::SizeIs;
20using ::testing::StrictMock;
25TEST(AvmSimulationEccTest, Add)
27 EventEmitter<EccAddEvent> ecc_event_emitter;
28 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
29 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
32 StrictMock<MockGreaterThan>
gt;
33 StrictMock<MockToRadix> to_radix;
36 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
38 FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
39 FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
42 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
43 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
48 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
49 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
51 EXPECT_EQ(result.x(), r_x);
52 EXPECT_EQ(result.y(), r_y);
53 EXPECT_EQ(result.is_infinity(), 0);
55 auto events = ecc_event_emitter.dump_events();
56 EXPECT_EQ(events.size(), 1);
57 EXPECT_EQ(events[0].p, p);
58 EXPECT_EQ(events[0].q, q);
59 EXPECT_EQ(events[0].result, result);
62TEST(AvmSimulationEccTest, ScalarMul)
64 EventEmitter<EccAddEvent> ecc_event_emitter;
65 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
66 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
69 StrictMock<MockGreaterThan>
gt;
70 StrictMock<MockToRadix> to_radix;
73 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
75 FF scalar(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
77 std::vector<bool> bits(254,
false);
78 for (
size_t i = 0; i < 254; ++i) {
79 bits[i] = scalar_num.
get_bit(i);
82 EXPECT_CALL(to_radix, to_le_bits(scalar, 254)).WillOnce(Return(
std::make_pair(bits,
false)));
84 FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
85 FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
95 intermediate_states.reserve(254);
101 for (
size_t i = 0; i < 254; ++i) {
102 bool bit = scalar_value.
get_bit(i);
106 intermediate_states.push_back({ res, temp, bit });
110 auto events = scalar_mul_event_emitter.dump_events();
111 EXPECT_THAT(events, AllOf(ElementsAre(ScalarMulEvent{ p, scalar, intermediate_states, result }), SizeIs(1)));
115TEST(AvmSimulationEccDeathTest, ScalarMulNotOnCurve)
117 EventEmitter<EccAddEvent> ecc_event_emitter;
118 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
119 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
122 StrictMock<MockGreaterThan>
gt;
123 StrictMock<MockToRadix> to_radix;
126 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
129 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
130 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
133 FF scalar(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
136 ASSERT_THROW(ecc.scalar_mul(p, scalar), std::runtime_error);
139TEST(AvmSimulationEccTest, AddWithMemory)
141 EventEmitter<EccAddEvent> ecc_event_emitter;
142 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
143 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
146 StrictMock<MockGreaterThan>
gt;
147 StrictMock<MockToRadix> to_radix;
154 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
156 FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
157 FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
160 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
161 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
164 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
165 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
168 uint32_t dst_address = 0x1000;
169 ecc.add(memory, p, q, dst_address);
177TEST(AvmSimulationEccTest, AddNotOnCurve)
179 EventEmitter<EccAddEvent> ecc_event_emitter;
180 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
181 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
184 StrictMock<MockGreaterThan>
gt;
185 StrictMock<MockToRadix> to_radix;
192 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
195 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
196 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
200 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
201 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
204 uint32_t dst_address = 0x1000;
205 EXPECT_THROW(ecc.add(memory, p, q, dst_address), EccException);
208TEST(AvmSimulationEccTest, InfinityOnCurve)
210 EventEmitter<EccAddEvent> ecc_event_emitter;
211 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
212 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
215 StrictMock<MockGreaterThan>
gt;
216 StrictMock<MockToRadix> to_radix;
223 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
229 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
230 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
233 uint32_t dst_address = 0x1000;
234 ecc.add(memory, p, q, dst_address);
240 EXPECT_EQ(result, q);
#define AVM_HIGHEST_MEM_ADDRESS
static const StandardAffinePoint & infinity()
const MemoryValue & get(MemoryAddress index) const override
constexpr bool get_bit(uint64_t bit_index) const
ExecutionIdManager execution_id_manager
TEST(EmitUnencryptedLogTest, Basic)
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept