Skip to content

Commit e774a6e

Browse files
committed
Add function to compute optimal ecmult_multi scratch space size for a given number of points
1 parent 24553bf commit e774a6e

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

src/ecmult_impl.h

+16
Original file line numberDiff line numberDiff line change
@@ -1267,4 +1267,20 @@ static int secp256k1_ecmult_multi_var(const secp256k1_callback* error_callback,
12671267
return 1;
12681268
}
12691269

1270+
/**
1271+
* Returns the optimal scratch space size for a given number of points
1272+
* excluding base point G.
1273+
*/
1274+
static size_t secp256k1_ecmult_multi_scratch_size(size_t n_points) {
1275+
if (n_points > ECMULT_MAX_POINTS_PER_BATCH) {
1276+
n_points = ECMULT_MAX_POINTS_PER_BATCH;
1277+
}
1278+
if (n_points >= ECMULT_PIPPENGER_THRESHOLD) {
1279+
int bucket_window = secp256k1_pippenger_bucket_window(n_points);
1280+
return secp256k1_pippenger_scratch_size(n_points, bucket_window);
1281+
} else {
1282+
return secp256k1_strauss_scratch_size(n_points);
1283+
}
1284+
}
1285+
12701286
#endif /* SECP256K1_ECMULT_IMPL_H */

src/tests.c

+12-3
Original file line numberDiff line numberDiff line change
@@ -3100,11 +3100,10 @@ void test_ecmult_multi_batching(void) {
31003100

31013101
for(i = 1; i <= n_points; i++) {
31023102
if (i >= ECMULT_PIPPENGER_THRESHOLD) {
3103-
int bucket_window = secp256k1_pippenger_bucket_window(i);
3104-
size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
3103+
size_t scratch_size = secp256k1_ecmult_multi_scratch_size(i);
31053104
scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size);
31063105
} else {
3107-
size_t scratch_size = secp256k1_strauss_scratch_size(i);
3106+
size_t scratch_size = secp256k1_ecmult_multi_scratch_size(i);
31083107
scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size);
31093108
}
31103109
CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, &ctx->ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
@@ -3116,6 +3115,15 @@ void test_ecmult_multi_batching(void) {
31163115
free(pt);
31173116
}
31183117

3118+
void test_ecmult_multi_scratch_size(void) {
3119+
/* test ECMULT_MAX_POINTS_PER_BATCH limit */
3120+
size_t n_points = ECMULT_MAX_POINTS_PER_BATCH + 1;
3121+
size_t scratch_size = secp256k1_ecmult_multi_scratch_size(n_points);
3122+
int expected_bucket_window = secp256k1_pippenger_bucket_window(n_points - 1);
3123+
size_t expected_scratch_size = secp256k1_pippenger_scratch_size(n_points - 1, expected_bucket_window);
3124+
CHECK(expected_scratch_size == scratch_size);
3125+
}
3126+
31193127
void run_ecmult_multi_tests(void) {
31203128
secp256k1_scratch *scratch;
31213129

@@ -3137,6 +3145,7 @@ void run_ecmult_multi_tests(void) {
31373145

31383146
test_ecmult_multi_batch_size_helper();
31393147
test_ecmult_multi_batching();
3148+
test_ecmult_multi_scratch_size();
31403149
}
31413150

31423151
void test_wnaf(const secp256k1_scalar *number, int w) {

0 commit comments

Comments
 (0)