Skip to content

Commit 399b582

Browse files
committed
Split memclear into two versions
secp256k1_memclear has the side effect of undefining bytes for valgrind checks. In some cases, we may want to zero bytes but allow subsequent reads. So we split memclear into memclear_explicit, which makes no guarantees about the content of the buffer on return, and memzero_explicit, which guarantees zero value on return. Change the memset in partial_sign to use memzero_explicit.
1 parent 4985ac0 commit 399b582

File tree

11 files changed

+41
-28
lines changed

11 files changed

+41
-28
lines changed

src/ecmult_gen_impl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,8 @@ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp25
277277
/* Cleanup. */
278278
secp256k1_fe_clear(&neg);
279279
secp256k1_ge_clear(&add);
280-
secp256k1_memclear(&adds, sizeof(adds));
281-
secp256k1_memclear(&recoded, sizeof(recoded));
280+
secp256k1_memclear_explicit(&adds, sizeof(adds));
281+
secp256k1_memclear_explicit(&recoded, sizeof(recoded));
282282
}
283283

284284
/* Setup blinding values for secp256k1_ecmult_gen. */
@@ -310,7 +310,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const
310310
VERIFY_CHECK(seed32 != NULL);
311311
memcpy(keydata + 32, seed32, 32);
312312
secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, 64);
313-
secp256k1_memclear(keydata, sizeof(keydata));
313+
secp256k1_memclear_explicit(keydata, sizeof(keydata));
314314

315315
/* Compute projective blinding factor (cannot be 0). */
316316
secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
@@ -331,7 +331,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const
331331
secp256k1_ge_set_gej(&ctx->ge_offset, &gb);
332332

333333
/* Clean up. */
334-
secp256k1_memclear(nonce32, sizeof(nonce32));
334+
secp256k1_memclear_explicit(nonce32, sizeof(nonce32));
335335
secp256k1_scalar_clear(&b);
336336
secp256k1_gej_clear(&gb);
337337
secp256k1_fe_clear(&f);

src/field_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#endif
2020

2121
SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) {
22-
secp256k1_memclear(a, sizeof(secp256k1_fe));
22+
secp256k1_memclear_explicit(a, sizeof(secp256k1_fe));
2323
}
2424

2525
SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {

src/group_impl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,11 +337,11 @@ static void secp256k1_ge_set_infinity(secp256k1_ge *r) {
337337
}
338338

339339
static void secp256k1_gej_clear(secp256k1_gej *r) {
340-
secp256k1_memclear(r, sizeof(secp256k1_gej));
340+
secp256k1_memclear_explicit(r, sizeof(secp256k1_gej));
341341
}
342342

343343
static void secp256k1_ge_clear(secp256k1_ge *r) {
344-
secp256k1_memclear(r, sizeof(secp256k1_ge));
344+
secp256k1_memclear_explicit(r, sizeof(secp256k1_ge));
345345
}
346346

347347
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) {

src/hash_impl.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ static void secp256k1_sha256_initialize_tagged(secp256k1_sha256 *hash, const uns
172172
}
173173

174174
static void secp256k1_sha256_clear(secp256k1_sha256 *hash) {
175-
secp256k1_memclear(hash, sizeof(*hash));
175+
secp256k1_memclear_explicit(hash, sizeof(*hash));
176176
}
177177

178178
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) {
@@ -200,7 +200,7 @@ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const
200200
rkey[n] ^= 0x5c ^ 0x36;
201201
}
202202
secp256k1_sha256_write(&hash->inner, rkey, sizeof(rkey));
203-
secp256k1_memclear(rkey, sizeof(rkey));
203+
secp256k1_memclear_explicit(rkey, sizeof(rkey));
204204
}
205205

206206
static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) {
@@ -211,12 +211,12 @@ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned
211211
unsigned char temp[32];
212212
secp256k1_sha256_finalize(&hash->inner, temp);
213213
secp256k1_sha256_write(&hash->outer, temp, 32);
214-
secp256k1_memclear(temp, sizeof(temp));
214+
secp256k1_memclear_explicit(temp, sizeof(temp));
215215
secp256k1_sha256_finalize(&hash->outer, out32);
216216
}
217217

218218
static void secp256k1_hmac_sha256_clear(secp256k1_hmac_sha256 *hash) {
219-
secp256k1_memclear(hash, sizeof(*hash));
219+
secp256k1_memclear_explicit(hash, sizeof(*hash));
220220
}
221221

222222
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen) {
@@ -285,7 +285,7 @@ static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256
285285
}
286286

287287
static void secp256k1_rfc6979_hmac_sha256_clear(secp256k1_rfc6979_hmac_sha256 *rng) {
288-
secp256k1_memclear(rng, sizeof(*rng));
288+
secp256k1_memclear_explicit(rng, sizeof(*rng));
289289
}
290290

291291
#undef Round

src/modules/ecdh/main_impl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *output, const se
6262

6363
ret = hashfp(output, x, y, data);
6464

65-
secp256k1_memclear(x, sizeof(x));
66-
secp256k1_memclear(y, sizeof(y));
65+
secp256k1_memclear_explicit(x, sizeof(x));
66+
secp256k1_memclear_explicit(y, sizeof(y));
6767
secp256k1_scalar_clear(&s);
6868
secp256k1_ge_clear(&pt);
6969
secp256k1_gej_clear(&res);

