Skip to content

Commit

Permalink
ecmult: add function to compute optimal scratch space size
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasnick committed Jan 29, 2022
1 parent 2d7a903 commit 0d574b4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
16 changes: 16 additions & 0 deletions src/ecmult_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -986,4 +986,20 @@ static int secp256k1_ecmult_multi_var(const secp256k1_callback* error_callback,
return 1;
}

/**
* Returns the optimal scratch space size for a given number of points
* excluding base point G.
*/
static size_t secp256k1_ecmult_multi_scratch_size(size_t n_points) {
if (n_points > ECMULT_MAX_POINTS_PER_BATCH) {
n_points = ECMULT_MAX_POINTS_PER_BATCH;
}
if (n_points >= ECMULT_PIPPENGER_THRESHOLD) {
int bucket_window = secp256k1_pippenger_bucket_window(n_points);
return secp256k1_pippenger_scratch_size(n_points, bucket_window);
} else {
return secp256k1_strauss_scratch_size(n_points);
}
}

#endif /* SECP256K1_ECMULT_IMPL_H */
20 changes: 12 additions & 8 deletions src/tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -4509,14 +4509,8 @@ void test_ecmult_multi_batching(void) {
secp256k1_scratch_destroy(&ctx->error_callback, scratch);

for(i = 1; i <= n_points; i++) {
if (i >= ECMULT_PIPPENGER_THRESHOLD) {
int bucket_window = secp256k1_pippenger_bucket_window(i);
size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window);
scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size);
} else {
size_t scratch_size = secp256k1_strauss_scratch_size(i);
scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size);
}
size_t scratch_size = secp256k1_ecmult_multi_scratch_size(i);
scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size);
CHECK(secp256k1_ecmult_multi_var(&ctx->error_callback, scratch, &r, &scG, ecmult_multi_callback, &data, n_points));
secp256k1_gej_add_var(&r, &r, &r2, NULL);
CHECK(secp256k1_gej_is_infinity(&r));
Expand All @@ -4526,6 +4520,15 @@ void test_ecmult_multi_batching(void) {
free(pt);
}

void test_ecmult_multi_scratch_size(void) {
/* test ECMULT_MAX_POINTS_PER_BATCH limit */
size_t n_points = ECMULT_MAX_POINTS_PER_BATCH + 1;
size_t scratch_size = secp256k1_ecmult_multi_scratch_size(n_points);
int expected_bucket_window = secp256k1_pippenger_bucket_window(n_points - 1);
size_t expected_scratch_size = secp256k1_pippenger_scratch_size(n_points - 1, expected_bucket_window);
CHECK(expected_scratch_size == scratch_size);
}

void run_ecmult_multi_tests(void) {
secp256k1_scratch *scratch;
int64_t todo = (int64_t)320 * count;
Expand Down Expand Up @@ -4553,6 +4556,7 @@ void run_ecmult_multi_tests(void) {

test_ecmult_multi_batch_size_helper();
test_ecmult_multi_batching();
test_ecmult_multi_scratch_size();
}

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

0 comments on commit 0d574b4

Please sign in to comment.