@@ -121,6 +121,8 @@ void test_schnorrsig_api(void) {
121121 secp256k1_xonly_pubkey pk [3 ];
122122 secp256k1_xonly_pubkey zero_pk ;
123123 unsigned char sig [64 ];
124+ secp256k1_schnorrsig_extraparams extraparams = SECP256K1_SCHNORRSIG_EXTRAPARAMS_INIT ;
125+ secp256k1_schnorrsig_extraparams invalid_extraparams = { 0 };
124126
125127 /** setup **/
126128 secp256k1_context * none = secp256k1_context_create (SECP256K1_CONTEXT_NONE );
@@ -167,6 +169,28 @@ void test_schnorrsig_api(void) {
167169 CHECK (secp256k1_schnorrsig_sign (sign , sig , msg , & invalid_keypair , NULL ) == 0 );
168170 CHECK (ecount == 6 );
169171
172+ ecount = 0 ;
173+ CHECK (secp256k1_schnorrsig_sign_custom (none , sig , msg , sizeof (msg ), & keypairs [0 ], & extraparams ) == 0 );
174+ CHECK (ecount == 1 );
175+ CHECK (secp256k1_schnorrsig_sign_custom (vrfy , sig , msg , sizeof (msg ), & keypairs [0 ], & extraparams ) == 0 );
176+ CHECK (ecount == 2 );
177+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , msg , sizeof (msg ), & keypairs [0 ], & extraparams ) == 1 );
178+ CHECK (ecount == 2 );
179+ CHECK (secp256k1_schnorrsig_sign_custom (sign , NULL , msg , sizeof (msg ), & keypairs [0 ], & extraparams ) == 0 );
180+ CHECK (ecount == 3 );
181+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , NULL , sizeof (msg ), & keypairs [0 ], & extraparams ) == 0 );
182+ CHECK (ecount == 4 );
183+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , NULL , 0 , & keypairs [0 ], & extraparams ) == 1 );
184+ CHECK (ecount == 4 );
185+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , msg , sizeof (msg ), NULL , & extraparams ) == 0 );
186+ CHECK (ecount == 5 );
187+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , msg , sizeof (msg ), & invalid_keypair , & extraparams ) == 0 );
188+ CHECK (ecount == 6 );
189+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , msg , sizeof (msg ), & keypairs [0 ], NULL ) == 1 );
190+ CHECK (ecount == 6 );
191+ CHECK (secp256k1_schnorrsig_sign_custom (sign , sig , msg , sizeof (msg ), & keypairs [0 ], & invalid_extraparams ) == 0 );
192+ CHECK (ecount == 7 );
193+
170194 ecount = 0 ;
171195 CHECK (secp256k1_schnorrsig_sign (sign , sig , msg , & keypairs [0 ], NULL ) == 1 );
172196 CHECK (secp256k1_schnorrsig_verify (none , sig , msg , sizeof (msg ), & pk [0 ]) == 0 );
@@ -179,6 +203,8 @@ void test_schnorrsig_api(void) {
179203 CHECK (ecount == 3 );
180204 CHECK (secp256k1_schnorrsig_verify (vrfy , sig , NULL , sizeof (msg ), & pk [0 ]) == 0 );
181205 CHECK (ecount == 4 );
206+ CHECK (secp256k1_schnorrsig_verify (vrfy , sig , NULL , 0 , & pk [0 ]) == 0 );
207+ CHECK (ecount == 4 );
182208 CHECK (secp256k1_schnorrsig_verify (vrfy , sig , msg , sizeof (msg ), NULL ) == 0 );
183209 CHECK (ecount == 5 );
184210 CHECK (secp256k1_schnorrsig_verify (vrfy , sig , msg , sizeof (msg ), & zero_pk ) == 0 );
@@ -694,10 +720,13 @@ void test_schnorrsig_sign(void) {
694720 secp256k1_keypair keypair ;
695721 const unsigned char msg [32 ] = "this is a msg for a schnorrsig.." ;
696722 unsigned char sig [64 ];
723+ unsigned char sig2 [64 ];
697724 unsigned char zeros64 [64 ] = { 0 };
698725 secp256k1_schnorrsig_extraparams extraparams = SECP256K1_SCHNORRSIG_EXTRAPARAMS_INIT ;
726+ unsigned char aux_rand [32 ];
699727
700728 secp256k1_testrand256 (sk );
729+ secp256k1_testrand256 (aux_rand );
701730 CHECK (secp256k1_keypair_create (ctx , & keypair , sk ));
702731 CHECK (secp256k1_keypair_xonly_pub (ctx , & pk , NULL , & keypair ));
703732 CHECK (secp256k1_schnorrsig_sign (ctx , sig , msg , & keypair , NULL ) == 1 );
@@ -718,6 +747,14 @@ void test_schnorrsig_sign(void) {
718747 extraparams .noncefp = nonce_function_overflowing ;
719748 CHECK (secp256k1_schnorrsig_sign_custom (ctx , sig , msg , sizeof (msg ), & keypair , & extraparams ) == 1 );
720749 CHECK (secp256k1_schnorrsig_verify (ctx , sig , msg , sizeof (msg ), & pk ));
750+
751+ /* When using the default nonce function, schnorrsig_sign_custom produces
752+ * the same result as schnorrsig_sign with aux_rand = extraparams.ndata */
753+ extraparams .noncefp = NULL ;
754+ extraparams .ndata = aux_rand ;
755+ CHECK (secp256k1_schnorrsig_sign_custom (ctx , sig , msg , sizeof (msg ), & keypair , & extraparams ) == 1 );
756+ CHECK (secp256k1_schnorrsig_sign (ctx , sig2 , msg , & keypair , extraparams .ndata ) == 1 );
757+ CHECK (secp256k1_memcmp_var (sig , sig2 , sizeof (sig )) == 0 );
721758}
722759
723760#define N_SIGS 3
@@ -780,6 +817,24 @@ void test_schnorrsig_sign_verify(void) {
780817 secp256k1_scalar_negate (& s , & s );
781818 secp256k1_scalar_get_b32 (& sig [0 ][32 ], & s );
782819 CHECK (!secp256k1_schnorrsig_verify (ctx , sig [0 ], msg [0 ], sizeof (msg [0 ]), & pk ));
820+
821+ /* The empty message can be signed & verified */
822+ CHECK (secp256k1_schnorrsig_sign_custom (ctx , sig [0 ], NULL , 0 , & keypair , NULL ) == 1 );
823+ CHECK (secp256k1_schnorrsig_verify (ctx , sig [0 ], NULL , 0 , & pk ) == 1 );
824+
825+ {
826+ /* Test varying message lengths */
827+ unsigned char msg_large [32 * 8 ];
828+ uint32_t msglen = secp256k1_testrand_int (sizeof (msg_large ));
829+ for (i = 0 ; i < sizeof (msg_large ); i += 32 ) {
830+ secp256k1_testrand256 (& msg_large [i ]);
831+ }
832+ CHECK (secp256k1_schnorrsig_sign_custom (ctx , sig [0 ], msg_large , msglen , & keypair , NULL ) == 1 );
833+ CHECK (secp256k1_schnorrsig_verify (ctx , sig [0 ], msg_large , msglen , & pk ) == 1 );
834+ /* Verification for a random wrong message length fails */
835+ msglen = (msglen + (sizeof (msg_large ) - 1 )) % sizeof (msg_large );
836+ CHECK (secp256k1_schnorrsig_verify (ctx , sig [0 ], msg_large , msglen , & pk ) == 0 );
837+ }
783838}
784839#undef N_SIGS
785840
0 commit comments