29#include "gtest/gtest.h"
36static const rct::key TESTPOW2SCALAR = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
37static const rct::key TESTSMALLSCALAR = {{5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
40static rct::key basic(
const std::vector<rct::MultiexpData> &data)
43 for (
const auto &d: data)
50 ge_add(&p1, &res_p3, &cached);
65TEST(multiexp, bos_coster_empty)
67 std::vector<rct::MultiexpData> data;
69 ASSERT_TRUE(basic(data) == bos_coster_heap_conv_robust(data));
72TEST(multiexp, straus_empty)
74 std::vector<rct::MultiexpData> data;
79TEST(multiexp, pippenger_empty)
81 std::vector<rct::MultiexpData> data;
86TEST(multiexp, bos_coster_zero_and_non_zero)
88 std::vector<rct::MultiexpData> data;
89 data.push_back({
rct::zero(), get_p3(TESTPOINT)});
90 data.push_back({TESTSCALAR, get_p3(TESTPOINT)});
91 ASSERT_TRUE(basic(data) == bos_coster_heap_conv_robust(data));
94TEST(multiexp, straus_zero_and_non_zero)
96 std::vector<rct::MultiexpData> data;
97 data.push_back({
rct::zero(), get_p3(TESTPOINT)});
98 data.push_back({TESTSCALAR, get_p3(TESTPOINT)});
102TEST(multiexp, pippenger_zero_and_non_zero)
104 std::vector<rct::MultiexpData> data;
105 data.push_back({
rct::zero(), get_p3(TESTPOINT)});
106 data.push_back({TESTSCALAR, get_p3(TESTPOINT)});
110TEST(multiexp, bos_coster_pow2_scalar)
112 std::vector<rct::MultiexpData> data;
113 data.push_back({TESTPOW2SCALAR, get_p3(TESTPOINT)});
114 data.push_back({TESTSMALLSCALAR, get_p3(TESTPOINT)});
115 ASSERT_TRUE(basic(data) == bos_coster_heap_conv_robust(data));
118TEST(multiexp, straus_pow2_scalar)
120 std::vector<rct::MultiexpData> data;
121 data.push_back({TESTPOW2SCALAR, get_p3(TESTPOINT)});
122 data.push_back({TESTSMALLSCALAR, get_p3(TESTPOINT)});
126TEST(multiexp, pippenger_pow2_scalar)
128 std::vector<rct::MultiexpData> data;
129 data.push_back({TESTPOW2SCALAR, get_p3(TESTPOINT)});
130 data.push_back({TESTSMALLSCALAR, get_p3(TESTPOINT)});
134TEST(multiexp, bos_coster_only_zeroes)
136 std::vector<rct::MultiexpData> data;
137 for (
int n = 0; n < 16; ++n)
138 data.push_back({rct::zero(), get_p3(TESTPOINT)});
139 ASSERT_TRUE(basic(data) == bos_coster_heap_conv_robust(data));
142TEST(multiexp, straus_only_zeroes)
144 std::vector<rct::MultiexpData> data;
145 for (
int n = 0; n < 16; ++n)
146 data.push_back({rct::zero(), get_p3(TESTPOINT)});
150TEST(multiexp, pippenger_only_zeroes)
152 std::vector<rct::MultiexpData> data;
153 for (
int n = 0; n < 16; ++n)
154 data.push_back({rct::zero(), get_p3(TESTPOINT)});
158TEST(multiexp, bos_coster_only_identities)
160 std::vector<rct::MultiexpData> data;
161 for (
int n = 0; n < 16; ++n)
162 data.push_back({TESTSCALAR, get_p3(rct::identity())});
163 ASSERT_TRUE(basic(data) == bos_coster_heap_conv_robust(data));
166TEST(multiexp, straus_only_identities)
168 std::vector<rct::MultiexpData> data;
169 for (
int n = 0; n < 16; ++n)
170 data.push_back({TESTSCALAR, get_p3(rct::identity())});
174TEST(multiexp, pippenger_only_identities)
176 std::vector<rct::MultiexpData> data;
177 for (
int n = 0; n < 16; ++n)
178 data.push_back({TESTSCALAR, get_p3(rct::identity())});
182TEST(multiexp, bos_coster_random)
184 std::vector<rct::MultiexpData> data;
185 for (
int n = 0; n < 32; ++n)
188 ASSERT_TRUE(basic(data) == bos_coster_heap_conv_robust(data));
194 std::vector<rct::MultiexpData> data;
195 for (
int n = 0; n < 32; ++n)
202TEST(multiexp, pippenger_random)
204 std::vector<rct::MultiexpData> data;
205 for (
int n = 0; n < 32; ++n)
214 static constexpr size_t N = 256;
215 std::vector<rct::MultiexpData> P(N);
216 for (
size_t n = 0; n < N; ++n)
222 for (
size_t n = 0; n < N/16; ++n)
224 std::vector<rct::MultiexpData> data;
226 for (
size_t s = 0; s < sz; ++s)
234TEST(multiexp, pippenger_cached)
236 static constexpr size_t N = 256;
237 std::vector<rct::MultiexpData> P(N);
238 for (
size_t n = 0; n < N; ++n)
244 for (
size_t n = 0; n < N/16; ++n)
246 std::vector<rct::MultiexpData> data;
248 for (
size_t s = 0; s < sz; ++s)
252 ASSERT_TRUE(basic(data) == pippenger(data, cache));
int ge_frombytes_vartime(ge_p3 *, const unsigned char *)
const ge_p3 ge_p3_identity
void ge_scalarmult_p3(ge_p3 *, const unsigned char *, const ge_p3 *)
#define EXPECT_TRUE(condition)
#define TEST(test_case_name, test_name)
#define ASSERT_TRUE(condition)
std::enable_if< std::is_pod< T >::value, T >::type rand()
void scalarmultBase(key &aG, const key &a)
std::shared_ptr< pippenger_cached_data > pippenger_init_cache(const std::vector< MultiexpData > &data, size_t start_offset=0, size_t N=0)
std::shared_ptr< straus_cached_data > straus_init_cache(const std::vector< MultiexpData > &data, size_t N=0)