Skip to content

Commit 349e6ab

Browse files
real-or-randomtheStack
authored andcommitted
Introduce separate _clear functions for hash module
This gives the caller more control about whether the state should be cleaned (= should be considered secret). Moreover, it gives the caller the possibility to clean a hash struct without finalizing it.
1 parent 99cc9fd commit 349e6ab

File tree

8 files changed

+26
-7
lines changed

8 files changed

+26
-7
lines changed

src/ecmult_gen_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const
335335
secp256k1_scalar_clear(&b);
336336
secp256k1_gej_clear(&gb);
337337
secp256k1_fe_clear(&f);
338+
secp256k1_rfc6979_hmac_sha256_clear(&rng);
338339
}
339340

340341
#endif /* SECP256K1_ECMULT_GEN_IMPL_H */

src/hash.h

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ typedef struct {
1919
static void secp256k1_sha256_initialize(secp256k1_sha256 *hash);
2020
static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size);
2121
static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32);
22+
static void secp256k1_sha256_clear(secp256k1_sha256 *hash);
2223

2324
typedef struct {
2425
secp256k1_sha256 inner, outer;
@@ -27,6 +28,7 @@ typedef struct {
2728
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size);
2829
static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size);
2930
static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32);
31+
static void secp256k1_hmac_sha256_clear(secp256k1_hmac_sha256 *hash);
3032

3133
typedef struct {
3234
unsigned char v[32];
@@ -37,5 +39,6 @@ typedef struct {
3739
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen);
3840
static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen);
3941
static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng);
42+
static void secp256k1_rfc6979_hmac_sha256_clear(secp256k1_rfc6979_hmac_sha256 *rng);
4043

4144
#endif /* SECP256K1_HASH_H */

src/hash_impl.h

+12-4
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,6 @@ static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out
156156
secp256k1_write_be32(&out32[4*i], hash->s[i]);
157157
hash->s[i] = 0;
158158
}
159-
160-
secp256k1_memclear(sizedesc, sizeof(sizedesc));
161-
secp256k1_memclear(hash, sizeof(secp256k1_sha256));
162159
}
163160

164161
/* Initializes a sha256 struct and writes the 64 byte string
@@ -174,6 +171,10 @@ static void secp256k1_sha256_initialize_tagged(secp256k1_sha256 *hash, const uns
174171
secp256k1_sha256_write(hash, buf, 32);
175172
}
176173

174+
static void secp256k1_sha256_clear(secp256k1_sha256 *hash) {
175+
secp256k1_memclear(hash, sizeof(*hash));
176+
}
177+
177178
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) {
178179
size_t n;
179180
unsigned char rkey[64];
@@ -214,6 +215,9 @@ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned
214215
secp256k1_sha256_finalize(&hash->outer, out32);
215216
}
216217

218+
static void secp256k1_hmac_sha256_clear(secp256k1_hmac_sha256 *hash) {
219+
secp256k1_memclear(hash, sizeof(*hash));
220+
}
217221

218222
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen) {
219223
secp256k1_hmac_sha256 hmac;
@@ -277,7 +281,11 @@ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256
277281
}
278282

279283
static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng) {
280-
secp256k1_memclear(rng, sizeof(secp256k1_rfc6979_hmac_sha256));
284+
(void) rng;
285+
}
286+
287+
static void secp256k1_rfc6979_hmac_sha256_clear(secp256k1_rfc6979_hmac_sha256 *rng) {
288+
secp256k1_memclear(rng, sizeof(*rng));
281289
}
282290

283291
#undef Round

src/modules/ecdh/main_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ static int ecdh_hash_function_sha256(unsigned char *output, const unsigned char
1919
secp256k1_sha256_write(&sha, &version, 1);
2020
secp256k1_sha256_write(&sha, x32, 32);
2121
secp256k1_sha256_finalize(&sha, output);
22+
secp256k1_sha256_clear(&sha);
2223

2324
return 1;
2425
}

src/modules/ellswift/main_impl.h

+2
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ static int ellswift_xdh_hash_function_prefix(unsigned char *output, const unsign
510510
secp256k1_sha256_write(&sha, ell_b64, 64);
511511
secp256k1_sha256_write(&sha, x32, 32);
512512
secp256k1_sha256_finalize(&sha, output);
513+
secp256k1_sha256_clear(&sha);
513514

514515
return 1;
515516
}
@@ -539,6 +540,7 @@ static int ellswift_xdh_hash_function_bip324(unsigned char* output, const unsign
539540
secp256k1_sha256_write(&sha, ell_b64, 64);
540541
secp256k1_sha256_write(&sha, x32, 32);
541542
secp256k1_sha256_finalize(&sha, output);
543+
secp256k1_sha256_clear(&sha);
542544

543545
return 1;
544546
}

src/modules/musig/session_impl.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,10 @@ static void secp256k1_nonce_function_musig(secp256k1_scalar *k, const unsigned c
386386

387387
/* Attempt to erase secret data */
388388
secp256k1_memclear(buf, sizeof(buf));
389-
secp256k1_memclear(&sha_tmp, sizeof(sha_tmp));
389+
secp256k1_sha256_clear(&sha_tmp);
390390
}
391391
secp256k1_memclear(rand, sizeof(rand));
392-
secp256k1_memclear(&sha, sizeof(sha));
392+
secp256k1_sha256_clear(&sha);
393393
}
394394

395395
int secp256k1_musig_nonce_gen_internal(const secp256k1_context* ctx, secp256k1_musig_secnonce *secnonce, secp256k1_musig_pubnonce *pubnonce, const unsigned char *input_nonce, const unsigned char *seckey, const secp256k1_pubkey *pubkey, const unsigned char *msg32, const secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *extra_input32) {

src/modules/schnorrsig/main_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ static int nonce_function_bip340(unsigned char *nonce32, const unsigned char *ms
9393
secp256k1_sha256_write(&sha, xonly_pk32, 32);
9494
secp256k1_sha256_write(&sha, msg, msglen);
9595
secp256k1_sha256_finalize(&sha, nonce32);
96+
secp256k1_sha256_clear(&sha);
9697
return 1;
9798
}
9899

src/secp256k1.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,13 @@ static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *m
494494
buffer_append(keydata, &offset, algo16, 16);
495495
}
496496
secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, offset);
497-
secp256k1_memclear(keydata, sizeof(keydata));
498497
for (i = 0; i <= counter; i++) {
499498
secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
500499
}
501500
secp256k1_rfc6979_hmac_sha256_finalize(&rng);
501+
502+
secp256k1_memclear(keydata, sizeof(keydata));
503+
secp256k1_rfc6979_hmac_sha256_clear(&rng);
502504
return 1;
503505
}
504506

@@ -799,6 +801,7 @@ int secp256k1_tagged_sha256(const secp256k1_context* ctx, unsigned char *hash32,
799801
secp256k1_sha256_initialize_tagged(&sha, tag, taglen);
800802
secp256k1_sha256_write(&sha, msg, msglen);
801803
secp256k1_sha256_finalize(&sha, hash32);
804+
secp256k1_sha256_clear(&sha);
802805
return 1;
803806
}
804807

0 commit comments

Comments
 (0)