@@ -121,6 +121,8 @@ void test_schnorrsig_api(void) {
121
121
secp256k1_xonly_pubkey pk [3 ];
122
122
secp256k1_xonly_pubkey zero_pk ;
123
123
unsigned char sig [64 ];
124
+ secp256k1_schnorrsig_extraparams extraparams = SECP256K1_SCHNORRSIG_EXTRAPARAMS_INIT ;
125
+ secp256k1_schnorrsig_extraparams invalid_extraparams = { 0 };
124
126
125
127
/** setup **/
126
128
secp256k1_context * none = secp256k1_context_create (SECP256K1_CONTEXT_NONE );
@@ -167,6 +169,28 @@ void test_schnorrsig_api(void) {
167
169
CHECK (secp256k1_schnorrsig_sign (sign , sig , msg , & invalid_keypair , NULL ) == 0 );
168
170
CHECK (ecount == 6 );
169
171
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
+
170
194
ecount = 0 ;
171
195
CHECK (secp256k1_schnorrsig_sign (sign , sig , msg , & keypairs [0 ], NULL ) == 1 );
172
196
CHECK (secp256k1_schnorrsig_verify (none , sig , msg , sizeof (msg ), & pk [0 ]) == 0 );
@@ -179,6 +203,8 @@ void test_schnorrsig_api(void) {
179
203
CHECK (ecount == 3 );
180
204
CHECK (secp256k1_schnorrsig_verify (vrfy , sig , NULL , sizeof (msg ), & pk [0 ]) == 0 );
181
205
CHECK (ecount == 4 );
206
+ CHECK (secp256k1_schnorrsig_verify (vrfy , sig , NULL , 0 , & pk [0 ]) == 0 );
207
+ CHECK (ecount == 4 );
182
208
CHECK (secp256k1_schnorrsig_verify (vrfy , sig , msg , sizeof (msg ), NULL ) == 0 );
183
209
CHECK (ecount == 5 );
184
210
CHECK (secp256k1_schnorrsig_verify (vrfy , sig , msg , sizeof (msg ), & zero_pk ) == 0 );
@@ -694,10 +720,13 @@ void test_schnorrsig_sign(void) {
694
720
secp256k1_keypair keypair ;
695
721
const unsigned char msg [32 ] = "this is a msg for a schnorrsig.." ;
696
722
unsigned char sig [64 ];
723
+ unsigned char sig2 [64 ];
697
724
unsigned char zeros64 [64 ] = { 0 };
698
725
secp256k1_schnorrsig_extraparams extraparams = SECP256K1_SCHNORRSIG_EXTRAPARAMS_INIT ;
726
+ unsigned char aux_rand [32 ];
699
727
700
728
secp256k1_testrand256 (sk );
729
+ secp256k1_testrand256 (aux_rand );
701
730
CHECK (secp256k1_keypair_create (ctx , & keypair , sk ));
702
731
CHECK (secp256k1_keypair_xonly_pub (ctx , & pk , NULL , & keypair ));
703
732
CHECK (secp256k1_schnorrsig_sign (ctx , sig , msg , & keypair , NULL ) == 1 );
@@ -718,6 +747,14 @@ void test_schnorrsig_sign(void) {
718
747
extraparams .noncefp = nonce_function_overflowing ;
719
748
CHECK (secp256k1_schnorrsig_sign_custom (ctx , sig , msg , sizeof (msg ), & keypair , & extraparams ) == 1 );
720
749
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 );
721
758
}
722
759
723
760
#define N_SIGS 3
@@ -780,6 +817,24 @@ void test_schnorrsig_sign_verify(void) {
780
817
secp256k1_scalar_negate (& s , & s );
781
818
secp256k1_scalar_get_b32 (& sig [0 ][32 ], & s );
782
819
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
+ }
783
838
}
784
839
#undef N_SIGS
785
840
0 commit comments