@@ -1026,7 +1026,7 @@ static void test_schnorr_adaptor_edge_cases(void) {
1026
1026
CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
1027
1027
1028
1028
/* TODO: test with different nonce functions after `schnorr_adaptor_presign_custom`
1029
- * implementation */
1029
+ * gets implemented */
1030
1030
1031
1031
/* Test schnorr_adaptor_extract */
1032
1032
CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
@@ -1084,9 +1084,9 @@ static void test_schnorr_adaptor_edge_cases(void) {
1084
1084
CHECK (secp256k1_schnorr_adaptor_extract (CTX , & extracted_adaptor_tmp , pre_sig , msg_tmp , & pk ) == 1 );
1085
1085
CHECK (secp256k1_ec_pubkey_cmp (CTX , & extracted_adaptor_tmp , & adaptor ) != 0 );
1086
1086
}
1087
- /* Note: presig test vectors 12, 13, 14 will cover the edge case
1088
- * of adaptor_extract returning 0 when [1] R = infinity, or
1089
- * [2] T = infinity. So, we don't need to test such scenarios here */
1087
+ /* Note: presig test vectors 12, 13, 14 will cover the case where
1088
+ * adaptor_extract returns 0 when [1] R = infinity, or [2] T = infinity.
1089
+ * So, we don't need to test those scenarios here */
1090
1090
1091
1091
/* Test schnorr_adaptor_adapt */
1092
1092
CHECK (secp256k1_schnorr_adaptor_presign (CTX , pre_sig , msg , & keypair , & adaptor , aux_rand ) == 1 );
@@ -1126,8 +1126,12 @@ static void test_schnorr_adaptor_edge_cases(void) {
1126
1126
unsigned char pre_sig_tmp [65 ];
1127
1127
memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1128
1128
rand_flip_bit (& pre_sig_tmp [1 ], sizeof (pre_sig_tmp ) - 1 );
1129
- CHECK (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig_tmp , sec_adaptor ) == 1 );
1130
- CHECK (secp256k1_schnorrsig_verify (CTX , sig_tmp , msg , sizeof (msg ), & pk ) == 0 );
1129
+ /* depending on which bit was flipped adaptor_adapt can either
1130
+ * return 0 (parsing pre_sig_tmp[33:65] failed) or 1 (parsing
1131
+ * success but invalid sig will be generated) */
1132
+ if (secp256k1_schnorr_adaptor_adapt (CTX , sig_tmp , pre_sig_tmp , sec_adaptor )) {
1133
+ CHECK (secp256k1_schnorrsig_verify (CTX , sig_tmp , msg , sizeof (msg ), & pk ) == 0 );
1134
+ }
1131
1135
}
1132
1136
{
1133
1137
/* any flipped bit in the sec_adaptor will result in an
@@ -1147,17 +1151,52 @@ static void test_schnorr_adaptor_edge_cases(void) {
1147
1151
CHECK (secp256k1_memcmp_var (extracted_sec_adaptor , sec_adaptor , sizeof (extracted_sec_adaptor )) == 0 );
1148
1152
{
1149
1153
/* overflowing pre_sig[33:65] */
1154
+ unsigned char extracted_sec_adaptor_tmp [32 ];
1155
+ unsigned char pre_sig_tmp [65 ];
1156
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1157
+ memset (& pre_sig_tmp [33 ], 0xFF , 32 );
1158
+ CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor_tmp , pre_sig_tmp , sig ) == 0 );
1150
1159
}
1151
1160
{
1152
1161
/* overflowing sig[32:64] */
1162
+ unsigned char extracted_sec_adaptor_tmp [32 ];
1163
+ unsigned char sig_tmp [64 ];
1164
+ memcpy (sig_tmp , sig , sizeof (sig_tmp ));
1165
+ memset (& sig_tmp [32 ], 0xFF , 32 );
1166
+ CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor_tmp , pre_sig , sig_tmp ) == 0 );
1153
1167
}
1154
1168
{
1155
- /* any flipped bit in the pre-signature will extract
1169
+ /* any flipped bit in pre_sig[33:65] will extract
1156
1170
* an invalid secret adaptor */
1171
+ unsigned char extracted_sec_adaptor_tmp [32 ];
1172
+ unsigned char pre_sig_tmp [65 ];
1173
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1174
+ rand_flip_bit (& pre_sig_tmp [33 ], sizeof (pre_sig_tmp ) - 33 );
1175
+ CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor_tmp , pre_sig_tmp , sig ) == 1 );
1176
+ CHECK (secp256k1_memcmp_var (extracted_sec_adaptor_tmp , sec_adaptor , sizeof (extracted_sec_adaptor_tmp )) != 0 );
1157
1177
}
1158
1178
{
1159
- /* any flipped bit in the signature will extract
1179
+ /* any flipped bit in sig[32:64] will extract
1160
1180
* an invalid secret adaptor */
1181
+ unsigned char extracted_sec_adaptor_tmp [32 ];
1182
+ unsigned char sig_tmp [64 ];
1183
+ memcpy (sig_tmp , sig , sizeof (sig_tmp ));
1184
+ rand_flip_bit (& sig_tmp [32 ], sizeof (sig_tmp ) - 32 );
1185
+ CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor_tmp , pre_sig , sig_tmp ) == 1 );
1186
+ CHECK (secp256k1_memcmp_var (extracted_sec_adaptor_tmp , sec_adaptor , sizeof (extracted_sec_adaptor_tmp )) != 0 );
1187
+ }
1188
+ {
1189
+ /* invalid presig[0:33] or sig[0:32] does not
1190
+ * neccessarily result in an invalid output */
1191
+ unsigned char extracted_sec_adaptor_tmp [32 ];
1192
+ unsigned char pre_sig_tmp [65 ];
1193
+ unsigned char sig_tmp [64 ];
1194
+ memcpy (pre_sig_tmp , pre_sig , sizeof (pre_sig_tmp ));
1195
+ memcpy (sig_tmp , sig , sizeof (sig_tmp ));
1196
+ memset (& pre_sig_tmp [1 ], 0xFF , 32 );
1197
+ memset (sig_tmp , 0xFF , 32 );
1198
+ CHECK (secp256k1_schnorr_adaptor_extract_sec (CTX , extracted_sec_adaptor_tmp , pre_sig_tmp , sig_tmp ) == 1 );
1199
+ CHECK (secp256k1_memcmp_var (extracted_sec_adaptor_tmp , sec_adaptor , sizeof (extracted_sec_adaptor_tmp )) == 0 );
1161
1200
}
1162
1201
}
1163
1202
0 commit comments