@qntx/nostr-native 0.0.0-stage → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/LICENSE-APACHE +201 -0
  2. package/LICENSE-MIT +21 -0
  3. package/NostrNative.podspec +37 -0
  4. package/README.md +30 -2
  5. package/android/CMakeLists.txt +38 -0
  6. package/android/build.gradle +136 -0
  7. package/android/gradle.properties +4 -0
  8. package/android/src/main/AndroidManifest.xml +2 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +7 -0
  10. package/android/src/main/java/com/margelo/nitro/nostrnative/NostrNativePackage.java +29 -0
  11. package/cpp/HybridNostrNative.cpp +52 -0
  12. package/cpp/HybridNostrNative.hpp +22 -0
  13. package/cpp/nostr_core.c +128 -0
  14. package/cpp/nostr_core.h +65 -0
  15. package/cpp/nostr_native.c +54 -0
  16. package/cpp/nostr_native.h +47 -0
  17. package/dist/index.d.mts +15 -0
  18. package/dist/index.mjs +26 -0
  19. package/dist/index.mjs.map +1 -0
  20. package/nitro.json +19 -0
  21. package/nitrogen/generated/.gitattributes +1 -0
  22. package/nitrogen/generated/android/NostrNative+autolinking.cmake +81 -0
  23. package/nitrogen/generated/android/NostrNative+autolinking.gradle +27 -0
  24. package/nitrogen/generated/android/NostrNativeOnLoad.cpp +49 -0
  25. package/nitrogen/generated/android/NostrNativeOnLoad.hpp +34 -0
  26. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nostrnative/NostrNativeOnLoad.kt +35 -0
  27. package/nitrogen/generated/ios/NostrNative+autolinking.rb +62 -0
  28. package/nitrogen/generated/ios/NostrNative-Swift-Cxx-Bridge.cpp +17 -0
  29. package/nitrogen/generated/ios/NostrNative-Swift-Cxx-Bridge.hpp +27 -0
  30. package/nitrogen/generated/ios/NostrNative-Swift-Cxx-Umbrella.hpp +38 -0
  31. package/nitrogen/generated/ios/NostrNativeAutolinking.mm +35 -0
  32. package/nitrogen/generated/ios/NostrNativeAutolinking.swift +16 -0
  33. package/nitrogen/generated/shared/c++/HybridNostrNativeSpec.cpp +23 -0
  34. package/nitrogen/generated/shared/c++/HybridNostrNativeSpec.hpp +64 -0
  35. package/package.json +86 -4
  36. package/react-native.config.js +12 -0
  37. package/vendor/secp256k1/COPYING +19 -0
  38. package/vendor/secp256k1/include/secp256k1.h +931 -0
  39. package/vendor/secp256k1/include/secp256k1_ecdh.h +63 -0
  40. package/vendor/secp256k1/include/secp256k1_ellswift.h +200 -0
  41. package/vendor/secp256k1/include/secp256k1_extrakeys.h +250 -0
  42. package/vendor/secp256k1/include/secp256k1_musig.h +588 -0
  43. package/vendor/secp256k1/include/secp256k1_preallocated.h +134 -0
  44. package/vendor/secp256k1/include/secp256k1_recovery.h +123 -0
  45. package/vendor/secp256k1/include/secp256k1_schnorrsig.h +179 -0
  46. package/vendor/secp256k1/include/secp256k1_silentpayments.h +396 -0
  47. package/vendor/secp256k1/src/assumptions.h +87 -0
  48. package/vendor/secp256k1/src/checkmem.h +117 -0
  49. package/vendor/secp256k1/src/ecdsa.h +21 -0
  50. package/vendor/secp256k1/src/ecdsa_impl.h +309 -0
  51. package/vendor/secp256k1/src/eckey.h +28 -0
  52. package/vendor/secp256k1/src/eckey_impl.h +94 -0
  53. package/vendor/secp256k1/src/ecmult.h +64 -0
  54. package/vendor/secp256k1/src/ecmult_compute_table.h +16 -0
  55. package/vendor/secp256k1/src/ecmult_compute_table_impl.h +49 -0
  56. package/vendor/secp256k1/src/ecmult_const.h +38 -0
  57. package/vendor/secp256k1/src/ecmult_const_impl.h +402 -0
  58. package/vendor/secp256k1/src/ecmult_gen.h +145 -0
  59. package/vendor/secp256k1/src/ecmult_gen_compute_table.h +14 -0
  60. package/vendor/secp256k1/src/ecmult_gen_compute_table_impl.h +108 -0
  61. package/vendor/secp256k1/src/ecmult_gen_impl.h +347 -0
  62. package/vendor/secp256k1/src/ecmult_impl.h +869 -0
  63. package/vendor/secp256k1/src/field.h +351 -0
  64. package/vendor/secp256k1/src/field_10x26.h +57 -0
  65. package/vendor/secp256k1/src/field_10x26_impl.h +1210 -0
  66. package/vendor/secp256k1/src/field_5x52.h +62 -0
  67. package/vendor/secp256k1/src/field_5x52_impl.h +496 -0
  68. package/vendor/secp256k1/src/field_5x52_int128_impl.h +274 -0
  69. package/vendor/secp256k1/src/field_impl.h +457 -0
  70. package/vendor/secp256k1/src/group.h +218 -0
  71. package/vendor/secp256k1/src/group_impl.h +1014 -0
  72. package/vendor/secp256k1/src/hash.h +56 -0
  73. package/vendor/secp256k1/src/hash_impl.h +397 -0
  74. package/vendor/secp256k1/src/hsort.h +33 -0
  75. package/vendor/secp256k1/src/hsort_impl.h +125 -0
  76. package/vendor/secp256k1/src/int128.h +90 -0
  77. package/vendor/secp256k1/src/int128_impl.h +18 -0
  78. package/vendor/secp256k1/src/int128_native.h +19 -0
  79. package/vendor/secp256k1/src/int128_native_impl.h +94 -0
  80. package/vendor/secp256k1/src/int128_struct.h +14 -0
  81. package/vendor/secp256k1/src/int128_struct_impl.h +205 -0
  82. package/vendor/secp256k1/src/modinv32.h +43 -0
  83. package/vendor/secp256k1/src/modinv32_impl.h +725 -0
  84. package/vendor/secp256k1/src/modinv64.h +47 -0
  85. package/vendor/secp256k1/src/modinv64_impl.h +780 -0
  86. package/vendor/secp256k1/src/modules/extrakeys/main_impl.h +292 -0
  87. package/vendor/secp256k1/src/modules/schnorrsig/main_impl.h +256 -0
  88. package/vendor/secp256k1/src/precomputed_ecmult.c +16456 -0
  89. package/vendor/secp256k1/src/precomputed_ecmult.h +40 -0
  90. package/vendor/secp256k1/src/precomputed_ecmult_gen.c +1779 -0
  91. package/vendor/secp256k1/src/precomputed_ecmult_gen.h +28 -0
  92. package/vendor/secp256k1/src/scalar.h +105 -0
  93. package/vendor/secp256k1/src/scalar_4x64.h +19 -0
  94. package/vendor/secp256k1/src/scalar_4x64_impl.h +1005 -0
  95. package/vendor/secp256k1/src/scalar_8x32.h +19 -0
  96. package/vendor/secp256k1/src/scalar_8x32_impl.h +820 -0
  97. package/vendor/secp256k1/src/scalar_impl.h +321 -0
  98. package/vendor/secp256k1/src/scalar_low.h +24 -0
  99. package/vendor/secp256k1/src/scalar_low_impl.h +217 -0
  100. package/vendor/secp256k1/src/scratch.h +44 -0
  101. package/vendor/secp256k1/src/scratch_impl.h +99 -0
  102. package/vendor/secp256k1/src/secp256k1.c +855 -0
  103. package/vendor/secp256k1/src/selftest.h +41 -0
  104. package/vendor/secp256k1/src/util.h +479 -0
  105. package/vendor/secp256k1/src/util_local_visibility.h +12 -0
  106. package/vendor/secp256k1/vendored.json +6 -0
