utxo-lib 1.0.7 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,391 @@
1
+ /*! musig-js - MIT License (c) 2022 Brandon Black */
2
+ export interface MuSig {
3
+ /**
4
+ * Gets the X-only public key associated with this context.
5
+ *
6
+ * @param ctx the key gen context or a signing session key
7
+ * @returns the X-only public key associated with this context
8
+ */
9
+ getXOnlyPubkey(ctx: KeyGenContext | SessionKey): Uint8Array;
10
+ /**
11
+ * Gets the plain public key associated with this context.
12
+ *
13
+ * @param ctx the key gen context or a signing session key
14
+ * @returns plain public key associated with this context in compressed DER format
15
+ */
16
+ getPlainPubkey(ctx: KeyGenContext | SessionKey): Uint8Array;
17
+ /**
18
+ * Sorts compressed DER format public keys lexicographically.
19
+ *
20
+ * @param publicKeys array of compressed DER encoded public keys to aggregate
21
+ * @returns sorted public keys (in a new array)
22
+ */
23
+ keySort(publicKeys: Uint8Array[]): Uint8Array[];
24
+ /**
25
+ * Performs MuSig key aggregation on 1+ x-only public keys.
26
+ *
27
+ * @param publicKeys array of compressed DER encoded public keys to aggregate
28
+ * @param tweaks tweaks (0 < tweak < n) to apply to the aggregate key,
29
+ * and optionally booleans to indicate x-only tweaking
30
+ * @returns an opaque key gen context for use with other MuSig operations
31
+ */
32
+ keyAgg(publicKeys: Uint8Array[], ...tweaks: Tweak[]): KeyGenContext;
33
+ /**
34
+ * Apply one or more x-only or ordinary tweaks to an aggregate public key.
35
+ *
36
+ * @param ctx the key generation context, as returned from `keyAgg`.
37
+ * @param tweaks tweaks (0 < tweak < n) to apply to the aggregate key,
38
+ * and optionally booleans to indicate x-only tweaking
39
+ * @returns an opaque key gen context for use with other MuSig operations
40
+ */
41
+ addTweaks(ctx: KeyGenContext, ...tweaks: Tweak[]): KeyGenContext;
42
+ /**
43
+ * Generate a MuSig nonce pair based on the provided values.
44
+ *
45
+ * The caller must not use the same sessionId for multiple calls to nonceGen
46
+ * with other parameters held constant.
47
+ *
48
+ * The secret nonce (97 bytes) is cached internally, and will be deleted
49
+ * from the cache prior to use in a signature. The secret nonce will also be
50
+ * deleted if the returned public nonce is deleted.
51
+ *
52
+ * @param sessionId if no secret key is provided, uniformly 32-bytes of
53
+ * random data, otherwise a value guaranteed not to repeat for the secret
54
+ * key. If no sessionId is provided a reasonably high quality random one will
55
+ * be generated.
56
+ * @param secretKey the secret key which will eventually sign with this nonce
57
+ * @param publicKey the public key for which this nonce will be signed (required)
58
+ * @param xOnlyPublicKey the x-coordinate of the aggregate public key that this
59
+ * nonce will be signing a part of
60
+ * @param msg the message which will eventually be signed with this nonce
61
+ * (any possible Uint8Array length)
62
+ * @param extraInput additional input which will contribute to the generated
63
+ * nonce (0 <= extraInput.length <= 2^32-1)
64
+ * @return the generated public nonce (66 bytes)
65
+ */
66
+ nonceGen(args: {
67
+ sessionId?: Uint8Array;
68
+ secretKey?: Uint8Array;
69
+ publicKey: Uint8Array;
70
+ xOnlyPublicKey?: Uint8Array;
71
+ msg?: Uint8Array;
72
+ extraInput?: Uint8Array;
73
+ }): Uint8Array;
74
+ /**
75
+ * Add an externally generated nonce to the cache.
76
+ *
77
+ * NOT RECOMMENDED, but useful in testing at least.
78
+ * @param publicNonce 66-byte public nonce (2 points in compressed DER)
79
+ * @param secretNonce 97-byte secret nonce (2 32-byte scalars, and the public
80
+ * key which will sign for this nonce in compressed DER)
81
+ */
82
+ addExternalNonce(publicNonce: Uint8Array, secretNonce: Uint8Array): void;
83
+ /**
84
+ * Combine public nonces from all signers into a single aggregate public nonce.
85
+ *
86
+ * Per the spec, this function prefers to succeed with an invalid nonce at
87
+ * infinity than to fail, to enable a dishonest signer to be detected later.
88
+ *
89
+ * This can be run by an untrusted node without breaking the security of the
90
+ * protocol. An untrusted aggregator can cause the protocol to fail, but not
91
+ * forge a signature.
92
+ *
93
+ * @param nonces n-signers public nonces (66-bytes each)
94
+ * @return the aggregate public nonce (66-bytes)
95
+ */
96
+ nonceAgg(nonces: Uint8Array[]): Uint8Array;
97
+ /**
98
+ * Creates an opaque signing session for used in partial signing, partial
99
+ * verification, or signature aggregation. This may be saved by a
100
+ * participant, but may not be provided by an untrusted party.
101
+ *
102
+ * @param aggNonce this signing session's aggregate nonce
103
+ * @param msg the 32-byte message to sign for, most commonly a transaction hash.
104
+ * @param publicKeys array of compressed DER encoded public keys to aggregate
105
+ * @param tweaks tweaks (0 < tweak < n) to apply to the aggregate key,
106
+ * and optionally booleans to indicate x-only tweaking
107
+ * @return session key for `partialSign`, `partialVerify` and `signAgg`
108
+ */
109
+ startSigningSession(aggNonce: Uint8Array, msg: Uint8Array, publicKeys: Uint8Array[], ...tweaks: Tweak[]): SessionKey;
110
+ /**
111
+ * Creates a MuSig partial signature for the given values.
112
+ *
113
+ * Verifies the resulting partial signature by default, as recommended in the
114
+ * specification.
115
+ *
116
+ * Note: Calling `partialSign` with the same `publicNonce` more than once
117
+ * will not work, as the corresponding secret nonce is deleted. Generate a
118
+ * new public nonce and try again.
119
+ *
120
+ * @param secretKey signer's secret key
121
+ * @param publicNonce signer's public nonce
122
+ * @param sessionKey signing session key (from startSigningSession)
123
+ * @param verify if false, don't verify partial signature
124
+ * @return resulting signature
125
+ */
126
+ partialSign(args: {
127
+ secretKey: Uint8Array;
128
+ publicNonce: Uint8Array;
129
+ sessionKey: SessionKey;
130
+ verify?: boolean;
131
+ }): Uint8Array;
132
+ /**
133
+ * Verifies a MuSig partial signature for the given values.
134
+ *
135
+ * @param sig the 32-byte MuSig partial signature to verify
136
+ * @param msg the 32-byte message to sign for, most commonly a transaction hash
137
+ * @param publicKey signer's public key
138
+ * @param publicNonce signer's public nonce
139
+ * @param aggNonce this signing session's aggregate nonce
140
+ * @param sessionKey signing session key (from startSigningSession)
141
+ * @return true if the partial signature is valid, otherwise false
142
+ */
143
+ partialVerify(args: {
144
+ sig: Uint8Array;
145
+ publicKey: Uint8Array;
146
+ publicNonce: Uint8Array;
147
+ sessionKey: SessionKey;
148
+ }): boolean;
149
+ /**
150
+ * Aggregates MuSig partial signatures. May be run by an untrusted party.
151
+ *
152
+ * @param sigs array of 32-bytes MuSig partial signatures.
153
+ * @param sessionKey signing session key (from startSigningSession)
154
+ * @return the resulting aggregate signature.
155
+ */
156
+ signAgg(sigs: Uint8Array[], sessionKey: SessionKey): Uint8Array;
157
+ /**
158
+ * Deterministically generate nonces and partially sign for a MuSig key.
159
+ * The security of this method depends on its being run after all other
160
+ * parties have provided their nonces.
161
+ *
162
+ * @param secretKey signer's secret key
163
+ * @param aggOtherNonce the result of calling `nonceAgg` on all other signing
164
+ * parties' nonces
165
+ * @param publicKeys array of compressed DER encoded public keys to aggregate
166
+ * @param tweaks tweaks (0 < tweak < n) to apply to the aggregate key,
167
+ * and optionally booleans to indicate x-only tweaking
168
+ * @param msg the 32-byte message to sign for, most commonly a transaction hash.
169
+ * @param rand optional additional randomness for nonce generation
170
+ * @param verify if false, don't verify partial signature
171
+ * @return resulting signature, session key (for signature aggregation), and
172
+ * public nonce (for partial verification)
173
+ */
174
+ deterministicSign(args: {
175
+ secretKey: Uint8Array;
176
+ aggOtherNonce: Uint8Array;
177
+ publicKeys: Uint8Array[];
178
+ tweaks?: Tweak[];
179
+ msg: Uint8Array;
180
+ rand?: Uint8Array;
181
+ verify?: boolean;
182
+ }): {
183
+ sig: Uint8Array;
184
+ sessionKey: SessionKey;
185
+ publicNonce: Uint8Array;
186
+ };
187
+ /**
188
+ * Deterministically generate nonces. This is identical to deterministicSign,
189
+ * except that it aborts after nonce generation and before signing, and
190
+ * returns only the public nonce. This security of this method of nonce
191
+ * generation depends on its being run after all other parties have provided
192
+ * their nonces.
193
+ *
194
+ * A public nonce generated in this way cannot be directly used for signing
195
+ * (no secret nonce is saved), but a matching partial signature can be
196
+ * generated by subsequently calling deterministicSign with the same
197
+ * arguments as the call to deterministicNonceGen.
198
+ *
199
+ * This can be useful in a case where a stateless signer only wants to
200
+ * provide its partial signature after seeing valid partial signatures from
201
+ * other parties.
202
+ *
203
+ * @param secretKey signer's secret key
204
+ * @param aggOtherNonce the result of calling `nonceAgg` on all other signing
205
+ * parties' nonces
206
+ * @param publicKeys array of compressed DER encoded public keys to aggregate
207
+ * @param tweaks tweaks (0 < tweak < n) to apply to the aggregate key,
208
+ * and optionally booleans to indicate x-only tweaking
209
+ * @param msg the 32-byte message to sign for, most commonly a transaction hash.
210
+ * @param rand optional additional randomness for nonce generation
211
+ * @param verify if false, don't verify partial signature
212
+ * @return public nonce
213
+ */
214
+ deterministicNonceGen(args: {
215
+ secretKey: Uint8Array;
216
+ aggOtherNonce: Uint8Array;
217
+ publicKeys: Uint8Array[];
218
+ tweaks?: Tweak[];
219
+ msg: Uint8Array;
220
+ rand?: Uint8Array;
221
+ }): {
222
+ publicNonce: Uint8Array;
223
+ };
224
+ }
225
+ export interface Crypto {
226
+ /**
227
+ * Adds a tweak to a point.
228
+ *
229
+ * @param p A point, compressed or uncompressed
230
+ * @param t A tweak, 0 < t < n
231
+ * @param compressed Whether the resulting point should be compressed.
232
+ * @returns The tweaked point, compressed or uncompressed, null if the result
233
+ * is the point at infinity.
234
+ */
235
+ pointAddTweak(p: Uint8Array, t: Uint8Array, compressed: boolean): Uint8Array | null;
236
+ /**
237
+ * Adds two points.
238
+ *
239
+ * @param a An addend point, compressed or uncompressed
240
+ * @param b An addend point, compressed or uncompressed
241
+ * @param compressed Whether the resulting point should be compressed.
242
+ * @returns The sum point, compressed or uncompressed, null if the result is
243
+ * the point at infinity.
244
+ */
245
+ pointAdd(a: Uint8Array, b: Uint8Array, compressed: boolean): Uint8Array | null;
246
+ /**
247
+ * Multiplies a point by a scalar.
248
+ * This function may use non-constant time operations, as no secret
249
+ * information is processed.
250
+ *
251
+ * @param p A point multiplicand, compressed or uncompressed
252
+ * @param a The multiplier, 0 < a < n
253
+ * @param compressed Whether the resulting point should be compressed.
254
+ * @returns The product point, compressed or uncompressed, null if the result
255
+ * is the point at infinity.
256
+ */
257
+ pointMultiplyUnsafe(p: Uint8Array, a: Uint8Array, compressed: boolean): Uint8Array | null;
258
+ /**
259
+ * Multiplies point 1 by a scalar and adds it to point 2.
260
+ * This function may use non-constant time operations, as no secret
261
+ * information is processed.
262
+ *
263
+ * @param p1 point multiplicand, compressed or uncompressed
264
+ * @param a The multiplier, 0 < a < n
265
+ * @param p2 point addend, compressed or uncompressed
266
+ * @param compressed Whether the resulting point should be compressed.
267
+ * @returns The product/sum point, compressed or uncompressed, null if the
268
+ * result is the point at infinity.
269
+ */
270
+ pointMultiplyAndAddUnsafe(p1: Uint8Array, a: Uint8Array, p2: Uint8Array, compressed: boolean): Uint8Array | null;
271
+ /**
272
+ * Negates a point, ie. returns the point with the opposite parity.
273
+ *
274
+ * @param p A point to negate, compressed or uncompressed
275
+ * @returns The negated point, with same compression as input.
276
+ */
277
+ pointNegate(p: Uint8Array): Uint8Array;
278
+ /**
279
+ * Compresses a point.
280
+ *
281
+ * @param p A point, compressed or uncompressed
282
+ * @param compress [default=true] if false, uncompress the point
283
+ * @returns The point, compressed if compress is true, or uncompressed if false.
284
+ */
285
+ pointCompress(p: Uint8Array, compress?: boolean): Uint8Array;
286
+ /**
287
+ * Adds one value to another, mod n.
288
+ *
289
+ * @param a An addend, 0 <= a < n
290
+ * @param b An addend, 0 <= b < n
291
+ * @returns The sum, 0 <= sum < n
292
+ */
293
+ scalarAdd(a: Uint8Array, b: Uint8Array): Uint8Array;
294
+ /**
295
+ * Multiply one value by another, mod n.
296
+ *
297
+ * @param a The multiplicand, 0 <= a < n
298
+ * @param b The multiplier, 0 <= b < n
299
+ * @returns The product, 0 <= product < n
300
+ */
301
+ scalarMultiply(a: Uint8Array, b: Uint8Array): Uint8Array;
302
+ /**
303
+ * Negates a value, mod n.
304
+ *
305
+ * @param a The value to negate, 0 <= a < n
306
+ * @returns The negated value, 0 <= negated < n
307
+ */
308
+ scalarNegate(a: Uint8Array): Uint8Array;
309
+ /**
310
+ * @param a The value to reduce
311
+ * @returns a mod n
312
+ */
313
+ scalarMod(a: Uint8Array): Uint8Array;
314
+ /**
315
+ * @param s A buffer to check against the curve order
316
+ * @returns true if s is a 32-byte array 0 <= s < n
317
+ */
318
+ isScalar(s: Uint8Array): boolean;
319
+ /**
320
+ * @param s A buffer to check against the curve order
321
+ * @returns true if s is a 32-byte array 0 < s < n
322
+ */
323
+ isSecret(s: Uint8Array): boolean;
324
+ /**
325
+ * @param p A buffer to check against the curve equation, compressed or
326
+ * uncompressed.
327
+ * @returns true if p is a valid point on secp256k1, false otherwise
328
+ */
329
+ isPoint(p: Uint8Array): boolean;
330
+ /**
331
+ * @param p A buffer to check against the curve equation.
332
+ * @returns true if p is the x coordinate of a valid point on secp256k1,
333
+ * false otherwise
334
+ */
335
+ isXOnlyPoint(p: Uint8Array): boolean;
336
+ /**
337
+ * @param p an x coordinate
338
+ * @returns the xy, uncompressed point if p is on the curve, otherwise null.
339
+ */
340
+ liftX(p: Uint8Array): Uint8Array | null;
341
+ /**
342
+ * @param p x-only, compressed or uncompressed
343
+ * @returns the x coordinate of p
344
+ */
345
+ pointX(p: Uint8Array): Uint8Array;
346
+ /**
347
+ * @param p a point, compressed or uncompressed
348
+ * @returns true if p has an even y coordinate, false otherwise
349
+ */
350
+ hasEvenY(p: Uint8Array): boolean;
351
+ /**
352
+ * Gets a public key for secret key.
353
+ *
354
+ * @param s Secret key
355
+ * @param compressed Whether the resulting point should be compressed.
356
+ * @returns The public key, compressed or uncompressed
357
+ */
358
+ getPublicKey(s: Uint8Array, compressed: boolean): Uint8Array | null;
359
+ /**
360
+ * Performs a BIP340-style tagged hash.
361
+ *
362
+ * @param tag
363
+ * @param messages Array of data to hash.
364
+ * @return The 32-byte BIP340-style tagged hash.
365
+ */
366
+ taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array;
367
+ /**
368
+ * SHA256 hash.
369
+ *
370
+ * @param messages Array of data to hash.
371
+ * @return The 32-byte SHA256 digest.
372
+ */
373
+ sha256(...messages: Uint8Array[]): Uint8Array;
374
+ }
375
+ export declare type Tweak = TypedTweak | Uint8Array;
376
+ export interface TypedTweak {
377
+ tweak: Uint8Array;
378
+ xOnly?: boolean;
379
+ }
380
+ export interface KeyGenContext {
381
+ aggPublicKey: Uint8Array;
382
+ gacc: Uint8Array;
383
+ tacc: Uint8Array;
384
+ }
385
+ export interface SessionKey {
386
+ publicKey: Uint8Array;
387
+ aggNonce: Uint8Array;
388
+ msg: Uint8Array;
389
+ }
390
+ export declare function MuSigFactory(ecc: Crypto): MuSig;
391
+ //# sourceMappingURL=musig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"musig.d.ts","sourceRoot":"","sources":["../../src/musig.ts"],"names":[],"mappings":"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"}