Skip to content

Commit c7680e5

Browse files
committed
Reduce usage of hardcoded size constants
1 parent 6ad5cdb commit c7680e5

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

src/hash_impl.h

+12-11
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *
133133
hash->bytes += len;
134134
while (bufsize + len >= 64) {
135135
/* Fill the buffer, and process it. */
136-
memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize);
137-
data += 64 - bufsize;
138-
len -= 64 - bufsize;
136+
size_t chunk_len = 64 - bufsize;
137+
memcpy(((unsigned char*)hash->buf) + bufsize, data, chunk_len);
138+
data += chunk_len;
139+
len -= chunk_len;
139140
secp256k1_sha256_transform(hash->s, hash->buf);
140141
bufsize = 0;
141142
}
@@ -162,11 +163,11 @@ static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out
162163
}
163164

164165
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) {
165-
int n;
166+
size_t n;
166167
unsigned char rkey[64];
167-
if (keylen <= 64) {
168+
if (keylen <= sizeof(rkey)) {
168169
memcpy(rkey, key, keylen);
169-
memset(rkey + keylen, 0, 64 - keylen);
170+
memset(rkey + keylen, 0, sizeof(rkey) - keylen);
170171
} else {
171172
secp256k1_sha256 sha256;
172173
secp256k1_sha256_initialize(&sha256);
@@ -176,17 +177,17 @@ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const
176177
}
177178

178179
secp256k1_sha256_initialize(&hash->outer);
179-
for (n = 0; n < 64; n++) {
180+
for (n = 0; n < sizeof(rkey); n++) {
180181
rkey[n] ^= 0x5c;
181182
}
182-
secp256k1_sha256_write(&hash->outer, rkey, 64);
183+
secp256k1_sha256_write(&hash->outer, rkey, sizeof(rkey));
183184

184185
secp256k1_sha256_initialize(&hash->inner);
185-
for (n = 0; n < 64; n++) {
186+
for (n = 0; n < sizeof(rkey); n++) {
186187
rkey[n] ^= 0x5c ^ 0x36;
187188
}
188-
secp256k1_sha256_write(&hash->inner, rkey, 64);
189-
memset(rkey, 0, 64);
189+
secp256k1_sha256_write(&hash->inner, rkey, sizeof(rkey));
190+
memset(rkey, 0, sizeof(rkey));
190191
}
191192

192193
static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) {

src/secp256k1.c

+13-10
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge,
120120
* representation inside secp256k1_pubkey, as conversion is very fast.
121121
* Note that secp256k1_pubkey_save must use the same representation. */
122122
secp256k1_ge_storage s;
123-
memcpy(&s, &pubkey->data[0], 64);
123+
memcpy(&s, &pubkey->data[0], sizeof(s));
124124
secp256k1_ge_from_storage(ge, &s);
125125
} else {
126126
/* Otherwise, fall back to 32-byte big endian for X and Y. */
@@ -137,7 +137,7 @@ static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) {
137137
if (sizeof(secp256k1_ge_storage) == 64) {
138138
secp256k1_ge_storage s;
139139
secp256k1_ge_to_storage(&s, ge);
140-
memcpy(&pubkey->data[0], &s, 64);
140+
memcpy(&pubkey->data[0], &s, sizeof(s));
141141
} else {
142142
VERIFY_CHECK(!secp256k1_ge_is_infinity(ge));
143143
secp256k1_fe_normalize_var(&ge->x);
@@ -307,9 +307,14 @@ int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_s
307307
secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m));
308308
}
309309

310+
static SECP256K1_INLINE void buffer_append(unsigned char *buf, unsigned int *offset, const void *data, unsigned int len) {
311+
memcpy(buf + *offset, data, len);
312+
*offset += len;
313+
}
314+
310315
static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {
311316
unsigned char keydata[112];
312-
int keylen = 64;
317+
unsigned int offset = 0;
313318
secp256k1_rfc6979_hmac_sha256 rng;
314319
unsigned int i;
315320
/* We feed a byte array to the PRNG as input, consisting of:
@@ -320,17 +325,15 @@ static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *m
320325
* different argument mixtures to emulate each other and result in the same
321326
* nonces.
322327
*/
323-
memcpy(keydata, key32, 32);
324-
memcpy(keydata + 32, msg32, 32);
328+
buffer_append(keydata, &offset, key32, 32);
329+
buffer_append(keydata, &offset, msg32, 32);
325330
if (data != NULL) {
326-
memcpy(keydata + 64, data, 32);
327-
keylen = 96;
331+
buffer_append(keydata, &offset, data, 32);
328332
}
329333
if (algo16 != NULL) {
330-
memcpy(keydata + keylen, algo16, 16);
331-
keylen += 16;
334+
buffer_append(keydata, &offset, algo16, 16);
332335
}
333-
secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, keylen);
336+
secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, offset);
334337
memset(keydata, 0, sizeof(keydata));
335338
for (i = 0; i <= counter; i++) {
336339
secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);

0 commit comments

Comments
 (0)