29 #include "gtest/gtest.h" 36 static 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}};
37 static 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}};
40 static rct::key basic(
const std::vector<rct::MultiexpData> &data)
43 for (
const auto &d: data)
50 ge_add(&p1, &res_p3, &cached);
65 TEST(multiexp, bos_coster_empty)
67 std::vector<rct::MultiexpData> data;
72 TEST(multiexp, straus_empty)
74 std::vector<rct::MultiexpData> data;
79 TEST(multiexp, pippenger_empty)
81 std::vector<rct::MultiexpData> data;
86 TEST(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)});
94 TEST(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)});
102 TEST(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)});
110 TEST(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)});
118 TEST(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)});
126 TEST(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)});
134 TEST(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)});
142 TEST(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)});
150 TEST(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)});
158 TEST(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())});
166 TEST(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())});
174 TEST(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())});
182 TEST(multiexp, bos_coster_random)
184 std::vector<rct::MultiexpData> data;
185 for (
int n = 0; n < 32; ++n)
194 std::vector<rct::MultiexpData> data;
195 for (
int n = 0; n < 32; ++n)
202 TEST(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;
225 size_t sz = 1 + crypto::rand<size_t>() % (N-1);
226 for (
size_t s = 0; s < sz; ++s)
234 TEST(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;
247 size_t sz = 1 + crypto::rand<size_t>() % (N-1);
248 for (
size_t s = 0; s < sz; ++s)
std::shared_ptr< straus_cached_data > straus_init_cache(const std::vector< MultiexpData > &data, size_t N=0)
rct::key straus(const std::vector< MultiexpData > &data, const std::shared_ptr< straus_cached_data > &cache=NULL, size_t STEP=0)
#define EXPECT_TRUE(condition)
rct::key pippenger(const std::vector< MultiexpData > &data, const std::shared_ptr< pippenger_cached_data > &cache=NULL, size_t cache_size=0, size_t c=0)
std::shared_ptr< pippenger_cached_data > pippenger_init_cache(const std::vector< MultiexpData > &data, size_t start_offset=0, size_t N=0)
void ge_scalarmult_p3(ge_p3 *, const unsigned char *, const ge_p3 *)
void scalarmultBase(key &aG, const key &a)
rct::key bos_coster_heap_conv_robust(std::vector< MultiexpData > data)
#define ASSERT_TRUE(condition)
const ge_p3 ge_p3_identity
TEST(multiexp, bos_coster_empty)
int ge_frombytes_vartime(ge_p3 *, const unsigned char *)