@@ -29,6 +29,21 @@ int secp256k1_schnorrsig_parse(const secp256k1_context* ctx, secp256k1_schnorrsi
2929 return 1 ;
3030}
3131
32+ /* Initializes SHA256 with fixed midstate. This midstate was computed by applying
33+ * SHA256 to SHA256("BIPSchnorr")||SHA256("BIPSchnorr"). */
34+ static void secp256k1_schnorrsig_sha256_tagged (secp256k1_sha256 * sha ) {
35+ secp256k1_sha256_initialize (sha );
36+ sha -> s [0 ] = 0x048d9a59ul ;
37+ sha -> s [1 ] = 0xfe39fb05ul ;
38+ sha -> s [2 ] = 0x28479648ul ;
39+ sha -> s [3 ] = 0xe4a660f9ul ;
40+ sha -> s [4 ] = 0x814b9e66ul ;
41+ sha -> s [5 ] = 0x0469e801ul ;
42+ sha -> s [6 ] = 0x83909280ul ;
43+ sha -> s [7 ] = 0xb329e454ul ;
44+ sha -> bytes = 64 ;
45+ }
46+
3247int secp256k1_schnorrsig_sign (const secp256k1_context * ctx , secp256k1_schnorrsig * sig , const unsigned char * msg32 , const unsigned char * seckey , secp256k1_nonce_function noncefp , void * ndata ) {
3348 secp256k1_scalar x ;
3449 secp256k1_scalar e ;
@@ -61,7 +76,7 @@ int secp256k1_schnorrsig_sign(const secp256k1_context* ctx, secp256k1_schnorrsig
6176 secp256k1_ecmult_gen (& ctx -> ecmult_gen_ctx , & pkj , & x );
6277 secp256k1_ge_set_gej (& pk , & pkj );
6378
64- if (!noncefp (buf , msg32 , seckey , NULL , (void * )ndata , 0 )) {
79+ if (!noncefp (buf , msg32 , seckey , ( unsigned char * ) "BIPSchnorrDerive" , (void * )ndata , 0 )) {
6580 return 0 ;
6681 }
6782 secp256k1_scalar_set_b32 (& k , buf , NULL );
@@ -78,7 +93,9 @@ int secp256k1_schnorrsig_sign(const secp256k1_context* ctx, secp256k1_schnorrsig
7893 secp256k1_fe_normalize (& r .x );
7994 secp256k1_fe_get_b32 (& sig -> data [0 ], & r .x );
8095
81- secp256k1_sha256_initialize (& sha );
96+
97+ /* tagged hash(r.x, pk, msg32) */
98+ secp256k1_schnorrsig_sha256_tagged (& sha );
8299 secp256k1_sha256_write (& sha , & sig -> data [0 ], 32 );
83100 secp256k1_eckey_pubkey_serialize (& pk , buf , & buflen , 1 );
84101 secp256k1_sha256_write (& sha , buf , buflen );
@@ -140,7 +157,7 @@ int secp256k1_schnorrsig_verify(const secp256k1_context* ctx, const secp256k1_sc
140157 return 0 ;
141158 }
142159
143- secp256k1_sha256_initialize (& sha );
160+ secp256k1_schnorrsig_sha256_tagged (& sha );
144161 secp256k1_sha256_write (& sha , & sig -> data [0 ], 32 );
145162 secp256k1_ec_pubkey_serialize (ctx , buf , & buflen , pk , SECP256K1_EC_COMPRESSED );
146163 secp256k1_sha256_write (& sha , buf , buflen );
@@ -203,7 +220,7 @@ static int secp256k1_schnorrsig_verify_batch_ecmult_callback(secp256k1_scalar *s
203220 unsigned char buf [33 ];
204221 size_t buflen = sizeof (buf );
205222 secp256k1_sha256 sha ;
206- secp256k1_sha256_initialize (& sha );
223+ secp256k1_schnorrsig_sha256_tagged (& sha );
207224 secp256k1_sha256_write (& sha , & ecmult_context -> sig [idx / 2 ]-> data [0 ], 32 );
208225 secp256k1_ec_pubkey_serialize (ecmult_context -> ctx , buf , & buflen , ecmult_context -> pk [idx / 2 ], SECP256K1_EC_COMPRESSED );
209226 secp256k1_sha256_write (& sha , buf , buflen );
0 commit comments