Bitcoin Core 32.99.0
P2P Digital Currency
session_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_SESSION_IMPL_H
7#define SECP256K1_MODULE_MUSIG_SESSION_IMPL_H
8
9#include <string.h>
10
11#include "../../../include/secp256k1.h"
12#include "../../../include/secp256k1_extrakeys.h"
13#include "../../../include/secp256k1_musig.h"
14
15#include "keyagg.h"
16#include "session.h"
17#include "../../eckey.h"
18#include "../../hash.h"
19#include "../../scalar.h"
20#include "../../util.h"
21
22static const unsigned char secp256k1_musig_secnonce_magic[4] = { 0x22, 0x0e, 0xdc, 0xf1 };
23
25 memcpy(&secnonce->data[0], secp256k1_musig_secnonce_magic, 4);
26 secp256k1_scalar_get_b32(&secnonce->data[4], &k[0]);
27 secp256k1_scalar_get_b32(&secnonce->data[36], &k[1]);
28 secp256k1_ge_to_bytes(&secnonce->data[68], pk);
29}
30
32 int is_zero;
34 /* We make very sure that the nonce isn't invalidated by checking the values
35 * in addition to the magic. */
36 is_zero = secp256k1_is_zero_array(&secnonce->data[4], 2 * 32);
37 secp256k1_declassify(ctx, &is_zero, sizeof(is_zero));
38 ARG_CHECK(!is_zero);
39
40 secp256k1_scalar_set_b32(&k[0], &secnonce->data[4], NULL);
41 secp256k1_scalar_set_b32(&k[1], &secnonce->data[36], NULL);
42 secp256k1_ge_from_bytes(pk, &secnonce->data[68]);
43 return 1;
44}
45
46/* If flag is 1, invalidate the secnonce; if flag is 0, leave it.
47 * Constant-time. Flag must be 0 or 1. */
49 secp256k1_memczero(secnonce->data, sizeof(secnonce->data), flag);
50 /* The flag argument is usually classified. So, the line above makes the
51 * magic and public key classified. However, we need both to be
52 * declassified. Note that we don't declassify the entire object, because if
53 * flag is 0, then k[0] and k[1] have not been zeroed. */
55 secp256k1_declassify(ctx, &secnonce->data[68], 64);
56}
57
58static const unsigned char secp256k1_musig_pubnonce_magic[4] = { 0xf5, 0x7a, 0x3d, 0xa0 };
59
60/* Saves two group elements into a pubnonce. Requires that none of the provided
61 * group elements is infinity. */
63 int i;
64 memcpy(&nonce->data[0], secp256k1_musig_pubnonce_magic, 4);
65 for (i = 0; i < 2; i++) {
66 secp256k1_ge_to_bytes(nonce->data + 4+64*i, &ges[i]);
67 }
68}
69
70/* Loads two group elements from a pubnonce. Returns 1 unless the nonce wasn't
71 * properly initialized */
73 int i;
74
76 for (i = 0; i < 2; i++) {
77 secp256k1_ge_from_bytes(&ges[i], nonce->data + 4 + 64*i);
78 }
79 return 1;
80}
81
82static const unsigned char secp256k1_musig_aggnonce_magic[4] = { 0xa8, 0xb7, 0xe4, 0x67 };
83
85 int i;
86 memcpy(&nonce->data[0], secp256k1_musig_aggnonce_magic, 4);
87 for (i = 0; i < 2; i++) {
88 secp256k1_ge_to_bytes_ext(&nonce->data[4 + 64*i], &ges[i]);
89 }
90}
91
93 int i;
94
96 for (i = 0; i < 2; i++) {
97 secp256k1_ge_from_bytes_ext(&ges[i], &nonce->data[4 + 64*i]);
98 }
99 return 1;
100}
101
102static const unsigned char secp256k1_musig_session_cache_magic[4] = { 0x9d, 0xed, 0xe9, 0x17 };
103
104/* A session consists of
105 * - 4 byte session cache magic
106 * - 1 byte the parity of the final nonce
107 * - 32 byte serialized x-only final nonce
108 * - 32 byte nonce coefficient b
109 * - 32 byte signature challenge hash e
110 * - 32 byte scalar s that is added to the partial signatures of the signers
111 */
113 unsigned char *ptr = session->data;
114
116 ptr += 4;
117 *ptr = session_i->fin_nonce_parity;
118 ptr += 1;
119 memcpy(ptr, session_i->fin_nonce, 32);
120 ptr += 32;
121 secp256k1_scalar_get_b32(ptr, &session_i->noncecoef);
122 ptr += 32;
123 secp256k1_scalar_get_b32(ptr, &session_i->challenge);
124 ptr += 32;
125 secp256k1_scalar_get_b32(ptr, &session_i->s_part);
126}
127
129 const unsigned char *ptr = session->data;
130
132 ptr += 4;
133 session_i->fin_nonce_parity = *ptr;
134 ptr += 1;
135 memcpy(session_i->fin_nonce, ptr, 32);
136 ptr += 32;
137 secp256k1_scalar_set_b32(&session_i->noncecoef, ptr, NULL);
138 ptr += 32;
139 secp256k1_scalar_set_b32(&session_i->challenge, ptr, NULL);
140 ptr += 32;
141 secp256k1_scalar_set_b32(&session_i->s_part, ptr, NULL);
142 return 1;
143}
144
145static const unsigned char secp256k1_musig_partial_sig_magic[4] = { 0xeb, 0xfb, 0x1a, 0x32 };
146
148 memcpy(&sig->data[0], secp256k1_musig_partial_sig_magic, 4);
150}
151
153 int overflow;
154
156 secp256k1_scalar_set_b32(s, &sig->data[4], &overflow);
157 /* Parsed signatures can not overflow */
158 VERIFY_CHECK(!overflow);
159 return 1;
160}
161
163 secp256k1_ge ges[2];
164 int i;
165
166 VERIFY_CHECK(ctx != NULL);
167 ARG_CHECK(nonce != NULL);
168 ARG_CHECK(in66 != NULL);
169
170 for (i = 0; i < 2; i++) {
171 if (!secp256k1_ge_parse(&ges[i], &in66[33*i], 33)) {
172 return 0;
173 }
175 return 0;
176 }
177 }
179 return 1;
180}
181
183 secp256k1_ge ges[2];
184 int i;
185
186 VERIFY_CHECK(ctx != NULL);
187 ARG_CHECK(out66 != NULL);
188 memset(out66, 0, 66);
189 ARG_CHECK(nonce != NULL);
190
191 if (!secp256k1_musig_pubnonce_load(ctx, ges, nonce)) {
192 return 0;
193 }
194 for (i = 0; i < 2; i++) {
195 /* serialize must succeed because the point was just loaded */
196 secp256k1_ge_serialize33(&ges[i], &out66[33*i]);
197 }
198 return 1;
199}
200
202 secp256k1_ge ges[2];
203 int i;
204
205 VERIFY_CHECK(ctx != NULL);
206 ARG_CHECK(nonce != NULL);
207 ARG_CHECK(in66 != NULL);
208
209 for (i = 0; i < 2; i++) {
210 if (!secp256k1_ge_parse_ext33(&ges[i], &in66[33*i])) {
211 return 0;
212 }
213 }
215 return 1;
216}
217
219 secp256k1_ge ges[2];
220 int i;
221
222 VERIFY_CHECK(ctx != NULL);
223 ARG_CHECK(out66 != NULL);
224 memset(out66, 0, 66);
225 ARG_CHECK(nonce != NULL);
226
227 if (!secp256k1_musig_aggnonce_load(ctx, ges, nonce)) {
228 return 0;
229 }
230 for (i = 0; i < 2; i++) {
231 secp256k1_ge_serialize_ext33(&out66[33*i], &ges[i]);
232 }
233 return 1;
234}
235
238 int overflow;
239 VERIFY_CHECK(ctx != NULL);
240 ARG_CHECK(sig != NULL);
241 ARG_CHECK(in32 != NULL);
242
243 /* Ensure that using the signature will fail if parsing fails (and the user
244 * doesn't check the return value). */
245 memset(sig, 0, sizeof(*sig));
246
247 secp256k1_scalar_set_b32(&tmp, in32, &overflow);
248 if (overflow) {
249 return 0;
250 }
252 return 1;
253}
254
256 VERIFY_CHECK(ctx != NULL);
257 ARG_CHECK(out32 != NULL);
258 ARG_CHECK(sig != NULL);
260
261 memcpy(out32, &sig->data[4], 32);
262 return 1;
263}
264
265/* Write optional inputs into the hash */
266static void secp256k1_nonce_function_musig_helper(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *sha, unsigned int prefix_size, const unsigned char *data, unsigned char len) {
267 unsigned char zero[7] = { 0 };
268 /* The spec requires length prefixes to be between 1 and 8 bytes
269 * (inclusive) */
270 VERIFY_CHECK(prefix_size >= 1 && prefix_size <= 8);
271 /* Since the length of all input data fits in a byte, we can always pad the
272 * length prefix with prefix_size - 1 zero bytes. */
273 secp256k1_sha256_write(hash_ctx, sha, zero, prefix_size - 1);
274 if (data != NULL) {
275 secp256k1_sha256_write(hash_ctx, sha, &len, 1);
276 secp256k1_sha256_write(hash_ctx, sha, data, len);
277 } else {
278 len = 0;
279 secp256k1_sha256_write(hash_ctx, sha, &len, 1);
280 }
281}
282
283/* Initializes SHA256 with fixed midstate. This midstate was computed by applying
284 * SHA256 to SHA256("MuSig/aux")||SHA256("MuSig/aux"). */
286 static const uint32_t midstate[8] = {
287 0xa19e884bul, 0xf463fe7eul, 0x2f18f9a2ul, 0xbeb0f9fful,
288 0x0f37e8b0ul, 0x06ebd26ful, 0xe3b243d2ul, 0x522fb150ul
289 };
290 secp256k1_sha256_initialize_midstate(sha, 64, midstate);
291}
292
293/* Initializes SHA256 with fixed midstate. This midstate was computed by applying
294 * SHA256 to SHA256("MuSig/nonce")||SHA256("MuSig/nonce"). */
296 static const uint32_t midstate[8] = {
297 0x07101b64ul, 0x18003414ul, 0x0391bc43ul, 0x0e6258eeul,
298 0x29d26b72ul, 0x8343937eul, 0xb7a0a4fbul, 0xff568a30ul
299 };
300 secp256k1_sha256_initialize_midstate(sha, 64, midstate);
301}
302
303static void secp256k1_nonce_function_musig(const secp256k1_hash_ctx *hash_ctx, 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) {
305 unsigned char rand[32];
306 unsigned char i;
307 unsigned char msg_present;
308
309 if (seckey32 != NULL) {
311 secp256k1_sha256_write(hash_ctx, &sha, session_secrand, 32);
312 secp256k1_sha256_finalize(hash_ctx, &sha, rand);
313 for (i = 0; i < 32; i++) {
314 rand[i] ^= seckey32[i];
315 }
316 } else {
317 memcpy(rand, session_secrand, sizeof(rand));
318 }
319
321 secp256k1_sha256_write(hash_ctx, &sha, rand, sizeof(rand));
322 secp256k1_nonce_function_musig_helper(hash_ctx, &sha, 1, pk33, 33);
323 secp256k1_nonce_function_musig_helper(hash_ctx, &sha, 1, agg_pk32, 32);
324 msg_present = msg32 != NULL;
325 secp256k1_sha256_write(hash_ctx, &sha, &msg_present, 1);
326 if (msg_present) {
327 secp256k1_nonce_function_musig_helper(hash_ctx, &sha, 8, msg32, 32);
328 }
329 secp256k1_nonce_function_musig_helper(hash_ctx, &sha, 4, extra_input32, 32);
330
331 for (i = 0; i < 2; i++) {
332 unsigned char buf[32];
333 secp256k1_sha256 sha_tmp = sha;
334 secp256k1_sha256_write(hash_ctx, &sha_tmp, &i, 1);
335 secp256k1_sha256_finalize(hash_ctx, &sha_tmp, buf);
336 secp256k1_scalar_set_b32(&k[i], buf, NULL);
337
338 /* Attempt to erase secret data */
339 secp256k1_memclear_explicit(buf, sizeof(buf));
340 secp256k1_sha256_clear(&sha_tmp);
341 }
342 secp256k1_memclear_explicit(rand, sizeof(rand));
344}
345
346static int secp256k1_musig_nonce_gen_internal(const secp256k1_context* ctx, secp256k1_musig_secnonce *secnonce, secp256k1_musig_pubnonce *pubnonce, const unsigned char *input_nonce, const unsigned char *seckey, const secp256k1_pubkey *pubkey, const unsigned char *msg32, const secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *extra_input32) {
348 secp256k1_ge nonce_pts[2];
349 secp256k1_gej nonce_ptj[2];
350 int i;
351 unsigned char pk_ser[33];
352 unsigned char aggpk_ser[32];
353 unsigned char *aggpk_ser_ptr = NULL;
355 int ret = 1;
356
357 ARG_CHECK(pubnonce != NULL);
358 memset(pubnonce, 0, sizeof(*pubnonce));
359 ARG_CHECK(pubkey != NULL);
361
362 /* Check that the seckey is valid to be able to sign for it later. */
363 if (seckey != NULL) {
367 }
368
369 if (keyagg_cache != NULL) {
371 if (!secp256k1_keyagg_cache_load(ctx, &cache_i, keyagg_cache)) {
372 return 0;
373 }
374 /* The loaded point cache_i.pk can not be the point at infinity. */
375 secp256k1_fe_get_b32(aggpk_ser, &cache_i.pk.x);
376 aggpk_ser_ptr = aggpk_ser;
377 }
378 if (!secp256k1_pubkey_load(ctx, &pk, pubkey)) {
379 return 0;
380 }
381 /* A pubkey cannot be the point at infinity */
383
384 secp256k1_nonce_function_musig(&ctx->hash_ctx, k, input_nonce, msg32, seckey, pk_ser, aggpk_ser_ptr, extra_input32);
389
390 /* Compute pubnonce as two gejs */
391 for (i = 0; i < 2; i++) {
392 secp256k1_ecmult_gen_gej(&ctx->ecmult_gen_ctx, &nonce_ptj[i], &k[i]);
394 }
395
396 /* Batch convert to two public ges */
397 secp256k1_ge_set_all_gej(nonce_pts, nonce_ptj, 2);
398 for (i = 0; i < 2; i++) {
399 secp256k1_gej_clear(&nonce_ptj[i]);
400 }
401
402 for (i = 0; i < 2; i++) {
403 secp256k1_declassify(ctx, &nonce_pts[i], sizeof(nonce_pts[i]));
404 }
405 /* None of the nonce_pts will be infinity because k != 0 with overwhelming
406 * probability */
407 secp256k1_musig_pubnonce_save(pubnonce, nonce_pts);
408 return ret;
409}
410
411int 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) {
412 int ret = 1;
413
414 VERIFY_CHECK(ctx != NULL);
415 ARG_CHECK(secnonce != NULL);
416 memset(secnonce, 0, sizeof(*secnonce));
417 ARG_CHECK(session_secrand32 != NULL);
418
419 /* Check in constant time that the session_secrand32 is not 0 as a
420 * defense-in-depth measure that may protect against a faulty RNG. */
421 ret &= !secp256k1_is_zero_array(session_secrand32, 32);
422
423 /* We can declassify because branching on ret is only relevant when this
424 * function called with an invalid session_secrand32 argument */
425 secp256k1_declassify(ctx, &ret, sizeof(ret));
426 if (ret == 0) {
427 secp256k1_musig_secnonce_invalidate(ctx, secnonce, 1);
428 return 0;
429 }
430
431 ret &= secp256k1_musig_nonce_gen_internal(ctx, secnonce, pubnonce, session_secrand32, seckey, pubkey, msg32, keyagg_cache, extra_input32);
432
433 /* Set the session_secrand32 buffer to zero to prevent the caller from using
434 * nonce_gen multiple times with the same buffer. */
435 secp256k1_memczero(session_secrand32, 32, ret);
436 return ret;
437}
438
439int 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) {
440 unsigned char buf[32] = { 0 };
441 unsigned char seckey[32];
442 secp256k1_pubkey pubkey;
443 int ret;
444
445 VERIFY_CHECK(ctx != NULL);
446 ARG_CHECK(secnonce != NULL);
447 memset(secnonce, 0, sizeof(*secnonce));
448 ARG_CHECK(keypair != NULL);
449
450 secp256k1_write_be64(buf, nonrepeating_cnt);
451 /* keypair_sec and keypair_pub do not fail if the arguments are not NULL */
452 ret = secp256k1_keypair_sec(ctx, seckey, keypair);
454 ret = secp256k1_keypair_pub(ctx, &pubkey, keypair);
456#ifndef VERIFY
457 (void) ret;
458#endif
459
460 ret = secp256k1_musig_nonce_gen_internal(ctx, secnonce, pubnonce, buf, seckey, &pubkey, msg32, keyagg_cache, extra_input32);
461 secp256k1_memclear_explicit(seckey, sizeof(seckey));
462 return ret;
463}
464
465static int secp256k1_musig_sum_pubnonces(const secp256k1_context* ctx, secp256k1_gej *summed_pubnonces, const secp256k1_musig_pubnonce * const* pubnonces, size_t n_pubnonces) {
466 size_t i;
467 int j;
468
469 secp256k1_gej_set_infinity(&summed_pubnonces[0]);
470 secp256k1_gej_set_infinity(&summed_pubnonces[1]);
471
472 for (i = 0; i < n_pubnonces; i++) {
473 secp256k1_ge nonce_pts[2];
474 if (!secp256k1_musig_pubnonce_load(ctx, nonce_pts, pubnonces[i])) {
475 return 0;
476 }
477 for (j = 0; j < 2; j++) {
478 secp256k1_gej_add_ge_var(&summed_pubnonces[j], &summed_pubnonces[j], &nonce_pts[j], NULL);
479 }
480 }
481 return 1;
482}
483
484int secp256k1_musig_nonce_agg(const secp256k1_context* ctx, secp256k1_musig_aggnonce *aggnonce, const secp256k1_musig_pubnonce * const* pubnonces, size_t n_pubnonces) {
485 secp256k1_gej aggnonce_ptsj[2];
486 secp256k1_ge aggnonce_pts[2];
487 size_t i;
488
489 VERIFY_CHECK(ctx != NULL);
490 ARG_CHECK(aggnonce != NULL);
491 ARG_CHECK(pubnonces != NULL);
492 ARG_CHECK(n_pubnonces > 0);
493 for (i = 0; i < n_pubnonces; i++) {
494 ARG_CHECK(pubnonces[i] != NULL);
495 }
496
497 if (!secp256k1_musig_sum_pubnonces(ctx, aggnonce_ptsj, pubnonces, n_pubnonces)) {
498 return 0;
499 }
500 secp256k1_ge_set_all_gej_var(aggnonce_pts, aggnonce_ptsj, 2);
501 secp256k1_musig_aggnonce_save(aggnonce, aggnonce_pts);
502 return 1;
503}
504
505/* Initializes SHA256 with fixed midstate. This midstate was computed by applying
506 * SHA256 to SHA256("MuSig/noncecoef")||SHA256("MuSig/noncecoef"). */
508 static const uint32_t midstate[8] = {
509 0x2c7d5a45ul, 0x06bf7e53ul, 0x89be68a6ul, 0x971254c0ul,
510 0x60ac12d2ul, 0x72846dcdul, 0x6c81212ful, 0xde7a2500ul
511 };
512 secp256k1_sha256_initialize_midstate(sha, 64, midstate);
513}
514
515/* tagged_hash(aggnonce[0], aggnonce[1], agg_pk, msg) */
516static void secp256k1_musig_compute_noncehash(const secp256k1_hash_ctx *hash_ctx, unsigned char *noncehash, secp256k1_ge *aggnonce, const unsigned char *agg_pk32, const unsigned char *msg) {
517 unsigned char buf[33];
519 int i;
520
522 for (i = 0; i < 2; i++) {
523 secp256k1_ge_serialize_ext33(buf, &aggnonce[i]);
524 secp256k1_sha256_write(hash_ctx, &sha, buf, sizeof(buf));
525 }
526 secp256k1_sha256_write(hash_ctx, &sha, agg_pk32, 32);
527 secp256k1_sha256_write(hash_ctx, &sha, msg, 32);
528 secp256k1_sha256_finalize(hash_ctx, &sha, noncehash);
529}
530
531/* out_nonce = nonce_pts[0] + b*nonce_pts[1] */
532static void secp256k1_effective_nonce(secp256k1_gej *out_nonce, const secp256k1_ge *nonce_pts, const secp256k1_scalar *b) {
533 secp256k1_gej tmp;
534
535 secp256k1_gej_set_ge(&tmp, &nonce_pts[1]);
536 secp256k1_ecmult(out_nonce, &tmp, b, NULL);
537 secp256k1_gej_add_ge_var(out_nonce, out_nonce, &nonce_pts[0], NULL);
538}
539
540static void secp256k1_musig_nonce_process_internal(const secp256k1_context *ctx, int *fin_nonce_parity, unsigned char *fin_nonce, secp256k1_scalar *b, secp256k1_ge *aggnonce_pts, const unsigned char *agg_pk32, const unsigned char *msg) {
541 unsigned char noncehash[32];
542 secp256k1_ge fin_nonce_pt;
543 secp256k1_gej fin_nonce_ptj;
544
545 secp256k1_musig_compute_noncehash(&ctx->hash_ctx, noncehash, aggnonce_pts, agg_pk32, msg);
546 secp256k1_scalar_set_b32(b, noncehash, NULL);
547 /* fin_nonce = aggnonce_pts[0] + b*aggnonce_pts[1] */
548 secp256k1_effective_nonce(&fin_nonce_ptj, aggnonce_pts, b);
549 secp256k1_ge_set_gej(&fin_nonce_pt, &fin_nonce_ptj);
550 if (secp256k1_ge_is_infinity(&fin_nonce_pt)) {
551 fin_nonce_pt = secp256k1_ge_const_g;
552 }
553 /* fin_nonce_pt is not the point at infinity */
554 secp256k1_fe_normalize_var(&fin_nonce_pt.x);
555 secp256k1_fe_get_b32(fin_nonce, &fin_nonce_pt.x);
556 secp256k1_fe_normalize_var(&fin_nonce_pt.y);
557 *fin_nonce_parity = secp256k1_fe_is_odd(&fin_nonce_pt.y);
558}
559
560int 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) {
562 secp256k1_ge aggnonce_pts[2];
563 unsigned char fin_nonce[32];
565 unsigned char agg_pk32[32];
566
567 VERIFY_CHECK(ctx != NULL);
568 ARG_CHECK(session != NULL);
569 ARG_CHECK(aggnonce != NULL);
570 ARG_CHECK(msg32 != NULL);
571 ARG_CHECK(keyagg_cache != NULL);
572
573 if (!secp256k1_keyagg_cache_load(ctx, &cache_i, keyagg_cache)) {
574 return 0;
575 }
576 secp256k1_fe_get_b32(agg_pk32, &cache_i.pk.x);
577
578 if (!secp256k1_musig_aggnonce_load(ctx, aggnonce_pts, aggnonce)) {
579 return 0;
580 }
581
582 secp256k1_musig_nonce_process_internal(ctx, &session_i.fin_nonce_parity, fin_nonce, &session_i.noncecoef, aggnonce_pts, agg_pk32, msg32);
583 secp256k1_schnorrsig_challenge(&ctx->hash_ctx, &session_i.challenge, fin_nonce, msg32, 32, agg_pk32);
584
585 /* If there is a tweak then set `challenge` times `tweak` to the `s`-part.*/
586 secp256k1_scalar_set_int(&session_i.s_part, 0);
587 if (!secp256k1_scalar_is_zero(&cache_i.tweak)) {
588 secp256k1_scalar e_tmp;
589 secp256k1_scalar_mul(&e_tmp, &session_i.challenge, &cache_i.tweak);
590 if (secp256k1_fe_is_odd(&cache_i.pk.y)) {
591 secp256k1_scalar_negate(&e_tmp, &e_tmp);
592 }
593 session_i.s_part = e_tmp;
594 }
595 memcpy(session_i.fin_nonce, fin_nonce, sizeof(session_i.fin_nonce));
596 secp256k1_musig_session_save(session, &session_i);
597 return 1;
598}
599
604}
605
608 secp256k1_ge pk, keypair_pk;
613 int ret;
614
615 VERIFY_CHECK(ctx != NULL);
616
617 ARG_CHECK(secnonce != NULL);
618 /* Fails if the magic doesn't match */
619 ret = secp256k1_musig_secnonce_load(ctx, k, &pk, secnonce);
620 /* Set nonce to zero to avoid nonce reuse. This will cause subsequent calls
621 * of this function to fail */
622 secp256k1_memzero_explicit(secnonce, sizeof(*secnonce));
623 if (!ret) {
625 return 0;
626 }
627
628 ARG_CHECK(partial_sig != NULL);
629 ARG_CHECK(keypair != NULL);
630 ARG_CHECK(keyagg_cache != NULL);
631 ARG_CHECK(session != NULL);
632
633 if (!secp256k1_keypair_load(ctx, &sk, &keypair_pk, keypair)) {
635 return 0;
636 }
637 ARG_CHECK(secp256k1_fe_equal(&pk.x, &keypair_pk.x)
638 && secp256k1_fe_equal(&pk.y, &keypair_pk.y));
639 if (!secp256k1_keyagg_cache_load(ctx, &cache_i, keyagg_cache)) {
641 return 0;
642 }
643
644 /* Negate sk if secp256k1_fe_is_odd(&cache_i.pk.y)) XOR cache_i.parity_acc.
645 * This corresponds to the line "Let d = gâ‹…gaccâ‹…d' mod n" in the
646 * specification. */
647 if ((secp256k1_fe_is_odd(&cache_i.pk.y)
648 != cache_i.parity_acc)) {
650 }
651
652 /* Multiply KeyAgg coefficient */
653 secp256k1_musig_keyaggcoef(&ctx->hash_ctx, &mu, &cache_i, &pk);
654 secp256k1_scalar_mul(&sk, &sk, &mu);
655
656 if (!secp256k1_musig_session_load(ctx, &session_i, session)) {
658 return 0;
659 }
660
661 if (session_i.fin_nonce_parity) {
662 secp256k1_scalar_negate(&k[0], &k[0]);
663 secp256k1_scalar_negate(&k[1], &k[1]);
664 }
665
666 /* Sign */
667 secp256k1_scalar_mul(&s, &session_i.challenge, &sk);
668 secp256k1_scalar_mul(&k[1], &session_i.noncecoef, &k[1]);
669 secp256k1_scalar_add(&k[0], &k[0], &k[1]);
670 secp256k1_scalar_add(&s, &s, &k[0]);
671 secp256k1_musig_partial_sig_save(partial_sig, &s);
673 return 1;
674}
675
679 secp256k1_scalar mu, e, s;
680 secp256k1_gej pkj;
681 secp256k1_ge nonce_pts[2];
682 secp256k1_gej rj;
683 secp256k1_gej tmp;
684 secp256k1_ge pkp;
685
686 VERIFY_CHECK(ctx != NULL);
687 ARG_CHECK(partial_sig != NULL);
688 ARG_CHECK(pubnonce != NULL);
689 ARG_CHECK(pubkey != NULL);
690 ARG_CHECK(keyagg_cache != NULL);
691 ARG_CHECK(session != NULL);
692
693 if (!secp256k1_musig_session_load(ctx, &session_i, session)) {
694 return 0;
695 }
696
697 if (!secp256k1_musig_pubnonce_load(ctx, nonce_pts, pubnonce)) {
698 return 0;
699 }
700 /* Compute "effective" nonce rj = nonce_pts[0] + b*nonce_pts[1] */
701 /* TODO: use multiexp to compute -s*G + e*mu*pubkey + nonce_pts[0] + b*nonce_pts[1] */
702 secp256k1_effective_nonce(&rj, nonce_pts, &session_i.noncecoef);
703
704 if (!secp256k1_pubkey_load(ctx, &pkp, pubkey)) {
705 return 0;
706 }
707 if (!secp256k1_keyagg_cache_load(ctx, &cache_i, keyagg_cache)) {
708 return 0;
709 }
710 /* Multiplying the challenge by the KeyAgg coefficient is equivalent
711 * to multiplying the signer's public key by the coefficient, except
712 * much easier to do. */
713 secp256k1_musig_keyaggcoef(&ctx->hash_ctx, &mu, &cache_i, &pkp);
714 secp256k1_scalar_mul(&e, &session_i.challenge, &mu);
715
716 /* Negate e if secp256k1_fe_is_odd(&cache_i.pk.y)) XOR cache_i.parity_acc.
717 * This corresponds to the line "Let g' = gâ‹…gacc mod n" and the multiplication "g'â‹…e"
718 * in the specification. */
719 if (secp256k1_fe_is_odd(&cache_i.pk.y)
720 != cache_i.parity_acc) {
722 }
723
724 if (!secp256k1_musig_partial_sig_load(ctx, &s, partial_sig)) {
725 return 0;
726 }
727 /* Compute -s*G + e*pkj + rj (e already includes the keyagg coefficient mu) */
729 secp256k1_gej_set_ge(&pkj, &pkp);
730 secp256k1_ecmult(&tmp, &pkj, &e, &s);
731 if (session_i.fin_nonce_parity) {
732 secp256k1_gej_neg(&rj, &rj);
733 }
734 secp256k1_gej_add_var(&tmp, &tmp, &rj, NULL);
735
736 return secp256k1_gej_is_infinity(&tmp);
737}
738
739int 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) {
740 size_t i;
742
743 VERIFY_CHECK(ctx != NULL);
744 ARG_CHECK(sig64 != NULL);
745 ARG_CHECK(session != NULL);
746 ARG_CHECK(partial_sigs != NULL);
747 ARG_CHECK(n_sigs > 0);
748 for (i = 0; i < n_sigs; i++) {
749 ARG_CHECK(partial_sigs[i] != NULL);
750 }
751
752 if (!secp256k1_musig_session_load(ctx, &session_i, session)) {
753 return 0;
754 }
755 for (i = 0; i < n_sigs; i++) {
756 secp256k1_scalar term;
757 if (!secp256k1_musig_partial_sig_load(ctx, &term, partial_sigs[i])) {
758 return 0;
759 }
760 secp256k1_scalar_add(&session_i.s_part, &session_i.s_part, &term);
761 }
762 secp256k1_scalar_get_b32(&sig64[32], &session_i.s_part);
763 memcpy(&sig64[0], session_i.fin_nonce, 32);
764 return 1;
765}
766
767#endif
int ret
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
static void secp256k1_ecmult(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng)
Double multiply: R = na*A + ng*G.
static void secp256k1_ecmult_gen_gej(const secp256k1_ecmult_gen_context *ecmult_gen_ctx, secp256k1_gej *r, const secp256k1_scalar *a)
Multiply with the generator: R = a*G.
static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context *ecmult_gen_ctx)
static int secp256k1_keypair_load(const secp256k1_context *ctx, secp256k1_scalar *sk, secp256k1_ge *pk, const secp256k1_keypair *keypair)
Definition: main_impl.h:183
#define secp256k1_fe_is_odd
Definition: field.h:85
#define secp256k1_fe_normalize_var
Definition: field.h:80
#define secp256k1_fe_get_b32
Definition: field.h:89
static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
Determine whether two field elements are equal.
static void secp256k1_gej_clear(secp256k1_gej *r)
Clear a secp256k1_gej to prevent leaking sensitive information.
static void secp256k1_gej_set_infinity(secp256k1_gej *r)
Set a group element (jacobian) equal to the point at infinity.
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
Check whether a group element is the point at infinity.
static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr)
Set r equal to the sum of a and b (with b given in affine coordinates).
static void secp256k1_ge_to_bytes_ext(unsigned char *data, const secp256k1_ge *ge)
Convert a group element (that is allowed to be infinity) to a 64-byte array.
static int secp256k1_ge_parse_ext33(secp256k1_ge *ge, const unsigned char *in33)
Outputs the point at infinity if the given byte array is all zero, otherwise attempts to parse compre...
static void secp256k1_ge_serialize33(secp256k1_ge *elem, unsigned char *pub33)
Serialize a group element (that is not allowed to be infinity) to a compressed public key (33 bytes).
static void secp256k1_ge_from_bytes_ext(secp256k1_ge *ge, const unsigned char *data)
Convert a 64-byte array into a group element.
static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr)
Set r equal to the sum of a and b.
static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a)
Set a group element equal to another which is given in jacobian coordinates.
static void secp256k1_ge_serialize_ext33(unsigned char *out33, secp256k1_ge *ge)
Outputs 33 zero bytes if the given group element is the point at infinity and otherwise outputs the c...
static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge *ge)
Determine if a point (which is assumed to be on the curve) is in the correct (sub)group of the curve.
static void secp256k1_ge_set_all_gej(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
Set group elements r[0:len] (affine) equal to group elements a[0:len] (jacobian).
static int secp256k1_ge_is_infinity(const secp256k1_ge *a)
Check whether a group element is the point at infinity.
static int secp256k1_ge_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size)
Parse a group element from a 33-byte compressed or 65-byte uncompressed public key.
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
Set group elements r[0:len] (affine) equal to group elements a[0:len] (jacobian).
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a)
Set a group element (jacobian) equal to another which is given in affine coordinates.
static void secp256k1_ge_to_bytes(unsigned char *buf, const secp256k1_ge *a)
Convert a group element that is not infinity to a 64-byte array.
static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a)
Set r equal to the inverse of a (i.e., mirrored around the X axis)
static void secp256k1_ge_from_bytes(secp256k1_ge *r, const unsigned char *buf)
Convert a 64-byte array into group element.
static const secp256k1_ge secp256k1_ge_const_g
Definition: group_impl.h:72
static void secp256k1_musig_keyaggcoef(const secp256k1_hash_ctx *hash_ctx, secp256k1_scalar *r, const secp256k1_keyagg_cache_internal *cache_i, secp256k1_ge *pk)
static int secp256k1_keyagg_cache_load(const secp256k1_context *ctx, secp256k1_keyagg_cache_internal *cache_i, const secp256k1_musig_keyagg_cache *cache)
unsigned int nonce
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_set_b32_seckey(secp256k1_scalar *r, const unsigned char *bin)
Set a scalar from a big endian byte array and returns 1 if it is a valid seckey and 0 otherwise.
static int secp256k1_scalar_is_zero(const secp256k1_scalar *a)
Check whether a scalar equals zero.
static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v)
Set a scalar to an unsigned integer.
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar *a)
Convert a scalar to a byte array.
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b)
Add two scalars together (modulo the group order).
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b)
Multiply two scalars (modulo the group order).
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the complement of a scalar (modulo the group order).
static void secp256k1_scalar_clear(secp256k1_scalar *r)
Clear a scalar to prevent the leak of sensitive data.
static void secp256k1_schnorrsig_challenge(const secp256k1_hash_ctx *hash_ctx, secp256k1_scalar *e, const unsigned char *r32, const unsigned char *msg, size_t msglen, const unsigned char *pubkey32)
Definition: main_impl.h:106
static void secp256k1_sha256_finalize(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *hash, unsigned char *out32)
static void secp256k1_sha256_initialize_midstate(secp256k1_sha256 *hash, uint64_t bytes, const uint32_t state[8])
static void secp256k1_sha256_write(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *hash, const unsigned char *data, size_t size)
static void secp256k1_sha256_clear(secp256k1_sha256 *hash)
static SECP256K1_INLINE void secp256k1_memclear_explicit(void *ptr, size_t len)
Definition: util.h:268
static SECP256K1_INLINE int secp256k1_memcmp_var(const void *s1, const void *s2, size_t n)
Semantics like memcmp.
Definition: util.h:281
static SECP256K1_INLINE void secp256k1_memzero_explicit(void *ptr, size_t len)
Definition: util.h:236
static SECP256K1_INLINE int secp256k1_is_zero_array(const unsigned char *s, size_t len)
Definition: util.h:296
static SECP256K1_INLINE void secp256k1_write_be64(unsigned char *p, uint64_t x)
Definition: util.h:456
#define VERIFY_CHECK(cond)
Definition: util.h:169
static SECP256K1_INLINE void secp256k1_memczero(void *s, size_t len, int flag)
Definition: util.h:220
#define ARG_CHECK(cond)
Definition: secp256k1.c:45
static SECP256K1_INLINE void secp256k1_declassify(const secp256k1_context *ctx, const void *p, size_t len)
Definition: secp256k1.c:250
static int secp256k1_pubkey_load(const secp256k1_context *ctx, secp256k1_ge *ge, const secp256k1_pubkey *pubkey)
Definition: secp256k1.c:254
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:231
SECP256K1_API int secp256k1_keypair_sec(const secp256k1_context *ctx, unsigned char *seckey, const secp256k1_keypair *keypair) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Get the secret key from a keypair.
Definition: main_impl.h:221
static void secp256k1_musig_secnonce_save(secp256k1_musig_secnonce *secnonce, const secp256k1_scalar *k, const secp256k1_ge *pk)
Definition: session_impl.h:24
static int secp256k1_musig_nonce_gen_internal(const secp256k1_context *ctx, secp256k1_musig_secnonce *secnonce, secp256k1_musig_pubnonce *pubnonce, const unsigned char *input_nonce, const unsigned char *seckey, const secp256k1_pubkey *pubkey, const unsigned char *msg32, const secp256k1_musig_keyagg_cache *keyagg_cache, const unsigned char *extra_input32)
Definition: session_impl.h:346
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)
Produces a partial signature.
Definition: session_impl.h:606
static void secp256k1_musig_compute_noncehash(const secp256k1_hash_ctx *hash_ctx, unsigned char *noncehash, secp256k1_ge *aggnonce, const unsigned char *agg_pk32, const unsigned char *msg)
Definition: session_impl.h:516
static const unsigned char secp256k1_musig_aggnonce_magic[4]
Definition: session_impl.h:82
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)
Starts a signing session by generating a nonce.
Definition: session_impl.h:411
int secp256k1_musig_aggnonce_serialize(const secp256k1_context *ctx, unsigned char *out66, const secp256k1_musig_aggnonce *nonce)
Serialize an aggregate public nonce.
Definition: session_impl.h:218
static const unsigned char secp256k1_musig_secnonce_magic[4]
Definition: session_impl.h:22
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:465
int secp256k1_musig_partial_sig_serialize(const secp256k1_context *ctx, unsigned char *out32, const secp256k1_musig_partial_sig *sig)
Serialize a MuSig partial signature.
Definition: session_impl.h:255
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)
Alternative way to generate a nonce and start a signing session.
Definition: session_impl.h:439
static int secp256k1_musig_partial_sig_load(const secp256k1_context *ctx, secp256k1_scalar *s, const secp256k1_musig_partial_sig *sig)
Definition: session_impl.h:152
static void secp256k1_musig_aggnonce_save(secp256k1_musig_aggnonce *nonce, const secp256k1_ge *ges)
Definition: session_impl.h:84
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)
Aggregates partial signatures.
Definition: session_impl.h:739
static const unsigned char secp256k1_musig_partial_sig_magic[4]
Definition: session_impl.h:145
static int secp256k1_musig_pubnonce_load(const secp256k1_context *ctx, secp256k1_ge *ges, const secp256k1_musig_pubnonce *nonce)
Definition: session_impl.h:72
static const unsigned char secp256k1_musig_session_cache_magic[4]
Definition: session_impl.h:102
static void secp256k1_musig_compute_noncehash_sha256_tagged(secp256k1_sha256 *sha)
Definition: session_impl.h:507
static void secp256k1_nonce_function_musig_sha256_tagged_aux(secp256k1_sha256 *sha)
Definition: session_impl.h:285
static int secp256k1_musig_secnonce_load(const secp256k1_context *ctx, secp256k1_scalar *k, secp256k1_ge *pk, const secp256k1_musig_secnonce *secnonce)
Definition: session_impl.h:31
static void secp256k1_nonce_function_musig_sha256_tagged(secp256k1_sha256 *sha)
Definition: session_impl.h:295
static void secp256k1_musig_partial_sig_save(secp256k1_musig_partial_sig *sig, secp256k1_scalar *s)
Definition: session_impl.h:147
static void secp256k1_musig_secnonce_invalidate(const secp256k1_context *ctx, secp256k1_musig_secnonce *secnonce, int flag)
Definition: session_impl.h:48
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)
Verifies an individual signer's partial signature.
Definition: session_impl.h:676
static void secp256k1_musig_session_save(secp256k1_musig_session *session, const secp256k1_musig_session_internal *session_i)
Definition: session_impl.h:112
int secp256k1_musig_aggnonce_parse(const secp256k1_context *ctx, secp256k1_musig_aggnonce *nonce, const unsigned char *in66)
Parse an aggregate public nonce.
Definition: session_impl.h:201
static void secp256k1_effective_nonce(secp256k1_gej *out_nonce, const secp256k1_ge *nonce_pts, const secp256k1_scalar *b)
Definition: session_impl.h:532
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)
Takes the aggregate nonce and creates a session that is required for signing and verification of part...
Definition: session_impl.h:560
static int secp256k1_musig_session_load(const secp256k1_context *ctx, secp256k1_musig_session_internal *session_i, const secp256k1_musig_session *session)
Definition: session_impl.h:128
static void secp256k1_nonce_function_musig_helper(const secp256k1_hash_ctx *hash_ctx, secp256k1_sha256 *sha, unsigned int prefix_size, const unsigned char *data, unsigned char len)
Definition: session_impl.h:266
int secp256k1_musig_nonce_agg(const secp256k1_context *ctx, secp256k1_musig_aggnonce *aggnonce, const secp256k1_musig_pubnonce *const *pubnonces, size_t n_pubnonces)
Aggregates the nonces of all signers into a single nonce.
Definition: session_impl.h:484
static void secp256k1_musig_nonce_process_internal(const secp256k1_context *ctx, int *fin_nonce_parity, unsigned char *fin_nonce, secp256k1_scalar *b, secp256k1_ge *aggnonce_pts, const unsigned char *agg_pk32, const unsigned char *msg)
Definition: session_impl.h:540
static void secp256k1_musig_partial_sign_clear(secp256k1_scalar *sk, secp256k1_scalar *k)
Definition: session_impl.h:600
static const unsigned char secp256k1_musig_pubnonce_magic[4]
Definition: session_impl.h:58
int secp256k1_musig_partial_sig_parse(const secp256k1_context *ctx, secp256k1_musig_partial_sig *sig, const unsigned char *in32)
Parse a MuSig partial signature.
Definition: session_impl.h:236
int secp256k1_musig_pubnonce_parse(const secp256k1_context *ctx, secp256k1_musig_pubnonce *nonce, const unsigned char *in66)
Parse a signer's public nonce.
Definition: session_impl.h:162
static int secp256k1_musig_aggnonce_load(const secp256k1_context *ctx, secp256k1_ge *ges, const secp256k1_musig_aggnonce *nonce)
Definition: session_impl.h:92
static void secp256k1_nonce_function_musig(const secp256k1_hash_ctx *hash_ctx, 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:303
static void secp256k1_musig_pubnonce_save(secp256k1_musig_pubnonce *nonce, const secp256k1_ge *ges)
Definition: session_impl.h:62
int secp256k1_musig_pubnonce_serialize(const secp256k1_context *ctx, unsigned char *out66, const secp256k1_musig_pubnonce *nonce)
Serialize a signer's public nonce.
Definition: session_impl.h:182
secp256k1_ecmult_gen_context ecmult_gen_ctx
Definition: secp256k1.c:62
secp256k1_hash_ctx hash_ctx
Definition: secp256k1.c:63
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
Definition: group.h:16
secp256k1_fe x
Definition: group.h:17
secp256k1_fe y
Definition: group.h:18
A group element of the secp256k1 curve, in jacobian coordinates.
Definition: group.h:28
secp256k1_scalar tweak
Definition: keyagg.h:22
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]
secp256k1_scalar noncecoef
Definition: session.h:17
secp256k1_scalar s_part
Definition: session.h:19
secp256k1_scalar challenge
Definition: session.h:18
unsigned char fin_nonce[32]
Definition: session.h:16
Opaque data structure that holds a MuSig session.
unsigned char data[133]
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:62
A scalar modulo the group order of the secp256k1 curve.
Definition: scalar_4x64.h:13