Bitcoin Core 30.99.0
P2P Digital Currency
tests_impl.h
Go to the documentation of this file.
1/***********************************************************************
2 * Distributed under the MIT software license, see the accompanying *
3 * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
4 ***********************************************************************/
5
6#ifndef SECP256K1_MODULE_MUSIG_TESTS_IMPL_H
7#define SECP256K1_MODULE_MUSIG_TESTS_IMPL_H
8
9#include <stdlib.h>
10#include <string.h>
11
12#include "../../../include/secp256k1.h"
13#include "../../../include/secp256k1_extrakeys.h"
14#include "../../../include/secp256k1_musig.h"
15
16#include "session.h"
17#include "keyagg.h"
18#include "../../scalar.h"
19#include "../../field.h"
20#include "../../group.h"
21#include "../../hash.h"
22#include "../../util.h"
23#include "../../unit_test.h"
24
25#include "vectors.h"
26
27static int create_keypair_and_pk(secp256k1_keypair *keypair, secp256k1_pubkey *pk, const unsigned char *sk) {
28 int ret;
29 secp256k1_keypair keypair_tmp;
30 ret = secp256k1_keypair_create(CTX, &keypair_tmp, sk);
31 ret &= secp256k1_keypair_pub(CTX, pk, &keypair_tmp);
32 if (keypair != NULL) {
33 *keypair = keypair_tmp;
34 }
35 return ret;
36}
37
38/* Just a simple (non-tweaked) 2-of-2 MuSig aggregate, sign, verify
39 * test. */
40static void musig_simple_test_internal(void) {
41 unsigned char sk[2][32];
42 secp256k1_keypair keypair[2];
43 secp256k1_musig_pubnonce pubnonce[2];
44 const secp256k1_musig_pubnonce *pubnonce_ptr[2];
46 unsigned char msg[32];
49 unsigned char session_secrand[2][32];
50 secp256k1_musig_secnonce secnonce[2];
52 const secp256k1_pubkey *pk_ptr[2];
53 secp256k1_musig_partial_sig partial_sig[2];
54 const secp256k1_musig_partial_sig *partial_sig_ptr[2];
55 unsigned char final_sig[64];
57 int i;
58
60 for (i = 0; i < 2; i++) {
61 testrand256(sk[i]);
62 pk_ptr[i] = &pk[i];
63 pubnonce_ptr[i] = &pubnonce[i];
64 partial_sig_ptr[i] = &partial_sig[i];
65
66 CHECK(create_keypair_and_pk(&keypair[i], &pk[i], sk[i]));
67 if (i == 0) {
68 testrand256(session_secrand[i]);
69 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[i], &pubnonce[i], session_secrand[i], sk[i], &pk[i], NULL, NULL, NULL) == 1);
70 } else {
71 uint64_t nonrepeating_cnt = 0;
72 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[i], &pubnonce[i], nonrepeating_cnt, &keypair[i], NULL, NULL, NULL) == 1);
73 }
74 }
75
76 CHECK(secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, pk_ptr, 2) == 1);
77 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 2) == 1);
78 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, msg, &keyagg_cache) == 1);
79
80 for (i = 0; i < 2; i++) {
81 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig[i], &secnonce[i], &keypair[i], &keyagg_cache, &session) == 1);
82 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[i], &pubnonce[i], &pk[i], &keyagg_cache, &session) == 1);
83 }
84
85 CHECK(secp256k1_musig_partial_sig_agg(CTX, final_sig, &session, partial_sig_ptr, 2) == 1);
86 CHECK(secp256k1_schnorrsig_verify(CTX, final_sig, msg, sizeof(msg), &agg_pk) == 1);
87}
88
89/* Generate two pubnonces such that both group elements of their sum (calculated
90 * with secp256k1_musig_sum_pubnonces) are infinity. */
92 secp256k1_ge ge[2];
93 int i;
94 secp256k1_gej summed_pubnonces[2];
95 const secp256k1_musig_pubnonce *pubnonce_ptr[2];
96
99
100 for (i = 0; i < 2; i++) {
101 secp256k1_musig_pubnonce_save(&pubnonce[i], ge);
102 pubnonce_ptr[i] = &pubnonce[i];
103 secp256k1_ge_neg(&ge[0], &ge[0]);
104 secp256k1_ge_neg(&ge[1], &ge[1]);
105 }
106
107 secp256k1_musig_sum_pubnonces(CTX, summed_pubnonces, pubnonce_ptr, 2);
108 CHECK(secp256k1_gej_is_infinity(&summed_pubnonces[0]));
109 CHECK(secp256k1_gej_is_infinity(&summed_pubnonces[1]));
110}
111
112int memcmp_and_randomize(unsigned char *value, const unsigned char *expected, size_t len) {
113 int ret;
114 size_t i;
115 ret = secp256k1_memcmp_var(value, expected, len);
116 for (i = 0; i < len; i++) {
117 value[i] = testrand_bits(8);
118 }
119 return ret;
120}
121
122static void musig_api_tests(void) {
123 secp256k1_musig_partial_sig partial_sig[2];
124 const secp256k1_musig_partial_sig *partial_sig_ptr[2];
125 secp256k1_musig_partial_sig invalid_partial_sig;
126 const secp256k1_musig_partial_sig *invalid_partial_sig_ptr[2];
127 unsigned char pre_sig[64];
128 unsigned char buf[32];
129 unsigned char sk[2][32];
130 secp256k1_keypair keypair[2];
131 secp256k1_keypair invalid_keypair;
132 unsigned char max64[64];
133 unsigned char zeros132[132] = { 0 };
134 unsigned char session_secrand[2][32];
135 unsigned char nonrepeating_cnt = 0;
136 secp256k1_musig_secnonce secnonce[2];
137 secp256k1_musig_secnonce secnonce_tmp;
138 secp256k1_musig_secnonce invalid_secnonce;
139 secp256k1_musig_pubnonce pubnonce[2];
140 const secp256k1_musig_pubnonce *pubnonce_ptr[2];
141 unsigned char pubnonce_ser[66];
142 secp256k1_musig_pubnonce inf_pubnonce[2];
143 const secp256k1_musig_pubnonce *inf_pubnonce_ptr[2];
144 secp256k1_musig_pubnonce invalid_pubnonce;
145 const secp256k1_musig_pubnonce *invalid_pubnonce_ptr[1];
147 unsigned char aggnonce_ser[66];
148 unsigned char msg[32];
150 secp256k1_pubkey full_agg_pk;
151 secp256k1_musig_keyagg_cache keyagg_cache;
152 secp256k1_musig_keyagg_cache invalid_keyagg_cache;
154 secp256k1_musig_session invalid_session;
156 const secp256k1_pubkey *pk_ptr[2];
157 secp256k1_pubkey invalid_pk;
158 const secp256k1_pubkey *invalid_pk_ptr2[2];
159 const secp256k1_pubkey *invalid_pk_ptr3[3];
160 unsigned char tweak[32];
161 int i;
162
164 memset(max64, 0xff, sizeof(max64));
165 memset(&invalid_keypair, 0, sizeof(invalid_keypair));
166 memset(&invalid_pk, 0, sizeof(invalid_pk));
167 memset(&invalid_secnonce, 0, sizeof(invalid_secnonce));
168 memset(&invalid_partial_sig, 0, sizeof(invalid_partial_sig));
169 pubnonce_summing_to_inf(inf_pubnonce);
170 /* Simulate structs being uninitialized by setting it to 0s. We don't want
171 * to produce undefined behavior by actually providing uninitialized
172 * structs. */
173 memset(&invalid_keyagg_cache, 0, sizeof(invalid_keyagg_cache));
174 memset(&invalid_pk, 0, sizeof(invalid_pk));
175 memset(&invalid_pubnonce, 0, sizeof(invalid_pubnonce));
176 memset(&invalid_session, 0, sizeof(invalid_session));
177
180 for (i = 0; i < 2; i++) {
181 pk_ptr[i] = &pk[i];
182 invalid_pk_ptr2[i] = &invalid_pk;
183 invalid_pk_ptr3[i] = &pk[i];
184 pubnonce_ptr[i] = &pubnonce[i];
185 inf_pubnonce_ptr[i] = &inf_pubnonce[i];
186 partial_sig_ptr[i] = &partial_sig[i];
187 invalid_partial_sig_ptr[i] = &partial_sig[i];
188 testrand256(session_secrand[i]);
189 testrand256(sk[i]);
190 CHECK(create_keypair_and_pk(&keypair[i], &pk[i], sk[i]));
191 }
192 invalid_pubnonce_ptr[0] = &invalid_pubnonce;
193 invalid_partial_sig_ptr[0] = &invalid_partial_sig;
194 /* invalid_pk_ptr3 has two valid, one invalid pk, which is important to test
195 * musig_pubkey_agg */
196 invalid_pk_ptr3[2] = &invalid_pk;
197
201 CHECK(secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, pk_ptr, 2) == 1);
202 CHECK(secp256k1_musig_pubkey_agg(CTX, NULL, &keyagg_cache, pk_ptr, 2) == 1);
203 CHECK(secp256k1_musig_pubkey_agg(CTX, &agg_pk, NULL, pk_ptr, 2) == 1);
204 /* check that NULL in array of public key pointers is not allowed */
205 for (i = 0; i < 2; i++) {
206 const secp256k1_pubkey *original_ptr = pk_ptr[i];
207 pk_ptr[i] = NULL;
208 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_agg(CTX, &agg_pk, NULL, pk_ptr, 2));
209 pk_ptr[i] = original_ptr;
210 }
211 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, NULL, 2));
212 CHECK(memcmp_and_randomize(agg_pk.data, zeros132, sizeof(agg_pk.data)) == 0);
213 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, invalid_pk_ptr2, 2));
214 CHECK(memcmp_and_randomize(agg_pk.data, zeros132, sizeof(agg_pk.data)) == 0);
215 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, invalid_pk_ptr3, 3));
216 CHECK(memcmp_and_randomize(agg_pk.data, zeros132, sizeof(agg_pk.data)) == 0);
217 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, pk_ptr, 0));
218 CHECK(memcmp_and_randomize(agg_pk.data, zeros132, sizeof(agg_pk.data)) == 0);
219 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, NULL, 0));
220 CHECK(memcmp_and_randomize(agg_pk.data, zeros132, sizeof(agg_pk.data)) == 0);
221
222 CHECK(secp256k1_musig_pubkey_agg(CTX, &agg_pk, &keyagg_cache, pk_ptr, 2) == 1);
223
224 /* pubkey_get */
225 CHECK(secp256k1_musig_pubkey_get(CTX, &full_agg_pk, &keyagg_cache) == 1);
226 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_get(CTX, NULL, &keyagg_cache));
227 CHECK_ILLEGAL(CTX, secp256k1_musig_pubkey_get(CTX, &full_agg_pk, NULL));
228 CHECK(secp256k1_memcmp_var(&full_agg_pk, zeros132, sizeof(full_agg_pk)) == 0);
229
231 {
232 int (*tweak_func[2]) (const secp256k1_context* ctx, secp256k1_pubkey *output_pubkey, secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *tweak32);
235 for (i = 0; i < 2; i++) {
236 secp256k1_pubkey tmp_output_pk;
237 secp256k1_musig_keyagg_cache tmp_keyagg_cache = keyagg_cache;
238 CHECK((*tweak_func[i])(CTX, &tmp_output_pk, &tmp_keyagg_cache, tweak) == 1);
239 /* Reset keyagg_cache */
240 tmp_keyagg_cache = keyagg_cache;
241 CHECK((*tweak_func[i])(CTX, NULL, &tmp_keyagg_cache, tweak) == 1);
242 tmp_keyagg_cache = keyagg_cache;
243 CHECK_ILLEGAL(CTX, (*tweak_func[i])(CTX, &tmp_output_pk, NULL, tweak));
244 CHECK(memcmp_and_randomize(tmp_output_pk.data, zeros132, sizeof(tmp_output_pk.data)) == 0);
245 tmp_keyagg_cache = keyagg_cache;
246 CHECK_ILLEGAL(CTX, (*tweak_func[i])(CTX, &tmp_output_pk, &tmp_keyagg_cache, NULL));
247 CHECK(memcmp_and_randomize(tmp_output_pk.data, zeros132, sizeof(tmp_output_pk.data)) == 0);
248 tmp_keyagg_cache = keyagg_cache;
249 CHECK((*tweak_func[i])(CTX, &tmp_output_pk, &tmp_keyagg_cache, max64) == 0);
250 CHECK(memcmp_and_randomize(tmp_output_pk.data, zeros132, sizeof(tmp_output_pk.data)) == 0);
251 tmp_keyagg_cache = keyagg_cache;
252 /* Uninitialized keyagg_cache */
253 CHECK_ILLEGAL(CTX, (*tweak_func[i])(CTX, &tmp_output_pk, &invalid_keyagg_cache, tweak));
254 CHECK(memcmp_and_randomize(tmp_output_pk.data, zeros132, sizeof(tmp_output_pk.data)) == 0);
255 }
256 }
257
259 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &pk[0], msg, &keyagg_cache, max64) == 1);
260 /* nonce_gen, if successful, sets session_secrand to the zero array, which
261 * makes subsequent nonce_gen calls with the same session_secrand fail. So
262 * check that session_secrand is indeed the zero array and fill it with
263 * random values again. */
264 CHECK(memcmp_and_randomize(session_secrand[0], zeros132, sizeof(session_secrand[0])) == 0);
265
266 CHECK_ILLEGAL(STATIC_CTX, secp256k1_musig_nonce_gen(STATIC_CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &pk[0], msg, &keyagg_cache, max64));
267 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
268
269 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen(CTX, NULL, &pubnonce[0], session_secrand[0], sk[0], &pk[0], msg, &keyagg_cache, max64));
270
271 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen(CTX, &secnonce[0], NULL, session_secrand[0], sk[0], &pk[0], msg, &keyagg_cache, max64));
272 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
273
274 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], NULL, sk[0], &pk[0], msg, &keyagg_cache, max64));
275 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
276
277 /* session_secrand = 0 is disallowed because it indicates a faulty RNG */
278 memcpy(&session_secrand[0], zeros132, sizeof(session_secrand[0]));
279 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], zeros132, sk[0], &pk[0], msg, &keyagg_cache, max64) == 0);
280 CHECK(memcmp_and_randomize(session_secrand[0], zeros132, sizeof(session_secrand[0])) == 0);
281 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
282
283 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], NULL, &pk[0], msg, &keyagg_cache, max64) == 1);
284 CHECK(memcmp_and_randomize(session_secrand[0], zeros132, sizeof(session_secrand[0])) == 0);
285
286 /* invalid seckey */
287 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], max64, &pk[0], msg, &keyagg_cache, max64) == 0);
288 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
289
290 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], NULL, msg, &keyagg_cache, max64));
291 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
292
293 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &invalid_pk, msg, &keyagg_cache, max64));
294 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
295
296 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &pk[0], NULL, &keyagg_cache, max64) == 1);
297 CHECK(memcmp_and_randomize(session_secrand[0], zeros132, sizeof(session_secrand[0])) == 0);
298
299 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &pk[0], msg, NULL, max64) == 1);
300 CHECK(memcmp_and_randomize(session_secrand[0], zeros132, sizeof(session_secrand[0])) == 0);
301
302 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &pk[0], msg, &invalid_keyagg_cache, max64));
303 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
304
305 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk[0], &pk[0], msg, &keyagg_cache, NULL) == 1);
306 CHECK(memcmp_and_randomize(session_secrand[0], zeros132, sizeof(session_secrand[0])) == 0);
307
308 /* Every in-argument except session_secrand and pubkey can be NULL */
309 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], NULL, &pk[0], NULL, NULL, NULL) == 1);
310 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[1], &pubnonce[1], session_secrand[1], sk[1], &pk[1], NULL, NULL, NULL) == 1);
311
313 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &keypair[0], msg, &keyagg_cache, max64) == 1);
314 CHECK_ILLEGAL(STATIC_CTX, secp256k1_musig_nonce_gen_counter(STATIC_CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &keypair[0], msg, &keyagg_cache, max64));
315 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
316 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen_counter(CTX, NULL, &pubnonce[0], nonrepeating_cnt, &keypair[0], msg, &keyagg_cache, max64));
317 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], NULL, nonrepeating_cnt, &keypair[0], msg, &keyagg_cache, max64));
318 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
319 /* using nonce_gen_counter requires keypair */
320 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, NULL, msg, &keyagg_cache, max64));
321 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
322 /* invalid keypair */
323 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &invalid_keypair, msg, &keyagg_cache, max64));
324 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
325 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &keypair[0], NULL, &keyagg_cache, max64) == 1);
326 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &keypair[0], msg, NULL, max64) == 1);
327 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &keypair[0], msg, &invalid_keyagg_cache, max64));
328 CHECK(memcmp_and_randomize(secnonce[0].data, zeros132, sizeof(secnonce[0].data)) == 0);
329 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt,&keypair[0], msg, &keyagg_cache, NULL) == 1);
330
331 /* Every in-argument except nonrepeating_cnt and keypair can be NULL */
332 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[0], &pubnonce[0], nonrepeating_cnt, &keypair[0], NULL, NULL, NULL) == 1);
333 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce[1], &pubnonce[1], nonrepeating_cnt, &keypair[1], NULL, NULL, NULL) == 1);
334
335
339 CHECK(memcmp_and_randomize(pubnonce_ser, zeros132, sizeof(pubnonce_ser)) == 0);
340 CHECK_ILLEGAL(CTX, secp256k1_musig_pubnonce_serialize(CTX, pubnonce_ser, &invalid_pubnonce));
341 CHECK(memcmp_and_randomize(pubnonce_ser, zeros132, sizeof(pubnonce_ser)) == 0);
342 CHECK(secp256k1_musig_pubnonce_serialize(CTX, pubnonce_ser, &pubnonce[0]) == 1);
343
344 CHECK(secp256k1_musig_pubnonce_parse(CTX, &pubnonce[0], pubnonce_ser) == 1);
347 CHECK(secp256k1_musig_pubnonce_parse(CTX, &pubnonce[0], zeros132) == 0);
348 CHECK(secp256k1_musig_pubnonce_parse(CTX, &pubnonce[0], pubnonce_ser) == 1);
349
350 {
351 /* Check that serialize and parse results in the same value */
353 CHECK(secp256k1_musig_pubnonce_serialize(CTX, pubnonce_ser, &pubnonce[0]) == 1);
354 CHECK(secp256k1_musig_pubnonce_parse(CTX, &tmp, pubnonce_ser) == 1);
355 CHECK(secp256k1_memcmp_var(&tmp, &pubnonce[0], sizeof(tmp)) == 0);
356 }
357
359 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 2) == 1);
360 /* check that NULL in array of public nonce pointers is not allowed */
361 for (i = 0; i < 2; i++) {
362 const secp256k1_musig_pubnonce *original_ptr = pubnonce_ptr[i];
363 pubnonce_ptr[i] = NULL;
364 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 2));
365 pubnonce_ptr[i] = original_ptr;
366 }
367 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_agg(CTX, NULL, pubnonce_ptr, 2));
368 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_agg(CTX, &aggnonce, NULL, 2));
369 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 0));
370 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_agg(CTX, &aggnonce, invalid_pubnonce_ptr, 1));
371 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, inf_pubnonce_ptr, 2) == 1);
372 {
373 /* Check that the aggnonce encodes two points at infinity */
374 secp256k1_ge aggnonce_pt[2];
375 secp256k1_musig_aggnonce_load(CTX, aggnonce_pt, &aggnonce);
376 for (i = 0; i < 2; i++) {
377 secp256k1_ge_is_infinity(&aggnonce_pt[i]);
378 }
379 }
380 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 2) == 1);
381
383 CHECK(secp256k1_musig_aggnonce_serialize(CTX, aggnonce_ser, &aggnonce) == 1);
386 CHECK(memcmp_and_randomize(aggnonce_ser, zeros132, sizeof(aggnonce_ser)) == 0);
388 CHECK(memcmp_and_randomize(aggnonce_ser, zeros132, sizeof(aggnonce_ser)) == 0);
389 CHECK(secp256k1_musig_aggnonce_serialize(CTX, aggnonce_ser, &aggnonce) == 1);
390
391 CHECK(secp256k1_musig_aggnonce_parse(CTX, &aggnonce, aggnonce_ser) == 1);
394 CHECK(secp256k1_musig_aggnonce_parse(CTX, &aggnonce, zeros132) == 1);
395 CHECK(secp256k1_musig_aggnonce_parse(CTX, &aggnonce, aggnonce_ser) == 1);
396
397 {
398 /* Check that serialize and parse results in the same value */
400 CHECK(secp256k1_musig_aggnonce_serialize(CTX, aggnonce_ser, &aggnonce) == 1);
401 CHECK(secp256k1_musig_aggnonce_parse(CTX, &tmp, aggnonce_ser) == 1);
402 CHECK(secp256k1_memcmp_var(&tmp, &aggnonce, sizeof(tmp)) == 0);
403 }
404
406 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, msg, &keyagg_cache) == 1);
407 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_process(CTX, NULL, &aggnonce, msg, &keyagg_cache));
408 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_process(CTX, &session, NULL, msg, &keyagg_cache));
409 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_process(CTX, &session, (secp256k1_musig_aggnonce*) &invalid_pubnonce, msg, &keyagg_cache));
410 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_process(CTX, &session, &aggnonce, NULL, &keyagg_cache));
411 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_process(CTX, &session, &aggnonce, msg, NULL));
412 CHECK_ILLEGAL(CTX, secp256k1_musig_nonce_process(CTX, &session, &aggnonce, msg, &invalid_keyagg_cache));
413
414 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, msg, &keyagg_cache) == 1);
415
416 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
417 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair[0], &keyagg_cache, &session) == 1);
418 /* The secnonce is set to 0 and subsequent signing attempts fail */
419 CHECK(secp256k1_memcmp_var(&secnonce_tmp, zeros132, sizeof(secnonce_tmp)) == 0);
420 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair[0], &keyagg_cache, &session));
421 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
422 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, NULL, &secnonce_tmp, &keypair[0], &keyagg_cache, &session));
423 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
424 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], NULL, &keypair[0], &keyagg_cache, &session));
425 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &invalid_secnonce, &keypair[0], &keyagg_cache, &session));
426 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, NULL, &keyagg_cache, &session));
427 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
428 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &invalid_keypair, &keyagg_cache, &session));
429 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
430 {
431 unsigned char sk_tmp[32];
432 secp256k1_keypair keypair_tmp;
433 testrand256(sk_tmp);
434 CHECK(secp256k1_keypair_create(CTX, &keypair_tmp, sk_tmp));
435 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair_tmp, &keyagg_cache, &session));
436 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
437 }
438 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair[0], NULL, &session));
439 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
440 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair[0], &invalid_keyagg_cache, &session));
441 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
442 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair[0], &keyagg_cache, NULL));
443 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
444 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce_tmp, &keypair[0], &keyagg_cache, &invalid_session));
445 memcpy(&secnonce_tmp, &secnonce[0], sizeof(secnonce_tmp));
446
447 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce[0], &keypair[0], &keyagg_cache, &session) == 1);
448 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig[1], &secnonce[1], &keypair[1], &keyagg_cache, &session) == 1);
449
450 CHECK(secp256k1_musig_partial_sig_serialize(CTX, buf, &partial_sig[0]) == 1);
453 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_serialize(CTX, buf, &invalid_partial_sig));
454 CHECK(secp256k1_musig_partial_sig_parse(CTX, &partial_sig[0], buf) == 1);
456 {
457 /* Check that parsing failure results in an invalid sig */
459 CHECK(secp256k1_musig_partial_sig_parse(CTX, &tmp, max64) == 0);
460 CHECK(secp256k1_memcmp_var(&tmp, zeros132, sizeof(partial_sig[0])) == 0);
461 }
462 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_parse(CTX, &partial_sig[0], NULL));
463
464 {
465 /* Check that serialize and parse results in the same value */
467 CHECK(secp256k1_musig_partial_sig_serialize(CTX, buf, &partial_sig[0]) == 1);
469 CHECK(secp256k1_memcmp_var(&tmp, &partial_sig[0], sizeof(tmp)) == 0);
470 }
471
473 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], &keyagg_cache, &session) == 1);
474 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[1], &pubnonce[0], &pk[0], &keyagg_cache, &session) == 0);
475 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, NULL, &pubnonce[0], &pk[0], &keyagg_cache, &session));
476 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &invalid_partial_sig, &pubnonce[0], &pk[0], &keyagg_cache, &session));
477 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], NULL, &pk[0], &keyagg_cache, &session));
478 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &invalid_pubnonce, &pk[0], &keyagg_cache, &session));
479 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], NULL, &keyagg_cache, &session));
480 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &invalid_pk, &keyagg_cache, &session));
481 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], NULL, &session));
482 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], &invalid_keyagg_cache, &session));
483 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], &keyagg_cache, NULL));
484 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], &keyagg_cache, &invalid_session));
485
486 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], &keyagg_cache, &session) == 1);
487 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[1], &pubnonce[1], &pk[1], &keyagg_cache, &session) == 1);
488
490 CHECK(secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, partial_sig_ptr, 2) == 1);
491 /* check that NULL in array of partial signature pointers is not allowed */
492 for (i = 0; i < 2; i++) {
493 const secp256k1_musig_partial_sig *original_ptr = partial_sig_ptr[i];
494 partial_sig_ptr[i] = NULL;
495 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, partial_sig_ptr, 2));
496 partial_sig_ptr[i] = original_ptr;
497 }
498 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, NULL, &session, partial_sig_ptr, 2));
499 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, pre_sig, NULL, partial_sig_ptr, 2));
500 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, pre_sig, &invalid_session, partial_sig_ptr, 2));
501 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, NULL, 2));
502 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, invalid_partial_sig_ptr, 2));
503 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, partial_sig_ptr, 0));
504 CHECK(secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, partial_sig_ptr, 1) == 1);
505 CHECK(secp256k1_musig_partial_sig_agg(CTX, pre_sig, &session, partial_sig_ptr, 2) == 1);
506}
507
508static void musig_nonce_bitflip(unsigned char **args, size_t n_flip, size_t n_bytes) {
509 secp256k1_scalar k1[2], k2[2];
510
511 secp256k1_nonce_function_musig(k1, args[0], args[1], args[2], args[3], args[4], args[5]);
512 testrand_flip(args[n_flip], n_bytes);
513 secp256k1_nonce_function_musig(k2, args[0], args[1], args[2], args[3], args[4], args[5]);
514 CHECK(secp256k1_scalar_eq(&k1[0], &k2[0]) == 0);
515 CHECK(secp256k1_scalar_eq(&k1[1], &k2[1]) == 0);
516}
517
518static void musig_nonce_test(void) {
519 unsigned char *args[6];
520 unsigned char session_secrand[32];
521 unsigned char sk[32];
522 unsigned char pk[33];
523 unsigned char msg[32];
524 unsigned char agg_pk[32];
525 unsigned char extra_input[32];
526 int i, j;
527 secp256k1_scalar k[6][2];
528
529 testrand_bytes_test(session_secrand, sizeof(session_secrand));
530 testrand_bytes_test(sk, sizeof(sk));
531 testrand_bytes_test(pk, sizeof(pk));
532 testrand_bytes_test(msg, sizeof(msg));
533 testrand_bytes_test(agg_pk, sizeof(agg_pk));
534 testrand_bytes_test(extra_input, sizeof(extra_input));
535
536 /* Check that a bitflip in an argument results in different nonces. */
537 args[0] = session_secrand;
538 args[1] = msg;
539 args[2] = sk;
540 args[3] = pk;
541 args[4] = agg_pk;
542 args[5] = extra_input;
543 for (i = 0; i < COUNT; i++) {
544 musig_nonce_bitflip(args, 0, sizeof(session_secrand));
545 musig_nonce_bitflip(args, 1, sizeof(msg));
546 musig_nonce_bitflip(args, 2, sizeof(sk));
547 musig_nonce_bitflip(args, 3, sizeof(pk));
548 musig_nonce_bitflip(args, 4, sizeof(agg_pk));
549 musig_nonce_bitflip(args, 5, sizeof(extra_input));
550 }
551 /* Check that if any argument is NULL, a different nonce is produced than if
552 * any other argument is NULL. */
553 memcpy(msg, session_secrand, sizeof(msg));
554 memcpy(sk, session_secrand, sizeof(sk));
555 memcpy(pk, session_secrand, sizeof(session_secrand));
556 memcpy(agg_pk, session_secrand, sizeof(agg_pk));
557 memcpy(extra_input, session_secrand, sizeof(extra_input));
558 secp256k1_nonce_function_musig(k[0], args[0], args[1], args[2], args[3], args[4], args[5]);
559 secp256k1_nonce_function_musig(k[1], args[0], NULL, args[2], args[3], args[4], args[5]);
560 secp256k1_nonce_function_musig(k[2], args[0], args[1], NULL, args[3], args[4], args[5]);
561 secp256k1_nonce_function_musig(k[3], args[0], args[1], args[2], NULL, args[4], args[5]);
562 secp256k1_nonce_function_musig(k[4], args[0], args[1], args[2], args[3], NULL, args[5]);
563 secp256k1_nonce_function_musig(k[5], args[0], args[1], args[2], args[3], args[4], NULL);
564 for (i = 0; i < 6; i++) {
565 CHECK(!secp256k1_scalar_eq(&k[i][0], &k[i][1]));
566 for (j = i+1; j < 6; j++) {
567 CHECK(!secp256k1_scalar_eq(&k[i][0], &k[j][0]));
568 CHECK(!secp256k1_scalar_eq(&k[i][1], &k[j][1]));
569 }
570 }
571}
572
573/* Checks that the initialized tagged hashes have the expected
574 * state. */
575static void sha256_tag_test(void) {
577 {
578 /* "KeyAgg list" */
579 static const unsigned char tag[] = {'K', 'e', 'y', 'A', 'g', 'g', ' ', 'l', 'i', 's', 't'};
581 test_sha256_tag_midstate(&sha, tag, sizeof(tag));
582 }
583 {
584 /* "KeyAgg coefficient" */
585 static const unsigned char tag[] = {'K', 'e', 'y', 'A', 'g', 'g', ' ', 'c', 'o', 'e', 'f', 'f', 'i', 'c', 'i', 'e', 'n', 't'};
587 test_sha256_tag_midstate(&sha, tag, sizeof(tag));
588 }
589 {
590 /* "MuSig/aux" */
591 static const unsigned char tag[] = { 'M', 'u', 'S', 'i', 'g', '/', 'a', 'u', 'x' };
593 test_sha256_tag_midstate(&sha, tag, sizeof(tag));
594 }
595 {
596 /* "MuSig/nonce" */
597 static const unsigned char tag[] = { 'M', 'u', 'S', 'i', 'g', '/', 'n', 'o', 'n', 'c', 'e' };
599 test_sha256_tag_midstate(&sha, tag, sizeof(tag));
600 }
601 {
602 /* "MuSig/noncecoef" */
603 static const unsigned char tag[] = { 'M', 'u', 'S', 'i', 'g', '/', 'n', 'o', 'n', 'c', 'e', 'c', 'o', 'e', 'f' };
605 test_sha256_tag_midstate(&sha, tag, sizeof(tag));
606 }
607}
608
609/* Attempts to create a signature for the aggregate public key using given secret
610 * keys and keyagg_cache. */
611static void musig_tweak_test_helper(const secp256k1_xonly_pubkey* agg_pk, const unsigned char *sk0, const unsigned char *sk1, secp256k1_musig_keyagg_cache *keyagg_cache) {
613 unsigned char session_secrand[2][32];
614 unsigned char msg[32];
615 secp256k1_musig_secnonce secnonce[2];
616 secp256k1_musig_pubnonce pubnonce[2];
617 const secp256k1_musig_pubnonce *pubnonce_ptr[2];
619 secp256k1_keypair keypair[2];
621 secp256k1_musig_partial_sig partial_sig[2];
622 const secp256k1_musig_partial_sig *partial_sig_ptr[2];
623 unsigned char final_sig[64];
624 int i;
625
626 for (i = 0; i < 2; i++) {
627 pubnonce_ptr[i] = &pubnonce[i];
628 partial_sig_ptr[i] = &partial_sig[i];
629
630 testrand256(session_secrand[i]);
631 }
632 CHECK(create_keypair_and_pk(&keypair[0], &pk[0], sk0) == 1);
633 CHECK(create_keypair_and_pk(&keypair[1], &pk[1], sk1) == 1);
635
636 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[0], &pubnonce[0], session_secrand[0], sk0, &pk[0], NULL, NULL, NULL) == 1);
637 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce[1], &pubnonce[1], session_secrand[1], sk1, &pk[1], NULL, NULL, NULL) == 1);
638
639 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 2) == 1);
640 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, msg, keyagg_cache) == 1);
641
642 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig[0], &secnonce[0], &keypair[0], keyagg_cache, &session) == 1);
643 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig[1], &secnonce[1], &keypair[1], keyagg_cache, &session) == 1);
644
645 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[0], &pubnonce[0], &pk[0], keyagg_cache, &session) == 1);
646 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig[1], &pubnonce[1], &pk[1], keyagg_cache, &session) == 1);
647
648 CHECK(secp256k1_musig_partial_sig_agg(CTX, final_sig, &session, partial_sig_ptr, 2) == 1);
649 CHECK(secp256k1_schnorrsig_verify(CTX, final_sig, msg, sizeof(msg), agg_pk) == 1);
650}
651
652/* Create aggregate public key P[0], tweak multiple times (using xonly and
653 * plain tweaking) and test signing. */
654static void musig_tweak_test_internal(void) {
655 unsigned char sk[2][32];
657 const secp256k1_pubkey *pk_ptr[2];
658 secp256k1_musig_keyagg_cache keyagg_cache;
659 enum { N_TWEAKS = 8 };
660 secp256k1_pubkey P[N_TWEAKS + 1];
661 secp256k1_xonly_pubkey P_xonly[N_TWEAKS + 1];
662 int i;
663
664 /* Key Setup */
665 for (i = 0; i < 2; i++) {
666 pk_ptr[i] = &pk[i];
667 testrand256(sk[i]);
668 CHECK(create_keypair_and_pk(NULL, &pk[i], sk[i]) == 1);
669 }
670 /* Compute P0 = keyagg(pk0, pk1) and test signing for it */
671 CHECK(secp256k1_musig_pubkey_agg(CTX, &P_xonly[0], &keyagg_cache, pk_ptr, 2) == 1);
672 musig_tweak_test_helper(&P_xonly[0], sk[0], sk[1], &keyagg_cache);
673 CHECK(secp256k1_musig_pubkey_get(CTX, &P[0], &keyagg_cache));
674
675 /* Compute Pi = f(Pj) + tweaki*G where where j = i-1 and try signing for
676 * that key. If xonly is set to true, the function f normalizes the input
677 * point to have an even X-coordinate ("xonly-tweaking").
678 * Otherwise, the function f is the identity function. */
679 for (i = 1; i <= N_TWEAKS; i++) {
680 unsigned char tweak[32];
681 int P_parity;
682 int xonly = testrand_bits(1);
683
685 if (xonly) {
686 CHECK(secp256k1_musig_pubkey_xonly_tweak_add(CTX, &P[i], &keyagg_cache, tweak) == 1);
687 } else {
688 CHECK(secp256k1_musig_pubkey_ec_tweak_add(CTX, &P[i], &keyagg_cache, tweak) == 1);
689 }
690 CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &P_xonly[i], &P_parity, &P[i]));
691 /* Check that musig_pubkey_tweak_add produces same result as
692 * xonly_pubkey_tweak_add or ec_pubkey_tweak_add. */
693 if (xonly) {
694 unsigned char P_serialized[32];
695 CHECK(secp256k1_xonly_pubkey_serialize(CTX, P_serialized, &P_xonly[i]));
696 CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, P_serialized, P_parity, &P_xonly[i-1], tweak) == 1);
697 } else {
698 secp256k1_pubkey tmp_key = P[i-1];
700 CHECK(secp256k1_memcmp_var(&tmp_key, &P[i], sizeof(tmp_key)) == 0);
701 }
702 /* Test signing for P[i] */
703 musig_tweak_test_helper(&P_xonly[i], sk[0], sk[1], &keyagg_cache);
704 }
705}
706
708 secp256k1_musig_keyagg_cache *keyagg_cache,
709 unsigned char *agg_pk_ser,
710 const unsigned char pubkeys33[][33],
711 const unsigned char tweaks32[][32],
712 size_t key_indices_len,
713 const size_t *key_indices,
714 size_t tweak_indices_len,
715 const size_t *tweak_indices,
716 const int *is_xonly) {
719 int i;
720 secp256k1_pubkey agg_pk;
721 secp256k1_xonly_pubkey agg_pk_xonly;
722
723 for (i = 0; i < (int)key_indices_len; i++) {
724 if (!secp256k1_ec_pubkey_parse(CTX, &pubkeys[i], pubkeys33[key_indices[i]], 33)) {
725 *error = MUSIG_PUBKEY;
726 return 0;
727 }
728 pk_ptr[i] = &pubkeys[i];
729 }
730 if (!secp256k1_musig_pubkey_agg(CTX, NULL, keyagg_cache, pk_ptr, key_indices_len)) {
731 *error = MUSIG_OTHER;
732 return 0;
733 }
734
735 for (i = 0; i < (int)tweak_indices_len; i++) {
736 if (is_xonly[i]) {
737 if (!secp256k1_musig_pubkey_xonly_tweak_add(CTX, NULL, keyagg_cache, tweaks32[tweak_indices[i]])) {
738 *error = MUSIG_TWEAK;
739 return 0;
740 }
741 } else {
742 if (!secp256k1_musig_pubkey_ec_tweak_add(CTX, NULL, keyagg_cache, tweaks32[tweak_indices[i]])) {
743 *error = MUSIG_TWEAK;
744 return 0;
745 }
746 }
747 }
748 if (!secp256k1_musig_pubkey_get(CTX, &agg_pk, keyagg_cache)) {
749 *error = MUSIG_OTHER;
750 return 0;
751 }
752
753 if (!secp256k1_xonly_pubkey_from_pubkey(CTX, &agg_pk_xonly, NULL, &agg_pk)) {
754 *error = MUSIG_OTHER;
755 return 0;
756 }
757
758 if (agg_pk_ser != NULL) {
759 if (!secp256k1_xonly_pubkey_serialize(CTX, agg_pk_ser, &agg_pk_xonly)) {
760 *error = MUSIG_OTHER;
761 return 0;
762 }
763 }
764
765 return 1;
766}
767
768static void musig_test_vectors_keyagg(void) {
769 size_t i;
770 const struct musig_key_agg_vector *vector = &musig_key_agg_vector;
771
772 for (i = 0; i < sizeof(vector->valid_case)/sizeof(vector->valid_case[0]); i++) {
773 const struct musig_key_agg_valid_test_case *c = &vector->valid_case[i];
774 enum MUSIG_ERROR error;
775 secp256k1_musig_keyagg_cache keyagg_cache;
776 unsigned char agg_pk[32];
777
778 CHECK(musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, agg_pk, vector->pubkeys, vector->tweaks, c->key_indices_len, c->key_indices, 0, NULL, NULL));
779 CHECK(secp256k1_memcmp_var(agg_pk, c->expected, sizeof(agg_pk)) == 0);
780 }
781
782 for (i = 0; i < sizeof(vector->error_case)/sizeof(vector->error_case[0]); i++) {
783 const struct musig_key_agg_error_test_case *c = &vector->error_case[i];
784 enum MUSIG_ERROR error;
785 secp256k1_musig_keyagg_cache keyagg_cache;
786
787 CHECK(!musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, vector->tweaks, c->key_indices_len, c->key_indices, c->tweak_indices_len, c->tweak_indices, c->is_xonly));
788 CHECK(c->error == error);
789 }
790}
791
793 size_t i;
794 const struct musig_nonce_gen_vector *vector = &musig_nonce_gen_vector;
795
796 for (i = 0; i < sizeof(vector->test_case)/sizeof(vector->test_case[0]); i++) {
797 const struct musig_nonce_gen_test_case *c = &vector->test_case[i];
798 secp256k1_musig_keyagg_cache keyagg_cache;
799 secp256k1_musig_keyagg_cache *keyagg_cache_ptr = NULL;
800 unsigned char session_secrand32[32];
803 const unsigned char *sk = NULL;
804 const unsigned char *msg = NULL;
805 const unsigned char *extra_in = NULL;
807 unsigned char pubnonce66[66];
808
809 memcpy(session_secrand32, c->rand_, 32);
810 if (c->has_sk) {
811 sk = c->sk;
812 }
813 if (c->has_aggpk) {
814 /* Create keyagg_cache from aggpk */
817 memset(&cache_i, 0, sizeof(cache_i));
820 secp256k1_keyagg_cache_save(&keyagg_cache, &cache_i);
821 keyagg_cache_ptr = &keyagg_cache;
822 }
823 if (c->has_msg) {
824 msg = c->msg;
825 }
826 if (c->has_extra_in) {
827 extra_in = c->extra_in;
828 }
829
830 CHECK(secp256k1_ec_pubkey_parse(CTX, &pk, c->pk, sizeof(c->pk)));
831 CHECK(secp256k1_musig_nonce_gen(CTX, &secnonce, &pubnonce, session_secrand32, sk, &pk, msg, keyagg_cache_ptr, extra_in) == 1);
832 CHECK(secp256k1_memcmp_var(&secnonce.data[4], c->expected_secnonce, 2*32) == 0);
833 /* The last element of the secnonce is the public key (uncompressed in
834 * secp256k1_musig_secnonce, compressed in the test vector secnonce). */
835 CHECK(secp256k1_memcmp_var(&secnonce.data[4+2*32], &pk, sizeof(pk)) == 0);
836 CHECK(secp256k1_memcmp_var(&c->expected_secnonce[2*32], c->pk, sizeof(c->pk)) == 0);
837
838 CHECK(secp256k1_musig_pubnonce_serialize(CTX, pubnonce66, &pubnonce) == 1);
839 CHECK(sizeof(c->expected_pubnonce) == sizeof(pubnonce66));
840 CHECK(secp256k1_memcmp_var(pubnonce66, c->expected_pubnonce, sizeof(pubnonce66)) == 0);
841 }
842}
843
844
846 size_t i;
847 int j;
848 const struct musig_nonce_agg_vector *vector = &musig_nonce_agg_vector;
849
850 for (i = 0; i < sizeof(vector->valid_case)/sizeof(vector->valid_case[0]); i++) {
851 const struct musig_nonce_agg_test_case *c = &vector->valid_case[i];
852 secp256k1_musig_pubnonce pubnonce[2];
853 const secp256k1_musig_pubnonce *pubnonce_ptr[2];
855 unsigned char aggnonce66[66];
856
857 for (j = 0; j < 2; j++) {
858 CHECK(secp256k1_musig_pubnonce_parse(CTX, &pubnonce[j], vector->pnonces[c->pnonce_indices[j]]) == 1);
859 pubnonce_ptr[j] = &pubnonce[j];
860 }
861 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, 2));
862 CHECK(secp256k1_musig_aggnonce_serialize(CTX, aggnonce66, &aggnonce));
863 CHECK(secp256k1_memcmp_var(aggnonce66, c->expected, 33) == 0);
864 }
865 for (i = 0; i < sizeof(vector->error_case)/sizeof(vector->error_case[0]); i++) {
866 const struct musig_nonce_agg_test_case *c = &vector->error_case[i];
867 secp256k1_musig_pubnonce pubnonce[2];
868 for (j = 0; j < 2; j++) {
869 int expected = c->invalid_nonce_idx != j;
870 CHECK(expected == secp256k1_musig_pubnonce_parse(CTX, &pubnonce[j], vector->pnonces[c->pnonce_indices[j]]));
871 }
872 }
873}
874
875static void musig_test_set_secnonce(secp256k1_musig_secnonce *secnonce, const unsigned char *secnonce64, const secp256k1_pubkey *pubkey) {
878
879 secp256k1_scalar_set_b32(&k[0], &secnonce64[0], NULL);
880 secp256k1_scalar_set_b32(&k[1], &secnonce64[32], NULL);
881 CHECK(secp256k1_pubkey_load(CTX, &pk, pubkey));
883}
884
886 size_t i;
888
889 for (i = 0; i < sizeof(vector->valid_case)/sizeof(vector->valid_case[0]); i++) {
890 const struct musig_valid_case *c = &vector->valid_case[i];
891 enum MUSIG_ERROR error;
892 secp256k1_musig_keyagg_cache keyagg_cache;
893 secp256k1_pubkey pubkey;
897 secp256k1_musig_partial_sig partial_sig;
899 secp256k1_keypair keypair;
900 unsigned char partial_sig32[32];
901
902 CHECK(secp256k1_keypair_create(CTX, &keypair, vector->sk));
903 CHECK(musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, NULL, c->key_indices_len, c->key_indices, 0, NULL, NULL));
904
906 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msgs[c->msg_index], &keyagg_cache));
907
908 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, vector->pubkeys[0], sizeof(vector->pubkeys[0])));
909 musig_test_set_secnonce(&secnonce, vector->secnonces[0], &pubkey);
910 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig, &secnonce, &keypair, &keyagg_cache, &session));
911 CHECK(secp256k1_musig_partial_sig_serialize(CTX, partial_sig32, &partial_sig));
912 CHECK(secp256k1_memcmp_var(partial_sig32, c->expected, sizeof(partial_sig32)) == 0);
913
914 CHECK(secp256k1_musig_pubnonce_parse(CTX, &pubnonce, vector->pubnonces[0]));
915 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig, &pubnonce, &pubkey, &keyagg_cache, &session));
916 }
917 for (i = 0; i < sizeof(vector->sign_error_case)/sizeof(vector->sign_error_case[0]); i++) {
918 const struct musig_sign_error_case *c = &vector->sign_error_case[i];
919 enum MUSIG_ERROR error;
920 secp256k1_musig_keyagg_cache keyagg_cache;
921 secp256k1_pubkey pubkey;
924 secp256k1_musig_partial_sig partial_sig;
926 secp256k1_keypair keypair;
927 int expected;
928
929 if (i == 0) {
930 /* Skip this vector since the implementation does not error out when
931 * the signing key does not belong to any pubkey. */
932 continue;
933 }
934
935 expected = c->error != MUSIG_PUBKEY;
936 CHECK(expected == musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, NULL, c->key_indices_len, c->key_indices, 0, NULL, NULL));
937 CHECK(expected || c->error == error);
938 if (!expected) {
939 continue;
940 }
941 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, vector->pubkeys[0], sizeof(vector->pubkeys[0])));
942 CHECK(secp256k1_keypair_create(CTX, &keypair, vector->sk));
943
944 expected = c->error != MUSIG_AGGNONCE;
945 CHECK(expected == secp256k1_musig_aggnonce_parse(CTX, &aggnonce, vector->aggnonces[c->aggnonce_index]));
946 if (!expected) {
947 continue;
948 }
949 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msgs[c->msg_index], &keyagg_cache));
950
951 expected = c->error != MUSIG_SECNONCE;
952 CHECK(!expected);
953 musig_test_set_secnonce(&secnonce, vector->secnonces[c->secnonce_index], &pubkey);
954 CHECK_ILLEGAL(CTX, secp256k1_musig_partial_sign(CTX, &partial_sig, &secnonce, &keypair, &keyagg_cache, &session));
955 }
956 for (i = 0; i < sizeof(vector->verify_fail_case)/sizeof(vector->verify_fail_case[0]); i++) {
957 const struct musig_verify_fail_error_case *c = &vector->verify_fail_case[i];
958 enum MUSIG_ERROR error;
959 secp256k1_musig_keyagg_cache keyagg_cache;
962 secp256k1_musig_partial_sig partial_sig;
963 enum { NUM_PUBNONCES = 3 };
964 secp256k1_musig_pubnonce pubnonce[NUM_PUBNONCES];
965 const secp256k1_musig_pubnonce *pubnonce_ptr[NUM_PUBNONCES];
966 secp256k1_pubkey pubkey;
967 int expected;
968 size_t j;
969
970 CHECK(NUM_PUBNONCES <= c->nonce_indices_len);
971 for (j = 0; j < c->nonce_indices_len; j++) {
972 CHECK(secp256k1_musig_pubnonce_parse(CTX, &pubnonce[j], vector->pubnonces[c->nonce_indices[j]]));
973 pubnonce_ptr[j] = &pubnonce[j];
974 }
975
976 CHECK(musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, NULL, c->key_indices_len, c->key_indices, 0, NULL, NULL));
977 CHECK(secp256k1_musig_nonce_agg(CTX, &aggnonce, pubnonce_ptr, c->nonce_indices_len) == 1);
978 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msgs[c->msg_index], &keyagg_cache));
979
980 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, vector->pubkeys[c->signer_index], sizeof(vector->pubkeys[0])));
981
982 expected = c->error != MUSIG_SIG;
983 CHECK(expected == secp256k1_musig_partial_sig_parse(CTX, &partial_sig, c->sig));
984 if (!expected) {
985 continue;
986 }
987 expected = c->error != MUSIG_SIG_VERIFY;
988 CHECK(expected == secp256k1_musig_partial_sig_verify(CTX, &partial_sig, pubnonce, &pubkey, &keyagg_cache, &session));
989 }
990 for (i = 0; i < sizeof(vector->verify_error_case)/sizeof(vector->verify_error_case[0]); i++) {
991 const struct musig_verify_fail_error_case *c = &vector->verify_error_case[i];
992 enum MUSIG_ERROR error;
993 secp256k1_musig_keyagg_cache keyagg_cache;
995 int expected;
996
997 expected = c->error != MUSIG_PUBKEY;
998 CHECK(expected == musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, NULL, c->key_indices_len, c->key_indices, 0, NULL, NULL));
999 CHECK(expected || c->error == error);
1000 if (!expected) {
1001 continue;
1002 }
1003 expected = c->error != MUSIG_PUBNONCE;
1004 CHECK(expected == secp256k1_musig_pubnonce_parse(CTX, &pubnonce, vector->pubnonces[c->nonce_indices[c->signer_index]]));
1005 }
1006}
1007
1008static void musig_test_vectors_tweak(void) {
1009 size_t i;
1010 const struct musig_tweak_vector *vector = &musig_tweak_vector;
1011 secp256k1_pubkey pubkey;
1014
1016 CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, vector->pubkeys[0], sizeof(vector->pubkeys[0])));
1017
1018 for (i = 0; i < sizeof(vector->valid_case)/sizeof(vector->valid_case[0]); i++) {
1019 const struct musig_tweak_case *c = &vector->valid_case[i];
1020 enum MUSIG_ERROR error;
1021 secp256k1_musig_keyagg_cache keyagg_cache;
1022 secp256k1_musig_pubnonce pubnonce;
1024 secp256k1_musig_partial_sig partial_sig;
1025 secp256k1_keypair keypair;
1026 unsigned char partial_sig32[32];
1027
1028 musig_test_set_secnonce(&secnonce, vector->secnonce, &pubkey);
1029
1030 CHECK(secp256k1_keypair_create(CTX, &keypair, vector->sk));
1031 CHECK(musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, vector->tweaks, c->key_indices_len, c->key_indices, c->tweak_indices_len, c->tweak_indices, c->is_xonly));
1032
1033 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msg, &keyagg_cache));
1034
1035 CHECK(secp256k1_musig_partial_sign(CTX, &partial_sig, &secnonce, &keypair, &keyagg_cache, &session));
1036 CHECK(secp256k1_musig_partial_sig_serialize(CTX, partial_sig32, &partial_sig));
1037 CHECK(secp256k1_memcmp_var(partial_sig32, c->expected, sizeof(partial_sig32)) == 0);
1038
1040 CHECK(secp256k1_musig_partial_sig_verify(CTX, &partial_sig, &pubnonce, &pubkey, &keyagg_cache, &session));
1041 }
1042 for (i = 0; i < sizeof(vector->error_case)/sizeof(vector->error_case[0]); i++) {
1043 const struct musig_tweak_case *c = &vector->error_case[i];
1044 enum MUSIG_ERROR error;
1045 secp256k1_musig_keyagg_cache keyagg_cache;
1046 CHECK(!musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, NULL, vector->pubkeys, vector->tweaks, c->key_indices_len, c->key_indices, c->tweak_indices_len, c->tweak_indices, c->is_xonly));
1047 CHECK(error == MUSIG_TWEAK);
1048 }
1049}
1050
1051static void musig_test_vectors_sigagg(void) {
1052 size_t i, j;
1053 const struct musig_sig_agg_vector *vector = &musig_sig_agg_vector;
1054
1055 for (i = 0; i < sizeof(vector->valid_case)/sizeof(vector->valid_case[0]); i++) {
1056 const struct musig_sig_agg_case *c = &vector->valid_case[i];
1057 enum MUSIG_ERROR error;
1058 unsigned char final_sig[64];
1059 secp256k1_musig_keyagg_cache keyagg_cache;
1060 unsigned char agg_pk32[32];
1064 secp256k1_musig_partial_sig partial_sig[(sizeof(vector->psigs)/sizeof(vector->psigs[0]))];
1065 const secp256k1_musig_partial_sig *partial_sig_ptr[(sizeof(vector->psigs)/sizeof(vector->psigs[0]))];
1066
1067 CHECK(musig_vectors_keyagg_and_tweak(&error, &keyagg_cache, agg_pk32, vector->pubkeys, vector->tweaks, c->key_indices_len, c->key_indices, c->tweak_indices_len, c->tweak_indices, c->is_xonly));
1069 CHECK(secp256k1_musig_nonce_process(CTX, &session, &aggnonce, vector->msg, &keyagg_cache));
1070 for (j = 0; j < c->psig_indices_len; j++) {
1071 CHECK(secp256k1_musig_partial_sig_parse(CTX, &partial_sig[j], vector->psigs[c->psig_indices[j]]));
1072 partial_sig_ptr[j] = &partial_sig[j];
1073 }
1074
1075 CHECK(secp256k1_musig_partial_sig_agg(CTX, final_sig, &session, partial_sig_ptr, c->psig_indices_len) == 1);
1076 CHECK(secp256k1_memcmp_var(final_sig, c->expected, sizeof(final_sig)) == 0);
1077
1078 CHECK(secp256k1_xonly_pubkey_parse(CTX, &agg_pk, agg_pk32));
1079 CHECK(secp256k1_schnorrsig_verify(CTX, final_sig, vector->msg, sizeof(vector->msg), &agg_pk) == 1);
1080 }
1081 for (i = 0; i < sizeof(vector->error_case)/sizeof(vector->error_case[0]); i++) {
1082 const struct musig_sig_agg_case *c = &vector->error_case[i];
1083 secp256k1_musig_partial_sig partial_sig[(sizeof(vector->psigs)/sizeof(vector->psigs[0]))];
1084 for (j = 0; j < c->psig_indices_len; j++) {
1085 int expected = c->invalid_sig_idx != (int)j;
1086 CHECK(expected == secp256k1_musig_partial_sig_parse(CTX, &partial_sig[j], vector->psigs[c->psig_indices[j]]));
1087 }
1088 }
1089}
1090
1091/* Since the BIP doesn't provide static test vectors for nonce_gen_counter, we
1092 * define a static test here */
1094 secp256k1_musig_secnonce secnonce;
1095 secp256k1_musig_pubnonce pubnonce;
1096 unsigned char pubnonce66[66];
1098 secp256k1_keypair keypair;
1099 uint64_t nonrepeating_cnt = 0;
1100 unsigned char sk[32] = {
1101 0xEE, 0xC1, 0xCB, 0x7D, 0x1B, 0x72, 0x54, 0xC5,
1102 0xCA, 0xB0, 0xD9, 0xC6, 0x1A, 0xB0, 0x2E, 0x64,
1103 0x3D, 0x46, 0x4A, 0x59, 0xFE, 0x6C, 0x96, 0xA7,
1104 0xEF, 0xE8, 0x71, 0xF0, 0x7C, 0x5A, 0xEF, 0x54,
1105 };
1106 unsigned char expected_secnonce[64] = {
1107 0x84, 0x2F, 0x13, 0x80, 0xCD, 0x17, 0xA1, 0x98,
1108 0xFC, 0x3D, 0xAD, 0x3B, 0x7D, 0xA7, 0x49, 0x29,
1109 0x41, 0xF4, 0x69, 0x76, 0xF2, 0x70, 0x2F, 0xF7,
1110 0xC6, 0x6F, 0x24, 0xF4, 0x72, 0x03, 0x6A, 0xF1,
1111 0xDA, 0x3F, 0x95, 0x2D, 0xDE, 0x4A, 0x2D, 0xA6,
1112 0xB6, 0x32, 0x57, 0x07, 0xCE, 0x87, 0xA4, 0xE3,
1113 0x61, 0x6D, 0x06, 0xFC, 0x5F, 0x81, 0xA9, 0xC9,
1114 0x93, 0x86, 0xD2, 0x0A, 0x99, 0xCE, 0xCF, 0x99,
1115 };
1116 unsigned char expected_pubnonce[66] = {
1117 0x03, 0xA5, 0xB9, 0xB6, 0x90, 0x79, 0x42, 0xEA,
1118 0xCD, 0xDA, 0x49, 0xA3, 0x66, 0x01, 0x6E, 0xC2,
1119 0xE6, 0x24, 0x04, 0xA1, 0xBF, 0x4A, 0xB6, 0xD4,
1120 0xDB, 0x82, 0x06, 0x7B, 0xC3, 0xAD, 0xF0, 0x86,
1121 0xD7, 0x03, 0x32, 0x05, 0xDB, 0x9E, 0xB3, 0x4D,
1122 0x5C, 0x7C, 0xE0, 0x28, 0x48, 0xCA, 0xC6, 0x8A,
1123 0x83, 0xED, 0x73, 0xE3, 0x88, 0x34, 0x77, 0xF5,
1124 0x63, 0xF2, 0x3C, 0xE9, 0xA1, 0x1A, 0x77, 0x21,
1125 0xEC, 0x64,
1126 };
1127
1128 CHECK(secp256k1_keypair_create(CTX, &keypair, sk));
1129 CHECK(secp256k1_keypair_pub(CTX, &pk, &keypair));
1130 CHECK(secp256k1_musig_nonce_gen_counter(CTX, &secnonce, &pubnonce, nonrepeating_cnt, &keypair, NULL, NULL, NULL) == 1);
1131
1132 CHECK(secp256k1_memcmp_var(&secnonce.data[4], expected_secnonce, 2*32) == 0);
1133 CHECK(secp256k1_memcmp_var(&secnonce.data[4+2*32], &pk, sizeof(pk)) == 0);
1134
1135 CHECK(secp256k1_musig_pubnonce_serialize(CTX, pubnonce66, &pubnonce) == 1);
1136 CHECK(secp256k1_memcmp_var(pubnonce66, expected_pubnonce, sizeof(pubnonce66)) == 0);
1137}
1138
1139/* --- Test registry --- */
1140REPEAT_TEST(musig_simple_test)
1141/* Run multiple times to ensure that pk and nonce have different y parities */
1142REPEAT_TEST(musig_tweak_test)
1143
1144static const struct tf_test_entry tests_musig[] = {
1145 CASE1(musig_simple_test),
1148 CASE1(musig_tweak_test),
1157};
1158
1159#endif
int ret
ArgsManager & args
Definition: bitcoind.cpp:277
static SECP256K1_INLINE int secp256k1_xonly_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_xonly_pubkey *pubkey)
Definition: main_impl.h:14
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
Check whether a group element is the point at infinity.
static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a)
Set r equal to the inverse of a (i.e., mirrored around the X axis)
static int secp256k1_ge_is_infinity(const secp256k1_ge *a)
Check whether a group element is the point at infinity.
static void secp256k1_musig_keyaggcoef_sha256(secp256k1_sha256 *sha)
Definition: keyagg_impl.h:99
static void secp256k1_musig_keyagglist_sha256(secp256k1_sha256 *sha)
Definition: keyagg_impl.h:64
static void secp256k1_keyagg_cache_save(secp256k1_musig_keyagg_cache *cache, const secp256k1_keyagg_cache_internal *cache_i)
Definition: keyagg_impl.h:31
#define CHECK(cond)
Unconditional failure on condition failure.
Definition: util.h:35
static const struct tf_test_entry tests_musig[]
Definition: tests_impl.h:1144
static void musig_test_vectors_keyagg(void)
Definition: tests_impl.h:768
static void musig_nonce_test(void)
Definition: tests_impl.h:518
int musig_vectors_keyagg_and_tweak(enum MUSIG_ERROR *error, secp256k1_musig_keyagg_cache *keyagg_cache, unsigned char *agg_pk_ser, const unsigned char pubkeys33[][33], const unsigned char tweaks32[][32], size_t key_indices_len, const size_t *key_indices, size_t tweak_indices_len, const size_t *tweak_indices, const int *is_xonly)
Definition: tests_impl.h:707
static void musig_test_set_secnonce(secp256k1_musig_secnonce *secnonce, const unsigned char *secnonce64, const secp256k1_pubkey *pubkey)
Definition: tests_impl.h:875
static void sha256_tag_test(void)
Definition: tests_impl.h:575
static int create_keypair_and_pk(secp256k1_keypair *keypair, secp256k1_pubkey *pk, const unsigned char *sk)
Definition: tests_impl.h:27
static void musig_api_tests(void)
Definition: tests_impl.h:122
static void musig_test_vectors_sigagg(void)
Definition: tests_impl.h:1051
static void musig_test_vectors_signverify(void)
Definition: tests_impl.h:885
static void pubnonce_summing_to_inf(secp256k1_musig_pubnonce *pubnonce)
Definition: tests_impl.h:91
static void musig_test_static_nonce_gen_counter(void)
Definition: tests_impl.h:1093
int memcmp_and_randomize(unsigned char *value, const unsigned char *expected, size_t len)
Definition: tests_impl.h:112
static void musig_nonce_bitflip(unsigned char **args, size_t n_flip, size_t n_bytes)
Definition: tests_impl.h:508
static void musig_test_vectors_nonceagg(void)
Definition: tests_impl.h:845
static void musig_tweak_test_internal(void)
Definition: tests_impl.h:654
static void musig_tweak_test_helper(const secp256k1_xonly_pubkey *agg_pk, const unsigned char *sk0, const unsigned char *sk1, secp256k1_musig_keyagg_cache *keyagg_cache)
Definition: tests_impl.h:611
static void musig_test_vectors_noncegen(void)
Definition: tests_impl.h:792
static void musig_simple_test_internal(void)
Definition: tests_impl.h:40
static void musig_test_vectors_tweak(void)
Definition: tests_impl.h:1008
static int tweak(const secp256k1_context *ctx, secp256k1_xonly_pubkey *agg_pk, secp256k1_musig_keyagg_cache *cache)
Definition: musig.c:64
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow)
Set a scalar from a big endian byte array.
static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b)
Compare two scalars.
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:269
static int secp256k1_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_pubkey *pubkey)
Definition: secp256k1.c:240
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *input, size_t inputlen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a variable-length public key into the pubkey object.
Definition: secp256k1.c:250
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by adding tweak times the generator to it.
Definition: secp256k1.c:695
SECP256K1_API int secp256k1_xonly_pubkey_from_pubkey(const secp256k1_context *ctx, secp256k1_xonly_pubkey *xonly_pubkey, int *pk_parity, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4)
Converts a secp256k1_pubkey into a secp256k1_xonly_pubkey.
Definition: main_impl.h:99
SECP256K1_API int secp256k1_xonly_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output32, const secp256k1_xonly_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an xonly_pubkey object into a 32-byte sequence.
Definition: main_impl.h:44
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_tweak_add_check(const secp256k1_context *ctx, const unsigned char *tweaked_pubkey32, int tweaked_pk_parity, const secp256k1_xonly_pubkey *internal_pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5)
Checks that a tweaked pubkey is the result of calling secp256k1_xonly_pubkey_tweak_add with internal_...
Definition: main_impl.h:135
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_keypair_create(const secp256k1_context *ctx, secp256k1_keypair *keypair, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the keypair for a valid secret key.
Definition: main_impl.h:196
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_parse(const secp256k1_context *ctx, secp256k1_xonly_pubkey *pubkey, const unsigned char *input32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a 32-byte sequence into a xonly_pubkey object.
Definition: main_impl.h:22
SECP256K1_API int secp256k1_keypair_pub(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const secp256k1_keypair *keypair) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Get the public key from a keypair.
Definition: main_impl.h:224
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_ec_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *output_pubkey, secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Apply plain "EC" tweaking to a public key in a given keyagg_cache by adding the generator multiplied ...
Definition: keyagg_impl.h:279
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_xonly_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *output_pubkey, secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Apply x-only tweaking to a public key in a given keyagg_cache by adding the generator multiplied with...
Definition: keyagg_impl.h:283
SECP256K1_API int secp256k1_musig_aggnonce_serialize(const secp256k1_context *ctx, unsigned char *out66, const secp256k1_musig_aggnonce *nonce) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an aggregate public nonce.
Definition: session_impl.h:244
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_partial_sig_parse(const secp256k1_context *ctx, secp256k1_musig_partial_sig *sig, const unsigned char *in32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a MuSig partial signature.
Definition: session_impl.h:262
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubnonce_parse(const secp256k1_context *ctx, secp256k1_musig_pubnonce *nonce, const unsigned char *in66) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a signer's public nonce.
Definition: session_impl.h:188
SECP256K1_API int secp256k1_musig_nonce_agg(const secp256k1_context *ctx, secp256k1_musig_aggnonce *aggnonce, const secp256k1_musig_pubnonce *const *pubnonces, size_t n_pubnonces) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Aggregates the nonces of all signers into a single nonce.
Definition: session_impl.h:522
SECP256K1_API int secp256k1_musig_partial_sign(const secp256k1_context *ctx, secp256k1_musig_partial_sig *partial_sig, secp256k1_musig_secnonce *secnonce, const secp256k1_keypair *keypair, const secp256k1_musig_keyagg_cache *keyagg_cache, const secp256k1_musig_session *session) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6)
Produces a partial signature.
Definition: session_impl.h:649
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_aggnonce_parse(const secp256k1_context *ctx, secp256k1_musig_aggnonce *nonce, const unsigned char *in66) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse an aggregate public nonce.
Definition: session_impl.h:227
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_get(const secp256k1_context *ctx, secp256k1_pubkey *agg_pk, const secp256k1_musig_keyagg_cache *keyagg_cache) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Obtain the aggregate public key from a keyagg_cache.
Definition: keyagg_impl.h:229
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_nonce_gen(const secp256k1_context *ctx, secp256k1_musig_secnonce *secnonce, secp256k1_musig_pubnonce *pubnonce, unsigned char *session_secrand32, const unsigned char *seckey, const secp256k1_pubkey *pubkey, const unsigned char *msg32, const secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *extra_input32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(6)
Starts a signing session by generating a nonce.
Definition: session_impl.h:447
SECP256K1_API int secp256k1_musig_partial_sig_serialize(const secp256k1_context *ctx, unsigned char *out32, const secp256k1_musig_partial_sig *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize a MuSig partial signature.
Definition: session_impl.h:281
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_partial_sig_verify(const secp256k1_context *ctx, const secp256k1_musig_partial_sig *partial_sig, const secp256k1_musig_pubnonce *pubnonce, const secp256k1_pubkey *pubkey, const secp256k1_musig_keyagg_cache *keyagg_cache, const secp256k1_musig_session *session) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6)
Verifies an individual signer's partial signature.
Definition: session_impl.h:719
SECP256K1_API int secp256k1_musig_partial_sig_agg(const secp256k1_context *ctx, unsigned char *sig64, const secp256k1_musig_session *session, const secp256k1_musig_partial_sig *const *partial_sigs, size_t n_sigs) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Aggregates partial signatures.
Definition: session_impl.h:782
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_nonce_gen_counter(const secp256k1_context *ctx, secp256k1_musig_secnonce *secnonce, secp256k1_musig_pubnonce *pubnonce, uint64_t nonrepeating_cnt, const secp256k1_keypair *keypair, const unsigned char *msg32, const secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *extra_input32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5)
Alternative way to generate a nonce and start a signing session.
Definition: session_impl.h:475
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_agg(const secp256k1_context *ctx, secp256k1_xonly_pubkey *agg_pk, secp256k1_musig_keyagg_cache *keyagg_cache, const secp256k1_pubkey *const *pubkeys, size_t n_pubkeys) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(4)
Computes an aggregate public key and uses it to initialize a keyagg_cache.
Definition: keyagg_impl.h:168
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_nonce_process(const secp256k1_context *ctx, secp256k1_musig_session *session, const secp256k1_musig_aggnonce *aggnonce, const unsigned char *msg32, const secp256k1_musig_keyagg_cache *keyagg_cache) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5)
Takes the aggregate nonce and creates a session that is required for signing and verification of part...
Definition: session_impl.h:603
SECP256K1_API int secp256k1_musig_pubnonce_serialize(const secp256k1_context *ctx, unsigned char *out66, const secp256k1_musig_pubnonce *nonce) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize a signer's public nonce.
Definition: session_impl.h:208
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorrsig_verify(const secp256k1_context *ctx, const unsigned char *sig64, const unsigned char *msg, size_t msglen, const secp256k1_xonly_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(5)
Verify a Schnorr signature.
Definition: main_impl.h:224
static void secp256k1_musig_secnonce_save(secp256k1_musig_secnonce *secnonce, const secp256k1_scalar *k, const secp256k1_ge *pk)
Definition: session_impl.h:50
static int secp256k1_musig_sum_pubnonces(const secp256k1_context *ctx, secp256k1_gej *summed_pubnonces, const secp256k1_musig_pubnonce *const *pubnonces, size_t n_pubnonces)
Definition: session_impl.h:503
static void secp256k1_nonce_function_musig(secp256k1_scalar *k, const unsigned char *session_secrand, const unsigned char *msg32, const unsigned char *seckey32, const unsigned char *pk33, const unsigned char *agg_pk32, const unsigned char *extra_input32)
Definition: session_impl.h:339
static void secp256k1_musig_compute_noncehash_sha256_tagged(secp256k1_sha256 *sha)
Definition: session_impl.h:545
static void secp256k1_nonce_function_musig_sha256_tagged_aux(secp256k1_sha256 *sha)
Definition: session_impl.h:311
static void secp256k1_nonce_function_musig_sha256_tagged(secp256k1_sha256 *sha)
Definition: session_impl.h:326
static int secp256k1_musig_aggnonce_load(const secp256k1_context *ctx, secp256k1_ge *ges, const secp256k1_musig_aggnonce *nonce)
Definition: session_impl.h:118
static void secp256k1_musig_pubnonce_save(secp256k1_musig_pubnonce *nonce, const secp256k1_ge *ges)
Definition: session_impl.h:88
enum MUSIG_ERROR error
Definition: vectors.h:30
unsigned char expected[32]
Definition: vectors.h:21
struct musig_key_agg_error_test_case error_case[5]
Definition: vectors.h:37
unsigned char pubkeys[7][33]
Definition: vectors.h:34
struct musig_key_agg_valid_test_case valid_case[4]
Definition: vectors.h:36
unsigned char tweaks[2][32]
Definition: vectors.h:35
unsigned char expected[66]
Definition: vectors.h:98
size_t pnonce_indices[2]
Definition: vectors.h:96
unsigned char pnonces[7][66]
Definition: vectors.h:104
struct musig_nonce_agg_test_case error_case[3]
Definition: vectors.h:106
struct musig_nonce_agg_test_case valid_case[2]
Definition: vectors.h:105
unsigned char extra_in[32]
Definition: vectors.h:79
unsigned char rand_[32]
Definition: vectors.h:70
unsigned char expected_pubnonce[66]
Definition: vectors.h:81
unsigned char sk[32]
Definition: vectors.h:72
unsigned char msg[32]
Definition: vectors.h:77
unsigned char expected_secnonce[97]
Definition: vectors.h:80
unsigned char pk[33]
Definition: vectors.h:73
unsigned char aggpk[32]
Definition: vectors.h:75
struct musig_nonce_gen_test_case test_case[2]
Definition: vectors.h:85
size_t tweak_indices[3]
Definition: vectors.h:292
size_t key_indices_len
Definition: vectors.h:289
size_t psig_indices_len
Definition: vectors.h:295
size_t tweak_indices_len
Definition: vectors.h:291
unsigned char expected[64]
Definition: vectors.h:298
size_t psig_indices[2]
Definition: vectors.h:296
unsigned char aggnonce[66]
Definition: vectors.h:294
size_t key_indices[2]
Definition: vectors.h:290
unsigned char pubkeys[4][33]
Definition: vectors.h:304
unsigned char msg[32]
Definition: vectors.h:307
unsigned char tweaks[3][32]
Definition: vectors.h:305
unsigned char psigs[9][32]
Definition: vectors.h:306
struct musig_sig_agg_case error_case[1]
Definition: vectors.h:309
struct musig_sig_agg_case valid_case[4]
Definition: vectors.h:308
enum MUSIG_ERROR error
Definition: vectors.h:147
size_t key_indices_len
Definition: vectors.h:142
size_t key_indices[3]
Definition: vectors.h:143
struct musig_verify_fail_error_case verify_fail_case[3]
Definition: vectors.h:170
struct musig_sign_error_case sign_error_case[6]
Definition: vectors.h:169
struct musig_verify_fail_error_case verify_error_case[2]
Definition: vectors.h:171
unsigned char sk[32]
Definition: vectors.h:162
unsigned char msgs[1][32]
Definition: vectors.h:167
unsigned char aggnonces[5][66]
Definition: vectors.h:166
unsigned char secnonces[2][194]
Definition: vectors.h:164
unsigned char pubkeys[4][33]
Definition: vectors.h:163
unsigned char pubnonces[5][194]
Definition: vectors.h:165
struct musig_valid_case valid_case[4]
Definition: vectors.h:168
size_t tweak_indices_len
Definition: vectors.h:233
size_t key_indices[3]
Definition: vectors.h:230
int is_xonly[4]
Definition: vectors.h:235
size_t key_indices_len
Definition: vectors.h:229
size_t nonce_indices[3]
Definition: vectors.h:232
unsigned char expected[32]
Definition: vectors.h:237
size_t signer_index
Definition: vectors.h:236
size_t tweak_indices[4]
Definition: vectors.h:234
unsigned char msg[32]
Definition: vectors.h:244
unsigned char secnonce[97]
Definition: vectors.h:242
unsigned char sk[32]
Definition: vectors.h:241
struct musig_tweak_case valid_case[5]
Definition: vectors.h:248
unsigned char aggnonce[66]
Definition: vectors.h:243
unsigned char pubnonces[3][194]
Definition: vectors.h:246
unsigned char pubkeys[3][33]
Definition: vectors.h:245
unsigned char tweaks[5][32]
Definition: vectors.h:247
struct musig_tweak_case error_case[1]
Definition: vectors.h:249
size_t key_indices_len
Definition: vectors.h:133
size_t key_indices[3]
Definition: vectors.h:134
size_t aggnonce_index
Definition: vectors.h:135
size_t msg_index
Definition: vectors.h:136
unsigned char expected[32]
Definition: vectors.h:138
enum MUSIG_ERROR error
Definition: vectors.h:158
unsigned char sig[32]
Definition: vectors.h:151
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
Definition: group.h:16
A group element of the secp256k1 curve, in jacobian coordinates.
Definition: group.h:28
Opaque data structure that holds a keypair consisting of a secret and a public key.
Opaque data structure that holds an aggregate public nonce.
This module implements BIP 327 "MuSig2 for BIP340-compatible Multi-Signatures" (https://github....
Opaque data structure that holds a partial MuSig signature.
Opaque data structure that holds a signer's public nonce.
Opaque data structure that holds a signer's secret nonce.
unsigned char data[132]
Opaque data structure that holds a MuSig session.
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:61
unsigned char data[64]
Definition: secp256k1.h:62
A scalar modulo the group order of the secp256k1 curve.
Definition: scalar_4x64.h:13
Opaque data structure that holds a parsed and valid "x-only" public key.
Definition: unit_test.h:51
static void testrand_flip(unsigned char *b, size_t len)
Flip a single random bit in a byte array.
static void testrand256(unsigned char *b32)
Generate a pseudorandom 32-byte array.
static SECP256K1_INLINE uint64_t testrand_bits(int bits)
Generate a pseudorandom number in the range [0..2**bits-1].
static void testrand_bytes_test(unsigned char *bytes, size_t len)
Generate pseudorandom bytes with long sequences of zero and one bits.
#define CHECK_ILLEGAL(ctx, expr)
Definition: tests.c:79
static secp256k1_context * CTX
Definition: tests.c:42
static void test_sha256_tag_midstate(secp256k1_sha256 *sha_tagged, const unsigned char *tag, size_t taglen)
Definition: tests.c:627
static secp256k1_context * STATIC_CTX
Definition: tests.c:43
static void testutil_random_ge_test(secp256k1_ge *ge)
Definition: testutil.h:90
int COUNT
Definition: unit_test.c:23
#define CASE1(name)
Definition: unit_test.h:25
#define REPEAT_TEST(fn)
Definition: unit_test.h:34
static const struct musig_sig_agg_vector musig_sig_agg_vector
Definition: vectors.h:312
static const struct musig_tweak_vector musig_tweak_vector
Definition: vectors.h:252
static const struct musig_nonce_agg_vector musig_nonce_agg_vector
Definition: vectors.h:109
MUSIG_ERROR
Automatically generated by .
Definition: vectors.h:7
@ MUSIG_AGGNONCE
Definition: vectors.h:11
@ MUSIG_TWEAK
Definition: vectors.h:9
@ MUSIG_SIG_VERIFY
Definition: vectors.h:14
@ MUSIG_PUBNONCE
Definition: vectors.h:10
@ MUSIG_SIG
Definition: vectors.h:13
@ MUSIG_PUBKEY
Definition: vectors.h:8
@ MUSIG_OTHER
Definition: vectors.h:15
@ MUSIG_SECNONCE
Definition: vectors.h:12
@ MUSIG_VECTORS_MAX_PUBKEYS
Definition: vectors.h:346
static const struct musig_key_agg_vector musig_key_agg_vector
Definition: vectors.h:40
static const struct musig_nonce_gen_vector musig_nonce_gen_vector
Definition: vectors.h:88
static const struct musig_sign_verify_vector musig_sign_verify_vector
Definition: vectors.h:174