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+
155189static 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