Skip to content

Commit 1728806

Browse files
committed
Merge pull request bitcoin#138
a5759c5 Check return value of malloc (Pieter Wuille) 2b9388b Remove unused secp256k1_fe_inv_all (Pieter Wuille) f461b76 Allocate precomputation arrays on the heap (Pieter Wuille)
2 parents ad86bdf + a5759c5 commit 1728806

File tree

9 files changed

+18
-54
lines changed

9 files changed

+18
-54
lines changed

src/ecdsa_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static void secp256k1_ecdsa_start(void) {
2727
return;
2828

2929
/* Allocate. */
30-
secp256k1_ecdsa_consts_t *ret = (secp256k1_ecdsa_consts_t*)malloc(sizeof(secp256k1_ecdsa_consts_t));
30+
secp256k1_ecdsa_consts_t *ret = (secp256k1_ecdsa_consts_t*)checked_malloc(sizeof(secp256k1_ecdsa_consts_t));
3131

3232
static const unsigned char order[] = {
3333
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

src/ecmult_gen_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static void secp256k1_ecmult_gen_start(void) {
3434
return;
3535

3636
/* Allocate the precomputation table. */
37-
secp256k1_ecmult_gen_consts_t *ret = (secp256k1_ecmult_gen_consts_t*)malloc(sizeof(secp256k1_ecmult_gen_consts_t));
37+
secp256k1_ecmult_gen_consts_t *ret = (secp256k1_ecmult_gen_consts_t*)checked_malloc(sizeof(secp256k1_ecmult_gen_consts_t));
3838

3939
/* get the generator */
4040
const secp256k1_ge_t *g = &secp256k1_ge_consts->g;

src/ecmult_impl.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,14 @@ static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const s
4343

4444
static void secp256k1_ecmult_table_precomp_ge_var(secp256k1_ge_t *pre, const secp256k1_gej_t *a, int w) {
4545
const int table_size = 1 << (w-2);
46-
secp256k1_gej_t prej[table_size];
46+
secp256k1_gej_t *prej = checked_malloc(sizeof(secp256k1_gej_t) * table_size);
4747
prej[0] = *a;
4848
secp256k1_gej_t d; secp256k1_gej_double_var(&d, a);
4949
for (int i=1; i<table_size; i++) {
5050
secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]);
5151
}
5252
secp256k1_ge_set_all_gej_var(table_size, pre, prej);
53+
free(prej);
5354
}
5455

5556
/** The number of entries a table with precomputed multiples needs to have. */
@@ -85,7 +86,7 @@ static void secp256k1_ecmult_start(void) {
8586
return;
8687

8788
/* Allocate the precomputation table. */
88-
secp256k1_ecmult_consts_t *ret = (secp256k1_ecmult_consts_t*)malloc(sizeof(secp256k1_ecmult_consts_t));
89+
secp256k1_ecmult_consts_t *ret = (secp256k1_ecmult_consts_t*)checked_malloc(sizeof(secp256k1_ecmult_consts_t));
8990

9091
/* get the generator */
9192
const secp256k1_ge_t *g = &secp256k1_ge_consts->g;

src/field.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,6 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a);
105105
/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be
106106
* at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and
107107
* outputs must not overlap in memory. */
108-
static void secp256k1_fe_inv_all(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]);
109-
110-
/** Potentially faster version of secp256k1_fe_inv_all, without constant-time guarantee. */
111108
static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]);
112109

113110
/** Convert a field element to a hexadecimal string. */

src/field_impl.h

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -218,30 +218,6 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
218218
#endif
219219
}
220220

