github.com/ethereum/go-ethereum@v1.16.1/crypto/secp256k1/libsecp256k1/include/secp256k1_musig.h (about) 1 #ifndef SECP256K1_MUSIG_H 2 #define SECP256K1_MUSIG_H 3 4 #include "secp256k1_extrakeys.h" 5 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 #include <stddef.h> 11 #include <stdint.h> 12 13 /** This module implements BIP 327 "MuSig2 for BIP340-compatible 14 * Multi-Signatures" 15 * (https://github.com/bitcoin/bips/blob/master/bip-0327.mediawiki) 16 * v1.0.0. You can find an example demonstrating the musig module in 17 * examples/musig.c. 18 * 19 * The module also supports BIP 341 ("Taproot") public key tweaking. 20 * 21 * It is recommended to read the documentation in this include file carefully. 22 * Further notes on API usage can be found in doc/musig.md 23 * 24 * Since the first version of MuSig is essentially replaced by MuSig2, we use 25 * MuSig, musig and MuSig2 synonymously unless noted otherwise. 26 */ 27 28 /** Opaque data structures 29 * 30 * The exact representation of data inside the opaque data structures is 31 * implementation defined and not guaranteed to be portable between different 32 * platforms or versions. With the exception of `secp256k1_musig_secnonce`, the 33 * data structures can be safely copied/moved. If you need to convert to a 34 * format suitable for storage, transmission, or comparison, use the 35 * corresponding serialization and parsing functions. 36 */ 37 38 /** Opaque data structure that caches information about public key aggregation. 39 * 40 * Guaranteed to be 197 bytes in size. No serialization and parsing functions 41 * (yet). 42 */ 43 typedef struct secp256k1_musig_keyagg_cache { 44 unsigned char data[197]; 45 } secp256k1_musig_keyagg_cache; 46 47 /** Opaque data structure that holds a signer's _secret_ nonce. 48 * 49 * Guaranteed to be 132 bytes in size. 50 * 51 * WARNING: This structure MUST NOT be copied or read or written to directly. A 52 * signer who is online throughout the whole process and can keep this 53 * structure in memory can use the provided API functions for a safe standard 54 * workflow. 55 * 56 * Copying this data structure can result in nonce reuse which will leak the 57 * secret signing key. 58 */ 59 typedef struct secp256k1_musig_secnonce { 60 unsigned char data[132]; 61 } secp256k1_musig_secnonce; 62 63 /** Opaque data structure that holds a signer's public nonce. 64 * 65 * Guaranteed to be 132 bytes in size. Serialized and parsed with 66 * `musig_pubnonce_serialize` and `musig_pubnonce_parse`. 67 */ 68 typedef struct secp256k1_musig_pubnonce { 69 unsigned char data[132]; 70 } secp256k1_musig_pubnonce; 71 72 /** Opaque data structure that holds an aggregate public nonce. 73 * 74 * Guaranteed to be 132 bytes in size. Serialized and parsed with 75 * `musig_aggnonce_serialize` and `musig_aggnonce_parse`. 76 */ 77 typedef struct secp256k1_musig_aggnonce { 78 unsigned char data[132]; 79 } secp256k1_musig_aggnonce; 80 81 /** Opaque data structure that holds a MuSig session. 82 * 83 * This structure is not required to be kept secret for the signing protocol to 84 * be secure. Guaranteed to be 133 bytes in size. No serialization and parsing 85 * functions (yet). 86 */ 87 typedef struct secp256k1_musig_session { 88 unsigned char data[133]; 89 } secp256k1_musig_session; 90 91 /** Opaque data structure that holds a partial MuSig signature. 92 * 93 * Guaranteed to be 36 bytes in size. Serialized and parsed with 94 * `musig_partial_sig_serialize` and `musig_partial_sig_parse`. 95 */ 96 typedef struct secp256k1_musig_partial_sig { 97 unsigned char data[36]; 98 } secp256k1_musig_partial_sig; 99 100 /** Parse a signer's public nonce. 101 * 102 * Returns: 1 when the nonce could be parsed, 0 otherwise. 103 * Args: ctx: pointer to a context object 104 * Out: nonce: pointer to a nonce object 105 * In: in66: pointer to the 66-byte nonce to be parsed 106 */ 107 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubnonce_parse( 108 const secp256k1_context *ctx, 109 secp256k1_musig_pubnonce *nonce, 110 const unsigned char *in66 111 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 112 113 /** Serialize a signer's public nonce 114 * 115 * Returns: 1 always 116 * Args: ctx: pointer to a context object 117 * Out: out66: pointer to a 66-byte array to store the serialized nonce 118 * In: nonce: pointer to the nonce 119 */ 120 SECP256K1_API int secp256k1_musig_pubnonce_serialize( 121 const secp256k1_context *ctx, 122 unsigned char *out66, 123 const secp256k1_musig_pubnonce *nonce 124 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 125 126 /** Parse an aggregate public nonce. 127 * 128 * Returns: 1 when the nonce could be parsed, 0 otherwise. 129 * Args: ctx: pointer to a context object 130 * Out: nonce: pointer to a nonce object 131 * In: in66: pointer to the 66-byte nonce to be parsed 132 */ 133 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_aggnonce_parse( 134 const secp256k1_context *ctx, 135 secp256k1_musig_aggnonce *nonce, 136 const unsigned char *in66 137 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 138 139 /** Serialize an aggregate public nonce 140 * 141 * Returns: 1 always 142 * Args: ctx: pointer to a context object 143 * Out: out66: pointer to a 66-byte array to store the serialized nonce 144 * In: nonce: pointer to the nonce 145 */ 146 SECP256K1_API int secp256k1_musig_aggnonce_serialize( 147 const secp256k1_context *ctx, 148 unsigned char *out66, 149 const secp256k1_musig_aggnonce *nonce 150 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 151 152 /** Parse a MuSig partial signature. 153 * 154 * Returns: 1 when the signature could be parsed, 0 otherwise. 155 * Args: ctx: pointer to a context object 156 * Out: sig: pointer to a signature object 157 * In: in32: pointer to the 32-byte signature to be parsed 158 */ 159 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_partial_sig_parse( 160 const secp256k1_context *ctx, 161 secp256k1_musig_partial_sig *sig, 162 const unsigned char *in32 163 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 164 165 /** Serialize a MuSig partial signature 166 * 167 * Returns: 1 always 168 * Args: ctx: pointer to a context object 169 * Out: out32: pointer to a 32-byte array to store the serialized signature 170 * In: sig: pointer to the signature 171 */ 172 SECP256K1_API int secp256k1_musig_partial_sig_serialize( 173 const secp256k1_context *ctx, 174 unsigned char *out32, 175 const secp256k1_musig_partial_sig *sig 176 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 177 178 /** Computes an aggregate public key and uses it to initialize a keyagg_cache 179 * 180 * Different orders of `pubkeys` result in different `agg_pk`s. 181 * 182 * Before aggregating, the pubkeys can be sorted with `secp256k1_ec_pubkey_sort` 183 * which ensures the same `agg_pk` result for the same multiset of pubkeys. 184 * This is useful to do before `pubkey_agg`, such that the order of pubkeys 185 * does not affect the aggregate public key. 186 * 187 * Returns: 0 if the arguments are invalid, 1 otherwise 188 * Args: ctx: pointer to a context object 189 * Out: agg_pk: the MuSig-aggregated x-only public key. If you do not need it, 190 * this arg can be NULL. 191 * keyagg_cache: if non-NULL, pointer to a musig_keyagg_cache struct that 192 * is required for signing (or observing the signing session 193 * and verifying partial signatures). 194 * In: pubkeys: input array of pointers to public keys to aggregate. The order 195 * is important; a different order will result in a different 196 * aggregate public key. 197 * n_pubkeys: length of pubkeys array. Must be greater than 0. 198 */ 199 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_agg( 200 const secp256k1_context *ctx, 201 secp256k1_xonly_pubkey *agg_pk, 202 secp256k1_musig_keyagg_cache *keyagg_cache, 203 const secp256k1_pubkey * const *pubkeys, 204 size_t n_pubkeys 205 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(4); 206 207 /** Obtain the aggregate public key from a keyagg_cache. 208 * 209 * This is only useful if you need the non-xonly public key, in particular for 210 * plain (non-xonly) tweaking or batch-verifying multiple key aggregations 211 * (not implemented). 212 * 213 * Returns: 0 if the arguments are invalid, 1 otherwise 214 * Args: ctx: pointer to a context object 215 * Out: agg_pk: the MuSig-aggregated public key. 216 * In: keyagg_cache: pointer to a `musig_keyagg_cache` struct initialized by 217 * `musig_pubkey_agg` 218 */ 219 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_get( 220 const secp256k1_context *ctx, 221 secp256k1_pubkey *agg_pk, 222 const secp256k1_musig_keyagg_cache *keyagg_cache 223 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 224 225 /** Apply plain "EC" tweaking to a public key in a given keyagg_cache by adding 226 * the generator multiplied with `tweak32` to it. This is useful for deriving 227 * child keys from an aggregate public key via BIP 32 where `tweak32` is set to 228 * a hash as defined in BIP 32. 229 * 230 * Callers are responsible for deriving `tweak32` in a way that does not reduce 231 * the security of MuSig (for example, by following BIP 32). 232 * 233 * The tweaking method is the same as `secp256k1_ec_pubkey_tweak_add`. So after 234 * the following pseudocode buf and buf2 have identical contents (absent 235 * earlier failures). 236 * 237 * secp256k1_musig_pubkey_agg(..., keyagg_cache, pubkeys, ...) 238 * secp256k1_musig_pubkey_get(..., agg_pk, keyagg_cache) 239 * secp256k1_musig_pubkey_ec_tweak_add(..., output_pk, tweak32, keyagg_cache) 240 * secp256k1_ec_pubkey_serialize(..., buf, ..., output_pk, ...) 241 * secp256k1_ec_pubkey_tweak_add(..., agg_pk, tweak32) 242 * secp256k1_ec_pubkey_serialize(..., buf2, ..., agg_pk, ...) 243 * 244 * This function is required if you want to _sign_ for a tweaked aggregate key. 245 * If you are only computing a public key but not intending to create a 246 * signature for it, use `secp256k1_ec_pubkey_tweak_add` instead. 247 * 248 * Returns: 0 if the arguments are invalid, 1 otherwise 249 * Args: ctx: pointer to a context object 250 * Out: output_pubkey: pointer to a public key to store the result. Will be set 251 * to an invalid value if this function returns 0. If you 252 * do not need it, this arg can be NULL. 253 * In/Out: keyagg_cache: pointer to a `musig_keyagg_cache` struct initialized by 254 * `musig_pubkey_agg` 255 * In: tweak32: pointer to a 32-byte tweak. The tweak is valid if it passes 256 * `secp256k1_ec_seckey_verify` and is not equal to the 257 * secret key corresponding to the public key represented 258 * by keyagg_cache or its negation. For uniformly random 259 * 32-byte arrays the chance of being invalid is 260 * negligible (around 1 in 2^128). 261 */ 262 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_ec_tweak_add( 263 const secp256k1_context *ctx, 264 secp256k1_pubkey *output_pubkey, 265 secp256k1_musig_keyagg_cache *keyagg_cache, 266 const unsigned char *tweak32 267 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); 268 269 /** Apply x-only tweaking to a public key in a given keyagg_cache by adding the 270 * generator multiplied with `tweak32` to it. This is useful for creating 271 * Taproot outputs where `tweak32` is set to a TapTweak hash as defined in BIP 272 * 341. 273 * 274 * Callers are responsible for deriving `tweak32` in a way that does not reduce 275 * the security of MuSig (for example, by following Taproot BIP 341). 276 * 277 * The tweaking method is the same as `secp256k1_xonly_pubkey_tweak_add`. So in 278 * the following pseudocode xonly_pubkey_tweak_add_check (absent earlier 279 * failures) returns 1. 280 * 281 * secp256k1_musig_pubkey_agg(..., agg_pk, keyagg_cache, pubkeys, ...) 282 * secp256k1_musig_pubkey_xonly_tweak_add(..., output_pk, keyagg_cache, tweak32) 283 * secp256k1_xonly_pubkey_serialize(..., buf, output_pk) 284 * secp256k1_xonly_pubkey_tweak_add_check(..., buf, ..., agg_pk, tweak32) 285 * 286 * This function is required if you want to _sign_ for a tweaked aggregate key. 287 * If you are only computing a public key but not intending to create a 288 * signature for it, use `secp256k1_xonly_pubkey_tweak_add` instead. 289 * 290 * Returns: 0 if the arguments are invalid, 1 otherwise 291 * Args: ctx: pointer to a context object 292 * Out: output_pubkey: pointer to a public key to store the result. Will be set 293 * to an invalid value if this function returns 0. If you 294 * do not need it, this arg can be NULL. 295 * In/Out: keyagg_cache: pointer to a `musig_keyagg_cache` struct initialized by 296 * `musig_pubkey_agg` 297 * In: tweak32: pointer to a 32-byte tweak. The tweak is valid if it passes 298 * `secp256k1_ec_seckey_verify` and is not equal to the 299 * secret key corresponding to the public key represented 300 * by keyagg_cache or its negation. For uniformly random 301 * 32-byte arrays the chance of being invalid is 302 * negligible (around 1 in 2^128). 303 */ 304 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_pubkey_xonly_tweak_add( 305 const secp256k1_context *ctx, 306 secp256k1_pubkey *output_pubkey, 307 secp256k1_musig_keyagg_cache *keyagg_cache, 308 const unsigned char *tweak32 309 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); 310 311 /** Starts a signing session by generating a nonce 312 * 313 * This function outputs a secret nonce that will be required for signing and a 314 * corresponding public nonce that is intended to be sent to other signers. 315 * 316 * MuSig differs from regular Schnorr signing in that implementers _must_ take 317 * special care to not reuse a nonce. This can be ensured by following these rules: 318 * 319 * 1. Each call to this function must have a UNIQUE session_secrand32 that must 320 * NOT BE REUSED in subsequent calls to this function and must be KEPT 321 * SECRET (even from other signers). 322 * 2. If you already know the seckey, message or aggregate public key 323 * cache, they can be optionally provided to derive the nonce and increase 324 * misuse-resistance. The extra_input32 argument can be used to provide 325 * additional data that does not repeat in normal scenarios, such as the 326 * current time. 327 * 3. Avoid copying (or serializing) the secnonce. This reduces the possibility 328 * that it is used more than once for signing. 329 * 330 * If you don't have access to good randomness for session_secrand32, but you 331 * have access to a non-repeating counter, then see 332 * secp256k1_musig_nonce_gen_counter. 333 * 334 * Remember that nonce reuse will leak the secret key! 335 * Note that using the same seckey for multiple MuSig sessions is fine. 336 * 337 * Returns: 0 if the arguments are invalid and 1 otherwise 338 * Args: ctx: pointer to a context object (not secp256k1_context_static) 339 * Out: secnonce: pointer to a structure to store the secret nonce 340 * pubnonce: pointer to a structure to store the public nonce 341 * In/Out: 342 * session_secrand32: a 32-byte session_secrand32 as explained above. Must be unique to this 343 * call to secp256k1_musig_nonce_gen and must be uniformly 344 * random. If the function call is successful, the 345 * session_secrand32 buffer is invalidated to prevent reuse. 346 * In: 347 * seckey: the 32-byte secret key that will later be used for signing, if 348 * already known (can be NULL) 349 * pubkey: public key of the signer creating the nonce. The secnonce 350 * output of this function cannot be used to sign for any 351 * other public key. While the public key should correspond 352 * to the provided seckey, a mismatch will not cause the 353 * function to return 0. 354 * msg32: the 32-byte message that will later be signed, if already known 355 * (can be NULL) 356 * keyagg_cache: pointer to the keyagg_cache that was used to create the aggregate 357 * (and potentially tweaked) public key if already known 358 * (can be NULL) 359 * extra_input32: an optional 32-byte array that is input to the nonce 360 * derivation function (can be NULL) 361 */ 362 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_nonce_gen( 363 const secp256k1_context *ctx, 364 secp256k1_musig_secnonce *secnonce, 365 secp256k1_musig_pubnonce *pubnonce, 366 unsigned char *session_secrand32, 367 const unsigned char *seckey, 368 const secp256k1_pubkey *pubkey, 369 const unsigned char *msg32, 370 const secp256k1_musig_keyagg_cache *keyagg_cache, 371 const unsigned char *extra_input32 372 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(6); 373 374 375 /** Alternative way to generate a nonce and start a signing session 376 * 377 * This function outputs a secret nonce that will be required for signing and a 378 * corresponding public nonce that is intended to be sent to other signers. 379 * 380 * This function differs from `secp256k1_musig_nonce_gen` by accepting a 381 * non-repeating counter value instead of a secret random value. This requires 382 * that a secret key is provided to `secp256k1_musig_nonce_gen_counter` 383 * (through the keypair argument), as opposed to `secp256k1_musig_nonce_gen` 384 * where the seckey argument is optional. 385 * 386 * MuSig differs from regular Schnorr signing in that implementers _must_ take 387 * special care to not reuse a nonce. This can be ensured by following these rules: 388 * 389 * 1. The nonrepeating_cnt argument must be a counter value that never repeats, 390 * i.e., you must never call `secp256k1_musig_nonce_gen_counter` twice with 391 * the same keypair and nonrepeating_cnt value. For example, this implies 392 * that if the same keypair is used with `secp256k1_musig_nonce_gen_counter` 393 * on multiple devices, none of the devices should have the same counter 394 * value as any other device. 395 * 2. If the seckey, message or aggregate public key cache is already available 396 * at this stage, any of these can be optionally provided, in which case 397 * they will be used in the derivation of the nonce and increase 398 * misuse-resistance. The extra_input32 argument can be used to provide 399 * additional data that does not repeat in normal scenarios, such as the 400 * current time. 401 * 3. Avoid copying (or serializing) the secnonce. This reduces the possibility 402 * that it is used more than once for signing. 403 * 404 * Remember that nonce reuse will leak the secret key! 405 * Note that using the same keypair for multiple MuSig sessions is fine. 406 * 407 * Returns: 0 if the arguments are invalid and 1 otherwise 408 * Args: ctx: pointer to a context object (not secp256k1_context_static) 409 * Out: secnonce: pointer to a structure to store the secret nonce 410 * pubnonce: pointer to a structure to store the public nonce 411 * In: 412 * nonrepeating_cnt: the value of a counter as explained above. Must be 413 * unique to this call to secp256k1_musig_nonce_gen. 414 * keypair: keypair of the signer creating the nonce. The secnonce 415 * output of this function cannot be used to sign for any 416 * other keypair. 417 * msg32: the 32-byte message that will later be signed, if already known 418 * (can be NULL) 419 * keyagg_cache: pointer to the keyagg_cache that was used to create the aggregate 420 * (and potentially tweaked) public key if already known 421 * (can be NULL) 422 * extra_input32: an optional 32-byte array that is input to the nonce 423 * derivation function (can be NULL) 424 */ 425 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_nonce_gen_counter( 426 const secp256k1_context *ctx, 427 secp256k1_musig_secnonce *secnonce, 428 secp256k1_musig_pubnonce *pubnonce, 429 uint64_t nonrepeating_cnt, 430 const secp256k1_keypair *keypair, 431 const unsigned char *msg32, 432 const secp256k1_musig_keyagg_cache *keyagg_cache, 433 const unsigned char *extra_input32 434 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); 435 436 /** Aggregates the nonces of all signers into a single nonce 437 * 438 * This can be done by an untrusted party to reduce the communication 439 * between signers. Instead of everyone sending nonces to everyone else, there 440 * can be one party receiving all nonces, aggregating the nonces with this 441 * function and then sending only the aggregate nonce back to the signers. 442 * 443 * If the aggregator does not compute the aggregate nonce correctly, the final 444 * signature will be invalid. 445 * 446 * Returns: 0 if the arguments are invalid, 1 otherwise 447 * Args: ctx: pointer to a context object 448 * Out: aggnonce: pointer to an aggregate public nonce object for 449 * musig_nonce_process 450 * In: pubnonces: array of pointers to public nonces sent by the 451 * signers 452 * n_pubnonces: number of elements in the pubnonces array. Must be 453 * greater than 0. 454 */ 455 SECP256K1_API int secp256k1_musig_nonce_agg( 456 const secp256k1_context *ctx, 457 secp256k1_musig_aggnonce *aggnonce, 458 const secp256k1_musig_pubnonce * const *pubnonces, 459 size_t n_pubnonces 460 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); 461 462 /** Takes the aggregate nonce and creates a session that is required for signing 463 * and verification of partial signatures. 464 * 465 * Returns: 0 if the arguments are invalid, 1 otherwise 466 * Args: ctx: pointer to a context object 467 * Out: session: pointer to a struct to store the session 468 * In: aggnonce: pointer to an aggregate public nonce object that is the 469 * output of musig_nonce_agg 470 * msg32: the 32-byte message to sign 471 * keyagg_cache: pointer to the keyagg_cache that was used to create the 472 * aggregate (and potentially tweaked) pubkey 473 */ 474 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_nonce_process( 475 const secp256k1_context *ctx, 476 secp256k1_musig_session *session, 477 const secp256k1_musig_aggnonce *aggnonce, 478 const unsigned char *msg32, 479 const secp256k1_musig_keyagg_cache *keyagg_cache 480 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); 481 482 /** Produces a partial signature 483 * 484 * This function overwrites the given secnonce with zeros and will abort if given a 485 * secnonce that is all zeros. This is a best effort attempt to protect against nonce 486 * reuse. However, this is of course easily defeated if the secnonce has been 487 * copied (or serialized). Remember that nonce reuse will leak the secret key! 488 * 489 * For signing to succeed, the secnonce provided to this function must have 490 * been generated for the provided keypair. This means that when signing for a 491 * keypair consisting of a seckey and pubkey, the secnonce must have been 492 * created by calling musig_nonce_gen with that pubkey. Otherwise, the 493 * illegal_callback is called. 494 * 495 * This function does not verify the output partial signature, deviating from 496 * the BIP 327 specification. It is recommended to verify the output partial 497 * signature with `secp256k1_musig_partial_sig_verify` to prevent random or 498 * adversarially provoked computation errors. 499 * 500 * Returns: 0 if the arguments are invalid or the provided secnonce has already 501 * been used for signing, 1 otherwise 502 * Args: ctx: pointer to a context object 503 * Out: partial_sig: pointer to struct to store the partial signature 504 * In/Out: secnonce: pointer to the secnonce struct created in 505 * musig_nonce_gen that has been never used in a 506 * partial_sign call before and has been created for the 507 * keypair 508 * In: keypair: pointer to keypair to sign the message with 509 * keyagg_cache: pointer to the keyagg_cache that was output when the 510 * aggregate public key for this session 511 * session: pointer to the session that was created with 512 * musig_nonce_process 513 */ 514 SECP256K1_API int secp256k1_musig_partial_sign( 515 const secp256k1_context *ctx, 516 secp256k1_musig_partial_sig *partial_sig, 517 secp256k1_musig_secnonce *secnonce, 518 const secp256k1_keypair *keypair, 519 const secp256k1_musig_keyagg_cache *keyagg_cache, 520 const secp256k1_musig_session *session 521 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6); 522 523 /** Verifies an individual signer's partial signature 524 * 525 * The signature is verified for a specific signing session. In order to avoid 526 * accidentally verifying a signature from a different or non-existing signing 527 * session, you must ensure the following: 528 * 1. The `keyagg_cache` argument is identical to the one used to create the 529 * `session` with `musig_nonce_process`. 530 * 2. The `pubkey` argument must be identical to the one sent by the signer 531 * before aggregating it with `musig_pubkey_agg` to create the 532 * `keyagg_cache`. 533 * 3. The `pubnonce` argument must be identical to the one sent by the signer 534 * before aggregating it with `musig_nonce_agg` and using the result to 535 * create the `session` with `musig_nonce_process`. 536 * 537 * It is not required to call this function in regular MuSig sessions, because 538 * if any partial signature does not verify, the final signature will not 539 * verify either, so the problem will be caught. However, this function 540 * provides the ability to identify which specific partial signature fails 541 * verification. 542 * 543 * Returns: 0 if the arguments are invalid or the partial signature does not 544 * verify, 1 otherwise 545 * Args ctx: pointer to a context object 546 * In: partial_sig: pointer to partial signature to verify, sent by 547 * the signer associated with `pubnonce` and `pubkey` 548 * pubnonce: public nonce of the signer in the signing session 549 * pubkey: public key of the signer in the signing session 550 * keyagg_cache: pointer to the keyagg_cache that was output when the 551 * aggregate public key for this signing session 552 * session: pointer to the session that was created with 553 * `musig_nonce_process` 554 */ 555 SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_musig_partial_sig_verify( 556 const secp256k1_context *ctx, 557 const secp256k1_musig_partial_sig *partial_sig, 558 const secp256k1_musig_pubnonce *pubnonce, 559 const secp256k1_pubkey *pubkey, 560 const secp256k1_musig_keyagg_cache *keyagg_cache, 561 const secp256k1_musig_session *session 562 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6); 563 564 /** Aggregates partial signatures 565 * 566 * Returns: 0 if the arguments are invalid, 1 otherwise (which does NOT mean 567 * the resulting signature verifies). 568 * Args: ctx: pointer to a context object 569 * Out: sig64: complete (but possibly invalid) Schnorr signature 570 * In: session: pointer to the session that was created with 571 * musig_nonce_process 572 * partial_sigs: array of pointers to partial signatures to aggregate 573 * n_sigs: number of elements in the partial_sigs array. Must be 574 * greater than 0. 575 */ 576 SECP256K1_API int secp256k1_musig_partial_sig_agg( 577 const secp256k1_context *ctx, 578 unsigned char *sig64, 579 const secp256k1_musig_session *session, 580 const secp256k1_musig_partial_sig * const *partial_sigs, 581 size_t n_sigs 582 ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); 583 584 #ifdef __cplusplus 585 } 586 #endif 587 588 #endif