Skip to content

Commit 6b87335

Browse files
committed
Merge #147: whitelist: fix SECP256K1_WHITELIST_MAX_N_KEYS constant
27d1c3b whitelist: add test for MAX_N_KEYS (Jonas Nick) c8ac14d whitelist: fix SECP256K1_WHITELIST_MAX_N_KEYS constant (Jonas Nick) Pull request description: ACKs for top commit: real-or-random: utACK 27d1c3b Tree-SHA512: 329099b134811462930866f572914075a3210d81fe15a21f48f26e17bc1a4650c31afdcad7a24af8dc4af093b96300386833d68604be05da89c3f7bc0aabf550
2 parents e290c0f + 27d1c3b commit 6b87335

File tree

3 files changed

+48
-36
lines changed

3 files changed

+48
-36
lines changed

include/secp256k1_whitelist.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
extern "C" {
1414
#endif
1515

16-
#define SECP256K1_WHITELIST_MAX_N_KEYS 256
16+
#define SECP256K1_WHITELIST_MAX_N_KEYS 255
1717

1818
/** Opaque data structure that holds a parsed whitelist proof
1919
*

src/modules/whitelist/main_impl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ int secp256k1_whitelist_signature_parse(const secp256k1_context* ctx, secp256k1_
144144
}
145145

146146
sig->n_keys = input[0];
147-
if (sig->n_keys >= MAX_KEYS || input_len != 1 + 32 * (sig->n_keys + 1)) {
147+
if (sig->n_keys > MAX_KEYS || input_len != 1 + 32 * (sig->n_keys + 1)) {
148148
return 0;
149149
}
150150
memcpy(&sig->data[0], &input[1], 32 * (sig->n_keys + 1));

src/modules/whitelist/tests_impl.h

+46-34
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,39 @@
99

1010
#include "include/secp256k1_whitelist.h"
1111

12-
void test_whitelist_end_to_end(const size_t n_keys) {
12+
void test_whitelist_end_to_end_internal(const unsigned char *summed_seckey, const unsigned char *online_seckey, const secp256k1_pubkey *online_pubkeys, const secp256k1_pubkey *offline_pubkeys, const secp256k1_pubkey *sub_pubkey, const size_t signer_i, const size_t n_keys) {
13+
unsigned char serialized[32 + 4 + 32 * SECP256K1_WHITELIST_MAX_N_KEYS] = {0};
14+
size_t slen = sizeof(serialized);
15+
secp256k1_whitelist_signature sig;
16+
secp256k1_whitelist_signature sig1;
17+
18+
CHECK(secp256k1_whitelist_sign(ctx, &sig, online_pubkeys, offline_pubkeys, n_keys, sub_pubkey, online_seckey, summed_seckey, signer_i, NULL, NULL));
19+
CHECK(secp256k1_whitelist_verify(ctx, &sig, online_pubkeys, offline_pubkeys, n_keys, sub_pubkey) == 1);
20+
/* Check that exchanging keys causes a failure */
21+
CHECK(secp256k1_whitelist_verify(ctx, &sig, offline_pubkeys, online_pubkeys, n_keys, sub_pubkey) != 1);
22+
/* Serialization round trip */
23+
CHECK(secp256k1_whitelist_signature_serialize(ctx, serialized, &slen, &sig) == 1);
24+
CHECK(slen == 33 + 32 * n_keys);
25+
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen) == 1);
26+
/* (Check various bad-length conditions) */
27+
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen + 32) == 0);
28+
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen + 1) == 0);
29+
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen - 1) == 0);
30+
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, 0) == 0);
31+
CHECK(secp256k1_whitelist_verify(ctx, &sig1, online_pubkeys, offline_pubkeys, n_keys, sub_pubkey) == 1);
32+
CHECK(secp256k1_whitelist_verify(ctx, &sig1, offline_pubkeys, online_pubkeys, n_keys, sub_pubkey) != 1);
33+
34+
/* Test n_keys */
35+
CHECK(secp256k1_whitelist_signature_n_keys(&sig) == n_keys);
36+
CHECK(secp256k1_whitelist_signature_n_keys(&sig1) == n_keys);
37+
38+
/* Test bad number of keys in signature */
39+
sig.n_keys = n_keys + 1;
40+
CHECK(secp256k1_whitelist_verify(ctx, &sig, offline_pubkeys, online_pubkeys, n_keys, sub_pubkey) != 1);
41+
sig.n_keys = n_keys;
42+
}
43+
44+
void test_whitelist_end_to_end(const size_t n_keys, int test_all_keys) {
1345
unsigned char **online_seckey = (unsigned char **) malloc(n_keys * sizeof(*online_seckey));
1446
unsigned char **summed_seckey = (unsigned char **) malloc(n_keys * sizeof(*summed_seckey));
1547
secp256k1_pubkey *online_pubkeys = (secp256k1_pubkey *) malloc(n_keys * sizeof(*online_pubkeys));
@@ -51,36 +83,15 @@ void test_whitelist_end_to_end(const size_t n_keys) {
5183
}
5284

5385
/* Sign/verify with each one */
54-
for (i = 0; i < n_keys; i++) {
55-
unsigned char serialized[32 + 4 + 32 * SECP256K1_WHITELIST_MAX_N_KEYS] = {0};
56-
size_t slen = sizeof(serialized);
57-
secp256k1_whitelist_signature sig;
58-
secp256k1_whitelist_signature sig1;
59-
60-
CHECK(secp256k1_whitelist_sign(ctx, &sig, online_pubkeys, offline_pubkeys, n_keys, &sub_pubkey, online_seckey[i], summed_seckey[i], i, NULL, NULL));
61-
CHECK(secp256k1_whitelist_verify(ctx, &sig, online_pubkeys, offline_pubkeys, n_keys, &sub_pubkey) == 1);
62-
/* Check that exchanging keys causes a failure */
63-
CHECK(secp256k1_whitelist_verify(ctx, &sig, offline_pubkeys, online_pubkeys, n_keys, &sub_pubkey) != 1);
64-
/* Serialization round trip */
65-
CHECK(secp256k1_whitelist_signature_serialize(ctx, serialized, &slen, &sig) == 1);
66-
CHECK(slen == 33 + 32 * n_keys);
67-
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen) == 1);
68-
/* (Check various bad-length conditions) */
69-
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen + 32) == 0);
70-
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen + 1) == 0);
71-
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen - 1) == 0);
72-
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, 0) == 0);
73-
CHECK(secp256k1_whitelist_verify(ctx, &sig1, online_pubkeys, offline_pubkeys, n_keys, &sub_pubkey) == 1);
74-
CHECK(secp256k1_whitelist_verify(ctx, &sig1, offline_pubkeys, online_pubkeys, n_keys, &sub_pubkey) != 1);
75-
76-
/* Test n_keys */
77-
CHECK(secp256k1_whitelist_signature_n_keys(&sig) == n_keys);
78-
CHECK(secp256k1_whitelist_signature_n_keys(&sig1) == n_keys);
79-
80-
/* Test bad number of keys in signature */
81-
sig.n_keys = n_keys + 1;
82-
CHECK(secp256k1_whitelist_verify(ctx, &sig, offline_pubkeys, online_pubkeys, n_keys, &sub_pubkey) != 1);
83-
sig.n_keys = n_keys;
86+
if (test_all_keys) {
87+
for (i = 0; i < n_keys; i++) {
88+
test_whitelist_end_to_end_internal(summed_seckey[i], online_seckey[i], online_pubkeys, offline_pubkeys, &sub_pubkey, i, n_keys);
89+
}
90+
} else {
91+
uint32_t rand_idx = secp256k1_testrand_int(n_keys-1);
92+
test_whitelist_end_to_end_internal(summed_seckey[0], online_seckey[0], online_pubkeys, offline_pubkeys, &sub_pubkey, 0, n_keys);
93+
test_whitelist_end_to_end_internal(summed_seckey[rand_idx], online_seckey[rand_idx], online_pubkeys, offline_pubkeys, &sub_pubkey, rand_idx, n_keys);
94+
test_whitelist_end_to_end_internal(summed_seckey[n_keys-1], online_seckey[n_keys-1], online_pubkeys, offline_pubkeys, &sub_pubkey, n_keys-1, n_keys);
8495
}
8596

8697
for (i = 0; i < n_keys; i++) {
@@ -142,9 +153,10 @@ void run_whitelist_tests(void) {
142153
test_whitelist_bad_parse();
143154
test_whitelist_bad_serialize();
144155
for (i = 0; i < count; i++) {
145-
test_whitelist_end_to_end(1);
146-
test_whitelist_end_to_end(10);
147-
test_whitelist_end_to_end(50);
156+
test_whitelist_end_to_end(1, 1);
157+
test_whitelist_end_to_end(10, 1);
158+
test_whitelist_end_to_end(50, 1);
159+
test_whitelist_end_to_end(SECP256K1_WHITELIST_MAX_N_KEYS, 0);
148160
}
149161
}
150162

0 commit comments

Comments
 (0)