src/modules/ellswift/main_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ int secp256k1_ellswift_xdh(const secp256k1_context *ctx, unsigned char *output,
582582
/* Invoke hasher */
583583
ret = hashfp(output, sx, ell_a64, ell_b64, data);
584584

585-
secp256k1_memclear(sx, sizeof(sx));
585+
secp256k1_memclear_explicit(sx, sizeof(sx));
586586
secp256k1_fe_clear(&px);
587587
secp256k1_scalar_clear(&s);
588588

src/modules/musig/session_impl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,10 +385,10 @@ static void secp256k1_nonce_function_musig(secp256k1_scalar *k, const unsigned c
385385
secp256k1_scalar_set_b32(&k[i], buf, NULL);
386386

387387
/* Attempt to erase secret data */
388-
secp256k1_memclear(buf, sizeof(buf));
388+
secp256k1_memclear_explicit(buf, sizeof(buf));
389389
secp256k1_sha256_clear(&sha_tmp);
390390
}
391-
secp256k1_memclear(rand, sizeof(rand));
391+
secp256k1_memclear_explicit(rand, sizeof(rand));
392392
secp256k1_sha256_clear(&sha);
393393
}
394394

@@ -518,7 +518,7 @@ int secp256k1_musig_nonce_gen_counter(const secp256k1_context* ctx, secp256k1_mu
518518
if (!secp256k1_musig_nonce_gen_internal(ctx, secnonce, pubnonce, buf, seckey, &pubkey, msg32, keyagg_cache, extra_input32)) {
519519
return 0;
520520
}
521-
secp256k1_memclear(seckey, sizeof(seckey));
521+
secp256k1_memclear_explicit(seckey, sizeof(seckey));
522522
return 1;
523523
}
524524

@@ -679,7 +679,7 @@ int secp256k1_musig_partial_sign(const secp256k1_context* ctx, secp256k1_musig_p
679679
ret = secp256k1_musig_secnonce_load(ctx, k, &pk, secnonce);
680680
/* Set nonce to zero to avoid nonce reuse. This will cause subsequent calls
681681
* of this function to fail */
682-
memset(secnonce, 0, sizeof(*secnonce));
682+
secp256k1_memzero_explicit(secnonce, sizeof(*secnonce));
683683
if (!ret) {
684684
secp256k1_musig_partial_sign_clear(&sk, k);
685685
return 0;

src/modules/schnorrsig/main_impl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static int nonce_function_bip340(unsigned char *nonce32, const unsigned char *ms
9494
secp256k1_sha256_write(&sha, msg, msglen);
9595
secp256k1_sha256_finalize(&sha, nonce32);
9696
secp256k1_sha256_clear(&sha);
97-
secp256k1_memclear(masked_key, sizeof(masked_key));
97+
secp256k1_memclear_explicit(masked_key, sizeof(masked_key));
9898

9999
return 1;
100100
}
@@ -190,8 +190,8 @@ static int secp256k1_schnorrsig_sign_internal(const secp256k1_context* ctx, unsi
190190
secp256k1_memczero(sig64, 64, !ret);
191191
secp256k1_scalar_clear(&k);
192192
secp256k1_scalar_clear(&sk);
193-
secp256k1_memclear(seckey, sizeof(seckey));
194-
secp256k1_memclear(nonce32, sizeof(nonce32));
193+
secp256k1_memclear_explicit(seckey, sizeof(seckey));
194+
secp256k1_memclear_explicit(nonce32, sizeof(nonce32));
195195
secp256k1_gej_clear(&rj);
196196

197197
return ret;

src/scalar_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static const secp256k1_scalar secp256k1_scalar_one = SECP256K1_SCALAR_CONST(0, 0
2828
static const secp256k1_scalar secp256k1_scalar_zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
2929

3030
SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) {
31-
secp256k1_memclear(r, sizeof(secp256k1_scalar));
31+
secp256k1_memclear_explicit(r, sizeof(secp256k1_scalar));
3232
}
3333

3434
static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned char *bin) {

src/secp256k1.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *m
499499
}
500500
secp256k1_rfc6979_hmac_sha256_finalize(&rng);
501501

502-
secp256k1_memclear(keydata, sizeof(keydata));
502+
secp256k1_memclear_explicit(keydata, sizeof(keydata));
503503
secp256k1_rfc6979_hmac_sha256_clear(&rng);
504504
return 1;
505505
}
@@ -550,7 +550,7 @@ static int secp256k1_ecdsa_sign_inner(const secp256k1_context* ctx, secp256k1_sc
550550
* seckey. As a result is_sec_valid is included in ret only after ret was
551551
* used as a branching variable. */
552552
ret &= is_sec_valid;
553-
secp256k1_memclear(nonce32, sizeof(nonce32));
553+
secp256k1_memclear_explicit(nonce32, sizeof(nonce32));
554554
secp256k1_scalar_clear(&msg);
555555
secp256k1_scalar_clear(&non);
556556
secp256k1_scalar_clear(&sec);

0 commit comments

Comments
 (0)