Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 8f61bd8

Browse files
committedOct 15, 2024·
add extract_sec edge case tests
1 parent 55a3104 commit 8f61bd8

File tree

3 files changed

+55
-8
lines changed

3 files changed

+55
-8
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

+47-8
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@ static void test_schnorr_adaptor_edge_cases(void) {
10261026
CHECK(secp256k1_schnorr_adaptor_presign(CTX, pre_sig, msg, &keypair, &adaptor, aux_rand) == 1);
10271027

10281028
/* TODO: test with different nonce functions after `schnorr_adaptor_presign_custom`
1029-
* implementation */
1029+
* gets implemented */
10301030

10311031
/* Test schnorr_adaptor_extract */
10321032
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) {
10841084
CHECK(secp256k1_schnorr_adaptor_extract(CTX, &extracted_adaptor_tmp, pre_sig, msg_tmp, &pk) == 1);
10851085
CHECK(secp256k1_ec_pubkey_cmp(CTX, &extracted_adaptor_tmp, &adaptor) != 0);
10861086
}
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 */
10901090

10911091
/* Test schnorr_adaptor_adapt */
10921092
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) {
11261126
unsigned char pre_sig_tmp[65];
11271127
memcpy(pre_sig_tmp, pre_sig, sizeof(pre_sig_tmp));
11281128
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+
}
11311135
}
11321136
{
11331137
/* any flipped bit in the sec_adaptor will result in an
@@ -1147,17 +1151,52 @@ static void test_schnorr_adaptor_edge_cases(void) {
11471151
CHECK(secp256k1_memcmp_var(extracted_sec_adaptor, sec_adaptor, sizeof(extracted_sec_adaptor)) == 0);
11481152
{
11491153
/* 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);
11501159
}
11511160
{
11521161
/* 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);
11531167
}
11541168
{
1155-
/* any flipped bit in the pre-signature will extract
1169+
/* any flipped bit in pre_sig[33:65] will extract
11561170
* 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);
11571177
}
11581178
{
1159-
/* any flipped bit in the signature will extract
1179+
/* any flipped bit in sig[32:64] will extract
11601180
* 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);
11611200
}
11621201
}
11631202

0 commit comments

Comments
 (0)
Please sign in to comment.