|
9 | 9 |
|
10 | 10 | #include "include/secp256k1_whitelist.h"
|
11 | 11 |
|
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) { |
13 | 45 | unsigned char **online_seckey = (unsigned char **) malloc(n_keys * sizeof(*online_seckey));
|
14 | 46 | unsigned char **summed_seckey = (unsigned char **) malloc(n_keys * sizeof(*summed_seckey));
|
15 | 47 | 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) {
|
51 | 83 | }
|
52 | 84 |
|
53 | 85 | /* 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); |
84 | 95 | }
|
85 | 96 |
|
86 | 97 | for (i = 0; i < n_keys; i++) {
|
@@ -142,9 +153,10 @@ void run_whitelist_tests(void) {
|
142 | 153 | test_whitelist_bad_parse();
|
143 | 154 | test_whitelist_bad_serialize();
|
144 | 155 | 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); |
148 | 160 | }
|
149 | 161 | }
|
150 | 162 |
|
|
0 commit comments