Skip to content

Commit dc4ad9f

Browse files
committed
Merge commit '2397210425017923ecd592c8af3aba196aad42de' into 2025_secp_sha256
2 parents 891299e + 2397210 commit dc4ad9f

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

src/secp256k1/src/hash.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out
2222
static void secp256k1_sha256_clear(secp256k1_sha256 *hash);
2323

2424
/* TODO: Add description */
25-
typedef void (*fn_sha256_transform_)(uint32_t* s, const unsigned char* buf, size_t n);
26-
static void secp256k1_set_sha256_transform(fn_sha256_transform_ fn_transform);
25+
static int secp256k1_set_sha256_transform(fn_sha256_transform fn_transform);
2726

2827
typedef struct {
2928
secp256k1_sha256 inner, outer;

src/secp256k1/src/hash_impl.h

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,41 @@
1414
#include <stdint.h>
1515
#include <string.h>
1616

17-
/* TODO: add description */
18-
static fn_sha256_transform g_fn_sha256_transform = NULL;
19-
static void secp256k1_set_sha256_transform(fn_sha256_transform fn_transform) { g_fn_sha256_transform = fn_transform; }
17+
/* Default SHA-256 transform - internal implementation */
18+
static void secp256k1_sha256_transform(uint32_t* s, const unsigned char* buf, size_t n);
19+
static void secp256k1_sha256_write_impl(secp256k1_sha256 *hash, const unsigned char *data, size_t len, fn_sha256_transform fn_transform);
20+
21+
static int secp256k1_sha256_check_transform(fn_sha256_transform fn_transform) {
22+
secp256k1_sha256 sha256;
23+
unsigned char out_curr[32], out_new[32];
24+
unsigned char msg[24] = "secp256k1_verif_round_i";
25+
int i;
26+
/* Compare hashes */
27+
for (i = 0; i < 10; i++) {
28+
msg[23] = (char) i;
29+
/* Current one */
30+
secp256k1_sha256_initialize(&sha256);
31+
secp256k1_sha256_write(&sha256, msg, 24);
32+
secp256k1_sha256_finalize(&sha256, out_curr);
33+
34+
/* New one */
35+
secp256k1_sha256_initialize(&sha256);
36+
secp256k1_sha256_write_impl(&sha256, msg, 24, fn_transform);
37+
secp256k1_sha256_finalize(&sha256, out_new);
38+
39+
/* Fail if it is not the same */
40+
if (memcmp(out_curr, out_new, 32) != 0) return 0;
41+
}
42+
return 1;
43+
}
44+
45+
/* Custom SHA-256 transform step */
46+
static fn_sha256_transform g_fn_sha256_transform = secp256k1_sha256_transform;
47+
static int secp256k1_set_sha256_transform(fn_sha256_transform fn_transform) {
48+
if (!secp256k1_sha256_check_transform(fn_transform)) return 0;
49+
g_fn_sha256_transform = fn_transform ? fn_transform : secp256k1_sha256_transform;
50+
return 1;
51+
}
2052

2153
#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
2254
#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
@@ -131,12 +163,10 @@ static void secp256k1_sha256_transform(uint32_t* s, const unsigned char* buf, si
131163
while (n--) secp256k1_sha256_transform_impl(s, buf);
132164
}
133165

134-
static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) {
135-
fn_sha256_transform fn_transform;
166+
static void secp256k1_sha256_write_impl(secp256k1_sha256 *hash, const unsigned char *data, size_t len, fn_sha256_transform fn_transform) {
136167
size_t bufsize = hash->bytes & 0x3F;
137168
hash->bytes += len;
138169
VERIFY_CHECK(hash->bytes >= len);
139-
fn_transform = g_fn_sha256_transform == NULL ? secp256k1_sha256_transform : g_fn_sha256_transform;
140170
while (len >= 64 - bufsize) {
141171
/* Fill the buffer, and process it. */
142172
size_t chunk_len = 64 - bufsize;
@@ -152,6 +182,10 @@ static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *
152182
}
153183
}
154184

185+
static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) {
186+
secp256k1_sha256_write_impl(hash, data, len, g_fn_sha256_transform);
187+
}
188+
155189
static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32) {
156190
static const unsigned char pad[64] = {0x80};
157191
unsigned char sizedesc[8];

0 commit comments

Comments
 (0)