Bitcoin Core  31.0.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 
27 static 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. */
40 static 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];
45  secp256k1_musig_aggnonce aggnonce;
46  unsigned char msg[32];
48  secp256k1_musig_keyagg_cache keyagg_cache;
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 
112 int 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 
122 static 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];
146  secp256k1_musig_aggnonce aggnonce;
147  unsigned char aggnonce_ser[66];
148  unsigned char msg[32];
149  secp256k1_xonly_pubkey agg_pk;
150  secp256k1_pubkey full_agg_pk;
151  secp256k1_musig_keyagg_cache keyagg_cache;
152  secp256k1_musig_keyagg_cache invalid_keyagg_cache;
153  secp256k1_musig_session session;
154  secp256k1_musig_session invalid_session;
155  secp256k1_pubkey pk[2];
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 
178  testrand256(msg);
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);
233  tweak_func[0] = secp256k1_musig_pubkey_ec_tweak_add;
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);
345  CHECK_ILLEGAL(CTX, secp256k1_musig_pubnonce_parse(CTX, NULL, pubnonce_ser));
346  CHECK_ILLEGAL(CTX, secp256k1_musig_pubnonce_parse(CTX, &pubnonce[0], NULL));
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);
392  CHECK_ILLEGAL(CTX, secp256k1_musig_aggnonce_parse(CTX, NULL, aggnonce_ser));
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);
468  CHECK(secp256k1_musig_partial_sig_parse(CTX, &tmp, buf) == 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 
508 static 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 
518 static 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. */
575 static void sha256_tag_test(void) {
576  secp256k1_sha256 sha;
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. */
611 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) {
612  secp256k1_pubkey pk[2];
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];
618  secp256k1_musig_aggnonce aggnonce;
619  secp256k1_keypair keypair[2];
620  secp256k1_musig_session session;
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);
634  testrand256(msg);
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. */
654 static void musig_tweak_test_internal(void) {
655  unsigned char sk[2][32];
656  secp256k1_pubkey pk[2];
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 
768 static 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 
792 static void musig_test_vectors_noncegen(void) {
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];
801  secp256k1_musig_secnonce secnonce;
802  secp256k1_musig_pubnonce pubnonce;
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 
845 static void musig_test_vectors_nonceagg(void) {
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];
854  secp256k1_musig_aggnonce aggnonce;
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 
875 static void musig_test_set_secnonce(secp256k1_musig_secnonce *secnonce, const unsigned char *secnonce64, const secp256k1_pubkey *pubkey) {
877  secp256k1_scalar k[2];
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));
882  secp256k1_musig_secnonce_save(secnonce, k, &pk);
883 }
884 
885 static void musig_test_vectors_signverify(void) {
886  size_t i;
887  const struct musig_sign_verify_vector *vector = &musig_sign_verify_vector;
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;
894  secp256k1_musig_pubnonce pubnonce;
895  secp256k1_musig_aggnonce aggnonce;
896  secp256k1_musig_session session;
897  secp256k1_musig_partial_sig partial_sig;
898  secp256k1_musig_secnonce secnonce;
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;
922  secp256k1_musig_aggnonce aggnonce;
923  secp256k1_musig_session session;
924  secp256k1_musig_partial_sig partial_sig;
925  secp256k1_musig_secnonce secnonce;
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;
960  secp256k1_musig_aggnonce aggnonce;
961  secp256k1_musig_session session;
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;
994  secp256k1_musig_pubnonce pubnonce;
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 
1008 static 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;
1023  secp256k1_musig_session session;
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 
1051 static 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];
1061  secp256k1_xonly_pubkey agg_pk;
1063  secp256k1_musig_session session;
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 --- */
1140 REPEAT_TEST(musig_simple_test)
1141 /* Run multiple times to ensure that pk and nonce have different y parities */
1142 REPEAT_TEST(musig_tweak_test)
1143 
1144 static const struct tf_test_entry tests_musig[] = {
1145  CASE1(musig_simple_test),
1148  CASE1(musig_tweak_test),
1157 };
1158 
1159 #endif
struct musig_sign_error_case sign_error_case[6]
Definition: vectors.h:169
static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b)
Compare two scalars.
static int secp256k1_ge_is_infinity(const secp256k1_ge *a)
Check whether a group element is the point at infinity.
static void musig_tweak_test_internal(void)
Definition: tests_impl.h:654
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
static void musig_test_vectors_tweak(void)
Definition: tests_impl.h:1008
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
Check whether a group element is the point at infinity.
This module implements BIP 327 "MuSig2 for BIP340-compatible Multi-Signatures" (https://github.com/bitcoin/bips/blob/master/bip-0327.mediawiki) v1.0.0.
size_t key_indices_len
Definition: vectors.h:142
int ret
#define CASE1(name)
Definition: unit_test.h:25
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&#39;s public nonce.
Definition: session_impl.h:208
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
size_t nonce_indices[3]
Definition: vectors.h:232
size_t key_indices[3]
Definition: vectors.h:143
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 void testutil_random_ge_test(secp256k1_ge *ge)
Definition: testutil.h:90
struct musig_nonce_agg_test_case valid_case[2]
Definition: vectors.h:105
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
unsigned char rand_[32]
Definition: vectors.h:70
static void secp256k1_keyagg_cache_save(secp256k1_musig_keyagg_cache *cache, const secp256k1_keyagg_cache_internal *cache_i)
Definition: keyagg_impl.h:31
int memcmp_and_randomize(unsigned char *value, const unsigned char *expected, size_t len)
Definition: tests_impl.h:112
unsigned char pk[33]
Definition: vectors.h:73
Opaque data structure that holds an aggregate public nonce.
unsigned char tweaks[2][32]
Definition: vectors.h:35
struct musig_tweak_case valid_case[5]
Definition: vectors.h:248
unsigned char msg[32]
Definition: vectors.h:244
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
static const struct musig_key_agg_vector musig_key_agg_vector
Definition: vectors.h:40
unsigned char pubnonces[3][194]
Definition: vectors.h:246
static void secp256k1_nonce_function_musig_sha256_tagged(secp256k1_sha256 *sha)
Definition: session_impl.h:326
static const struct musig_sign_verify_vector musig_sign_verify_vector
Definition: vectors.h:174
size_t key_indices_len
Definition: vectors.h:289
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
static void secp256k1_musig_keyagglist_sha256(secp256k1_sha256 *sha)
Definition: keyagg_impl.h:64
struct musig_nonce_agg_test_case error_case[3]
Definition: vectors.h:106
static const struct tf_test_entry tests_musig[]
Definition: tests_impl.h:1144
size_t tweak_indices[3]
Definition: vectors.h:292
static void secp256k1_musig_secnonce_save(secp256k1_musig_secnonce *secnonce, const secp256k1_scalar *k, const secp256k1_ge *pk)
Definition: session_impl.h:50
unsigned char tweaks[5][32]
Definition: vectors.h:247
int is_xonly[4]
Definition: vectors.h:235
size_t key_indices_len
Definition: vectors.h:133
static void sha256_tag_test(void)
Definition: tests_impl.h:575
unsigned char expected[32]
Definition: vectors.h:21
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&#39;s partial signature.
Definition: session_impl.h:719
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&#39;s public nonce.
Definition: session_impl.h:188
unsigned char msg[32]
Definition: vectors.h:307
size_t key_indices_len
Definition: vectors.h:229
size_t key_indices[3]
Definition: vectors.h:134
static void secp256k1_musig_keyaggcoef_sha256(secp256k1_sha256 *sha)
Definition: keyagg_impl.h:99
static const struct musig_tweak_vector musig_tweak_vector
Definition: vectors.h:252
memcpy(result.begin(), stream.data(), stream.size())
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow)
Set a scalar from a big endian byte array.
A group element of the secp256k1 curve, in jacobian coordinates.
Definition: group.h:28
struct musig_tweak_case error_case[1]
Definition: vectors.h:249
size_t pnonce_indices[2]
Definition: vectors.h:96
size_t key_indices[3]
Definition: vectors.h:230
static void testrand256(unsigned char *b32)
Generate a pseudorandom 32-byte array.
enum MUSIG_ERROR error
Definition: vectors.h:147
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_static_nonce_gen_counter(void)
Definition: tests_impl.h:1093
static int tweak(const secp256k1_context *ctx, secp256k1_xonly_pubkey *agg_pk, secp256k1_musig_keyagg_cache *cache)
Definition: musig.c:64
size_t psig_indices_len
Definition: vectors.h:295
struct musig_verify_fail_error_case verify_error_case[2]
Definition: vectors.h:171
Opaque data structure that holds a partial MuSig signature.
unsigned char pubkeys[7][33]
Definition: vectors.h:34
static void testrand_flip(unsigned char *b, size_t len)
Flip a single random bit in a byte array.
struct musig_valid_case valid_case[4]
Definition: vectors.h:168
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
size_t tweak_indices_len
Definition: vectors.h:233
unsigned char extra_in[32]
Definition: vectors.h:79
static void musig_nonce_bitflip(unsigned char **args, size_t n_flip, size_t n_bytes)
Definition: tests_impl.h:508
static secp256k1_context * STATIC_CTX
Definition: tests.c:43
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_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
unsigned char pnonces[7][66]
Definition: vectors.h:104
static void musig_test_vectors_signverify(void)
Definition: tests_impl.h:885
static int secp256k1_musig_aggnonce_load(const secp256k1_context *ctx, secp256k1_ge *ges, const secp256k1_musig_aggnonce *nonce)
Definition: session_impl.h:118
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
#define REPEAT_TEST(fn)
Definition: unit_test.h:34
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
unsigned char pubkeys[4][33]
Definition: vectors.h:304
size_t msg_index
Definition: vectors.h:136
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
ArgsManager & args
Definition: bitcoind.cpp:277
unsigned char tweaks[3][32]
Definition: vectors.h:305
Opaque data structure that holds a parsed and valid "x-only" public key.
static void musig_test_vectors_keyagg(void)
Definition: tests_impl.h:768
static void musig_test_vectors_nonceagg(void)
Definition: tests_impl.h:845
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
unsigned char expected[64]
Definition: vectors.h:298
Definition: unit_test.h:51
unsigned char aggnonce[66]
Definition: vectors.h:243
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
static secp256k1_context * CTX
Definition: tests.c:42
static void secp256k1_musig_pubnonce_save(secp256k1_musig_pubnonce *nonce, const secp256k1_ge *ges)
Definition: session_impl.h:88
unsigned char aggnonces[5][66]
Definition: vectors.h:166
struct musig_verify_fail_error_case verify_fail_case[3]
Definition: vectors.h:170
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 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
unsigned char secnonce[97]
Definition: vectors.h:242
Opaque data structure that holds a signer&#39;s secret nonce.
unsigned char pubnonces[5][194]
Definition: vectors.h:165
static void testrand_bytes_test(unsigned char *bytes, size_t len)
Generate pseudorandom bytes with long sequences of zero and one bits.
struct musig_sig_agg_case error_case[1]
Definition: vectors.h:309
size_t key_indices[2]
Definition: vectors.h:290
MUSIG_ERROR
Automatically generated by .
Definition: vectors.h:7
#define CHECK(cond)
Unconditional failure on condition failure.
Definition: util.h:35
static void secp256k1_nonce_function_musig_sha256_tagged_aux(secp256k1_sha256 *sha)
Definition: session_impl.h:311
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
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
Definition: group.h:16
unsigned char aggpk[32]
Definition: vectors.h:75
static void musig_test_vectors_noncegen(void)
Definition: tests_impl.h:792
enum MUSIG_ERROR error
Definition: vectors.h:30
A scalar modulo the group order of the secp256k1 curve.
Definition: scalar_4x64.h:13
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
Opaque data structure that holds a keypair consisting of a secret and a public key.
unsigned char expected_pubnonce[66]
Definition: vectors.h:81
size_t aggnonce_index
Definition: vectors.h:135
unsigned char secnonces[2][194]
Definition: vectors.h:164
static void musig_api_tests(void)
Definition: tests_impl.h:122
unsigned char sk[32]
Definition: vectors.h:241
Opaque data structure that holds a signer&#39;s public nonce.
size_t tweak_indices[4]
Definition: vectors.h:234
struct musig_key_agg_valid_test_case valid_case[4]
Definition: vectors.h:36
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
unsigned char data[64]
Definition: secp256k1.h:62
static void musig_test_set_secnonce(secp256k1_musig_secnonce *secnonce, const unsigned char *secnonce64, const secp256k1_pubkey *pubkey)
Definition: tests_impl.h:875
size_t signer_index
Definition: vectors.h:236
Opaque data structure that holds a MuSig session.
struct musig_nonce_gen_test_case test_case[2]
Definition: vectors.h:85
size_t tweak_indices_len
Definition: vectors.h:291
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
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 test_sha256_tag_midstate(secp256k1_sha256 *sha_tagged, const unsigned char *tag, size_t taglen)
Definition: tests.c:627
unsigned char sk[32]
Definition: vectors.h:72
unsigned char sig[32]
Definition: vectors.h:151
unsigned char data[132]
enum MUSIG_ERROR error
Definition: vectors.h:158
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:269
static SECP256K1_INLINE uint64_t testrand_bits(int bits)
Generate a pseudorandom number in the range [0..2**bits-1].
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
unsigned char expected_secnonce[97]
Definition: vectors.h:80
unsigned char aggnonce[66]
Definition: vectors.h:294
unsigned char msg[32]
Definition: vectors.h:77
static void musig_test_vectors_sigagg(void)
Definition: tests_impl.h:1051
unsigned char expected[32]
Definition: vectors.h:237
static int secp256k1_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_pubkey *pubkey)
Definition: secp256k1.c:240
unsigned char pubkeys[4][33]
Definition: vectors.h:163
static const struct musig_nonce_gen_vector musig_nonce_gen_vector
Definition: vectors.h:88
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
unsigned char pubkeys[3][33]
Definition: vectors.h:245
static void musig_simple_test_internal(void)
Definition: tests_impl.h:40
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 void secp256k1_musig_compute_noncehash_sha256_tagged(secp256k1_sha256 *sha)
Definition: session_impl.h:545
unsigned char psigs[9][32]
Definition: vectors.h:306
unsigned char msgs[1][32]
Definition: vectors.h:167
#define CHECK_ILLEGAL(ctx, expr)
Definition: tests.c:79
size_t psig_indices[2]
Definition: vectors.h:296
unsigned char sk[32]
Definition: vectors.h:162
struct musig_sig_agg_case valid_case[4]
Definition: vectors.h:308
static int create_keypair_and_pk(secp256k1_keypair *keypair, secp256k1_pubkey *pk, const unsigned char *sk)
Definition: tests_impl.h:27
unsigned char expected[32]
Definition: vectors.h:138
unsigned char expected[66]
Definition: vectors.h:98
struct musig_key_agg_error_test_case error_case[5]
Definition: vectors.h:37
static void musig_nonce_test(void)
Definition: tests_impl.h:518
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 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
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
static void pubnonce_summing_to_inf(secp256k1_musig_pubnonce *pubnonce)
Definition: tests_impl.h:91
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:61
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
static const struct musig_nonce_agg_vector musig_nonce_agg_vector
Definition: vectors.h:109
int COUNT
Definition: unit_test.c:23
static const struct musig_sig_agg_vector musig_sig_agg_vector
Definition: vectors.h:312