Skip to content

Commit ad34c62

Browse files
committed
add extract_sec edge case tests
1 parent 55a3104 commit ad34c62

File tree

3 files changed

+45
-2
lines changed

3 files changed

+45
-2
lines changed

schnorr_adaptor_example

0 Bytes
Binary file not shown.

src/modules/schnorr_adaptor/main_impl.h

+8
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,14 @@ int secp256k1_schnorr_adaptor_extract_sec(const secp256k1_context *ctx, unsigned
328328
return 0;
329329
}
330330

331+
/*TODO: should we parse presig[0:33] & sig[0:32], to make sure the presig &
332+
* has valid public nonce point?
333+
*
334+
* But we don't care about their validity here right? Then why do we ARG_CHECK
335+
* presig[0] parity byte?
336+
*
337+
* Here, the inputs are invalid but the output is valid :/ */
338+
331339
secp256k1_scalar_negate(&s, &s);
332340
secp256k1_scalar_add(&t, &t, &s);
333341
/* `adaptor_adapt` negates the secret adaptor t when R’.y is odd, during

src/modules/schnorr_adaptor/tests_impl.h

+37-2
Original file line numberDiff line numberDiff line change
@@ -1147,17 +1147,52 @@ static void test_schnorr_adaptor_edge_cases(void) {
11471147
CHECK(secp256k1_memcmp_var(extracted_sec_adaptor, sec_adaptor, sizeof(extracted_sec_adaptor)) == 0);
11481148
{
11491149
/* overflowing pre_sig[33:65] */
1150+
unsigned char extracted_sec_adaptor_tmp[32];
1151+
unsigned char pre_sig_tmp[65];
1152+
memcpy(pre_sig_tmp, pre_sig, sizeof(pre_sig_tmp));
1153+
memset(&pre_sig_tmp[33], 0xFF, 32);
1154+
CHECK(secp256k1_schnorr_adaptor_extract_sec(CTX, extracted_sec_adaptor_tmp, pre_sig_tmp, sig) == 0);
11501155
}
11511156
{
11521157
/* overflowing sig[32:64] */
1158+
unsigned char extracted_sec_adaptor_tmp[32];
1159+
unsigned char sig_tmp[64];
1160+
memcpy(sig_tmp, sig, sizeof(sig_tmp));
1161+
memset(&sig_tmp[32], 0xFF, 32);
1162+
CHECK(secp256k1_schnorr_adaptor_extract_sec(CTX, extracted_sec_adaptor_tmp, pre_sig, sig_tmp) == 0);
11531163
}
11541164
{
1155-
/* any flipped bit in the pre-signature will extract
1165+
/* any flipped bit in pre_sig[33:65] will extract
11561166
* an invalid secret adaptor */
1167+
unsigned char extracted_sec_adaptor_tmp[32];
1168+
unsigned char pre_sig_tmp[65];
1169+
memcpy(pre_sig_tmp, pre_sig, sizeof(pre_sig_tmp));
1170+
rand_flip_bit(&pre_sig_tmp[33], sizeof(pre_sig_tmp) - 33);
1171+
CHECK(secp256k1_schnorr_adaptor_extract_sec(CTX, extracted_sec_adaptor_tmp, pre_sig_tmp, sig) == 1);
1172+
CHECK(secp256k1_memcmp_var(extracted_sec_adaptor_tmp, sec_adaptor, sizeof(extracted_sec_adaptor_tmp)) != 0);
11571173
}
11581174
{
1159-
/* any flipped bit in the signature will extract
1175+
/* any flipped bit in sig[32:64] will extract
11601176
* an invalid secret adaptor */
1177+
unsigned char extracted_sec_adaptor_tmp[32];
1178+
unsigned char sig_tmp[64];
1179+
memcpy(sig_tmp, sig, sizeof(sig_tmp));
1180+
rand_flip_bit(&sig_tmp[32], sizeof(sig_tmp) - 32);
1181+
CHECK(secp256k1_schnorr_adaptor_extract_sec(CTX, extracted_sec_adaptor_tmp, pre_sig, sig_tmp) == 1);
1182+
CHECK(secp256k1_memcmp_var(extracted_sec_adaptor_tmp, sec_adaptor, sizeof(extracted_sec_adaptor_tmp)) != 0);
1183+
}
1184+
{
1185+
/* invalid presig[0:33] or sig[0:32] does not
1186+
* result in an invalid output */
1187+
unsigned char extracted_sec_adaptor_tmp[32];
1188+
unsigned char pre_sig_tmp[65];
1189+
unsigned char sig_tmp[64];
1190+
memcpy(pre_sig_tmp, pre_sig, sizeof(pre_sig_tmp));
1191+
memcpy(sig_tmp, sig, sizeof(sig_tmp));
1192+
memset(&pre_sig_tmp[1], 0xFF, 32);
1193+
memset(sig_tmp, 0xFF, 32);
1194+
CHECK(secp256k1_schnorr_adaptor_extract_sec(CTX, extracted_sec_adaptor_tmp, pre_sig_tmp, sig_tmp) == 1);
1195+
CHECK(secp256k1_memcmp_var(extracted_sec_adaptor_tmp, sec_adaptor, sizeof(extracted_sec_adaptor_tmp)) == 0);
11611196
}
11621197
}
11631198

0 commit comments

Comments
 (0)