Skip to content

Commit 1573a10

Browse files
committed
Add ability to pass extra entropy to rfc6979
Suggested by Greg Maxwell.
1 parent 3087bc4 commit 1573a10

File tree

7 files changed

+25
-9
lines changed

7 files changed

+25
-9
lines changed

include/secp256k1.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,10 @@ typedef int (*secp256k1_nonce_function_t)(
9797
const void *data
9898
);
9999

100-
/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. */
100+
/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function.
101+
* If a data pointer is passed, it is assumed to be a pointer to 32 bytes of
102+
* extra entropy.
103+
*/
101104
extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979;
102105

103106
/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */

src/bench_internal.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ void bench_rfc6979_hmac_sha256(void* arg) {
265265
secp256k1_rfc6979_hmac_sha256_t rng;
266266

267267
for (i = 0; i < 20000; i++) {
268-
secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32);
268+
secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32, NULL, 0);
269269
secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32);
270270
}
271271
}

src/hash.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ typedef struct {
3434
int retry;
3535
} secp256k1_rfc6979_hmac_sha256_t;
3636

37-
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen);
37+
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen);
3838
static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen);
3939
static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng);
4040

src/hash_impl.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsign
200200
}
201201

202202

203-
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen) {
203+
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen) {
204204
secp256k1_hmac_sha256_t hmac;
205205
static const unsigned char zero[1] = {0x00};
206206
static const unsigned char one[1] = {0x01};
@@ -213,6 +213,9 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2
213213
secp256k1_hmac_sha256_write(&hmac, zero, 1);
214214
secp256k1_hmac_sha256_write(&hmac, key, keylen);
215215
secp256k1_hmac_sha256_write(&hmac, msg, msglen);
216+
if (rnd && rndlen) {
217+
secp256k1_hmac_sha256_write(&hmac, rnd, rndlen);
218+
}
216219
secp256k1_hmac_sha256_finalize(&hmac, rng->k);
217220
secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
218221
secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
@@ -223,6 +226,9 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2
223226
secp256k1_hmac_sha256_write(&hmac, one, 1);
224227
secp256k1_hmac_sha256_write(&hmac, key, keylen);
225228
secp256k1_hmac_sha256_write(&hmac, msg, msglen);
229+
if (rnd && rndlen) {
230+
secp256k1_hmac_sha256_write(&hmac, rnd, rndlen);
231+
}
226232
secp256k1_hmac_sha256_finalize(&hmac, rng->k);
227233
secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
228234
secp256k1_hmac_sha256_write(&hmac, rng->v, 32);

src/secp256k1.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ int secp256k1_ecdsa_verify(const unsigned char *msg32, const unsigned char *sig,
6666
static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) {
6767
secp256k1_rfc6979_hmac_sha256_t rng;
6868
unsigned int i;
69-
(void)data;
70-
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32);
69+
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, data, data != NULL ? 32 : 0);
7170
for (i = 0; i <= counter; i++) {
7271
secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
7372
}

src/testrand_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static uint32_t secp256k1_test_rng_precomputed[8];
1818
static int secp256k1_test_rng_precomputed_used = 8;
1919

2020
SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) {
21-
secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, (const unsigned char*)"TestRNG", 7, seed16, 16);
21+
secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, (const unsigned char*)"TestRNG", 7, seed16, 16, NULL, 0);
2222
}
2323

2424
SECP256K1_INLINE static uint32_t secp256k1_rand32(void) {

src/tests.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,16 +200,24 @@ void run_rfc6979_hmac_sha256_tests(void) {
200200

201201
secp256k1_rfc6979_hmac_sha256_t rng;
202202
unsigned char out[32];
203+
unsigned char zero[1] = {0};
203204
int i;
204205

205-
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32);
206+
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, NULL, 1);
206207
for (i = 0; i < 3; i++) {
207208
secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
208209
CHECK(memcmp(out, out1[i], 32) == 0);
209210
}
210211
secp256k1_rfc6979_hmac_sha256_finalize(&rng);
211212

212-
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 32, msg2, 32);
213+
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, zero, 1);
214+
for (i = 0; i < 3; i++) {
215+
secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
216+
CHECK(memcmp(out, out1[i], 32) != 0);
217+
}
218+
secp256k1_rfc6979_hmac_sha256_finalize(&rng);
219+
220+
secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 32, msg2, 32, zero, 0);
213221
for (i = 0; i < 3; i++) {
214222
secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);
215223
CHECK(memcmp(out, out2[i], 32) == 0);

0 commit comments

Comments
 (0)