1616#include <stdint.h>
1717#include <string.h>
1818
19- static void secp256k1_sha256_initialize (secp256k1_sha256 * hash ) {
19+ static void secp256k1_sha256_initialize (secp256k1_sha256 * hash , sha256_transform_callback fn_transform ) {
2020 hash -> s [0 ] = 0x6a09e667ul ;
2121 hash -> s [1 ] = 0xbb67ae85ul ;
2222 hash -> s [2 ] = 0x3c6ef372ul ;
@@ -26,6 +26,7 @@ static void secp256k1_sha256_initialize(secp256k1_sha256 *hash) {
2626 hash -> s [6 ] = 0x1f83d9abul ;
2727 hash -> s [7 ] = 0x5be0cd19ul ;
2828 hash -> bytes = 0 ;
29+ hash -> fn_transform = fn_transform == NULL ? secp256k1_sha256_transform : fn_transform ;
2930}
3031
3132static void secp256k1_sha256_write (secp256k1_sha256 * hash , const unsigned char * data , size_t len ) {
@@ -38,7 +39,7 @@ static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *
3839 memcpy (hash -> buf + bufsize , data , chunk_len );
3940 data += chunk_len ;
4041 len -= chunk_len ;
41- secp256k1_sha256_transform (hash -> s , hash -> buf , 1 );
42+ hash -> fn_transform (hash -> s , hash -> buf , 1 );
4243 bufsize = 0 ;
4344 }
4445 if (len ) {
@@ -63,15 +64,56 @@ static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out
6364 }
6465}
6566
67+ static int secp256k1_sha256_check_transform (sha256_transform_callback fn_transform ) {
68+ secp256k1_sha256 sha256 ;
69+ unsigned char out [2 ][32 ];
70+
71+ /* Four messages of different sizes: 1, 24, 64 and 81 bytes */
72+ unsigned char * msgs [4 ];
73+ size_t lens [4 ];
74+ unsigned char msg_0 = 0 ;
75+ unsigned char msg_1 [24 ] = "secp256k1_verif_round_i" ;
76+ unsigned char msg_2 [64 ] = "For this test, this 63-byte string will be used as input data i" ;
77+ unsigned char msg_3 [81 ] = "Genesis: The Times 03/Jan/2009 Chancellor on brink of second bailout for banks i" ;
78+ msgs [0 ] = & msg_0 ; lens [0 ] = sizeof (msg_0 );
79+ msgs [1 ] = msg_1 ; lens [1 ] = sizeof (msg_1 );
80+ msgs [2 ] = msg_2 ; lens [2 ] = sizeof (msg_2 );
81+ msgs [3 ] = msg_3 ; lens [3 ] = sizeof (msg_3 );
82+
83+ /* Compare hashes between built-in transform vs the one provided by the user */
84+ {
85+ unsigned char i , j , k ;
86+ sha256_transform_callback funcs [2 ];
87+ funcs [0 ] = secp256k1_sha256_transform ; /* Built-in */
88+ funcs [1 ] = fn_transform ; /* User provided */
89+
90+ for (i = 0 ; i < 10 ; i ++ ) {
91+ msg_0 = i ;
92+ msg_1 [23 ] = i ;
93+ msg_2 [63 ] = i ;
94+ msg_3 [80 ] = i ;
95+ for (j = 0 ; j < 4 ; j ++ ) {
96+ for (k = 0 ; k < 2 ; k ++ ) {
97+ secp256k1_sha256_initialize (& sha256 , funcs [k ]);
98+ secp256k1_sha256_write (& sha256 , msgs [j ], lens [j ]);
99+ secp256k1_sha256_finalize (& sha256 , out [k ]);
100+ }
101+ if (memcmp (out [0 ], out [1 ], 32 ) != 0 ) return 0 ;
102+ }
103+ }
104+ }
105+ return 1 ;
106+ }
107+
66108/* Initializes a sha256 struct and writes the 64 byte string
67109 * SHA256(tag)||SHA256(tag) into it. */
68- static void secp256k1_sha256_initialize_tagged (secp256k1_sha256 * hash , const unsigned char * tag , size_t taglen ) {
110+ static void secp256k1_sha256_initialize_tagged (secp256k1_sha256 * hash , const unsigned char * tag , size_t taglen , sha256_transform_callback fn_sha256_transform ) {
69111 unsigned char buf [32 ];
70- secp256k1_sha256_initialize (hash );
112+ secp256k1_sha256_initialize (hash , fn_sha256_transform );
71113 secp256k1_sha256_write (hash , tag , taglen );
72114 secp256k1_sha256_finalize (hash , buf );
73115
74- secp256k1_sha256_initialize (hash );
116+ secp256k1_sha256_initialize (hash , fn_sha256_transform );
75117 secp256k1_sha256_write (hash , buf , 32 );
76118 secp256k1_sha256_write (hash , buf , 32 );
77119}
@@ -80,27 +122,27 @@ static void secp256k1_sha256_clear(secp256k1_sha256 *hash) {
80122 secp256k1_memclear_explicit (hash , sizeof (* hash ));
81123}
82124
83- static void secp256k1_hmac_sha256_initialize (secp256k1_hmac_sha256 * hash , const unsigned char * key , size_t keylen ) {
125+ static void secp256k1_hmac_sha256_initialize (secp256k1_hmac_sha256 * hash , const unsigned char * key , size_t keylen , sha256_transform_callback fn_sha256_transform ) {
84126 size_t n ;
85127 unsigned char rkey [64 ];
86128 if (keylen <= sizeof (rkey )) {
87129 memcpy (rkey , key , keylen );
88130 memset (rkey + keylen , 0 , sizeof (rkey ) - keylen );
89131 } else {
90132 secp256k1_sha256 sha256 ;
91- secp256k1_sha256_initialize (& sha256 );
133+ secp256k1_sha256_initialize (& sha256 , fn_sha256_transform );
92134 secp256k1_sha256_write (& sha256 , key , keylen );
93135 secp256k1_sha256_finalize (& sha256 , rkey );
94136 memset (rkey + 32 , 0 , 32 );
95137 }
96138
97- secp256k1_sha256_initialize (& hash -> outer );
139+ secp256k1_sha256_initialize (& hash -> outer , fn_sha256_transform );
98140 for (n = 0 ; n < sizeof (rkey ); n ++ ) {
99141 rkey [n ] ^= 0x5c ;
100142 }
101143 secp256k1_sha256_write (& hash -> outer , rkey , sizeof (rkey ));
102144
103- secp256k1_sha256_initialize (& hash -> inner );
145+ secp256k1_sha256_initialize (& hash -> inner , fn_sha256_transform );
104146 for (n = 0 ; n < sizeof (rkey ); n ++ ) {
105147 rkey [n ] ^= 0x5c ^ 0x36 ;
106148 }
@@ -124,7 +166,7 @@ static void secp256k1_hmac_sha256_clear(secp256k1_hmac_sha256 *hash) {
124166 secp256k1_memclear_explicit (hash , sizeof (* hash ));
125167}
126168
127- static void secp256k1_rfc6979_hmac_sha256_initialize (secp256k1_rfc6979_hmac_sha256 * rng , const unsigned char * key , size_t keylen ) {
169+ static void secp256k1_rfc6979_hmac_sha256_initialize (secp256k1_rfc6979_hmac_sha256 * rng , const unsigned char * key , size_t keylen , sha256_transform_callback fn_sha256_transform ) {
128170 secp256k1_hmac_sha256 hmac ;
129171 static const unsigned char zero [1 ] = {0x00 };
130172 static const unsigned char one [1 ] = {0x01 };
@@ -133,45 +175,45 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2
133175 memset (rng -> k , 0x00 , 32 ); /* RFC6979 3.2.c. */
134176
135177 /* RFC6979 3.2.d. */
136- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
178+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
137179 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
138180 secp256k1_hmac_sha256_write (& hmac , zero , 1 );
139181 secp256k1_hmac_sha256_write (& hmac , key , keylen );
140182 secp256k1_hmac_sha256_finalize (& hmac , rng -> k );
141- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
183+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
142184 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
143185 secp256k1_hmac_sha256_finalize (& hmac , rng -> v );
144186
145187 /* RFC6979 3.2.f. */
146- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
188+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
147189 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
148190 secp256k1_hmac_sha256_write (& hmac , one , 1 );
149191 secp256k1_hmac_sha256_write (& hmac , key , keylen );
150192 secp256k1_hmac_sha256_finalize (& hmac , rng -> k );
151- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
193+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
152194 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
153195 secp256k1_hmac_sha256_finalize (& hmac , rng -> v );
154196 rng -> retry = 0 ;
155197}
156198
157- static void secp256k1_rfc6979_hmac_sha256_generate (secp256k1_rfc6979_hmac_sha256 * rng , unsigned char * out , size_t outlen ) {
199+ static void secp256k1_rfc6979_hmac_sha256_generate (secp256k1_rfc6979_hmac_sha256 * rng , unsigned char * out , size_t outlen , sha256_transform_callback fn_sha256_transform ) {
158200 /* RFC6979 3.2.h. */
159201 static const unsigned char zero [1 ] = {0x00 };
160202 if (rng -> retry ) {
161203 secp256k1_hmac_sha256 hmac ;
162- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
204+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
163205 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
164206 secp256k1_hmac_sha256_write (& hmac , zero , 1 );
165207 secp256k1_hmac_sha256_finalize (& hmac , rng -> k );
166- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
208+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
167209 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
168210 secp256k1_hmac_sha256_finalize (& hmac , rng -> v );
169211 }
170212
171213 while (outlen > 0 ) {
172214 secp256k1_hmac_sha256 hmac ;
173215 size_t now = outlen ;
174- secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 );
216+ secp256k1_hmac_sha256_initialize (& hmac , rng -> k , 32 , fn_sha256_transform );
175217 secp256k1_hmac_sha256_write (& hmac , rng -> v , 32 );
176218 secp256k1_hmac_sha256_finalize (& hmac , rng -> v );
177219 if (now > 32 ) {
0 commit comments