Skip to content

Commit 5cfa213

Browse files
jonasnicksanket1729
authored andcommitted
Make sure that bppp_log2 isn't called with value 0
Author: Jonas Nick <[email protected]> Date: Thu Feb 9 21:31:43 2023 +0000
1 parent e5a01d1 commit 5cfa213

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

src/modules/bppp/bppp_norm_product_impl.h

+15-4
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,13 @@ static int secp256k1_bppp_rangeproof_norm_product_prove(
238238
ecmult_r_cb_data r_cb_data;
239239
size_t g_len = n_vec_len, h_len = l_vec_len;
240240
const size_t G_GENS_LEN = g_len;
241-
size_t log_g_len = secp256k1_bppp_log2(g_len), log_h_len = secp256k1_bppp_log2(h_len);
242-
size_t num_rounds = log_g_len > log_h_len ? log_g_len : log_h_len;
241+
size_t log_g_len, log_h_len;
242+
size_t num_rounds;
243243

244+
VERIFY_CHECK(g_len > 0 && h_len > 0);
245+
log_g_len = secp256k1_bppp_log2(g_len);
246+
log_h_len = secp256k1_bppp_log2(h_len);
247+
num_rounds = log_g_len > log_h_len ? log_g_len : log_h_len;
244248
/* Check proof sizes.*/
245249
VERIFY_CHECK(*proof_len >= 65 * num_rounds + 64);
246250
VERIFY_CHECK(g_vec_len == (n_vec_len + l_vec_len) && l_vec_len == c_vec_len);
@@ -440,10 +444,17 @@ static int secp256k1_bppp_rangeproof_norm_product_verify(
440444
secp256k1_gej res1, res2;
441445
size_t i = 0, scratch_checkpoint;
442446
int overflow;
443-
size_t log_g_len = secp256k1_bppp_log2(g_len), log_h_len = secp256k1_bppp_log2(c_vec_len);
444-
size_t n_rounds = log_g_len > log_h_len ? log_g_len : log_h_len;
447+
size_t log_g_len, log_h_len;
448+
size_t n_rounds;
445449
size_t h_len = c_vec_len;
446450

451+
if (g_len == 0 || c_vec_len == 0) {
452+
return 0;
453+
}
454+
log_g_len = secp256k1_bppp_log2(g_len);
455+
log_h_len = secp256k1_bppp_log2(c_vec_len);
456+
n_rounds = log_g_len > log_h_len ? log_g_len : log_h_len;
457+
447458
if (g_vec->n != (h_len + g_len) || (proof_len != 65 * n_rounds + 64)) {
448459
return 0;
449460
}

src/modules/bppp/bppp_util.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,10 @@ static int secp256k1_is_power_of_two(size_t n) {
4545
return n > 0 && (n & (n - 1)) == 0;
4646
}
4747

48-
/* Compute the log2 of n. If n is not a power of two, it returns the largest
49-
* `k` such that 2^k <= n. Assumes n < 2^64. In Bulletproofs, this is bounded
50-
* by len of input vectors which can be safely assumed to be less than 2^64.
48+
/* Compute the log2 of n. n must NOT be 0. If n is not a power of two, it
49+
* returns the largest `k` such that 2^k <= n. Assumes 0 < n < 2^64. In
50+
* Bulletproofs, this is bounded by len of input vectors which can be safely
51+
* assumed to be less than 2^64.
5152
*/
5253
static size_t secp256k1_bppp_log2(size_t n) {
5354
return 64 - 1 - secp256k1_clz64_var((uint64_t)n);

src/modules/bppp/tests_impl.h

+18
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,24 @@ void norm_arg_zero(void) {
420420
secp256k1_bppp_generators_destroy(ctx, gs);
421421
}
422422

423+
/* Verify vectors of length 0 */
424+
{
425+
unsigned int n_vec_len = 1;
426+
unsigned int c_vec_len = 1;
427+
secp256k1_bppp_generators *gs = secp256k1_bppp_generators_create(ctx, n_vec_len + c_vec_len);
428+
size_t plen = sizeof(proof);
429+
random_scalar_order(&n_vec[0]);
430+
random_scalar_order(&c_vec[0]);
431+
random_scalar_order(&l_vec[0]);
432+
CHECK(secp256k1_bppp_commit(ctx, scratch, &commit, gs, n_vec, n_vec_len, l_vec, c_vec_len, c_vec, c_vec_len, &q));
433+
CHECK(secp256k1_norm_arg_prove(scratch, proof, &plen, &r, gs, n_vec, n_vec_len, l_vec, c_vec_len, c_vec, c_vec_len, &commit));
434+
CHECK(secp256k1_norm_arg_verify(scratch, proof, plen, &r, gs, n_vec_len, c_vec, c_vec_len, &commit));
435+
CHECK(!secp256k1_norm_arg_verify(scratch, proof, plen, &r, gs, 0, c_vec, c_vec_len, &commit));
436+
CHECK(!secp256k1_norm_arg_verify(scratch, proof, plen, &r, gs, n_vec_len, c_vec, 0, &commit));
437+
438+
secp256k1_bppp_generators_destroy(ctx, gs);
439+
}
440+
423441
secp256k1_scratch_space_destroy(ctx, scratch);
424442
}
425443

0 commit comments

Comments
 (0)