221-
static void secp256k1_fe_inv_all(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]) {
222-
if (len < 1)
223-
return;
224-
225-
VERIFY_CHECK((r + len <= a) || (a + len <= r));
226-
227-
r[0] = a[0];
228-
229-
size_t i = 0;
230-
while (++i < len) {
231-
secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]);
232-
}
233-
234-
secp256k1_fe_t u; secp256k1_fe_inv(&u, &r[--i]);
235-
236-
while (i > 0) {
237-
int j = i--;
238-
secp256k1_fe_mul(&r[j], &r[i], &u);
239-
secp256k1_fe_mul(&u, &u, &a[j]);
240-
}
241-
242-
r[0] = u;
243-
}
244-
245221
static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]) {
246222
if (len < 1)
247223
return;
@@ -277,7 +253,7 @@ static void secp256k1_fe_start(void) {
277253
#endif
278254
if (secp256k1_fe_consts == NULL) {
279255
secp256k1_fe_inner_start();
280-
secp256k1_fe_consts_t *ret = (secp256k1_fe_consts_t*)malloc(sizeof(secp256k1_fe_consts_t));
256+
secp256k1_fe_consts_t *ret = (secp256k1_fe_consts_t*)checked_malloc(sizeof(secp256k1_fe_consts_t));
281257
#ifndef USE_NUM_NONE
282258
secp256k1_num_set_bin(&ret->p, secp256k1_fe_consts_p, sizeof(secp256k1_fe_consts_p));
283259
#endif

src/group_impl.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,16 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) {
8585

8686
static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t r[len], const secp256k1_gej_t a[len]) {
8787
size_t count = 0;
88-
secp256k1_fe_t az[len];
88+
secp256k1_fe_t *az = checked_malloc(sizeof(secp256k1_fe_t) * len);
8989
for (size_t i=0; i<len; i++) {
9090
if (!a[i].infinity) {
9191
az[count++] = a[i].z;
9292
}
9393
}
9494

95-
secp256k1_fe_t azi[count];
95+
secp256k1_fe_t *azi = checked_malloc(sizeof(secp256k1_fe_t) * count);
9696
secp256k1_fe_inv_all_var(count, azi, az);
97+
free(az);
9798

9899
count = 0;
99100
for (size_t i=0; i<len; i++) {
@@ -106,6 +107,7 @@ static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t r[len], cons
106107
secp256k1_fe_mul(&r[i].y, &a[i].y, &zi3);
107108
}
108109
}
110+
free(azi);
109111
}
110112

111113
static void secp256k1_gej_set_infinity(secp256k1_gej_t *r) {
@@ -433,7 +435,7 @@ static void secp256k1_ge_start(void) {
433435
};
434436
#endif
435437
if (secp256k1_ge_consts == NULL) {
436-
secp256k1_ge_consts_t *ret = (secp256k1_ge_consts_t*)malloc(sizeof(secp256k1_ge_consts_t));
438+
secp256k1_ge_consts_t *ret = (secp256k1_ge_consts_t*)checked_malloc(sizeof(secp256k1_ge_consts_t));
437439
#ifdef USE_ENDOMORPHISM
438440
VERIFY_CHECK(secp256k1_fe_set_b32(&ret->beta, secp256k1_ge_consts_beta));
439441
#endif

src/scalar_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static void secp256k1_scalar_start(void) {
4040
return;
4141

4242
/* Allocate. */
43-
secp256k1_scalar_consts_t *ret = (secp256k1_scalar_consts_t*)malloc(sizeof(secp256k1_scalar_consts_t));
43+
secp256k1_scalar_consts_t *ret = (secp256k1_scalar_consts_t*)checked_malloc(sizeof(secp256k1_scalar_consts_t));
4444

4545
#ifndef USE_NUM_NONE
4646
static const unsigned char secp256k1_scalar_consts_order[] = {

src/tests.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -498,23 +498,6 @@ void run_field_inv_var(void) {
498498
}
499499
}
500500

501-
void run_field_inv_all(void) {
502-
secp256k1_fe_t x[16], xi[16], xii[16];
503-
/* Check it's safe to call for 0 elements */
504-
secp256k1_fe_inv_all(0, xi, x);
505-
for (int i=0; i<count; i++) {
506-
size_t len = (secp256k1_rand32() & 15) + 1;
507-
for (size_t j=0; j<len; j++)
508-
random_fe_non_zero(&x[j]);
509-
secp256k1_fe_inv_all(len, xi, x);
510-
for (size_t j=0; j<len; j++)
511-
CHECK(check_fe_inverse(&x[j], &xi[j]));
512-
secp256k1_fe_inv_all(len, xii, xi);
513-
for (size_t j=0; j<len; j++)
514-
CHECK(check_fe_equal(&x[j], &xii[j]));
515-
}
516-
}
517-
518501
void run_field_inv_all_var(void) {
519502
secp256k1_fe_t x[16], xi[16], xii[16];
520503
/* Check it's safe to call for 0 elements */
@@ -1185,7 +1168,6 @@ int main(int argc, char **argv) {
11851168
/* field tests */
11861169
run_field_inv();
11871170
run_field_inv_var();
1188-
run_field_inv_all();
11891171
run_field_inv_all_var();
11901172
run_sqr();
11911173
run_sqrt();

src/util.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161
#define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
6262
#endif
6363

64+
static inline void *checked_malloc(size_t size) {
65+
void *ret = malloc(size);
66+
CHECK(ret != NULL);
67+
return ret;
68+
}
69+
6470
/* Macro for restrict, when available and not in a VERIFY build. */
6571
#if defined(SECP256K1_BUILD) && defined(VERIFY)
6672
# define SECP256K1_RESTRICT

0 commit comments

Comments
 (0)