@@ -0,0 +1,588 @@
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 `nostr_native_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 nostr_native_secp256k1_musig_keyagg_cache {
44
+ unsigned char data[197];
45
+ } nostr_native_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 nostr_native_secp256k1_musig_secnonce {
60
+ unsigned char data[132];
61
+ } nostr_native_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 nostr_native_secp256k1_musig_pubnonce {
69
+ unsigned char data[132];
70
+ } nostr_native_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 nostr_native_secp256k1_musig_aggnonce {
78
+ unsigned char data[132];
79
+ } nostr_native_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 nostr_native_secp256k1_musig_session {
88
+ unsigned char data[133];
89
+ } nostr_native_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 nostr_native_secp256k1_musig_partial_sig {
97
+ unsigned char data[36];
98
+ } nostr_native_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 nostr_native_secp256k1_musig_pubnonce_parse(
108
+ const nostr_native_secp256k1_context *ctx,
109
+ nostr_native_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 nostr_native_secp256k1_musig_pubnonce_serialize(
121
+ const nostr_native_secp256k1_context *ctx,
122
+ unsigned char *out66,
123
+ const nostr_native_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 nostr_native_secp256k1_musig_aggnonce_parse(
134
+ const nostr_native_secp256k1_context *ctx,
135
+ nostr_native_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 nostr_native_secp256k1_musig_aggnonce_serialize(
147
+ const nostr_native_secp256k1_context *ctx,
148
+ unsigned char *out66,
149
+ const nostr_native_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 nostr_native_secp256k1_musig_partial_sig_parse(
160
+ const nostr_native_secp256k1_context *ctx,
161
+ nostr_native_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 nostr_native_secp256k1_musig_partial_sig_serialize(
173
+ const nostr_native_secp256k1_context *ctx,
174
+ unsigned char *out32,
175
+ const nostr_native_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 `nostr_native_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 nostr_native_secp256k1_musig_pubkey_agg(
200
+ const nostr_native_secp256k1_context *ctx,
201
+ nostr_native_secp256k1_xonly_pubkey *agg_pk,
202
+ nostr_native_secp256k1_musig_keyagg_cache *keyagg_cache,
203
+ const nostr_native_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 nostr_native_secp256k1_musig_pubkey_get(
220
+ const nostr_native_secp256k1_context *ctx,
221
+ nostr_native_secp256k1_pubkey *agg_pk,
222
+ const nostr_native_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 `nostr_native_secp256k1_ec_pubkey_tweak_add`. So after
234
+ * the following pseudocode buf and buf2 have identical contents (absent
235
+ * earlier failures).
236
+ *
237
+ * nostr_native_secp256k1_musig_pubkey_agg(..., keyagg_cache, pubkeys, ...)
238
+ * nostr_native_secp256k1_musig_pubkey_get(..., agg_pk, keyagg_cache)
239
+ * nostr_native_secp256k1_musig_pubkey_ec_tweak_add(..., output_pk, tweak32, keyagg_cache)
240
+ * nostr_native_secp256k1_ec_pubkey_serialize(..., buf, ..., output_pk, ...)
241
+ * nostr_native_secp256k1_ec_pubkey_tweak_add(..., agg_pk, tweak32)
242
+ * nostr_native_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 `nostr_native_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
+ * `nostr_native_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 nostr_native_secp256k1_musig_pubkey_ec_tweak_add(
263
+ const nostr_native_secp256k1_context *ctx,
264
+ nostr_native_secp256k1_pubkey *output_pubkey,
265
+ nostr_native_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 `nostr_native_secp256k1_xonly_pubkey_tweak_add`. So in
278
+ * the following pseudocode xonly_pubkey_tweak_add_check (absent earlier
279
+ * failures) returns 1.
280
+ *
281
+ * nostr_native_secp256k1_musig_pubkey_agg(..., agg_pk, keyagg_cache, pubkeys, ...)
282
+ * nostr_native_secp256k1_musig_pubkey_xonly_tweak_add(..., output_pk, keyagg_cache, tweak32)
283
+ * nostr_native_secp256k1_xonly_pubkey_serialize(..., buf, output_pk)
284
+ * nostr_native_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 `nostr_native_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
+ * `nostr_native_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 nostr_native_secp256k1_musig_pubkey_xonly_tweak_add(
305
+ const nostr_native_secp256k1_context *ctx,
306
+ nostr_native_secp256k1_pubkey *output_pubkey,
307
+ nostr_native_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
+ * nostr_native_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 nostr_native_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 nostr_native_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 nostr_native_secp256k1_musig_nonce_gen(
363
+ const nostr_native_secp256k1_context *ctx,
364
+ nostr_native_secp256k1_musig_secnonce *secnonce,
365
+ nostr_native_secp256k1_musig_pubnonce *pubnonce,
366
+ unsigned char *session_secrand32,
367
+ const unsigned char *seckey,
368
+ const nostr_native_secp256k1_pubkey *pubkey,
369
+ const unsigned char *msg32,
370
+ const nostr_native_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 `nostr_native_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 `nostr_native_secp256k1_musig_nonce_gen_counter`
383
+ * (through the keypair argument), as opposed to `nostr_native_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 `nostr_native_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 `nostr_native_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 nostr_native_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 nostr_native_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 nostr_native_secp256k1_musig_nonce_gen_counter(
426
+ const nostr_native_secp256k1_context *ctx,
427
+ nostr_native_secp256k1_musig_secnonce *secnonce,
428
+ nostr_native_secp256k1_musig_pubnonce *pubnonce,
429
+ uint64_t nonrepeating_cnt,
430
+ const nostr_native_secp256k1_keypair *keypair,
431
+ const unsigned char *msg32,
432
+ const nostr_native_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 nostr_native_secp256k1_musig_nonce_agg(
456
+ const nostr_native_secp256k1_context *ctx,
457
+ nostr_native_secp256k1_musig_aggnonce *aggnonce,
458
+ const nostr_native_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 nostr_native_secp256k1_musig_nonce_process(
475
+ const nostr_native_secp256k1_context *ctx,
476
+ nostr_native_secp256k1_musig_session *session,
477
+ const nostr_native_secp256k1_musig_aggnonce *aggnonce,
478
+ const unsigned char *msg32,
479
+ const nostr_native_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 `nostr_native_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 nostr_native_secp256k1_musig_partial_sign(
515
+ const nostr_native_secp256k1_context *ctx,
516
+ nostr_native_secp256k1_musig_partial_sig *partial_sig,
517
+ nostr_native_secp256k1_musig_secnonce *secnonce,
518
+ const nostr_native_secp256k1_keypair *keypair,
519
+ const nostr_native_secp256k1_musig_keyagg_cache *keyagg_cache,
520
+ const nostr_native_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 nostr_native_secp256k1_musig_partial_sig_verify(
556
+ const nostr_native_secp256k1_context *ctx,
557
+ const nostr_native_secp256k1_musig_partial_sig *partial_sig,
558
+ const nostr_native_secp256k1_musig_pubnonce *pubnonce,
559
+ const nostr_native_secp256k1_pubkey *pubkey,
560
+ const nostr_native_secp256k1_musig_keyagg_cache *keyagg_cache,
561
+ const nostr_native_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 nostr_native_secp256k1_musig_partial_sig_agg(
577
+ const nostr_native_secp256k1_context *ctx,
578
+ unsigned char *sig64,
579
+ const nostr_native_secp256k1_musig_session *session,
580
+ const nostr_native_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