3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
14using ::testing::AllOf;
15using ::testing::ElementsAre;
16using ::testing::Return;
17using ::testing::SizeIs;
18using ::testing::StrictMock;
23TEST(AvmSimulationEccTest, Add)
25 EventEmitter<EccAddEvent> ecc_event_emitter;
26 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
27 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
30 StrictMock<MockGreaterThan>
gt;
31 StrictMock<MockToRadix> to_radix;
34 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
36 FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
37 FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
40 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
41 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
46 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
47 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
49 EXPECT_EQ(result.x(), r_x);
50 EXPECT_EQ(result.y(), r_y);
51 EXPECT_EQ(result.is_infinity(), 0);
53 auto events = ecc_event_emitter.dump_events();
54 EXPECT_EQ(events.size(), 1);
55 EXPECT_EQ(events[0].p, p);
56 EXPECT_EQ(events[0].q, q);
57 EXPECT_EQ(events[0].result, result);
60TEST(AvmSimulationEccTest, ScalarMul)
62 EventEmitter<EccAddEvent> ecc_event_emitter;
63 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
64 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
67 StrictMock<MockGreaterThan>
gt;
68 StrictMock<MockToRadix> to_radix;
71 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
73 FF scalar(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
75 std::vector<bool> bits(254,
false);
76 for (
size_t i = 0; i < 254; ++i) {
77 bits[i] = scalar_num.
get_bit(i);
80 EXPECT_CALL(to_radix, to_le_bits(scalar, 254)).WillOnce(Return(bits));
82 FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
83 FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
93 intermediate_states.reserve(254);
99 for (
size_t i = 0; i < 254; ++i) {
100 bool bit = scalar_value.
get_bit(i);
104 intermediate_states.push_back({ res, temp, bit });
108 auto events = scalar_mul_event_emitter.dump_events();
109 EXPECT_THAT(events, AllOf(ElementsAre(ScalarMulEvent{ p, scalar, intermediate_states, result }), SizeIs(1)));
113TEST(AvmSimulationEccDeathTest, ScalarMulNotOnCurve)
115 EventEmitter<EccAddEvent> ecc_event_emitter;
116 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
117 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
120 StrictMock<MockGreaterThan>
gt;
121 StrictMock<MockToRadix> to_radix;
124 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
127 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
128 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
131 FF scalar(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
133 ASSERT_DEATH(ecc.scalar_mul(p, scalar),
"Point must be on the curve for scalar multiplication");
136TEST(AvmSimulationEccTest, AddWithMemory)
138 EventEmitter<EccAddEvent> ecc_event_emitter;
139 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
140 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
143 StrictMock<MockGreaterThan>
gt;
144 StrictMock<MockToRadix> to_radix;
151 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
153 FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
154 FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
157 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
158 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
161 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
162 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
165 uint32_t dst_address = 0x1000;
166 ecc.add(memory, p, q, dst_address);
174TEST(AvmSimulationEccTest, AddNotOnCurve)
176 EventEmitter<EccAddEvent> ecc_event_emitter;
177 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
178 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
181 StrictMock<MockGreaterThan>
gt;
182 StrictMock<MockToRadix> to_radix;
189 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
192 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
193 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
197 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
198 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
201 uint32_t dst_address = 0x1000;
202 EXPECT_THROW(ecc.add(memory, p, q, dst_address), EccException);
205TEST(AvmSimulationEccTest, InfinityOnCurve)
207 EventEmitter<EccAddEvent> ecc_event_emitter;
208 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
209 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
212 StrictMock<MockGreaterThan>
gt;
213 StrictMock<MockToRadix> to_radix;
220 execution_id_manager, gt, to_radix, ecc_event_emitter, scalar_mul_event_emitter, ecc_add_memory_event_emitter);
226 FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
227 FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
230 uint32_t dst_address = 0x1000;
231 ecc.add(memory, p, q, dst_address);
237 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