@0xpolygonid/js-sdk 1.9.2 → 1.9.4
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.
- package/dist/browser/esm/index.js +2989 -1220
- package/dist/browser/esm/index.js.map +1 -1
- package/dist/browser/umd/index.js +2956 -1176
- package/dist/browser/umd/index.js.map +1 -1
- package/dist/node/cjs/circuits/comparer.js +6 -1
- package/dist/node/cjs/kms/key-providers/ed25519-provider.js +96 -0
- package/dist/node/cjs/kms/key-providers/index.js +1 -0
- package/dist/node/cjs/kms/store/types.js +1 -0
- package/dist/node/cjs/proof/provers/inputs-generator.js +16 -1
- package/dist/node/cjs/proof/verifiers/pub-signals-verifier.js +96 -3
- package/dist/node/cjs/proof/verifiers/query.js +90 -75
- package/dist/node/esm/circuits/comparer.js +4 -0
- package/dist/node/esm/kms/key-providers/ed25519-provider.js +69 -0
- package/dist/node/esm/kms/key-providers/index.js +1 -0
- package/dist/node/esm/kms/store/types.js +1 -0
- package/dist/node/esm/proof/provers/inputs-generator.js +17 -2
- package/dist/node/esm/proof/verifiers/pub-signals-verifier.js +98 -5
- package/dist/node/esm/proof/verifiers/query.js +82 -76
- package/dist/types/circuits/comparer.d.ts +1 -0
- package/dist/types/kms/key-providers/ed25519-provider.d.ts +44 -0
- package/dist/types/kms/key-providers/index.d.ts +1 -0
- package/dist/types/kms/store/types.d.ts +2 -1
- package/dist/types/proof/provers/inputs-generator.d.ts +1 -0
- package/dist/types/proof/verifiers/pub-signals-verifier.d.ts +1 -0
- package/dist/types/proof/verifiers/query.d.ts +13 -1
- package/package.json +5 -3
|
@@ -208,6 +208,1841 @@ var PolygonIdSdk = (function (exports) {
|
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
+
// copied from utils
|
|
212
|
+
function isBytes$1(a) {
|
|
213
|
+
return (a instanceof Uint8Array ||
|
|
214
|
+
(a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
|
|
215
|
+
}
|
|
216
|
+
function bytes$1(b, ...lengths) {
|
|
217
|
+
if (!isBytes$1(b))
|
|
218
|
+
throw new Error('Uint8Array expected');
|
|
219
|
+
if (lengths.length > 0 && !lengths.includes(b.length))
|
|
220
|
+
throw new Error(`Uint8Array expected of length ${lengths}, not of length=${b.length}`);
|
|
221
|
+
}
|
|
222
|
+
function exists$1(instance, checkFinished = true) {
|
|
223
|
+
if (instance.destroyed)
|
|
224
|
+
throw new Error('Hash instance has been destroyed');
|
|
225
|
+
if (checkFinished && instance.finished)
|
|
226
|
+
throw new Error('Hash#digest() has already been called');
|
|
227
|
+
}
|
|
228
|
+
function output$1(out, instance) {
|
|
229
|
+
bytes$1(out);
|
|
230
|
+
const min = instance.outputLen;
|
|
231
|
+
if (out.length < min) {
|
|
232
|
+
throw new Error(`digestInto() expects output buffer of length at least ${min}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const crypto$4 = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;
|
|
237
|
+
|
|
238
|
+
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
239
|
+
// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.
|
|
240
|
+
// node.js versions earlier than v19 don't declare it in global scope.
|
|
241
|
+
// For node.js, package.json#exports field mapping rewrites import
|
|
242
|
+
// from `crypto` to `cryptoNode`, which imports native module.
|
|
243
|
+
// Makes the utils un-importable in browsers without a bundler.
|
|
244
|
+
// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.
|
|
245
|
+
// Cast array to view
|
|
246
|
+
const createView$1 = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
|
|
247
|
+
/**
|
|
248
|
+
* @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])
|
|
249
|
+
*/
|
|
250
|
+
function utf8ToBytes$2(str) {
|
|
251
|
+
if (typeof str !== 'string')
|
|
252
|
+
throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
|
|
253
|
+
return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Normalizes (non-hex) string or Uint8Array to Uint8Array.
|
|
257
|
+
* Warning: when Uint8Array is passed, it would NOT get copied.
|
|
258
|
+
* Keep in mind for future mutable operations.
|
|
259
|
+
*/
|
|
260
|
+
function toBytes$1(data) {
|
|
261
|
+
if (typeof data === 'string')
|
|
262
|
+
data = utf8ToBytes$2(data);
|
|
263
|
+
bytes$1(data);
|
|
264
|
+
return data;
|
|
265
|
+
}
|
|
266
|
+
// For runtime check if class implements interface
|
|
267
|
+
let Hash$1 = class Hash {
|
|
268
|
+
// Safe version that clones internal state
|
|
269
|
+
clone() {
|
|
270
|
+
return this._cloneInto();
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
function wrapConstructor$1(hashCons) {
|
|
274
|
+
const hashC = (msg) => hashCons().update(toBytes$1(msg)).digest();
|
|
275
|
+
const tmp = hashCons();
|
|
276
|
+
hashC.outputLen = tmp.outputLen;
|
|
277
|
+
hashC.blockLen = tmp.blockLen;
|
|
278
|
+
hashC.create = () => hashCons();
|
|
279
|
+
return hashC;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.
|
|
283
|
+
*/
|
|
284
|
+
function randomBytes$1(bytesLength = 32) {
|
|
285
|
+
if (crypto$4 && typeof crypto$4.getRandomValues === 'function') {
|
|
286
|
+
return crypto$4.getRandomValues(new Uint8Array(bytesLength));
|
|
287
|
+
}
|
|
288
|
+
throw new Error('crypto.getRandomValues must be defined');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Polyfill for Safari 14
|
|
292
|
+
function setBigUint64$1(view, byteOffset, value, isLE) {
|
|
293
|
+
if (typeof view.setBigUint64 === 'function')
|
|
294
|
+
return view.setBigUint64(byteOffset, value, isLE);
|
|
295
|
+
const _32n = BigInt(32);
|
|
296
|
+
const _u32_max = BigInt(0xffffffff);
|
|
297
|
+
const wh = Number((value >> _32n) & _u32_max);
|
|
298
|
+
const wl = Number(value & _u32_max);
|
|
299
|
+
const h = isLE ? 4 : 0;
|
|
300
|
+
const l = isLE ? 0 : 4;
|
|
301
|
+
view.setUint32(byteOffset + h, wh, isLE);
|
|
302
|
+
view.setUint32(byteOffset + l, wl, isLE);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Merkle-Damgard hash construction base class.
|
|
306
|
+
* Could be used to create MD5, RIPEMD, SHA1, SHA2.
|
|
307
|
+
*/
|
|
308
|
+
class HashMD extends Hash$1 {
|
|
309
|
+
constructor(blockLen, outputLen, padOffset, isLE) {
|
|
310
|
+
super();
|
|
311
|
+
this.blockLen = blockLen;
|
|
312
|
+
this.outputLen = outputLen;
|
|
313
|
+
this.padOffset = padOffset;
|
|
314
|
+
this.isLE = isLE;
|
|
315
|
+
this.finished = false;
|
|
316
|
+
this.length = 0;
|
|
317
|
+
this.pos = 0;
|
|
318
|
+
this.destroyed = false;
|
|
319
|
+
this.buffer = new Uint8Array(blockLen);
|
|
320
|
+
this.view = createView$1(this.buffer);
|
|
321
|
+
}
|
|
322
|
+
update(data) {
|
|
323
|
+
exists$1(this);
|
|
324
|
+
const { view, buffer, blockLen } = this;
|
|
325
|
+
data = toBytes$1(data);
|
|
326
|
+
const len = data.length;
|
|
327
|
+
for (let pos = 0; pos < len;) {
|
|
328
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
329
|
+
// Fast path: we have at least one block in input, cast it to view and process
|
|
330
|
+
if (take === blockLen) {
|
|
331
|
+
const dataView = createView$1(data);
|
|
332
|
+
for (; blockLen <= len - pos; pos += blockLen)
|
|
333
|
+
this.process(dataView, pos);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
337
|
+
this.pos += take;
|
|
338
|
+
pos += take;
|
|
339
|
+
if (this.pos === blockLen) {
|
|
340
|
+
this.process(view, 0);
|
|
341
|
+
this.pos = 0;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
this.length += data.length;
|
|
345
|
+
this.roundClean();
|
|
346
|
+
return this;
|
|
347
|
+
}
|
|
348
|
+
digestInto(out) {
|
|
349
|
+
exists$1(this);
|
|
350
|
+
output$1(out, this);
|
|
351
|
+
this.finished = true;
|
|
352
|
+
// Padding
|
|
353
|
+
// We can avoid allocation of buffer for padding completely if it
|
|
354
|
+
// was previously not allocated here. But it won't change performance.
|
|
355
|
+
const { buffer, view, blockLen, isLE } = this;
|
|
356
|
+
let { pos } = this;
|
|
357
|
+
// append the bit '1' to the message
|
|
358
|
+
buffer[pos++] = 0b10000000;
|
|
359
|
+
this.buffer.subarray(pos).fill(0);
|
|
360
|
+
// we have less than padOffset left in buffer, so we cannot put length in
|
|
361
|
+
// current block, need process it and pad again
|
|
362
|
+
if (this.padOffset > blockLen - pos) {
|
|
363
|
+
this.process(view, 0);
|
|
364
|
+
pos = 0;
|
|
365
|
+
}
|
|
366
|
+
// Pad until full block byte with zeros
|
|
367
|
+
for (let i = pos; i < blockLen; i++)
|
|
368
|
+
buffer[i] = 0;
|
|
369
|
+
// Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that
|
|
370
|
+
// You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.
|
|
371
|
+
// So we just write lowest 64 bits of that value.
|
|
372
|
+
setBigUint64$1(view, blockLen - 8, BigInt(this.length * 8), isLE);
|
|
373
|
+
this.process(view, 0);
|
|
374
|
+
const oview = createView$1(out);
|
|
375
|
+
const len = this.outputLen;
|
|
376
|
+
// NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT
|
|
377
|
+
if (len % 4)
|
|
378
|
+
throw new Error('_sha2: outputLen should be aligned to 32bit');
|
|
379
|
+
const outLen = len / 4;
|
|
380
|
+
const state = this.get();
|
|
381
|
+
if (outLen > state.length)
|
|
382
|
+
throw new Error('_sha2: outputLen bigger than state');
|
|
383
|
+
for (let i = 0; i < outLen; i++)
|
|
384
|
+
oview.setUint32(4 * i, state[i], isLE);
|
|
385
|
+
}
|
|
386
|
+
digest() {
|
|
387
|
+
const { buffer, outputLen } = this;
|
|
388
|
+
this.digestInto(buffer);
|
|
389
|
+
const res = buffer.slice(0, outputLen);
|
|
390
|
+
this.destroy();
|
|
391
|
+
return res;
|
|
392
|
+
}
|
|
393
|
+
_cloneInto(to) {
|
|
394
|
+
to || (to = new this.constructor());
|
|
395
|
+
to.set(...this.get());
|
|
396
|
+
const { blockLen, buffer, length, finished, destroyed, pos } = this;
|
|
397
|
+
to.length = length;
|
|
398
|
+
to.pos = pos;
|
|
399
|
+
to.finished = finished;
|
|
400
|
+
to.destroyed = destroyed;
|
|
401
|
+
if (length % blockLen)
|
|
402
|
+
to.buffer.set(buffer);
|
|
403
|
+
return to;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const U32_MASK64$1 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
|
|
408
|
+
const _32n$1 = /* @__PURE__ */ BigInt(32);
|
|
409
|
+
// We are not using BigUint64Array, because they are extremely slow as per 2022
|
|
410
|
+
function fromBig$1(n, le = false) {
|
|
411
|
+
if (le)
|
|
412
|
+
return { h: Number(n & U32_MASK64$1), l: Number((n >> _32n$1) & U32_MASK64$1) };
|
|
413
|
+
return { h: Number((n >> _32n$1) & U32_MASK64$1) | 0, l: Number(n & U32_MASK64$1) | 0 };
|
|
414
|
+
}
|
|
415
|
+
function split$2(lst, le = false) {
|
|
416
|
+
let Ah = new Uint32Array(lst.length);
|
|
417
|
+
let Al = new Uint32Array(lst.length);
|
|
418
|
+
for (let i = 0; i < lst.length; i++) {
|
|
419
|
+
const { h, l } = fromBig$1(lst[i], le);
|
|
420
|
+
[Ah[i], Al[i]] = [h, l];
|
|
421
|
+
}
|
|
422
|
+
return [Ah, Al];
|
|
423
|
+
}
|
|
424
|
+
const toBig = (h, l) => (BigInt(h >>> 0) << _32n$1) | BigInt(l >>> 0);
|
|
425
|
+
// for Shift in [0, 32)
|
|
426
|
+
const shrSH = (h, _l, s) => h >>> s;
|
|
427
|
+
const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
|
428
|
+
// Right rotate for Shift in [1, 32)
|
|
429
|
+
const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));
|
|
430
|
+
const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
|
431
|
+
// Right rotate for Shift in (32, 64), NOTE: 32 is special case.
|
|
432
|
+
const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));
|
|
433
|
+
const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));
|
|
434
|
+
// Right rotate for shift===32 (just swaps l&h)
|
|
435
|
+
const rotr32H = (_h, l) => l;
|
|
436
|
+
const rotr32L = (h, _l) => h;
|
|
437
|
+
// Left rotate for Shift in [1, 32)
|
|
438
|
+
const rotlSH$1 = (h, l, s) => (h << s) | (l >>> (32 - s));
|
|
439
|
+
const rotlSL$1 = (h, l, s) => (l << s) | (h >>> (32 - s));
|
|
440
|
+
// Left rotate for Shift in (32, 64), NOTE: 32 is special case.
|
|
441
|
+
const rotlBH$1 = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));
|
|
442
|
+
const rotlBL$1 = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));
|
|
443
|
+
// JS uses 32-bit signed integers for bitwise operations which means we cannot
|
|
444
|
+
// simple take carry out of low bit sum by shift, we need to use division.
|
|
445
|
+
function add$1(Ah, Al, Bh, Bl) {
|
|
446
|
+
const l = (Al >>> 0) + (Bl >>> 0);
|
|
447
|
+
return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };
|
|
448
|
+
}
|
|
449
|
+
// Addition with more than 2 elements
|
|
450
|
+
const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);
|
|
451
|
+
const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;
|
|
452
|
+
const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);
|
|
453
|
+
const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;
|
|
454
|
+
const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);
|
|
455
|
+
const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;
|
|
456
|
+
// prettier-ignore
|
|
457
|
+
const u64 = {
|
|
458
|
+
fromBig: fromBig$1, split: split$2, toBig,
|
|
459
|
+
shrSH, shrSL,
|
|
460
|
+
rotrSH, rotrSL, rotrBH, rotrBL,
|
|
461
|
+
rotr32H, rotr32L,
|
|
462
|
+
rotlSH: rotlSH$1, rotlSL: rotlSL$1, rotlBH: rotlBH$1, rotlBL: rotlBL$1,
|
|
463
|
+
add: add$1, add3L, add3H, add4L, add4H, add5H, add5L,
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
// Round contants (first 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409):
|
|
467
|
+
// prettier-ignore
|
|
468
|
+
const [SHA512_Kh, SHA512_Kl] = /* @__PURE__ */ (() => u64.split([
|
|
469
|
+
'0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',
|
|
470
|
+
'0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',
|
|
471
|
+
'0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',
|
|
472
|
+
'0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',
|
|
473
|
+
'0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',
|
|
474
|
+
'0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',
|
|
475
|
+
'0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',
|
|
476
|
+
'0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',
|
|
477
|
+
'0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',
|
|
478
|
+
'0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',
|
|
479
|
+
'0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',
|
|
480
|
+
'0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',
|
|
481
|
+
'0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',
|
|
482
|
+
'0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',
|
|
483
|
+
'0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',
|
|
484
|
+
'0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',
|
|
485
|
+
'0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',
|
|
486
|
+
'0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',
|
|
487
|
+
'0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',
|
|
488
|
+
'0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'
|
|
489
|
+
].map(n => BigInt(n))))();
|
|
490
|
+
// Temporary buffer, not used to store anything between runs
|
|
491
|
+
const SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);
|
|
492
|
+
const SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);
|
|
493
|
+
let SHA512$2 = class SHA512 extends HashMD {
|
|
494
|
+
constructor() {
|
|
495
|
+
super(128, 64, 16, false);
|
|
496
|
+
// We cannot use array here since array allows indexing by variable which means optimizer/compiler cannot use registers.
|
|
497
|
+
// Also looks cleaner and easier to verify with spec.
|
|
498
|
+
// Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
|
|
499
|
+
// h -- high 32 bits, l -- low 32 bits
|
|
500
|
+
this.Ah = 0x6a09e667 | 0;
|
|
501
|
+
this.Al = 0xf3bcc908 | 0;
|
|
502
|
+
this.Bh = 0xbb67ae85 | 0;
|
|
503
|
+
this.Bl = 0x84caa73b | 0;
|
|
504
|
+
this.Ch = 0x3c6ef372 | 0;
|
|
505
|
+
this.Cl = 0xfe94f82b | 0;
|
|
506
|
+
this.Dh = 0xa54ff53a | 0;
|
|
507
|
+
this.Dl = 0x5f1d36f1 | 0;
|
|
508
|
+
this.Eh = 0x510e527f | 0;
|
|
509
|
+
this.El = 0xade682d1 | 0;
|
|
510
|
+
this.Fh = 0x9b05688c | 0;
|
|
511
|
+
this.Fl = 0x2b3e6c1f | 0;
|
|
512
|
+
this.Gh = 0x1f83d9ab | 0;
|
|
513
|
+
this.Gl = 0xfb41bd6b | 0;
|
|
514
|
+
this.Hh = 0x5be0cd19 | 0;
|
|
515
|
+
this.Hl = 0x137e2179 | 0;
|
|
516
|
+
}
|
|
517
|
+
// prettier-ignore
|
|
518
|
+
get() {
|
|
519
|
+
const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;
|
|
520
|
+
return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];
|
|
521
|
+
}
|
|
522
|
+
// prettier-ignore
|
|
523
|
+
set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {
|
|
524
|
+
this.Ah = Ah | 0;
|
|
525
|
+
this.Al = Al | 0;
|
|
526
|
+
this.Bh = Bh | 0;
|
|
527
|
+
this.Bl = Bl | 0;
|
|
528
|
+
this.Ch = Ch | 0;
|
|
529
|
+
this.Cl = Cl | 0;
|
|
530
|
+
this.Dh = Dh | 0;
|
|
531
|
+
this.Dl = Dl | 0;
|
|
532
|
+
this.Eh = Eh | 0;
|
|
533
|
+
this.El = El | 0;
|
|
534
|
+
this.Fh = Fh | 0;
|
|
535
|
+
this.Fl = Fl | 0;
|
|
536
|
+
this.Gh = Gh | 0;
|
|
537
|
+
this.Gl = Gl | 0;
|
|
538
|
+
this.Hh = Hh | 0;
|
|
539
|
+
this.Hl = Hl | 0;
|
|
540
|
+
}
|
|
541
|
+
process(view, offset) {
|
|
542
|
+
// Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array
|
|
543
|
+
for (let i = 0; i < 16; i++, offset += 4) {
|
|
544
|
+
SHA512_W_H[i] = view.getUint32(offset);
|
|
545
|
+
SHA512_W_L[i] = view.getUint32((offset += 4));
|
|
546
|
+
}
|
|
547
|
+
for (let i = 16; i < 80; i++) {
|
|
548
|
+
// s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)
|
|
549
|
+
const W15h = SHA512_W_H[i - 15] | 0;
|
|
550
|
+
const W15l = SHA512_W_L[i - 15] | 0;
|
|
551
|
+
const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);
|
|
552
|
+
const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);
|
|
553
|
+
// s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)
|
|
554
|
+
const W2h = SHA512_W_H[i - 2] | 0;
|
|
555
|
+
const W2l = SHA512_W_L[i - 2] | 0;
|
|
556
|
+
const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);
|
|
557
|
+
const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);
|
|
558
|
+
// SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];
|
|
559
|
+
const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);
|
|
560
|
+
const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);
|
|
561
|
+
SHA512_W_H[i] = SUMh | 0;
|
|
562
|
+
SHA512_W_L[i] = SUMl | 0;
|
|
563
|
+
}
|
|
564
|
+
let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;
|
|
565
|
+
// Compression function main loop, 80 rounds
|
|
566
|
+
for (let i = 0; i < 80; i++) {
|
|
567
|
+
// S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)
|
|
568
|
+
const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);
|
|
569
|
+
const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);
|
|
570
|
+
//const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;
|
|
571
|
+
const CHIh = (Eh & Fh) ^ (~Eh & Gh);
|
|
572
|
+
const CHIl = (El & Fl) ^ (~El & Gl);
|
|
573
|
+
// T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]
|
|
574
|
+
// prettier-ignore
|
|
575
|
+
const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);
|
|
576
|
+
const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);
|
|
577
|
+
const T1l = T1ll | 0;
|
|
578
|
+
// S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)
|
|
579
|
+
const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);
|
|
580
|
+
const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);
|
|
581
|
+
const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);
|
|
582
|
+
const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);
|
|
583
|
+
Hh = Gh | 0;
|
|
584
|
+
Hl = Gl | 0;
|
|
585
|
+
Gh = Fh | 0;
|
|
586
|
+
Gl = Fl | 0;
|
|
587
|
+
Fh = Eh | 0;
|
|
588
|
+
Fl = El | 0;
|
|
589
|
+
({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));
|
|
590
|
+
Dh = Ch | 0;
|
|
591
|
+
Dl = Cl | 0;
|
|
592
|
+
Ch = Bh | 0;
|
|
593
|
+
Cl = Bl | 0;
|
|
594
|
+
Bh = Ah | 0;
|
|
595
|
+
Bl = Al | 0;
|
|
596
|
+
const All = u64.add3L(T1l, sigma0l, MAJl);
|
|
597
|
+
Ah = u64.add3H(All, T1h, sigma0h, MAJh);
|
|
598
|
+
Al = All | 0;
|
|
599
|
+
}
|
|
600
|
+
// Add the compressed chunk to the current hash value
|
|
601
|
+
({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));
|
|
602
|
+
({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));
|
|
603
|
+
({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));
|
|
604
|
+
({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));
|
|
605
|
+
({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));
|
|
606
|
+
({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));
|
|
607
|
+
({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));
|
|
608
|
+
({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));
|
|
609
|
+
this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);
|
|
610
|
+
}
|
|
611
|
+
roundClean() {
|
|
612
|
+
SHA512_W_H.fill(0);
|
|
613
|
+
SHA512_W_L.fill(0);
|
|
614
|
+
}
|
|
615
|
+
destroy() {
|
|
616
|
+
this.buffer.fill(0);
|
|
617
|
+
this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
const sha512$1 = /* @__PURE__ */ wrapConstructor$1(() => new SHA512$2());
|
|
621
|
+
|
|
622
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
623
|
+
// 100 lines of code in the file are duplicated from noble-hashes (utils).
|
|
624
|
+
// This is OK: `abstract` directory does not use noble-hashes.
|
|
625
|
+
// User may opt-in into using different hashing library. This way, noble-hashes
|
|
626
|
+
// won't be included into their bundle.
|
|
627
|
+
BigInt(0);
|
|
628
|
+
const _1n$a = BigInt(1);
|
|
629
|
+
const _2n$7 = BigInt(2);
|
|
630
|
+
function isBytes(a) {
|
|
631
|
+
return (a instanceof Uint8Array ||
|
|
632
|
+
(a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
|
|
633
|
+
}
|
|
634
|
+
function abytes(item) {
|
|
635
|
+
if (!isBytes(item))
|
|
636
|
+
throw new Error('Uint8Array expected');
|
|
637
|
+
}
|
|
638
|
+
// Array where index 0xf0 (240) is mapped to string 'f0'
|
|
639
|
+
const hexes$1 = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));
|
|
640
|
+
/**
|
|
641
|
+
* @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'
|
|
642
|
+
*/
|
|
643
|
+
function bytesToHex$3(bytes) {
|
|
644
|
+
abytes(bytes);
|
|
645
|
+
// pre-caching improves the speed 6x
|
|
646
|
+
let hex = '';
|
|
647
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
648
|
+
hex += hexes$1[bytes[i]];
|
|
649
|
+
}
|
|
650
|
+
return hex;
|
|
651
|
+
}
|
|
652
|
+
function hexToNumber$1(hex) {
|
|
653
|
+
if (typeof hex !== 'string')
|
|
654
|
+
throw new Error('hex string expected, got ' + typeof hex);
|
|
655
|
+
// Big Endian
|
|
656
|
+
return BigInt(hex === '' ? '0' : `0x${hex}`);
|
|
657
|
+
}
|
|
658
|
+
// We use optimized technique to convert hex string to byte array
|
|
659
|
+
const asciis = { _0: 48, _9: 57, _A: 65, _F: 70, _a: 97, _f: 102 };
|
|
660
|
+
function asciiToBase16(char) {
|
|
661
|
+
if (char >= asciis._0 && char <= asciis._9)
|
|
662
|
+
return char - asciis._0;
|
|
663
|
+
if (char >= asciis._A && char <= asciis._F)
|
|
664
|
+
return char - (asciis._A - 10);
|
|
665
|
+
if (char >= asciis._a && char <= asciis._f)
|
|
666
|
+
return char - (asciis._a - 10);
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])
|
|
671
|
+
*/
|
|
672
|
+
function hexToBytes$3(hex) {
|
|
673
|
+
if (typeof hex !== 'string')
|
|
674
|
+
throw new Error('hex string expected, got ' + typeof hex);
|
|
675
|
+
const hl = hex.length;
|
|
676
|
+
const al = hl / 2;
|
|
677
|
+
if (hl % 2)
|
|
678
|
+
throw new Error('padded hex string expected, got unpadded hex of length ' + hl);
|
|
679
|
+
const array = new Uint8Array(al);
|
|
680
|
+
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
681
|
+
const n1 = asciiToBase16(hex.charCodeAt(hi));
|
|
682
|
+
const n2 = asciiToBase16(hex.charCodeAt(hi + 1));
|
|
683
|
+
if (n1 === undefined || n2 === undefined) {
|
|
684
|
+
const char = hex[hi] + hex[hi + 1];
|
|
685
|
+
throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi);
|
|
686
|
+
}
|
|
687
|
+
array[ai] = n1 * 16 + n2;
|
|
688
|
+
}
|
|
689
|
+
return array;
|
|
690
|
+
}
|
|
691
|
+
// BE: Big Endian, LE: Little Endian
|
|
692
|
+
function bytesToNumberBE$1(bytes) {
|
|
693
|
+
return hexToNumber$1(bytesToHex$3(bytes));
|
|
694
|
+
}
|
|
695
|
+
function bytesToNumberLE$1(bytes) {
|
|
696
|
+
abytes(bytes);
|
|
697
|
+
return hexToNumber$1(bytesToHex$3(Uint8Array.from(bytes).reverse()));
|
|
698
|
+
}
|
|
699
|
+
function numberToBytesBE$1(n, len) {
|
|
700
|
+
return hexToBytes$3(n.toString(16).padStart(len * 2, '0'));
|
|
701
|
+
}
|
|
702
|
+
function numberToBytesLE$1(n, len) {
|
|
703
|
+
return numberToBytesBE$1(n, len).reverse();
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Takes hex string or Uint8Array, converts to Uint8Array.
|
|
707
|
+
* Validates output length.
|
|
708
|
+
* Will throw error for other types.
|
|
709
|
+
* @param title descriptive title for an error e.g. 'private key'
|
|
710
|
+
* @param hex hex string or Uint8Array
|
|
711
|
+
* @param expectedLength optional, will compare to result array's length
|
|
712
|
+
* @returns
|
|
713
|
+
*/
|
|
714
|
+
function ensureBytes$1(title, hex, expectedLength) {
|
|
715
|
+
let res;
|
|
716
|
+
if (typeof hex === 'string') {
|
|
717
|
+
try {
|
|
718
|
+
res = hexToBytes$3(hex);
|
|
719
|
+
}
|
|
720
|
+
catch (e) {
|
|
721
|
+
throw new Error(`${title} must be valid hex string, got "${hex}". Cause: ${e}`);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
else if (isBytes(hex)) {
|
|
725
|
+
// Uint8Array.from() instead of hash.slice() because node.js Buffer
|
|
726
|
+
// is instance of Uint8Array, and its slice() creates **mutable** copy
|
|
727
|
+
res = Uint8Array.from(hex);
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
throw new Error(`${title} must be hex string or Uint8Array`);
|
|
731
|
+
}
|
|
732
|
+
const len = res.length;
|
|
733
|
+
if (typeof expectedLength === 'number' && len !== expectedLength)
|
|
734
|
+
throw new Error(`${title} expected ${expectedLength} bytes, got ${len}`);
|
|
735
|
+
return res;
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Copies several Uint8Arrays into one.
|
|
739
|
+
*/
|
|
740
|
+
function concatBytes$2(...arrays) {
|
|
741
|
+
let sum = 0;
|
|
742
|
+
for (let i = 0; i < arrays.length; i++) {
|
|
743
|
+
const a = arrays[i];
|
|
744
|
+
abytes(a);
|
|
745
|
+
sum += a.length;
|
|
746
|
+
}
|
|
747
|
+
const res = new Uint8Array(sum);
|
|
748
|
+
for (let i = 0, pad = 0; i < arrays.length; i++) {
|
|
749
|
+
const a = arrays[i];
|
|
750
|
+
res.set(a, pad);
|
|
751
|
+
pad += a.length;
|
|
752
|
+
}
|
|
753
|
+
return res;
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* Calculate mask for N bits. Not using ** operator with bigints because of old engines.
|
|
757
|
+
* Same as BigInt(`0b${Array(i).fill('1').join('')}`)
|
|
758
|
+
*/
|
|
759
|
+
const bitMask$1 = (n) => (_2n$7 << BigInt(n - 1)) - _1n$a;
|
|
760
|
+
// Validating curves and fields
|
|
761
|
+
const validatorFns$1 = {
|
|
762
|
+
bigint: (val) => typeof val === 'bigint',
|
|
763
|
+
function: (val) => typeof val === 'function',
|
|
764
|
+
boolean: (val) => typeof val === 'boolean',
|
|
765
|
+
string: (val) => typeof val === 'string',
|
|
766
|
+
stringOrUint8Array: (val) => typeof val === 'string' || isBytes(val),
|
|
767
|
+
isSafeInteger: (val) => Number.isSafeInteger(val),
|
|
768
|
+
array: (val) => Array.isArray(val),
|
|
769
|
+
field: (val, object) => object.Fp.isValid(val),
|
|
770
|
+
hash: (val) => typeof val === 'function' && Number.isSafeInteger(val.outputLen),
|
|
771
|
+
};
|
|
772
|
+
// type Record<K extends string | number | symbol, T> = { [P in K]: T; }
|
|
773
|
+
function validateObject$1(object, validators, optValidators = {}) {
|
|
774
|
+
const checkField = (fieldName, type, isOptional) => {
|
|
775
|
+
const checkVal = validatorFns$1[type];
|
|
776
|
+
if (typeof checkVal !== 'function')
|
|
777
|
+
throw new Error(`Invalid validator "${type}", expected function`);
|
|
778
|
+
const val = object[fieldName];
|
|
779
|
+
if (isOptional && val === undefined)
|
|
780
|
+
return;
|
|
781
|
+
if (!checkVal(val, object)) {
|
|
782
|
+
throw new Error(`Invalid param ${String(fieldName)}=${val} (${typeof val}), expected ${type}`);
|
|
783
|
+
}
|
|
784
|
+
};
|
|
785
|
+
for (const [fieldName, type] of Object.entries(validators))
|
|
786
|
+
checkField(fieldName, type, false);
|
|
787
|
+
for (const [fieldName, type] of Object.entries(optValidators))
|
|
788
|
+
checkField(fieldName, type, true);
|
|
789
|
+
return object;
|
|
790
|
+
}
|
|
791
|
+
// validate type tests
|
|
792
|
+
// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };
|
|
793
|
+
// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!
|
|
794
|
+
// // Should fail type-check
|
|
795
|
+
// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });
|
|
796
|
+
// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });
|
|
797
|
+
// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });
|
|
798
|
+
// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });
|
|
799
|
+
|
|
800
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
801
|
+
// Utilities for modular arithmetics and finite fields
|
|
802
|
+
// prettier-ignore
|
|
803
|
+
const _0n$7 = BigInt(0), _1n$9 = BigInt(1), _2n$6 = BigInt(2), _3n$2 = BigInt(3);
|
|
804
|
+
// prettier-ignore
|
|
805
|
+
const _4n$1 = BigInt(4), _5n$2 = BigInt(5), _8n$2 = BigInt(8);
|
|
806
|
+
// prettier-ignore
|
|
807
|
+
BigInt(9); BigInt(16);
|
|
808
|
+
// Calculates a modulo b
|
|
809
|
+
function mod$2(a, b) {
|
|
810
|
+
const result = a % b;
|
|
811
|
+
return result >= _0n$7 ? result : b + result;
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* Efficiently raise num to power and do modular division.
|
|
815
|
+
* Unsafe in some contexts: uses ladder, so can expose bigint bits.
|
|
816
|
+
* @example
|
|
817
|
+
* pow(2n, 6n, 11n) // 64n % 11n == 9n
|
|
818
|
+
*/
|
|
819
|
+
// TODO: use field version && remove
|
|
820
|
+
function pow$2(num, power, modulo) {
|
|
821
|
+
if (modulo <= _0n$7 || power < _0n$7)
|
|
822
|
+
throw new Error('Expected power/modulo > 0');
|
|
823
|
+
if (modulo === _1n$9)
|
|
824
|
+
return _0n$7;
|
|
825
|
+
let res = _1n$9;
|
|
826
|
+
while (power > _0n$7) {
|
|
827
|
+
if (power & _1n$9)
|
|
828
|
+
res = (res * num) % modulo;
|
|
829
|
+
num = (num * num) % modulo;
|
|
830
|
+
power >>= _1n$9;
|
|
831
|
+
}
|
|
832
|
+
return res;
|
|
833
|
+
}
|
|
834
|
+
// Does x ^ (2 ^ power) mod p. pow2(30, 4) == 30 ^ (2 ^ 4)
|
|
835
|
+
function pow2$1(x, power, modulo) {
|
|
836
|
+
let res = x;
|
|
837
|
+
while (power-- > _0n$7) {
|
|
838
|
+
res *= res;
|
|
839
|
+
res %= modulo;
|
|
840
|
+
}
|
|
841
|
+
return res;
|
|
842
|
+
}
|
|
843
|
+
// Inverses number over modulo
|
|
844
|
+
function invert$1(number, modulo) {
|
|
845
|
+
if (number === _0n$7 || modulo <= _0n$7) {
|
|
846
|
+
throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`);
|
|
847
|
+
}
|
|
848
|
+
// Euclidean GCD https://brilliant.org/wiki/extended-euclidean-algorithm/
|
|
849
|
+
// Fermat's little theorem "CT-like" version inv(n) = n^(m-2) mod m is 30x slower.
|
|
850
|
+
let a = mod$2(number, modulo);
|
|
851
|
+
let b = modulo;
|
|
852
|
+
// prettier-ignore
|
|
853
|
+
let x = _0n$7, u = _1n$9;
|
|
854
|
+
while (a !== _0n$7) {
|
|
855
|
+
// JIT applies optimization if those two lines follow each other
|
|
856
|
+
const q = b / a;
|
|
857
|
+
const r = b % a;
|
|
858
|
+
const m = x - u * q;
|
|
859
|
+
// prettier-ignore
|
|
860
|
+
b = a, a = r, x = u, u = m;
|
|
861
|
+
}
|
|
862
|
+
const gcd = b;
|
|
863
|
+
if (gcd !== _1n$9)
|
|
864
|
+
throw new Error('invert: does not exist');
|
|
865
|
+
return mod$2(x, modulo);
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* Tonelli-Shanks square root search algorithm.
|
|
869
|
+
* 1. https://eprint.iacr.org/2012/685.pdf (page 12)
|
|
870
|
+
* 2. Square Roots from 1; 24, 51, 10 to Dan Shanks
|
|
871
|
+
* Will start an infinite loop if field order P is not prime.
|
|
872
|
+
* @param P field order
|
|
873
|
+
* @returns function that takes field Fp (created from P) and number n
|
|
874
|
+
*/
|
|
875
|
+
function tonelliShanks$1(P) {
|
|
876
|
+
// Legendre constant: used to calculate Legendre symbol (a | p),
|
|
877
|
+
// which denotes the value of a^((p-1)/2) (mod p).
|
|
878
|
+
// (a | p) ≡ 1 if a is a square (mod p)
|
|
879
|
+
// (a | p) ≡ -1 if a is not a square (mod p)
|
|
880
|
+
// (a | p) ≡ 0 if a ≡ 0 (mod p)
|
|
881
|
+
const legendreC = (P - _1n$9) / _2n$6;
|
|
882
|
+
let Q, S, Z;
|
|
883
|
+
// Step 1: By factoring out powers of 2 from p - 1,
|
|
884
|
+
// find q and s such that p - 1 = q*(2^s) with q odd
|
|
885
|
+
for (Q = P - _1n$9, S = 0; Q % _2n$6 === _0n$7; Q /= _2n$6, S++)
|
|
886
|
+
;
|
|
887
|
+
// Step 2: Select a non-square z such that (z | p) ≡ -1 and set c ≡ zq
|
|
888
|
+
for (Z = _2n$6; Z < P && pow$2(Z, legendreC, P) !== P - _1n$9; Z++)
|
|
889
|
+
;
|
|
890
|
+
// Fast-path
|
|
891
|
+
if (S === 1) {
|
|
892
|
+
const p1div4 = (P + _1n$9) / _4n$1;
|
|
893
|
+
return function tonelliFast(Fp, n) {
|
|
894
|
+
const root = Fp.pow(n, p1div4);
|
|
895
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
896
|
+
throw new Error('Cannot find square root');
|
|
897
|
+
return root;
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
// Slow-path
|
|
901
|
+
const Q1div2 = (Q + _1n$9) / _2n$6;
|
|
902
|
+
return function tonelliSlow(Fp, n) {
|
|
903
|
+
// Step 0: Check that n is indeed a square: (n | p) should not be ≡ -1
|
|
904
|
+
if (Fp.pow(n, legendreC) === Fp.neg(Fp.ONE))
|
|
905
|
+
throw new Error('Cannot find square root');
|
|
906
|
+
let r = S;
|
|
907
|
+
// TODO: will fail at Fp2/etc
|
|
908
|
+
let g = Fp.pow(Fp.mul(Fp.ONE, Z), Q); // will update both x and b
|
|
909
|
+
let x = Fp.pow(n, Q1div2); // first guess at the square root
|
|
910
|
+
let b = Fp.pow(n, Q); // first guess at the fudge factor
|
|
911
|
+
while (!Fp.eql(b, Fp.ONE)) {
|
|
912
|
+
if (Fp.eql(b, Fp.ZERO))
|
|
913
|
+
return Fp.ZERO; // https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm (4. If t = 0, return r = 0)
|
|
914
|
+
// Find m such b^(2^m)==1
|
|
915
|
+
let m = 1;
|
|
916
|
+
for (let t2 = Fp.sqr(b); m < r; m++) {
|
|
917
|
+
if (Fp.eql(t2, Fp.ONE))
|
|
918
|
+
break;
|
|
919
|
+
t2 = Fp.sqr(t2); // t2 *= t2
|
|
920
|
+
}
|
|
921
|
+
// NOTE: r-m-1 can be bigger than 32, need to convert to bigint before shift, otherwise there will be overflow
|
|
922
|
+
const ge = Fp.pow(g, _1n$9 << BigInt(r - m - 1)); // ge = 2^(r-m-1)
|
|
923
|
+
g = Fp.sqr(ge); // g = ge * ge
|
|
924
|
+
x = Fp.mul(x, ge); // x *= ge
|
|
925
|
+
b = Fp.mul(b, g); // b *= g
|
|
926
|
+
r = m;
|
|
927
|
+
}
|
|
928
|
+
return x;
|
|
929
|
+
};
|
|
930
|
+
}
|
|
931
|
+
function FpSqrt$1(P) {
|
|
932
|
+
// NOTE: different algorithms can give different roots, it is up to user to decide which one they want.
|
|
933
|
+
// For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).
|
|
934
|
+
// P ≡ 3 (mod 4)
|
|
935
|
+
// √n = n^((P+1)/4)
|
|
936
|
+
if (P % _4n$1 === _3n$2) {
|
|
937
|
+
// Not all roots possible!
|
|
938
|
+
// const ORDER =
|
|
939
|
+
// 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabn;
|
|
940
|
+
// const NUM = 72057594037927816n;
|
|
941
|
+
const p1div4 = (P + _1n$9) / _4n$1;
|
|
942
|
+
return function sqrt3mod4(Fp, n) {
|
|
943
|
+
const root = Fp.pow(n, p1div4);
|
|
944
|
+
// Throw if root**2 != n
|
|
945
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
946
|
+
throw new Error('Cannot find square root');
|
|
947
|
+
return root;
|
|
948
|
+
};
|
|
949
|
+
}
|
|
950
|
+
// Atkin algorithm for q ≡ 5 (mod 8), https://eprint.iacr.org/2012/685.pdf (page 10)
|
|
951
|
+
if (P % _8n$2 === _5n$2) {
|
|
952
|
+
const c1 = (P - _5n$2) / _8n$2;
|
|
953
|
+
return function sqrt5mod8(Fp, n) {
|
|
954
|
+
const n2 = Fp.mul(n, _2n$6);
|
|
955
|
+
const v = Fp.pow(n2, c1);
|
|
956
|
+
const nv = Fp.mul(n, v);
|
|
957
|
+
const i = Fp.mul(Fp.mul(nv, _2n$6), v);
|
|
958
|
+
const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));
|
|
959
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
960
|
+
throw new Error('Cannot find square root');
|
|
961
|
+
return root;
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
// Other cases: Tonelli-Shanks algorithm
|
|
965
|
+
return tonelliShanks$1(P);
|
|
966
|
+
}
|
|
967
|
+
// Little-endian check for first LE bit (last BE bit);
|
|
968
|
+
const isNegativeLE = (num, modulo) => (mod$2(num, modulo) & _1n$9) === _1n$9;
|
|
969
|
+
// prettier-ignore
|
|
970
|
+
const FIELD_FIELDS$1 = [
|
|
971
|
+
'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',
|
|
972
|
+
'eql', 'add', 'sub', 'mul', 'pow', 'div',
|
|
973
|
+
'addN', 'subN', 'mulN', 'sqrN'
|
|
974
|
+
];
|
|
975
|
+
function validateField$1(field) {
|
|
976
|
+
const initial = {
|
|
977
|
+
ORDER: 'bigint',
|
|
978
|
+
MASK: 'bigint',
|
|
979
|
+
BYTES: 'isSafeInteger',
|
|
980
|
+
BITS: 'isSafeInteger',
|
|
981
|
+
};
|
|
982
|
+
const opts = FIELD_FIELDS$1.reduce((map, val) => {
|
|
983
|
+
map[val] = 'function';
|
|
984
|
+
return map;
|
|
985
|
+
}, initial);
|
|
986
|
+
return validateObject$1(field, opts);
|
|
987
|
+
}
|
|
988
|
+
// Generic field functions
|
|
989
|
+
/**
|
|
990
|
+
* Same as `pow` but for Fp: non-constant-time.
|
|
991
|
+
* Unsafe in some contexts: uses ladder, so can expose bigint bits.
|
|
992
|
+
*/
|
|
993
|
+
function FpPow$1(f, num, power) {
|
|
994
|
+
// Should have same speed as pow for bigints
|
|
995
|
+
// TODO: benchmark!
|
|
996
|
+
if (power < _0n$7)
|
|
997
|
+
throw new Error('Expected power > 0');
|
|
998
|
+
if (power === _0n$7)
|
|
999
|
+
return f.ONE;
|
|
1000
|
+
if (power === _1n$9)
|
|
1001
|
+
return num;
|
|
1002
|
+
let p = f.ONE;
|
|
1003
|
+
let d = num;
|
|
1004
|
+
while (power > _0n$7) {
|
|
1005
|
+
if (power & _1n$9)
|
|
1006
|
+
p = f.mul(p, d);
|
|
1007
|
+
d = f.sqr(d);
|
|
1008
|
+
power >>= _1n$9;
|
|
1009
|
+
}
|
|
1010
|
+
return p;
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Efficiently invert an array of Field elements.
|
|
1014
|
+
* `inv(0)` will return `undefined` here: make sure to throw an error.
|
|
1015
|
+
*/
|
|
1016
|
+
function FpInvertBatch$1(f, nums) {
|
|
1017
|
+
const tmp = new Array(nums.length);
|
|
1018
|
+
// Walk from first to last, multiply them by each other MOD p
|
|
1019
|
+
const lastMultiplied = nums.reduce((acc, num, i) => {
|
|
1020
|
+
if (f.is0(num))
|
|
1021
|
+
return acc;
|
|
1022
|
+
tmp[i] = acc;
|
|
1023
|
+
return f.mul(acc, num);
|
|
1024
|
+
}, f.ONE);
|
|
1025
|
+
// Invert last element
|
|
1026
|
+
const inverted = f.inv(lastMultiplied);
|
|
1027
|
+
// Walk from last to first, multiply them by inverted each other MOD p
|
|
1028
|
+
nums.reduceRight((acc, num, i) => {
|
|
1029
|
+
if (f.is0(num))
|
|
1030
|
+
return acc;
|
|
1031
|
+
tmp[i] = f.mul(acc, tmp[i]);
|
|
1032
|
+
return f.mul(acc, num);
|
|
1033
|
+
}, inverted);
|
|
1034
|
+
return tmp;
|
|
1035
|
+
}
|
|
1036
|
+
// CURVE.n lengths
|
|
1037
|
+
function nLength$1(n, nBitLength) {
|
|
1038
|
+
// Bit size, byte size of CURVE.n
|
|
1039
|
+
const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;
|
|
1040
|
+
const nByteLength = Math.ceil(_nBitLength / 8);
|
|
1041
|
+
return { nBitLength: _nBitLength, nByteLength };
|
|
1042
|
+
}
|
|
1043
|
+
/**
|
|
1044
|
+
* Initializes a finite field over prime. **Non-primes are not supported.**
|
|
1045
|
+
* Do not init in loop: slow. Very fragile: always run a benchmark on a change.
|
|
1046
|
+
* Major performance optimizations:
|
|
1047
|
+
* * a) denormalized operations like mulN instead of mul
|
|
1048
|
+
* * b) same object shape: never add or remove keys
|
|
1049
|
+
* * c) Object.freeze
|
|
1050
|
+
* @param ORDER prime positive bigint
|
|
1051
|
+
* @param bitLen how many bits the field consumes
|
|
1052
|
+
* @param isLE (def: false) if encoding / decoding should be in little-endian
|
|
1053
|
+
* @param redef optional faster redefinitions of sqrt and other methods
|
|
1054
|
+
*/
|
|
1055
|
+
function Field$1(ORDER, bitLen, isLE = false, redef = {}) {
|
|
1056
|
+
if (ORDER <= _0n$7)
|
|
1057
|
+
throw new Error(`Expected Field ORDER > 0, got ${ORDER}`);
|
|
1058
|
+
const { nBitLength: BITS, nByteLength: BYTES } = nLength$1(ORDER, bitLen);
|
|
1059
|
+
if (BYTES > 2048)
|
|
1060
|
+
throw new Error('Field lengths over 2048 bytes are not supported');
|
|
1061
|
+
const sqrtP = FpSqrt$1(ORDER);
|
|
1062
|
+
const f = Object.freeze({
|
|
1063
|
+
ORDER,
|
|
1064
|
+
BITS,
|
|
1065
|
+
BYTES,
|
|
1066
|
+
MASK: bitMask$1(BITS),
|
|
1067
|
+
ZERO: _0n$7,
|
|
1068
|
+
ONE: _1n$9,
|
|
1069
|
+
create: (num) => mod$2(num, ORDER),
|
|
1070
|
+
isValid: (num) => {
|
|
1071
|
+
if (typeof num !== 'bigint')
|
|
1072
|
+
throw new Error(`Invalid field element: expected bigint, got ${typeof num}`);
|
|
1073
|
+
return _0n$7 <= num && num < ORDER; // 0 is valid element, but it's not invertible
|
|
1074
|
+
},
|
|
1075
|
+
is0: (num) => num === _0n$7,
|
|
1076
|
+
isOdd: (num) => (num & _1n$9) === _1n$9,
|
|
1077
|
+
neg: (num) => mod$2(-num, ORDER),
|
|
1078
|
+
eql: (lhs, rhs) => lhs === rhs,
|
|
1079
|
+
sqr: (num) => mod$2(num * num, ORDER),
|
|
1080
|
+
add: (lhs, rhs) => mod$2(lhs + rhs, ORDER),
|
|
1081
|
+
sub: (lhs, rhs) => mod$2(lhs - rhs, ORDER),
|
|
1082
|
+
mul: (lhs, rhs) => mod$2(lhs * rhs, ORDER),
|
|
1083
|
+
pow: (num, power) => FpPow$1(f, num, power),
|
|
1084
|
+
div: (lhs, rhs) => mod$2(lhs * invert$1(rhs, ORDER), ORDER),
|
|
1085
|
+
// Same as above, but doesn't normalize
|
|
1086
|
+
sqrN: (num) => num * num,
|
|
1087
|
+
addN: (lhs, rhs) => lhs + rhs,
|
|
1088
|
+
subN: (lhs, rhs) => lhs - rhs,
|
|
1089
|
+
mulN: (lhs, rhs) => lhs * rhs,
|
|
1090
|
+
inv: (num) => invert$1(num, ORDER),
|
|
1091
|
+
sqrt: redef.sqrt || ((n) => sqrtP(f, n)),
|
|
1092
|
+
invertBatch: (lst) => FpInvertBatch$1(f, lst),
|
|
1093
|
+
// TODO: do we really need constant cmov?
|
|
1094
|
+
// We don't have const-time bigints anyway, so probably will be not very useful
|
|
1095
|
+
cmov: (a, b, c) => (c ? b : a),
|
|
1096
|
+
toBytes: (num) => (isLE ? numberToBytesLE$1(num, BYTES) : numberToBytesBE$1(num, BYTES)),
|
|
1097
|
+
fromBytes: (bytes) => {
|
|
1098
|
+
if (bytes.length !== BYTES)
|
|
1099
|
+
throw new Error(`Fp.fromBytes: expected ${BYTES}, got ${bytes.length}`);
|
|
1100
|
+
return isLE ? bytesToNumberLE$1(bytes) : bytesToNumberBE$1(bytes);
|
|
1101
|
+
},
|
|
1102
|
+
});
|
|
1103
|
+
return Object.freeze(f);
|
|
1104
|
+
}
|
|
1105
|
+
function FpSqrtEven(Fp, elm) {
|
|
1106
|
+
if (!Fp.isOdd)
|
|
1107
|
+
throw new Error(`Field doesn't have isOdd`);
|
|
1108
|
+
const root = Fp.sqrt(elm);
|
|
1109
|
+
return Fp.isOdd(root) ? Fp.neg(root) : root;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
1113
|
+
// Abelian group utilities
|
|
1114
|
+
const _0n$6 = BigInt(0);
|
|
1115
|
+
const _1n$8 = BigInt(1);
|
|
1116
|
+
// Elliptic curve multiplication of Point by scalar. Fragile.
|
|
1117
|
+
// Scalars should always be less than curve order: this should be checked inside of a curve itself.
|
|
1118
|
+
// Creates precomputation tables for fast multiplication:
|
|
1119
|
+
// - private scalar is split by fixed size windows of W bits
|
|
1120
|
+
// - every window point is collected from window's table & added to accumulator
|
|
1121
|
+
// - since windows are different, same point inside tables won't be accessed more than once per calc
|
|
1122
|
+
// - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)
|
|
1123
|
+
// - +1 window is neccessary for wNAF
|
|
1124
|
+
// - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication
|
|
1125
|
+
// TODO: Research returning 2d JS array of windows, instead of a single window. This would allow
|
|
1126
|
+
// windows to be in different memory locations
|
|
1127
|
+
function wNAF$1(c, bits) {
|
|
1128
|
+
const constTimeNegate = (condition, item) => {
|
|
1129
|
+
const neg = item.negate();
|
|
1130
|
+
return condition ? neg : item;
|
|
1131
|
+
};
|
|
1132
|
+
const opts = (W) => {
|
|
1133
|
+
const windows = Math.ceil(bits / W) + 1; // +1, because
|
|
1134
|
+
const windowSize = 2 ** (W - 1); // -1 because we skip zero
|
|
1135
|
+
return { windows, windowSize };
|
|
1136
|
+
};
|
|
1137
|
+
return {
|
|
1138
|
+
constTimeNegate,
|
|
1139
|
+
// non-const time multiplication ladder
|
|
1140
|
+
unsafeLadder(elm, n) {
|
|
1141
|
+
let p = c.ZERO;
|
|
1142
|
+
let d = elm;
|
|
1143
|
+
while (n > _0n$6) {
|
|
1144
|
+
if (n & _1n$8)
|
|
1145
|
+
p = p.add(d);
|
|
1146
|
+
d = d.double();
|
|
1147
|
+
n >>= _1n$8;
|
|
1148
|
+
}
|
|
1149
|
+
return p;
|
|
1150
|
+
},
|
|
1151
|
+
/**
|
|
1152
|
+
* Creates a wNAF precomputation window. Used for caching.
|
|
1153
|
+
* Default window size is set by `utils.precompute()` and is equal to 8.
|
|
1154
|
+
* Number of precomputed points depends on the curve size:
|
|
1155
|
+
* 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:
|
|
1156
|
+
* - 𝑊 is the window size
|
|
1157
|
+
* - 𝑛 is the bitlength of the curve order.
|
|
1158
|
+
* For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.
|
|
1159
|
+
* @returns precomputed point tables flattened to a single array
|
|
1160
|
+
*/
|
|
1161
|
+
precomputeWindow(elm, W) {
|
|
1162
|
+
const { windows, windowSize } = opts(W);
|
|
1163
|
+
const points = [];
|
|
1164
|
+
let p = elm;
|
|
1165
|
+
let base = p;
|
|
1166
|
+
for (let window = 0; window < windows; window++) {
|
|
1167
|
+
base = p;
|
|
1168
|
+
points.push(base);
|
|
1169
|
+
// =1, because we skip zero
|
|
1170
|
+
for (let i = 1; i < windowSize; i++) {
|
|
1171
|
+
base = base.add(p);
|
|
1172
|
+
points.push(base);
|
|
1173
|
+
}
|
|
1174
|
+
p = base.double();
|
|
1175
|
+
}
|
|
1176
|
+
return points;
|
|
1177
|
+
},
|
|
1178
|
+
/**
|
|
1179
|
+
* Implements ec multiplication using precomputed tables and w-ary non-adjacent form.
|
|
1180
|
+
* @param W window size
|
|
1181
|
+
* @param precomputes precomputed tables
|
|
1182
|
+
* @param n scalar (we don't check here, but should be less than curve order)
|
|
1183
|
+
* @returns real and fake (for const-time) points
|
|
1184
|
+
*/
|
|
1185
|
+
wNAF(W, precomputes, n) {
|
|
1186
|
+
// TODO: maybe check that scalar is less than group order? wNAF behavious is undefined otherwise
|
|
1187
|
+
// But need to carefully remove other checks before wNAF. ORDER == bits here
|
|
1188
|
+
const { windows, windowSize } = opts(W);
|
|
1189
|
+
let p = c.ZERO;
|
|
1190
|
+
let f = c.BASE;
|
|
1191
|
+
const mask = BigInt(2 ** W - 1); // Create mask with W ones: 0b1111 for W=4 etc.
|
|
1192
|
+
const maxNumber = 2 ** W;
|
|
1193
|
+
const shiftBy = BigInt(W);
|
|
1194
|
+
for (let window = 0; window < windows; window++) {
|
|
1195
|
+
const offset = window * windowSize;
|
|
1196
|
+
// Extract W bits.
|
|
1197
|
+
let wbits = Number(n & mask);
|
|
1198
|
+
// Shift number by W bits.
|
|
1199
|
+
n >>= shiftBy;
|
|
1200
|
+
// If the bits are bigger than max size, we'll split those.
|
|
1201
|
+
// +224 => 256 - 32
|
|
1202
|
+
if (wbits > windowSize) {
|
|
1203
|
+
wbits -= maxNumber;
|
|
1204
|
+
n += _1n$8;
|
|
1205
|
+
}
|
|
1206
|
+
// This code was first written with assumption that 'f' and 'p' will never be infinity point:
|
|
1207
|
+
// since each addition is multiplied by 2 ** W, it cannot cancel each other. However,
|
|
1208
|
+
// there is negate now: it is possible that negated element from low value
|
|
1209
|
+
// would be the same as high element, which will create carry into next window.
|
|
1210
|
+
// It's not obvious how this can fail, but still worth investigating later.
|
|
1211
|
+
// Check if we're onto Zero point.
|
|
1212
|
+
// Add random point inside current window to f.
|
|
1213
|
+
const offset1 = offset;
|
|
1214
|
+
const offset2 = offset + Math.abs(wbits) - 1; // -1 because we skip zero
|
|
1215
|
+
const cond1 = window % 2 !== 0;
|
|
1216
|
+
const cond2 = wbits < 0;
|
|
1217
|
+
if (wbits === 0) {
|
|
1218
|
+
// The most important part for const-time getPublicKey
|
|
1219
|
+
f = f.add(constTimeNegate(cond1, precomputes[offset1]));
|
|
1220
|
+
}
|
|
1221
|
+
else {
|
|
1222
|
+
p = p.add(constTimeNegate(cond2, precomputes[offset2]));
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
// JIT-compiler should not eliminate f here, since it will later be used in normalizeZ()
|
|
1226
|
+
// Even if the variable is still unused, there are some checks which will
|
|
1227
|
+
// throw an exception, so compiler needs to prove they won't happen, which is hard.
|
|
1228
|
+
// At this point there is a way to F be infinity-point even if p is not,
|
|
1229
|
+
// which makes it less const-time: around 1 bigint multiply.
|
|
1230
|
+
return { p, f };
|
|
1231
|
+
},
|
|
1232
|
+
wNAFCached(P, precomputesMap, n, transform) {
|
|
1233
|
+
// @ts-ignore
|
|
1234
|
+
const W = P._WINDOW_SIZE || 1;
|
|
1235
|
+
// Calculate precomputes on a first run, reuse them after
|
|
1236
|
+
let comp = precomputesMap.get(P);
|
|
1237
|
+
if (!comp) {
|
|
1238
|
+
comp = this.precomputeWindow(P, W);
|
|
1239
|
+
if (W !== 1) {
|
|
1240
|
+
precomputesMap.set(P, transform(comp));
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
return this.wNAF(W, comp, n);
|
|
1244
|
+
},
|
|
1245
|
+
};
|
|
1246
|
+
}
|
|
1247
|
+
function validateBasic$1(curve) {
|
|
1248
|
+
validateField$1(curve.Fp);
|
|
1249
|
+
validateObject$1(curve, {
|
|
1250
|
+
n: 'bigint',
|
|
1251
|
+
h: 'bigint',
|
|
1252
|
+
Gx: 'field',
|
|
1253
|
+
Gy: 'field',
|
|
1254
|
+
}, {
|
|
1255
|
+
nBitLength: 'isSafeInteger',
|
|
1256
|
+
nByteLength: 'isSafeInteger',
|
|
1257
|
+
});
|
|
1258
|
+
// Set defaults
|
|
1259
|
+
return Object.freeze({
|
|
1260
|
+
...nLength$1(curve.n, curve.nBitLength),
|
|
1261
|
+
...curve,
|
|
1262
|
+
...{ p: curve.Fp.ORDER },
|
|
1263
|
+
});
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
1267
|
+
// Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y²
|
|
1268
|
+
// Be friendly to bad ECMAScript parsers by not using bigint literals
|
|
1269
|
+
// prettier-ignore
|
|
1270
|
+
const _0n$5 = BigInt(0), _1n$7 = BigInt(1), _2n$5 = BigInt(2), _8n$1 = BigInt(8);
|
|
1271
|
+
// verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex:
|
|
1272
|
+
const VERIFY_DEFAULT = { zip215: true };
|
|
1273
|
+
function validateOpts$1(curve) {
|
|
1274
|
+
const opts = validateBasic$1(curve);
|
|
1275
|
+
validateObject$1(curve, {
|
|
1276
|
+
hash: 'function',
|
|
1277
|
+
a: 'bigint',
|
|
1278
|
+
d: 'bigint',
|
|
1279
|
+
randomBytes: 'function',
|
|
1280
|
+
}, {
|
|
1281
|
+
adjustScalarBytes: 'function',
|
|
1282
|
+
domain: 'function',
|
|
1283
|
+
uvRatio: 'function',
|
|
1284
|
+
mapToCurve: 'function',
|
|
1285
|
+
});
|
|
1286
|
+
// Set defaults
|
|
1287
|
+
return Object.freeze({ ...opts });
|
|
1288
|
+
}
|
|
1289
|
+
// It is not generic twisted curve for now, but ed25519/ed448 generic implementation
|
|
1290
|
+
function twistedEdwards(curveDef) {
|
|
1291
|
+
const CURVE = validateOpts$1(curveDef);
|
|
1292
|
+
const { Fp, n: CURVE_ORDER, prehash: prehash, hash: cHash, randomBytes, nByteLength, h: cofactor, } = CURVE;
|
|
1293
|
+
const MASK = _2n$5 << (BigInt(nByteLength * 8) - _1n$7);
|
|
1294
|
+
const modP = Fp.create; // Function overrides
|
|
1295
|
+
// sqrt(u/v)
|
|
1296
|
+
const uvRatio = CURVE.uvRatio ||
|
|
1297
|
+
((u, v) => {
|
|
1298
|
+
try {
|
|
1299
|
+
return { isValid: true, value: Fp.sqrt(u * Fp.inv(v)) };
|
|
1300
|
+
}
|
|
1301
|
+
catch (e) {
|
|
1302
|
+
return { isValid: false, value: _0n$5 };
|
|
1303
|
+
}
|
|
1304
|
+
});
|
|
1305
|
+
const adjustScalarBytes = CURVE.adjustScalarBytes || ((bytes) => bytes); // NOOP
|
|
1306
|
+
const domain = CURVE.domain ||
|
|
1307
|
+
((data, ctx, phflag) => {
|
|
1308
|
+
if (ctx.length || phflag)
|
|
1309
|
+
throw new Error('Contexts/pre-hash are not supported');
|
|
1310
|
+
return data;
|
|
1311
|
+
}); // NOOP
|
|
1312
|
+
const inBig = (n) => typeof n === 'bigint' && _0n$5 < n; // n in [1..]
|
|
1313
|
+
const inRange = (n, max) => inBig(n) && inBig(max) && n < max; // n in [1..max-1]
|
|
1314
|
+
const in0MaskRange = (n) => n === _0n$5 || inRange(n, MASK); // n in [0..MASK-1]
|
|
1315
|
+
function assertInRange(n, max) {
|
|
1316
|
+
// n in [1..max-1]
|
|
1317
|
+
if (inRange(n, max))
|
|
1318
|
+
return n;
|
|
1319
|
+
throw new Error(`Expected valid scalar < ${max}, got ${typeof n} ${n}`);
|
|
1320
|
+
}
|
|
1321
|
+
function assertGE0(n) {
|
|
1322
|
+
// n in [0..CURVE_ORDER-1]
|
|
1323
|
+
return n === _0n$5 ? n : assertInRange(n, CURVE_ORDER); // GE = prime subgroup, not full group
|
|
1324
|
+
}
|
|
1325
|
+
const pointPrecomputes = new Map();
|
|
1326
|
+
function isPoint(other) {
|
|
1327
|
+
if (!(other instanceof Point))
|
|
1328
|
+
throw new Error('ExtendedPoint expected');
|
|
1329
|
+
}
|
|
1330
|
+
// Extended Point works in extended coordinates: (x, y, z, t) ∋ (x=x/z, y=y/z, t=xy).
|
|
1331
|
+
// https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates
|
|
1332
|
+
class Point {
|
|
1333
|
+
constructor(ex, ey, ez, et) {
|
|
1334
|
+
this.ex = ex;
|
|
1335
|
+
this.ey = ey;
|
|
1336
|
+
this.ez = ez;
|
|
1337
|
+
this.et = et;
|
|
1338
|
+
if (!in0MaskRange(ex))
|
|
1339
|
+
throw new Error('x required');
|
|
1340
|
+
if (!in0MaskRange(ey))
|
|
1341
|
+
throw new Error('y required');
|
|
1342
|
+
if (!in0MaskRange(ez))
|
|
1343
|
+
throw new Error('z required');
|
|
1344
|
+
if (!in0MaskRange(et))
|
|
1345
|
+
throw new Error('t required');
|
|
1346
|
+
}
|
|
1347
|
+
get x() {
|
|
1348
|
+
return this.toAffine().x;
|
|
1349
|
+
}
|
|
1350
|
+
get y() {
|
|
1351
|
+
return this.toAffine().y;
|
|
1352
|
+
}
|
|
1353
|
+
static fromAffine(p) {
|
|
1354
|
+
if (p instanceof Point)
|
|
1355
|
+
throw new Error('extended point not allowed');
|
|
1356
|
+
const { x, y } = p || {};
|
|
1357
|
+
if (!in0MaskRange(x) || !in0MaskRange(y))
|
|
1358
|
+
throw new Error('invalid affine point');
|
|
1359
|
+
return new Point(x, y, _1n$7, modP(x * y));
|
|
1360
|
+
}
|
|
1361
|
+
static normalizeZ(points) {
|
|
1362
|
+
const toInv = Fp.invertBatch(points.map((p) => p.ez));
|
|
1363
|
+
return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);
|
|
1364
|
+
}
|
|
1365
|
+
// "Private method", don't use it directly
|
|
1366
|
+
_setWindowSize(windowSize) {
|
|
1367
|
+
this._WINDOW_SIZE = windowSize;
|
|
1368
|
+
pointPrecomputes.delete(this);
|
|
1369
|
+
}
|
|
1370
|
+
// Not required for fromHex(), which always creates valid points.
|
|
1371
|
+
// Could be useful for fromAffine().
|
|
1372
|
+
assertValidity() {
|
|
1373
|
+
const { a, d } = CURVE;
|
|
1374
|
+
if (this.is0())
|
|
1375
|
+
throw new Error('bad point: ZERO'); // TODO: optimize, with vars below?
|
|
1376
|
+
// Equation in affine coordinates: ax² + y² = 1 + dx²y²
|
|
1377
|
+
// Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²
|
|
1378
|
+
const { ex: X, ey: Y, ez: Z, et: T } = this;
|
|
1379
|
+
const X2 = modP(X * X); // X²
|
|
1380
|
+
const Y2 = modP(Y * Y); // Y²
|
|
1381
|
+
const Z2 = modP(Z * Z); // Z²
|
|
1382
|
+
const Z4 = modP(Z2 * Z2); // Z⁴
|
|
1383
|
+
const aX2 = modP(X2 * a); // aX²
|
|
1384
|
+
const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z²
|
|
1385
|
+
const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y²
|
|
1386
|
+
if (left !== right)
|
|
1387
|
+
throw new Error('bad point: equation left != right (1)');
|
|
1388
|
+
// In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T
|
|
1389
|
+
const XY = modP(X * Y);
|
|
1390
|
+
const ZT = modP(Z * T);
|
|
1391
|
+
if (XY !== ZT)
|
|
1392
|
+
throw new Error('bad point: equation left != right (2)');
|
|
1393
|
+
}
|
|
1394
|
+
// Compare one point to another.
|
|
1395
|
+
equals(other) {
|
|
1396
|
+
isPoint(other);
|
|
1397
|
+
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
1398
|
+
const { ex: X2, ey: Y2, ez: Z2 } = other;
|
|
1399
|
+
const X1Z2 = modP(X1 * Z2);
|
|
1400
|
+
const X2Z1 = modP(X2 * Z1);
|
|
1401
|
+
const Y1Z2 = modP(Y1 * Z2);
|
|
1402
|
+
const Y2Z1 = modP(Y2 * Z1);
|
|
1403
|
+
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
1404
|
+
}
|
|
1405
|
+
is0() {
|
|
1406
|
+
return this.equals(Point.ZERO);
|
|
1407
|
+
}
|
|
1408
|
+
negate() {
|
|
1409
|
+
// Flips point sign to a negative one (-x, y in affine coords)
|
|
1410
|
+
return new Point(modP(-this.ex), this.ey, this.ez, modP(-this.et));
|
|
1411
|
+
}
|
|
1412
|
+
// Fast algo for doubling Extended Point.
|
|
1413
|
+
// https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd
|
|
1414
|
+
// Cost: 4M + 4S + 1*a + 6add + 1*2.
|
|
1415
|
+
double() {
|
|
1416
|
+
const { a } = CURVE;
|
|
1417
|
+
const { ex: X1, ey: Y1, ez: Z1 } = this;
|
|
1418
|
+
const A = modP(X1 * X1); // A = X12
|
|
1419
|
+
const B = modP(Y1 * Y1); // B = Y12
|
|
1420
|
+
const C = modP(_2n$5 * modP(Z1 * Z1)); // C = 2*Z12
|
|
1421
|
+
const D = modP(a * A); // D = a*A
|
|
1422
|
+
const x1y1 = X1 + Y1;
|
|
1423
|
+
const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B
|
|
1424
|
+
const G = D + B; // G = D+B
|
|
1425
|
+
const F = G - C; // F = G-C
|
|
1426
|
+
const H = D - B; // H = D-B
|
|
1427
|
+
const X3 = modP(E * F); // X3 = E*F
|
|
1428
|
+
const Y3 = modP(G * H); // Y3 = G*H
|
|
1429
|
+
const T3 = modP(E * H); // T3 = E*H
|
|
1430
|
+
const Z3 = modP(F * G); // Z3 = F*G
|
|
1431
|
+
return new Point(X3, Y3, Z3, T3);
|
|
1432
|
+
}
|
|
1433
|
+
// Fast algo for adding 2 Extended Points.
|
|
1434
|
+
// https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd
|
|
1435
|
+
// Cost: 9M + 1*a + 1*d + 7add.
|
|
1436
|
+
add(other) {
|
|
1437
|
+
isPoint(other);
|
|
1438
|
+
const { a, d } = CURVE;
|
|
1439
|
+
const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
|
|
1440
|
+
const { ex: X2, ey: Y2, ez: Z2, et: T2 } = other;
|
|
1441
|
+
// Faster algo for adding 2 Extended Points when curve's a=-1.
|
|
1442
|
+
// http://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-4
|
|
1443
|
+
// Cost: 8M + 8add + 2*2.
|
|
1444
|
+
// Note: It does not check whether the `other` point is valid.
|
|
1445
|
+
if (a === BigInt(-1)) {
|
|
1446
|
+
const A = modP((Y1 - X1) * (Y2 + X2));
|
|
1447
|
+
const B = modP((Y1 + X1) * (Y2 - X2));
|
|
1448
|
+
const F = modP(B - A);
|
|
1449
|
+
if (F === _0n$5)
|
|
1450
|
+
return this.double(); // Same point. Tests say it doesn't affect timing
|
|
1451
|
+
const C = modP(Z1 * _2n$5 * T2);
|
|
1452
|
+
const D = modP(T1 * _2n$5 * Z2);
|
|
1453
|
+
const E = D + C;
|
|
1454
|
+
const G = B + A;
|
|
1455
|
+
const H = D - C;
|
|
1456
|
+
const X3 = modP(E * F);
|
|
1457
|
+
const Y3 = modP(G * H);
|
|
1458
|
+
const T3 = modP(E * H);
|
|
1459
|
+
const Z3 = modP(F * G);
|
|
1460
|
+
return new Point(X3, Y3, Z3, T3);
|
|
1461
|
+
}
|
|
1462
|
+
const A = modP(X1 * X2); // A = X1*X2
|
|
1463
|
+
const B = modP(Y1 * Y2); // B = Y1*Y2
|
|
1464
|
+
const C = modP(T1 * d * T2); // C = T1*d*T2
|
|
1465
|
+
const D = modP(Z1 * Z2); // D = Z1*Z2
|
|
1466
|
+
const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B
|
|
1467
|
+
const F = D - C; // F = D-C
|
|
1468
|
+
const G = D + C; // G = D+C
|
|
1469
|
+
const H = modP(B - a * A); // H = B-a*A
|
|
1470
|
+
const X3 = modP(E * F); // X3 = E*F
|
|
1471
|
+
const Y3 = modP(G * H); // Y3 = G*H
|
|
1472
|
+
const T3 = modP(E * H); // T3 = E*H
|
|
1473
|
+
const Z3 = modP(F * G); // Z3 = F*G
|
|
1474
|
+
return new Point(X3, Y3, Z3, T3);
|
|
1475
|
+
}
|
|
1476
|
+
subtract(other) {
|
|
1477
|
+
return this.add(other.negate());
|
|
1478
|
+
}
|
|
1479
|
+
wNAF(n) {
|
|
1480
|
+
return wnaf.wNAFCached(this, pointPrecomputes, n, Point.normalizeZ);
|
|
1481
|
+
}
|
|
1482
|
+
// Constant-time multiplication.
|
|
1483
|
+
multiply(scalar) {
|
|
1484
|
+
const { p, f } = this.wNAF(assertInRange(scalar, CURVE_ORDER));
|
|
1485
|
+
return Point.normalizeZ([p, f])[0];
|
|
1486
|
+
}
|
|
1487
|
+
// Non-constant-time multiplication. Uses double-and-add algorithm.
|
|
1488
|
+
// It's faster, but should only be used when you don't care about
|
|
1489
|
+
// an exposed private key e.g. sig verification.
|
|
1490
|
+
// Does NOT allow scalars higher than CURVE.n.
|
|
1491
|
+
multiplyUnsafe(scalar) {
|
|
1492
|
+
let n = assertGE0(scalar); // 0 <= scalar < CURVE.n
|
|
1493
|
+
if (n === _0n$5)
|
|
1494
|
+
return I;
|
|
1495
|
+
if (this.equals(I) || n === _1n$7)
|
|
1496
|
+
return this;
|
|
1497
|
+
if (this.equals(G))
|
|
1498
|
+
return this.wNAF(n).p;
|
|
1499
|
+
return wnaf.unsafeLadder(this, n);
|
|
1500
|
+
}
|
|
1501
|
+
// Checks if point is of small order.
|
|
1502
|
+
// If you add something to small order point, you will have "dirty"
|
|
1503
|
+
// point with torsion component.
|
|
1504
|
+
// Multiplies point by cofactor and checks if the result is 0.
|
|
1505
|
+
isSmallOrder() {
|
|
1506
|
+
return this.multiplyUnsafe(cofactor).is0();
|
|
1507
|
+
}
|
|
1508
|
+
// Multiplies point by curve order and checks if the result is 0.
|
|
1509
|
+
// Returns `false` is the point is dirty.
|
|
1510
|
+
isTorsionFree() {
|
|
1511
|
+
return wnaf.unsafeLadder(this, CURVE_ORDER).is0();
|
|
1512
|
+
}
|
|
1513
|
+
// Converts Extended point to default (x, y) coordinates.
|
|
1514
|
+
// Can accept precomputed Z^-1 - for example, from invertBatch.
|
|
1515
|
+
toAffine(iz) {
|
|
1516
|
+
const { ex: x, ey: y, ez: z } = this;
|
|
1517
|
+
const is0 = this.is0();
|
|
1518
|
+
if (iz == null)
|
|
1519
|
+
iz = is0 ? _8n$1 : Fp.inv(z); // 8 was chosen arbitrarily
|
|
1520
|
+
const ax = modP(x * iz);
|
|
1521
|
+
const ay = modP(y * iz);
|
|
1522
|
+
const zz = modP(z * iz);
|
|
1523
|
+
if (is0)
|
|
1524
|
+
return { x: _0n$5, y: _1n$7 };
|
|
1525
|
+
if (zz !== _1n$7)
|
|
1526
|
+
throw new Error('invZ was invalid');
|
|
1527
|
+
return { x: ax, y: ay };
|
|
1528
|
+
}
|
|
1529
|
+
clearCofactor() {
|
|
1530
|
+
const { h: cofactor } = CURVE;
|
|
1531
|
+
if (cofactor === _1n$7)
|
|
1532
|
+
return this;
|
|
1533
|
+
return this.multiplyUnsafe(cofactor);
|
|
1534
|
+
}
|
|
1535
|
+
// Converts hash string or Uint8Array to Point.
|
|
1536
|
+
// Uses algo from RFC8032 5.1.3.
|
|
1537
|
+
static fromHex(hex, zip215 = false) {
|
|
1538
|
+
const { d, a } = CURVE;
|
|
1539
|
+
const len = Fp.BYTES;
|
|
1540
|
+
hex = ensureBytes$1('pointHex', hex, len); // copy hex to a new array
|
|
1541
|
+
const normed = hex.slice(); // copy again, we'll manipulate it
|
|
1542
|
+
const lastByte = hex[len - 1]; // select last byte
|
|
1543
|
+
normed[len - 1] = lastByte & ~0x80; // clear last bit
|
|
1544
|
+
const y = bytesToNumberLE$1(normed);
|
|
1545
|
+
if (y === _0n$5) ;
|
|
1546
|
+
else {
|
|
1547
|
+
// RFC8032 prohibits >= p, but ZIP215 doesn't
|
|
1548
|
+
if (zip215)
|
|
1549
|
+
assertInRange(y, MASK); // zip215=true [1..P-1] (2^255-19-1 for ed25519)
|
|
1550
|
+
else
|
|
1551
|
+
assertInRange(y, Fp.ORDER); // zip215=false [1..MASK-1] (2^256-1 for ed25519)
|
|
1552
|
+
}
|
|
1553
|
+
// Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case:
|
|
1554
|
+
// ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a)
|
|
1555
|
+
const y2 = modP(y * y); // denominator is always non-0 mod p.
|
|
1556
|
+
const u = modP(y2 - _1n$7); // u = y² - 1
|
|
1557
|
+
const v = modP(d * y2 - a); // v = d y² + 1.
|
|
1558
|
+
let { isValid, value: x } = uvRatio(u, v); // √(u/v)
|
|
1559
|
+
if (!isValid)
|
|
1560
|
+
throw new Error('Point.fromHex: invalid y coordinate');
|
|
1561
|
+
const isXOdd = (x & _1n$7) === _1n$7; // There are 2 square roots. Use x_0 bit to select proper
|
|
1562
|
+
const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit
|
|
1563
|
+
if (!zip215 && x === _0n$5 && isLastByteOdd)
|
|
1564
|
+
// if x=0 and x_0 = 1, fail
|
|
1565
|
+
throw new Error('Point.fromHex: x=0 and x_0=1');
|
|
1566
|
+
if (isLastByteOdd !== isXOdd)
|
|
1567
|
+
x = modP(-x); // if x_0 != x mod 2, set x = p-x
|
|
1568
|
+
return Point.fromAffine({ x, y });
|
|
1569
|
+
}
|
|
1570
|
+
static fromPrivateKey(privKey) {
|
|
1571
|
+
return getExtendedPublicKey(privKey).point;
|
|
1572
|
+
}
|
|
1573
|
+
toRawBytes() {
|
|
1574
|
+
const { x, y } = this.toAffine();
|
|
1575
|
+
const bytes = numberToBytesLE$1(y, Fp.BYTES); // each y has 2 x values (x, -y)
|
|
1576
|
+
bytes[bytes.length - 1] |= x & _1n$7 ? 0x80 : 0; // when compressing, it's enough to store y
|
|
1577
|
+
return bytes; // and use the last byte to encode sign of x
|
|
1578
|
+
}
|
|
1579
|
+
toHex() {
|
|
1580
|
+
return bytesToHex$3(this.toRawBytes()); // Same as toRawBytes, but returns string.
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
Point.BASE = new Point(CURVE.Gx, CURVE.Gy, _1n$7, modP(CURVE.Gx * CURVE.Gy));
|
|
1584
|
+
Point.ZERO = new Point(_0n$5, _1n$7, _1n$7, _0n$5); // 0, 1, 1, 0
|
|
1585
|
+
const { BASE: G, ZERO: I } = Point;
|
|
1586
|
+
const wnaf = wNAF$1(Point, nByteLength * 8);
|
|
1587
|
+
function modN(a) {
|
|
1588
|
+
return mod$2(a, CURVE_ORDER);
|
|
1589
|
+
}
|
|
1590
|
+
// Little-endian SHA512 with modulo n
|
|
1591
|
+
function modN_LE(hash) {
|
|
1592
|
+
return modN(bytesToNumberLE$1(hash));
|
|
1593
|
+
}
|
|
1594
|
+
/** Convenience method that creates public key and other stuff. RFC8032 5.1.5 */
|
|
1595
|
+
function getExtendedPublicKey(key) {
|
|
1596
|
+
const len = nByteLength;
|
|
1597
|
+
key = ensureBytes$1('private key', key, len);
|
|
1598
|
+
// Hash private key with curve's hash function to produce uniformingly random input
|
|
1599
|
+
// Check byte lengths: ensure(64, h(ensure(32, key)))
|
|
1600
|
+
const hashed = ensureBytes$1('hashed private key', cHash(key), 2 * len);
|
|
1601
|
+
const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE
|
|
1602
|
+
const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6)
|
|
1603
|
+
const scalar = modN_LE(head); // The actual private scalar
|
|
1604
|
+
const point = G.multiply(scalar); // Point on Edwards curve aka public key
|
|
1605
|
+
const pointBytes = point.toRawBytes(); // Uint8Array representation
|
|
1606
|
+
return { head, prefix, scalar, point, pointBytes };
|
|
1607
|
+
}
|
|
1608
|
+
// Calculates EdDSA pub key. RFC8032 5.1.5. Privkey is hashed. Use first half with 3 bits cleared
|
|
1609
|
+
function getPublicKey(privKey) {
|
|
1610
|
+
return getExtendedPublicKey(privKey).pointBytes;
|
|
1611
|
+
}
|
|
1612
|
+
// int('LE', SHA512(dom2(F, C) || msgs)) mod N
|
|
1613
|
+
function hashDomainToScalar(context = new Uint8Array(), ...msgs) {
|
|
1614
|
+
const msg = concatBytes$2(...msgs);
|
|
1615
|
+
return modN_LE(cHash(domain(msg, ensureBytes$1('context', context), !!prehash)));
|
|
1616
|
+
}
|
|
1617
|
+
/** Signs message with privateKey. RFC8032 5.1.6 */
|
|
1618
|
+
function sign(msg, privKey, options = {}) {
|
|
1619
|
+
msg = ensureBytes$1('message', msg);
|
|
1620
|
+
if (prehash)
|
|
1621
|
+
msg = prehash(msg); // for ed25519ph etc.
|
|
1622
|
+
const { prefix, scalar, pointBytes } = getExtendedPublicKey(privKey);
|
|
1623
|
+
const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M)
|
|
1624
|
+
const R = G.multiply(r).toRawBytes(); // R = rG
|
|
1625
|
+
const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M)
|
|
1626
|
+
const s = modN(r + k * scalar); // S = (r + k * s) mod L
|
|
1627
|
+
assertGE0(s); // 0 <= s < l
|
|
1628
|
+
const res = concatBytes$2(R, numberToBytesLE$1(s, Fp.BYTES));
|
|
1629
|
+
return ensureBytes$1('result', res, nByteLength * 2); // 64-byte signature
|
|
1630
|
+
}
|
|
1631
|
+
const verifyOpts = VERIFY_DEFAULT;
|
|
1632
|
+
function verify(sig, msg, publicKey, options = verifyOpts) {
|
|
1633
|
+
const { context, zip215 } = options;
|
|
1634
|
+
const len = Fp.BYTES; // Verifies EdDSA signature against message and public key. RFC8032 5.1.7.
|
|
1635
|
+
sig = ensureBytes$1('signature', sig, 2 * len); // An extended group equation is checked.
|
|
1636
|
+
msg = ensureBytes$1('message', msg);
|
|
1637
|
+
if (prehash)
|
|
1638
|
+
msg = prehash(msg); // for ed25519ph, etc
|
|
1639
|
+
const s = bytesToNumberLE$1(sig.slice(len, 2 * len));
|
|
1640
|
+
// zip215: true is good for consensus-critical apps and allows points < 2^256
|
|
1641
|
+
// zip215: false follows RFC8032 / NIST186-5 and restricts points to CURVE.p
|
|
1642
|
+
let A, R, SB;
|
|
1643
|
+
try {
|
|
1644
|
+
A = Point.fromHex(publicKey, zip215);
|
|
1645
|
+
R = Point.fromHex(sig.slice(0, len), zip215);
|
|
1646
|
+
SB = G.multiplyUnsafe(s); // 0 <= s < l is done inside
|
|
1647
|
+
}
|
|
1648
|
+
catch (error) {
|
|
1649
|
+
return false;
|
|
1650
|
+
}
|
|
1651
|
+
if (!zip215 && A.isSmallOrder())
|
|
1652
|
+
return false;
|
|
1653
|
+
const k = hashDomainToScalar(context, R.toRawBytes(), A.toRawBytes(), msg);
|
|
1654
|
+
const RkA = R.add(A.multiplyUnsafe(k));
|
|
1655
|
+
// [8][S]B = [8]R + [8][k]A'
|
|
1656
|
+
return RkA.subtract(SB).clearCofactor().equals(Point.ZERO);
|
|
1657
|
+
}
|
|
1658
|
+
G._setWindowSize(8); // Enable precomputes. Slows down first publicKey computation by 20ms.
|
|
1659
|
+
const utils = {
|
|
1660
|
+
getExtendedPublicKey,
|
|
1661
|
+
// ed25519 private keys are uniform 32b. No need to check for modulo bias, like in secp256k1.
|
|
1662
|
+
randomPrivateKey: () => randomBytes(Fp.BYTES),
|
|
1663
|
+
/**
|
|
1664
|
+
* We're doing scalar multiplication (used in getPublicKey etc) with precomputed BASE_POINT
|
|
1665
|
+
* values. This slows down first getPublicKey() by milliseconds (see Speed section),
|
|
1666
|
+
* but allows to speed-up subsequent getPublicKey() calls up to 20x.
|
|
1667
|
+
* @param windowSize 2, 4, 8, 16
|
|
1668
|
+
*/
|
|
1669
|
+
precompute(windowSize = 8, point = Point.BASE) {
|
|
1670
|
+
point._setWindowSize(windowSize);
|
|
1671
|
+
point.multiply(BigInt(3));
|
|
1672
|
+
return point;
|
|
1673
|
+
},
|
|
1674
|
+
};
|
|
1675
|
+
return {
|
|
1676
|
+
CURVE,
|
|
1677
|
+
getPublicKey,
|
|
1678
|
+
sign,
|
|
1679
|
+
verify,
|
|
1680
|
+
ExtendedPoint: Point,
|
|
1681
|
+
utils,
|
|
1682
|
+
};
|
|
1683
|
+
}
|
|
1684
|
+
|
|
1685
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
1686
|
+
/**
|
|
1687
|
+
* ed25519 Twisted Edwards curve with following addons:
|
|
1688
|
+
* - X25519 ECDH
|
|
1689
|
+
* - Ristretto cofactor elimination
|
|
1690
|
+
* - Elligator hash-to-group / point indistinguishability
|
|
1691
|
+
*/
|
|
1692
|
+
const ED25519_P = BigInt('57896044618658097711785492504343953926634992332820282019728792003956564819949');
|
|
1693
|
+
// √(-1) aka √(a) aka 2^((p-1)/4)
|
|
1694
|
+
const ED25519_SQRT_M1 = BigInt('19681161376707505956807079304988542015446066515923890162744021073123829784752');
|
|
1695
|
+
// prettier-ignore
|
|
1696
|
+
BigInt(0); const _1n$6 = BigInt(1), _2n$4 = BigInt(2), _5n$1 = BigInt(5);
|
|
1697
|
+
// prettier-ignore
|
|
1698
|
+
const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);
|
|
1699
|
+
function ed25519_pow_2_252_3(x) {
|
|
1700
|
+
const P = ED25519_P;
|
|
1701
|
+
const x2 = (x * x) % P;
|
|
1702
|
+
const b2 = (x2 * x) % P; // x^3, 11
|
|
1703
|
+
const b4 = (pow2$1(b2, _2n$4, P) * b2) % P; // x^15, 1111
|
|
1704
|
+
const b5 = (pow2$1(b4, _1n$6, P) * x) % P; // x^31
|
|
1705
|
+
const b10 = (pow2$1(b5, _5n$1, P) * b5) % P;
|
|
1706
|
+
const b20 = (pow2$1(b10, _10n, P) * b10) % P;
|
|
1707
|
+
const b40 = (pow2$1(b20, _20n, P) * b20) % P;
|
|
1708
|
+
const b80 = (pow2$1(b40, _40n, P) * b40) % P;
|
|
1709
|
+
const b160 = (pow2$1(b80, _80n, P) * b80) % P;
|
|
1710
|
+
const b240 = (pow2$1(b160, _80n, P) * b80) % P;
|
|
1711
|
+
const b250 = (pow2$1(b240, _10n, P) * b10) % P;
|
|
1712
|
+
const pow_p_5_8 = (pow2$1(b250, _2n$4, P) * x) % P;
|
|
1713
|
+
// ^ To pow to (p+3)/8, multiply it by x.
|
|
1714
|
+
return { pow_p_5_8, b2 };
|
|
1715
|
+
}
|
|
1716
|
+
function adjustScalarBytes(bytes) {
|
|
1717
|
+
// Section 5: For X25519, in order to decode 32 random bytes as an integer scalar,
|
|
1718
|
+
// set the three least significant bits of the first byte
|
|
1719
|
+
bytes[0] &= 248; // 0b1111_1000
|
|
1720
|
+
// and the most significant bit of the last to zero,
|
|
1721
|
+
bytes[31] &= 127; // 0b0111_1111
|
|
1722
|
+
// set the second most significant bit of the last byte to 1
|
|
1723
|
+
bytes[31] |= 64; // 0b0100_0000
|
|
1724
|
+
return bytes;
|
|
1725
|
+
}
|
|
1726
|
+
// sqrt(u/v)
|
|
1727
|
+
function uvRatio(u, v) {
|
|
1728
|
+
const P = ED25519_P;
|
|
1729
|
+
const v3 = mod$2(v * v * v, P); // v³
|
|
1730
|
+
const v7 = mod$2(v3 * v3 * v, P); // v⁷
|
|
1731
|
+
// (p+3)/8 and (p-5)/8
|
|
1732
|
+
const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;
|
|
1733
|
+
let x = mod$2(u * v3 * pow, P); // (uv³)(uv⁷)^(p-5)/8
|
|
1734
|
+
const vx2 = mod$2(v * x * x, P); // vx²
|
|
1735
|
+
const root1 = x; // First root candidate
|
|
1736
|
+
const root2 = mod$2(x * ED25519_SQRT_M1, P); // Second root candidate
|
|
1737
|
+
const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root
|
|
1738
|
+
const useRoot2 = vx2 === mod$2(-u, P); // If vx² = -u, set x <-- x * 2^((p-1)/4)
|
|
1739
|
+
const noRoot = vx2 === mod$2(-u * ED25519_SQRT_M1, P); // There is no valid root, vx² = -u√(-1)
|
|
1740
|
+
if (useRoot1)
|
|
1741
|
+
x = root1;
|
|
1742
|
+
if (useRoot2 || noRoot)
|
|
1743
|
+
x = root2; // We return root2 anyway, for const-time
|
|
1744
|
+
if (isNegativeLE(x, P))
|
|
1745
|
+
x = mod$2(-x, P);
|
|
1746
|
+
return { isValid: useRoot1 || useRoot2, value: x };
|
|
1747
|
+
}
|
|
1748
|
+
const Fp$1 = Field$1(ED25519_P, undefined, true);
|
|
1749
|
+
const ed25519Defaults = {
|
|
1750
|
+
// Param: a
|
|
1751
|
+
a: BigInt(-1), // Fp.create(-1) is proper; our way still works and is faster
|
|
1752
|
+
// d is equal to -121665/121666 over finite field.
|
|
1753
|
+
// Negative number is P - number, and division is invert(number, P)
|
|
1754
|
+
d: BigInt('37095705934669439343138083508754565189542113879843219016388785533085940283555'),
|
|
1755
|
+
// Finite field 𝔽p over which we'll do calculations; 2n**255n - 19n
|
|
1756
|
+
Fp: Fp$1,
|
|
1757
|
+
// Subgroup order: how many points curve has
|
|
1758
|
+
// 2n**252n + 27742317777372353535851937790883648493n;
|
|
1759
|
+
n: BigInt('7237005577332262213973186563042994240857116359379907606001950938285454250989'),
|
|
1760
|
+
// Cofactor
|
|
1761
|
+
h: BigInt(8),
|
|
1762
|
+
// Base point (x, y) aka generator point
|
|
1763
|
+
Gx: BigInt('15112221349535400772501151409588531511454012693041857206046113283949847762202'),
|
|
1764
|
+
Gy: BigInt('46316835694926478169428394003475163141307993866256225615783033603165251855960'),
|
|
1765
|
+
hash: sha512$1,
|
|
1766
|
+
randomBytes: randomBytes$1,
|
|
1767
|
+
adjustScalarBytes,
|
|
1768
|
+
// dom2
|
|
1769
|
+
// Ratio of u to v. Allows us to combine inversion and square root. Uses algo from RFC8032 5.1.3.
|
|
1770
|
+
// Constant-time, u/√v
|
|
1771
|
+
uvRatio,
|
|
1772
|
+
};
|
|
1773
|
+
const ed25519$1 = /* @__PURE__ */ twistedEdwards(ed25519Defaults);
|
|
1774
|
+
// Hash To Curve Elligator2 Map (NOTE: different from ristretto255 elligator)
|
|
1775
|
+
// NOTE: very important part is usage of FpSqrtEven for ELL2_C1_EDWARDS, since
|
|
1776
|
+
// SageMath returns different root first and everything falls apart
|
|
1777
|
+
const ELL2_C1 = (Fp$1.ORDER + BigInt(3)) / BigInt(8); // 1. c1 = (q + 3) / 8 # Integer arithmetic
|
|
1778
|
+
Fp$1.pow(_2n$4, ELL2_C1); // 2. c2 = 2^c1
|
|
1779
|
+
Fp$1.sqrt(Fp$1.neg(Fp$1.ONE)); // 3. c3 = sqrt(-1)
|
|
1780
|
+
(Fp$1.ORDER - BigInt(5)) / BigInt(8); // 4. c4 = (q - 5) / 8 # Integer arithmetic
|
|
1781
|
+
BigInt(486662);
|
|
1782
|
+
FpSqrtEven(Fp$1, Fp$1.neg(BigInt(486664))); // sgn0(c1) MUST equal 0
|
|
1783
|
+
// √(ad - 1)
|
|
1784
|
+
BigInt('25063068953384623474111414158702152701244531502492656460079210482610430750235');
|
|
1785
|
+
// 1 / √(a-d)
|
|
1786
|
+
BigInt('54469307008909316920995813868745141605393597292927456921205312896311721017578');
|
|
1787
|
+
// 1-d²
|
|
1788
|
+
BigInt('1159843021668779879193775521855586647937357759715417654439879720876111806838');
|
|
1789
|
+
// (d-1)²
|
|
1790
|
+
BigInt('40440834346308536858101042469323190826248399146238708352240133220865137265952');
|
|
1791
|
+
BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff');
|
|
1792
|
+
|
|
1793
|
+
/* eslint-disable @typescript-eslint/strict-boolean-expressions */
|
|
1794
|
+
function parse$2(string, encoding, opts) {
|
|
1795
|
+
var _opts$out;
|
|
1796
|
+
|
|
1797
|
+
if (opts === void 0) {
|
|
1798
|
+
opts = {};
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
// Build the character lookup table:
|
|
1802
|
+
if (!encoding.codes) {
|
|
1803
|
+
encoding.codes = {};
|
|
1804
|
+
|
|
1805
|
+
for (var i = 0; i < encoding.chars.length; ++i) {
|
|
1806
|
+
encoding.codes[encoding.chars[i]] = i;
|
|
1807
|
+
}
|
|
1808
|
+
} // The string must have a whole number of bytes:
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
if (!opts.loose && string.length * encoding.bits & 7) {
|
|
1812
|
+
throw new SyntaxError('Invalid padding');
|
|
1813
|
+
} // Count the padding bytes:
|
|
1814
|
+
|
|
1815
|
+
|
|
1816
|
+
var end = string.length;
|
|
1817
|
+
|
|
1818
|
+
while (string[end - 1] === '=') {
|
|
1819
|
+
--end; // If we get a whole number of bytes, there is too much padding:
|
|
1820
|
+
|
|
1821
|
+
if (!opts.loose && !((string.length - end) * encoding.bits & 7)) {
|
|
1822
|
+
throw new SyntaxError('Invalid padding');
|
|
1823
|
+
}
|
|
1824
|
+
} // Allocate the output:
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
var out = new ((_opts$out = opts.out) != null ? _opts$out : Uint8Array)(end * encoding.bits / 8 | 0); // Parse the data:
|
|
1828
|
+
|
|
1829
|
+
var bits = 0; // Number of bits currently in the buffer
|
|
1830
|
+
|
|
1831
|
+
var buffer = 0; // Bits waiting to be written out, MSB first
|
|
1832
|
+
|
|
1833
|
+
var written = 0; // Next byte to write
|
|
1834
|
+
|
|
1835
|
+
for (var _i = 0; _i < end; ++_i) {
|
|
1836
|
+
// Read one character from the string:
|
|
1837
|
+
var value = encoding.codes[string[_i]];
|
|
1838
|
+
|
|
1839
|
+
if (value === undefined) {
|
|
1840
|
+
throw new SyntaxError('Invalid character ' + string[_i]);
|
|
1841
|
+
} // Append the bits to the buffer:
|
|
1842
|
+
|
|
1843
|
+
|
|
1844
|
+
buffer = buffer << encoding.bits | value;
|
|
1845
|
+
bits += encoding.bits; // Write out some bits if the buffer has a byte's worth:
|
|
1846
|
+
|
|
1847
|
+
if (bits >= 8) {
|
|
1848
|
+
bits -= 8;
|
|
1849
|
+
out[written++] = 0xff & buffer >> bits;
|
|
1850
|
+
}
|
|
1851
|
+
} // Verify that we have received just enough bits:
|
|
1852
|
+
|
|
1853
|
+
|
|
1854
|
+
if (bits >= encoding.bits || 0xff & buffer << 8 - bits) {
|
|
1855
|
+
throw new SyntaxError('Unexpected end of data');
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
return out;
|
|
1859
|
+
}
|
|
1860
|
+
function stringify$1(data, encoding, opts) {
|
|
1861
|
+
if (opts === void 0) {
|
|
1862
|
+
opts = {};
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
var _opts = opts,
|
|
1866
|
+
_opts$pad = _opts.pad,
|
|
1867
|
+
pad = _opts$pad === void 0 ? true : _opts$pad;
|
|
1868
|
+
var mask = (1 << encoding.bits) - 1;
|
|
1869
|
+
var out = '';
|
|
1870
|
+
var bits = 0; // Number of bits currently in the buffer
|
|
1871
|
+
|
|
1872
|
+
var buffer = 0; // Bits waiting to be written out, MSB first
|
|
1873
|
+
|
|
1874
|
+
for (var i = 0; i < data.length; ++i) {
|
|
1875
|
+
// Slurp data into the buffer:
|
|
1876
|
+
buffer = buffer << 8 | 0xff & data[i];
|
|
1877
|
+
bits += 8; // Write out as much as we can:
|
|
1878
|
+
|
|
1879
|
+
while (bits > encoding.bits) {
|
|
1880
|
+
bits -= encoding.bits;
|
|
1881
|
+
out += encoding.chars[mask & buffer >> bits];
|
|
1882
|
+
}
|
|
1883
|
+
} // Partial character:
|
|
1884
|
+
|
|
1885
|
+
|
|
1886
|
+
if (bits) {
|
|
1887
|
+
out += encoding.chars[mask & buffer << encoding.bits - bits];
|
|
1888
|
+
} // Add padding characters until we hit a byte boundary:
|
|
1889
|
+
|
|
1890
|
+
|
|
1891
|
+
if (pad) {
|
|
1892
|
+
while (out.length * encoding.bits & 7) {
|
|
1893
|
+
out += '=';
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
|
|
1897
|
+
return out;
|
|
1898
|
+
}
|
|
1899
|
+
var base64Encoding = {
|
|
1900
|
+
chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
|
1901
|
+
bits: 6
|
|
1902
|
+
};
|
|
1903
|
+
var base64UrlEncoding = {
|
|
1904
|
+
chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
|
|
1905
|
+
bits: 6
|
|
1906
|
+
};
|
|
1907
|
+
var base64$3 = {
|
|
1908
|
+
parse: function parse$1(string, opts) {
|
|
1909
|
+
return parse$2(string, base64Encoding, opts);
|
|
1910
|
+
},
|
|
1911
|
+
stringify: function stringify$1$1(data, opts) {
|
|
1912
|
+
return stringify$1(data, base64Encoding, opts);
|
|
1913
|
+
}
|
|
1914
|
+
};
|
|
1915
|
+
var base64url$1 = {
|
|
1916
|
+
parse: function parse$1(string, opts) {
|
|
1917
|
+
return parse$2(string, base64UrlEncoding, opts);
|
|
1918
|
+
},
|
|
1919
|
+
stringify: function stringify$1$1(data, opts) {
|
|
1920
|
+
return stringify$1(data, base64UrlEncoding, opts);
|
|
1921
|
+
}
|
|
1922
|
+
};
|
|
1923
|
+
|
|
1924
|
+
const byteEncoder = new TextEncoder();
|
|
1925
|
+
const byteDecoder = new TextDecoder();
|
|
1926
|
+
function bytesToBase64url$1(b, opts = { pad: false }) {
|
|
1927
|
+
return base64url$1.stringify(b, opts);
|
|
1928
|
+
}
|
|
1929
|
+
function base64ToBytes$1(s, opts = { loose: true }) {
|
|
1930
|
+
return base64$3.parse(s, opts);
|
|
1931
|
+
}
|
|
1932
|
+
function bytesToBase64(b, opts = { pad: false }) {
|
|
1933
|
+
return base64$3.stringify(b, opts);
|
|
1934
|
+
}
|
|
1935
|
+
function base64UrlToBytes(s, opts = { loose: true }) {
|
|
1936
|
+
const inputBase64Url = s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
1937
|
+
return base64url$1.parse(inputBase64Url, opts);
|
|
1938
|
+
}
|
|
1939
|
+
function base58ToBytes$1(s) {
|
|
1940
|
+
return yE(s);
|
|
1941
|
+
}
|
|
1942
|
+
function bytesToBase58$1(b) {
|
|
1943
|
+
return uE(b);
|
|
1944
|
+
}
|
|
1945
|
+
function hexToBytes$2(s) {
|
|
1946
|
+
const input = s.startsWith('0x') ? s.substring(2) : s;
|
|
1947
|
+
return b$5.decodeString(input.toLowerCase());
|
|
1948
|
+
}
|
|
1949
|
+
function encodeBase64url(s, opts = { pad: false }) {
|
|
1950
|
+
return base64url$1.stringify(byteEncoder.encode(s), opts);
|
|
1951
|
+
}
|
|
1952
|
+
function decodeBase64url$1(s, opts = { loose: true }) {
|
|
1953
|
+
return byteDecoder.decode(base64url$1.parse(s, opts));
|
|
1954
|
+
}
|
|
1955
|
+
function bytesToHex$2(b) {
|
|
1956
|
+
return b$5.encodeString(b);
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
function mergeObjects(credSubject, otherCredSubject) {
|
|
1960
|
+
let result = {};
|
|
1961
|
+
const credSubjectKeys = Object.keys(credSubject);
|
|
1962
|
+
for (const key of credSubjectKeys) {
|
|
1963
|
+
if (typeof otherCredSubject[key] !== 'undefined') {
|
|
1964
|
+
if (typeof credSubject[key] !== 'object' && typeof otherCredSubject[key] !== 'object') {
|
|
1965
|
+
throw new Error('Invalid query');
|
|
1966
|
+
}
|
|
1967
|
+
const subjectProperty = credSubject[key];
|
|
1968
|
+
const otherSubjectProperty = otherCredSubject[key];
|
|
1969
|
+
const propertyOperators = Object.keys(subjectProperty);
|
|
1970
|
+
const subjectPropertyResult = {};
|
|
1971
|
+
for (const operatorKey of propertyOperators) {
|
|
1972
|
+
if (typeof otherSubjectProperty[operatorKey] !== 'undefined') {
|
|
1973
|
+
const operatorValue1 = subjectProperty[operatorKey];
|
|
1974
|
+
const operatorValue2 = otherSubjectProperty[operatorKey];
|
|
1975
|
+
subjectPropertyResult[operatorKey] = [
|
|
1976
|
+
...new Set([
|
|
1977
|
+
...(subjectPropertyResult[operatorKey] ?? []),
|
|
1978
|
+
operatorValue1,
|
|
1979
|
+
...(Array.isArray(operatorValue2) ? operatorValue2 : [operatorValue2])
|
|
1980
|
+
])
|
|
1981
|
+
];
|
|
1982
|
+
}
|
|
1983
|
+
else {
|
|
1984
|
+
subjectPropertyResult[operatorKey] = subjectProperty[operatorKey];
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
result[key] = {
|
|
1988
|
+
...otherCredSubject[key],
|
|
1989
|
+
...subjectPropertyResult
|
|
1990
|
+
};
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1993
|
+
// Add remaining keys from obj2
|
|
1994
|
+
result = { ...credSubject, ...otherCredSubject, ...result };
|
|
1995
|
+
return result;
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
const i$1=32,n$1=1,o$1=new Uint8Array(65),h$2="empty",l$2=32,w$2=BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");w$2-BigInt("1");function g$2(t,e,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return "m"===i?s:"a"===i?s.call(t):s?s.value:e.get(t)}function v$2(t,e,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!n:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return "a"===s?n.call(t,i):n?n.value=i:e.set(t,i),i}const p$2=t=>t<w$2,b$3=(t,e)=>t.every(((t,i)=>t===e[i])),m$2=t=>t.slice().reverse(),x$2=t=>"0b"+t.reduce(((t,e)=>t+e.toString(2).padStart(8,"0")),""),A$2=(t,e)=>0!=(t[parseInt((e/8).toString())]&1<<e%8),I$2=(t,e)=>0!=(t[t.length-parseInt(""+e/8)-1]&1<<e%8),k$1=(t,e)=>{t[t.length-parseInt(""+e/8)-1]|=1<<e%8;},S$2="0123456789abcdef",R$1=t=>{const e=new Array(2*t.length);let i=0;return t.forEach((t=>{e[i]=S$2[parseInt((t>>4).toString(10))],e[i+1]=S$2[parseInt((15&t).toString(10))],i+=2;})),e.join("")},B$2=t=>new Uint8Array(2*t.length).map(((e,i)=>t.charCodeAt(i))),N$1=(t,e)=>{const i=new Array(t);for(let s=0;s<t;s+=1)i[s]=A$2(e,s);return i},U$1=t=>{const e=new ArrayBuffer(i$1*t.length),s=new Uint8Array(e);return t.forEach(((t,e)=>{s.set(t.value,e*i$1);})),s},K$2=t=>{const e=BigInt(256),s=new Uint8Array(i$1);let n=0;for(;t>BigInt(0);)s[31-n]=Number(t%e),t/=e,n+=1;return s};let V$1 = class V{constructor(t){if(t?.length){if(t.length!==i$1)throw new Error(`Expected 32 bytes, found ${t.length} bytes`);this.bytes=t;}else this.bytes=new Uint8Array(i$1);}get value(){return this.bytes}set value(t){if(t.length!==i$1)throw `Expected 32 bytes, found ${t.length} bytes`;this.bytes=m$2(t);}string(){return this.bigInt().toString(10)}hex(){return R$1(this.bytes)}equals(t){return b$3(this.value,t.value)}bigInt(){const t=m$2(this.value);return BigInt(x$2(t))}static fromString(t){try{return V.fromBigInt(BigInt(t))}catch(e){const i=JSON.parse(t),s=Uint8Array.from(Object.values(i.bytes));return new V(s)}}static fromBigInt(t){if(!p$2(t))throw new Error("NewBigIntFromHashBytes: Value not inside the Finite Field");const e=K$2(t);return new V(m$2(e))}static fromHex(e){return e?new V(b$5.decodeString(e)):M$2}toJSON(){return this.string()}};const M$2=new V$1,O$1=t=>V$1.fromString(t),_$1=t=>{const i=$$2.hash(t);return V$1.fromBigInt(i)},J$1=(t,i)=>{const s=$$2.hash([...i,t]);return V$1.fromBigInt(s)},P$1=(t,e)=>{for(let i=t.length;i<e;i+=1)t.push(M$2);return t};var T$2,H$1;let j$1 = class j{constructor(t){T$2.set(this,void 0),H$1.set(this,void 0),this.prefix=t,v$2(this,T$2,{},"f"),v$2(this,H$1,M$2,"f");}async get(t){const e=new Uint8Array([...this.prefix,...t]);return g$2(this,T$2,"f")[e.toString()]?g$2(this,T$2,"f")[e.toString()]:void 0}async put(t,e){const i=new Uint8Array([...this.prefix,...t]);g$2(this,T$2,"f")[i.toString()]=e;}async getRoot(){return g$2(this,H$1,"f")}async setRoot(t){v$2(this,H$1,t,"f");}};T$2=new WeakMap,H$1=new WeakMap;const z$2=async(t,e)=>J$1(BigInt(1),[t.bigInt(),e.bigInt()]),C$2=(t,e,i)=>{const s=new Uint8Array(65),n=K$2(e.bigInt()),r=K$2(i.bigInt());s[0]=t;for(let t=1;t<33;t+=1)s[t]=n[t-1];for(let t=33;t<=65;t+=1)s[t]=r[t-33];return s};var q$1,F$1,D$1,G$1;let Q$1 = class Q{constructor(t,e){q$1.set(this,void 0),this.type=1,this.entry=[t,e],v$2(this,q$1,M$2,"f");}async getKey(){return g$2(this,q$1,"f")===M$2?await z$2(this.entry[0],this.entry[1]):g$2(this,q$1,"f")}get value(){return C$2(this.type,this.entry[0],this.entry[1])}get string(){return `Leaf I:${this.entry[0]} D:${this.entry[1]}`}};q$1=new WeakMap;let X$1 = class X{constructor(t,e){F$1.set(this,void 0),this.type=0,this.childL=t,this.childR=e,v$2(this,F$1,M$2,"f");}async getKey(){return g$2(this,F$1,"f")===M$2?_$1([this.childL.bigInt(),this.childR.bigInt()]):g$2(this,F$1,"f")}get value(){return C$2(this.type,this.childL,this.childR)}get string(){return `Middle L:${this.childL} R:${this.childR}`}};F$1=new WeakMap;let Y$1 = class Y{constructor(){D$1.set(this,void 0),this.type=2,v$2(this,D$1,M$2,"f");}async getKey(){return M$2}get value(){return o$1}get string(){return h$2}};D$1=new WeakMap;let Z$1 = class Z{constructor(t){this._prefix=t,G$1.set(this,void 0);const e=localStorage.getItem(R$1(t));if(e){const t=JSON.parse(e);v$2(this,G$1,new V$1(Uint8Array.from(t)),"f");}else v$2(this,G$1,M$2,"f");}async get(t){const e=new Uint8Array([...this._prefix,...t]),i=R$1(e),s=localStorage.getItem(i);if(null===s)return;const n=JSON.parse(s);switch(n.type){case 2:return new Y$1;case 0:const t=new V$1(Uint8Array.from(n.childL)),e=new V$1(Uint8Array.from(n.childR));return new X$1(t,e);case 1:const i=new V$1(Uint8Array.from(n.entry[0])),s=new V$1(Uint8Array.from(n.entry[1]));return new Q$1(i,s)}throw `error: value found for key ${R$1(e)} is not of type Node`}async put(t,e){const i=new Uint8Array([...this._prefix,...t]),s=R$1(i),n={type:e.type};e instanceof X$1?(n.childL=Array.from(e.childL.bytes),n.childR=Array.from(e.childR.bytes)):e instanceof Q$1&&(n.entry=[Array.from(e.entry[0].bytes),Array.from(e.entry[1].bytes)]);const r=JSON.stringify(n);localStorage.setItem(s,r);}async getRoot(){return g$2(this,G$1,"f")}async setRoot(t){v$2(this,G$1,t,"f"),localStorage.setItem(R$1(this._prefix),JSON.stringify(Array.from(t.bytes)));}};function tt$1(t){return new Promise(((e,i)=>{t.oncomplete=t.onsuccess=()=>e(t.result),t.onabort=t.onerror=()=>i(t.error);}))}function et$1(t,e){const i=indexedDB.open(t);i.onupgradeneeded=()=>i.result.createObjectStore(e);const s=tt$1(i);return (t,i)=>s.then((s=>i(s.transaction(e,t).objectStore(e))))}let it$1;function st$1(){return it$1||(it$1=et$1("keyval-store","keyval")),it$1}function nt$1(t,e=st$1()){return e("readonly",(e=>tt$1(e.get(t))))}function rt$1(t,e,i=st$1()){return i("readwrite",(i=>(i.put(e,t),tt$1(i.transaction))))}var at$1;G$1=new WeakMap;let lt$2 = class lt{constructor(t,e){this._prefix=t,at$1.set(this,void 0),v$2(this,at$1,M$2,"f"),this._prefixHash=R$1(t),this._store=et$1(`${e??lt.storageName}-db`,lt.storageName);}async get(t){const e=new Uint8Array([...this._prefix,...t]),i=R$1(e),s=await nt$1(i,this._store);if(null!=s){if(2===s.type)return new Y$1;if(0===s.type){const t=new V$1(Uint8Array.from(s.childL.bytes)),e=new V$1(Uint8Array.from(s.childR.bytes));return new X$1(t,e)}if(1===s.type){const t=new V$1(Uint8Array.from(s.entry[0].bytes)),e=new V$1(Uint8Array.from(s.entry[1].bytes));return new Q$1(t,e)}throw new Error(`error: value found for key ${i} is not of type Node`)}}async put(t,e){const i=new Uint8Array([...this._prefix,...t]),s=R$1(i);await rt$1(s,e,this._store);}async getRoot(){if(!g$2(this,at$1,"f").equals(M$2))return g$2(this,at$1,"f");const t=await nt$1(this._prefixHash,this._store);return v$2(this,at$1,t?new V$1(t.bytes):M$2,"f"),g$2(this,at$1,"f")}async setRoot(t){await rt$1(this._prefixHash,t,this._store),v$2(this,at$1,t,"f");}};at$1=new WeakMap,lt$2.storageName="merkle-tree";const vt$1=t=>t.map((t=>t.bigInt())),pt$1=t=>{const e=vt$1(t.data.value);let i=!0;return e.forEach((t=>{p$2(t)||(i=!1);})),i},mt$1="Key not found in the MerkleTree",At$1="reached maximum level of the merkle tree",It$1="found an invalid node in the DB",Rt$1="the entry index already exists in the tree",Lt$1="Merkle Tree not writable",Bt$1="key not found";let Nt$1 = class Nt{constructor(t=M$2,e=[],i=M$2,s=M$2,n=!1,r=M$2,a=M$2,o=0){this.root=t,this.siblings=e,this.oldKey=i,this.oldValue=s,this.isOld0=n,this.key=r,this.value=a,this.fnc=o;}};let Ut$1 = class Ut{constructor(t=M$2,e=M$2,i=[],s=M$2,n=M$2,r=M$2,a=M$2,o=!1,h=0){this.oldRoot=t,this.newRoot=e,this.siblings=i,this.oldKey=s,this.oldValue=n,this.newKey=r,this.newValue=a,this.isOld0=o,this.fnc=h;}};const Et$1="non-existence proof being checked against hIndex equal to nodeAux";let Kt$1 = class Kt{constructor(t){this.existence=t?.existence??!1,this.depth=t?.siblings.length??0,this.nodeAux=t?.nodeAux;const{siblings:e,notEmpties:i}=this.reduceSiblings(t?.siblings);this.siblings=e,this.notEmpties=i;}bytes(){let t=2+this.notEmpties.length+l$2*this.siblings.length;void 0!==this.nodeAux&&(t+=64);const e=new ArrayBuffer(t),i=new Uint8Array(e);this.existence||(i[0]|=1),i[1]=this.depth,i.set(this.notEmpties,2);const s=U$1(this.siblings);return i.set(s,this.notEmpties.length+2),void 0!==this.nodeAux&&(i[0]|=2,i.set(this.nodeAux.key.value,i.length-64),i.set(this.nodeAux.value.value,i.length-32)),i}toJSON(){return {existence:this.existence,siblings:this.allSiblings().map((t=>t.toJSON())),nodeAux:this.nodeAux?{key:this.nodeAux.key.toJSON(),value:this.nodeAux.value.toJSON()}:void 0}}reduceSiblings(t){const e=[],i=new Uint8Array(30);if(!t)return {siblings:e,notEmpties:i};for(let s=0;s<t.length;s++){const n=t[s];JSON.stringify(t[s])!==JSON.stringify(M$2)&&(k$1(i,s),e.push(n));}return {notEmpties:i,siblings:e}}static fromJSON(t){let e;t.nodeAux&&(e={key:V$1.fromString(t.nodeAux.key),value:V$1.fromString(t.nodeAux.value)});const i=t.existence??!1,s=t.siblings.map((t=>V$1.fromString(t)));return new Kt({existence:i,nodeAux:e,siblings:s})}allSiblings(){return Kt.buildAllSiblings(this.depth,this.notEmpties,this.siblings)}static buildAllSiblings(t,e,i){let s=0;const n=[];for(let r=0;r<t;r+=1)I$2(e,r)?(n.push(i[s]),s+=1):n.push(M$2);return n}};const Mt$1=async(t,e,i,s)=>{try{const n=await Wt$1(e,i,s);return b$3(t.value,n.value)}catch(t){if(t===Et$1)return !1;throw t}},Wt$1=async(t,e,i)=>{const s=V$1.fromBigInt(e),n=V$1.fromBigInt(i);let r;if(t.existence)r=await z$2(s,n);else if(void 0===t.nodeAux)r=M$2;else {const e=t.nodeAux;if(b$3(s.value,e.key.value))throw Et$1;r=await z$2(e.key,e.value);}const a=t.allSiblings(),o=N$1(a.length,s.value);for(let t=a.length-1;t>=0;t-=1)r=o[t]?await new X$1(a[t],r).getKey():await new X$1(r,a[t]).getKey();return r};var $t$1,Ot$1,_t$1,Jt$1;let Pt$1 = class Pt{constructor(t,e,i){$t$1.set(this,void 0),Ot$1.set(this,void 0),_t$1.set(this,void 0),Jt$1.set(this,void 0),v$2(this,$t$1,t,"f"),v$2(this,_t$1,e,"f"),v$2(this,Jt$1,i,"f");}async root(){return g$2(this,Ot$1,"f")||v$2(this,Ot$1,await g$2(this,$t$1,"f").getRoot(),"f"),g$2(this,Ot$1,"f")}get maxLevels(){return g$2(this,Jt$1,"f")}async add(t,e){if(!g$2(this,_t$1,"f"))throw Lt$1;v$2(this,Ot$1,await this.root(),"f");const i=V$1.fromBigInt(t),s=V$1.fromBigInt(e),n=new Q$1(i,s),r=N$1(this.maxLevels,i.value),a=await this.addLeaf(n,g$2(this,Ot$1,"f"),0,r);v$2(this,Ot$1,a,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));}async updateNode(t){if(!g$2(this,_t$1,"f"))throw Lt$1;if(2===t.type)return await t.getKey();const e=await t.getKey();return await g$2(this,$t$1,"f").put(e.value,t),e}async addNode(t){if(!g$2(this,_t$1,"f"))throw Lt$1;if(2===t.type)return await t.getKey();const e=await t.getKey();return await g$2(this,$t$1,"f").put(e.value,t),e}async addEntry(t){if(!g$2(this,_t$1,"f"))throw Lt$1;if(!pt$1(t))throw "elements not inside the finite field over r";v$2(this,Ot$1,await g$2(this,$t$1,"f").getRoot(),"f");const e=await t.hIndex(),i=await t.hValue(),s=new Q$1(e,i),n=N$1(this.maxLevels,e.value),r=await this.addLeaf(s,g$2(this,Ot$1,"f"),0,n);v$2(this,Ot$1,r,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));}async pushLeaf(t,e,i,s,n){if(i>g$2(this,Jt$1,"f")-2)throw new Error(At$1);let r;if(s[i]===n[i]){const a=await this.pushLeaf(t,e,i+1,s,n);return r=s[i]?new X$1(new V$1,a):new X$1(a,new V$1),await this.addNode(r)}const a=await e.getKey(),o=await t.getKey();return r=s[i]?new X$1(a,o):new X$1(o,a),await this.addNode(t),await this.addNode(r)}async addLeaf(t,e,i,s){if(i>g$2(this,Jt$1,"f")-1)throw new Error(At$1);const n=await this.getNode(e);if(void 0===n)throw Bt$1;switch(n.type){case 2:return this.addNode(t);case 1:{const e=n.entry[0],r=t.entry[0];if(b$3(e.value,r.value))throw Rt$1;const a=N$1(this.maxLevels,e.value);return this.pushLeaf(t,n,i,s,a)}case 0:{let e;if(s[i]){const r=await this.addLeaf(t,n.childR,i+1,s);e=new X$1(n.childL,r);}else {const r=await this.addLeaf(t,n.childL,i+1,s);e=new X$1(r,n.childR);}return this.addNode(e)}default:throw It$1}}async get(t){const e=V$1.fromBigInt(t),i=N$1(this.maxLevels,e.value);let s=await this.root();const n=[];for(let t=0;t<this.maxLevels;t++){const e=await this.getNode(s);if(void 0===e)throw mt$1;switch(e.type){case 2:return {key:BigInt("0"),value:BigInt("0"),siblings:n};case 1:return {key:e.entry[0].bigInt(),value:e.entry[1].bigInt(),siblings:n};case 0:i[t]?(s=e.childR,n.push(e.childL)):(s=e.childL,n.push(e.childR));break;default:throw It$1}}throw new Error(At$1)}async update(t,e){if(!g$2(this,_t$1,"f"))throw Lt$1;if(!p$2(t))throw "key not inside the finite field";if(!p$2(e))throw "key not inside the finite field";const i=V$1.fromBigInt(t),s=V$1.fromBigInt(e),n=N$1(this.maxLevels,i.value),r=new Ut$1;r.fnc=1,r.oldRoot=await this.root(),r.oldKey=i,r.newKey=i,r.newValue=s;let a=await this.root();const o=[];for(let t=0;t<this.maxLevels;t+=1){const e=await this.getNode(a);if(void 0===e)throw Bt$1;switch(e.type){case 2:throw mt$1;case 1:if(b$3(i.value,e.entry[0].value)){r.oldValue=e.entry[1],r.siblings=P$1([...o],this.maxLevels);const t=new Q$1(i,s);await this.updateNode(t);const a=await this.recalculatePathUntilRoot(n,t,o);return v$2(this,Ot$1,a,"f"),await g$2(this,$t$1,"f").setRoot(a),r.newRoot=a,r}break;case 0:n[t]?(a=e.childR,o.push(e.childL)):(a=e.childL,o.push(e.childR));break;default:throw It$1}}throw mt$1}async getNode(t){return b$3(t.value,M$2.value)?new Y$1:await g$2(this,$t$1,"f").get(t.value)}async recalculatePathUntilRoot(t,e,i){for(let s=i.length-1;s>=0;s-=1){const n=await e.getKey();e=t[s]?new X$1(i[s],n):new X$1(n,i[s]),await this.addNode(e);}return await e.getKey()}async delete(t){if(!g$2(this,_t$1,"f"))throw Lt$1;const e=V$1.fromBigInt(t),i=N$1(this.maxLevels,e.value);let s=g$2(this,Ot$1,"f");const n=[];for(let t=0;t<g$2(this,Jt$1,"f");t+=1){const r=await this.getNode(s);if(void 0===r)throw Bt$1;switch(r.type){case 2:throw mt$1;case 1:if(b$3(e.bytes,r.entry[0].value))return void await this.rmAndUpload(i,e,n);throw mt$1;case 0:i[t]?(s=r.childR,n.push(r.childL)):(s=r.childL,n.push(r.childR));break;default:throw It$1}}throw mt$1}async rmAndUpload(t,e,i){if(0===i.length)return v$2(this,Ot$1,M$2,"f"),void await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));const s=i[i.length-1];i.length<2&&(v$2(this,Ot$1,i[0],"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f")));for(let e=i.length-2;e>=0;e-=1){if(!b$3(i[e].value,M$2.value)){let n;n=t[e]?new X$1(i[e],s):new X$1(s,i[e]),await this.addNode(n);const r=await this.recalculatePathUntilRoot(t,n,i.slice(0,e));v$2(this,Ot$1,r,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));break}if(0===e){v$2(this,Ot$1,s,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));break}}}async recWalk(t,e){const i=await this.getNode(t);if(void 0===i)throw Bt$1;switch(i.type){case 2:case 1:await e(i);break;case 0:await e(i),await this.recWalk(i.childL,e),await this.recWalk(i.childR,e);break;default:throw It$1}}async walk(t,e){b$3(t.value,M$2.value)&&(t=await this.root()),await this.recWalk(t,e);}async generateCircomVerifierProof(t,e){const i=await this.generateSCVerifierProof(t,e);return i.siblings=P$1(i.siblings,this.maxLevels),i}async generateSCVerifierProof(t,e){b$3(e.value,M$2.value)&&(e=await this.root());const{proof:i,value:s}=await this.generateProof(t,e),n=new Nt$1;return n.root=e,n.siblings=i.allSiblings(),void 0!==i.nodeAux?(n.oldKey=i.nodeAux.key,n.oldValue=i.nodeAux.value):(n.oldKey=M$2,n.oldValue=M$2),n.key=V$1.fromBigInt(t),n.value=V$1.fromBigInt(s),i.existence?n.fnc=0:n.fnc=1,n}async generateProof(t,e){let i;const s=V$1.fromBigInt(t),n=N$1(this.maxLevels,s.value);e||(e=await this.root());let r=e,a=0,o=!1;const h=[];let l;for(a=0;a<this.maxLevels;a+=1){const t=await this.getNode(r);if(void 0===t)throw Bt$1;switch(t.type){case 2:return {proof:new Kt$1({existence:o,nodeAux:l,siblings:h}),value:BigInt("0")};case 1:return b$3(s.value,t.entry[0].value)?(o=!0,{proof:new Kt$1({existence:o,nodeAux:l,siblings:h}),value:t.entry[1].bigInt()}):(l={key:t.entry[0],value:t.entry[1]},{proof:new Kt$1({existence:o,nodeAux:l,siblings:h}),value:t.entry[1].bigInt()});case 0:n[a]?(r=t.childR,i=t.childL):(r=t.childL,i=t.childR);break;default:throw It$1}h.push(i);}throw mt$1}async addAndGetCircomProof(t,e){const i=new Ut$1;i.fnc=2,i.oldRoot=await this.root();let s=BigInt("0"),n=BigInt("0"),r=[];try{const e=await this.get(t);s=e.key,n=e.value,r=e.siblings;}catch(t){if(t!==mt$1)throw t}if(void 0===s||void 0===n)throw "key/value undefined";return i.oldKey=V$1.fromBigInt(s),i.oldValue=V$1.fromBigInt(n),b$3(i.oldKey.value,M$2.value)&&(i.isOld0=!0),i.siblings=P$1(r,this.maxLevels),await this.add(t,e),i.newKey=V$1.fromBigInt(t),i.newValue=V$1.fromBigInt(e),i.newRoot=await this.root(),i}async graphViz(t){let e=0;await this.walk(t,(async t=>{const i=await t.getKey();let s,n;switch(t.type){case 2:break;case 1:console.log(`"${i.string()}" [style=filled]`);break;case 0:s=[t.childL.string(),t.childR.string()],n="",s.forEach(((t,i)=>{"0"===t&&(s[i]=`empty${e}`,n+=`"${s[i]}" [style=dashed,label=0];\n`,e+=1);})),console.log(`"${i.string()}" -> {"${s[1]}"}`),console.log(n);}})),console.log("}\n");}async printGraphViz(t){b$3(t.value,M$2.value)&&(t=await this.root()),console.log(`--------\nGraphViz of the MerkleTree with RootKey ${t.bigInt().toString(10)}\n`),await this.graphViz(M$2),console.log(`End of GraphViz of the MerkleTree with RootKey ${t.bigInt().toString(10)}\n--------\n`);}};$t$1=new WeakMap,Ot$1=new WeakMap,_t$1=new WeakMap,Jt$1=new WeakMap;
|
|
1999
|
+
|
|
2000
|
+
/**
|
|
2001
|
+
* Checks if state is genesis state
|
|
2002
|
+
*
|
|
2003
|
+
* @param {string} did - did
|
|
2004
|
+
* @param {bigint|string} state - hash on bigInt or hex string format
|
|
2005
|
+
* @returns boolean
|
|
2006
|
+
*/
|
|
2007
|
+
function isGenesisState(did, state) {
|
|
2008
|
+
if (typeof state === 'string') {
|
|
2009
|
+
state = V$1.fromHex(state).bigInt();
|
|
2010
|
+
}
|
|
2011
|
+
const id = W$2.idFromDID(did);
|
|
2012
|
+
const { method, blockchain, networkId } = W$2.decodePartsFromId(id);
|
|
2013
|
+
const type = P$2(method, blockchain, networkId);
|
|
2014
|
+
const idFromState = k$2.idGenesisFromIdenState(type, state);
|
|
2015
|
+
return id.bigInt().toString() === idFromState.bigInt().toString();
|
|
2016
|
+
}
|
|
2017
|
+
const buildVerifierId = (address, info) => {
|
|
2018
|
+
address = address.replace('0x', '');
|
|
2019
|
+
const ethAddrBytes = b$5.decodeString(address);
|
|
2020
|
+
const ethAddr = ethAddrBytes.slice(0, 20);
|
|
2021
|
+
const genesis = O$2(ethAddr);
|
|
2022
|
+
const tp = P$2(info.method, info.blockchain, info.networkId);
|
|
2023
|
+
return new k$2(tp, genesis);
|
|
2024
|
+
};
|
|
2025
|
+
const validateDIDDocumentAuth = async (did, resolverURL, state) => {
|
|
2026
|
+
const vm = await resolveDIDDocumentAuth(did, resolverURL, state);
|
|
2027
|
+
if (!vm) {
|
|
2028
|
+
throw new Error(`can't resolve DID document`);
|
|
2029
|
+
}
|
|
2030
|
+
// published or genesis
|
|
2031
|
+
if (!vm.published &&
|
|
2032
|
+
!isGenesisState(did, state.bigInt())) {
|
|
2033
|
+
throw new Error(`issuer state not published and not genesis`);
|
|
2034
|
+
}
|
|
2035
|
+
};
|
|
2036
|
+
const resolveDIDDocumentAuth = async (did, resolveURL, state) => {
|
|
2037
|
+
let url = `${resolveURL}/${did.string().replace(/:/g, '%3A')}`;
|
|
2038
|
+
if (state) {
|
|
2039
|
+
url += `?state=${state.hex()}`;
|
|
2040
|
+
}
|
|
2041
|
+
const resp = await fetch(url);
|
|
2042
|
+
const didResolutionRes = (await resp.json());
|
|
2043
|
+
return didResolutionRes.didDocument?.verificationMethod?.find((i) => i.type === 'Iden3StateInfo2023');
|
|
2044
|
+
};
|
|
2045
|
+
|
|
211
2046
|
var commonjsGlobal$1 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
212
2047
|
|
|
213
2048
|
function getDefaultExportFromCjs$1 (x) {
|
|
@@ -239,6 +2074,506 @@ var PolygonIdSdk = (function (exports) {
|
|
|
239
2074
|
return a;
|
|
240
2075
|
}
|
|
241
2076
|
|
|
2077
|
+
var pubsub = {exports: {}};
|
|
2078
|
+
|
|
2079
|
+
/**
|
|
2080
|
+
* Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk
|
|
2081
|
+
* License: MIT - http://mrgnrdrck.mit-license.org
|
|
2082
|
+
*
|
|
2083
|
+
* https://github.com/mroderick/PubSubJS
|
|
2084
|
+
*/
|
|
2085
|
+
|
|
2086
|
+
(function (module, exports) {
|
|
2087
|
+
(function (root, factory){
|
|
2088
|
+
|
|
2089
|
+
var PubSub = {};
|
|
2090
|
+
|
|
2091
|
+
if (root.PubSub) {
|
|
2092
|
+
PubSub = root.PubSub;
|
|
2093
|
+
console.warn("PubSub already loaded, using existing version");
|
|
2094
|
+
} else {
|
|
2095
|
+
root.PubSub = PubSub;
|
|
2096
|
+
factory(PubSub);
|
|
2097
|
+
}
|
|
2098
|
+
// CommonJS and Node.js module support
|
|
2099
|
+
{
|
|
2100
|
+
if (module !== undefined && module.exports) {
|
|
2101
|
+
exports = module.exports = PubSub; // Node.js specific `module.exports`
|
|
2102
|
+
}
|
|
2103
|
+
exports.PubSub = PubSub; // CommonJS module 1.1.1 spec
|
|
2104
|
+
module.exports = exports = PubSub; // CommonJS
|
|
2105
|
+
}
|
|
2106
|
+
|
|
2107
|
+
}(( typeof window === 'object' && window ) || commonjsGlobal$1, function (PubSub){
|
|
2108
|
+
|
|
2109
|
+
var messages = {},
|
|
2110
|
+
lastUid = -1,
|
|
2111
|
+
ALL_SUBSCRIBING_MSG = '*';
|
|
2112
|
+
|
|
2113
|
+
function hasKeys(obj){
|
|
2114
|
+
var key;
|
|
2115
|
+
|
|
2116
|
+
for (key in obj){
|
|
2117
|
+
if ( Object.prototype.hasOwnProperty.call(obj, key) ){
|
|
2118
|
+
return true;
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
2121
|
+
return false;
|
|
2122
|
+
}
|
|
2123
|
+
|
|
2124
|
+
/**
|
|
2125
|
+
* Returns a function that throws the passed exception, for use as argument for setTimeout
|
|
2126
|
+
* @alias throwException
|
|
2127
|
+
* @function
|
|
2128
|
+
* @param { Object } ex An Error object
|
|
2129
|
+
*/
|
|
2130
|
+
function throwException( ex ){
|
|
2131
|
+
return function reThrowException(){
|
|
2132
|
+
throw ex;
|
|
2133
|
+
};
|
|
2134
|
+
}
|
|
2135
|
+
|
|
2136
|
+
function callSubscriberWithDelayedExceptions( subscriber, message, data ){
|
|
2137
|
+
try {
|
|
2138
|
+
subscriber( message, data );
|
|
2139
|
+
} catch( ex ){
|
|
2140
|
+
setTimeout( throwException( ex ), 0);
|
|
2141
|
+
}
|
|
2142
|
+
}
|
|
2143
|
+
|
|
2144
|
+
function callSubscriberWithImmediateExceptions( subscriber, message, data ){
|
|
2145
|
+
subscriber( message, data );
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
function deliverMessage( originalMessage, matchedMessage, data, immediateExceptions ){
|
|
2149
|
+
var subscribers = messages[matchedMessage],
|
|
2150
|
+
callSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions,
|
|
2151
|
+
s;
|
|
2152
|
+
|
|
2153
|
+
if ( !Object.prototype.hasOwnProperty.call( messages, matchedMessage ) ) {
|
|
2154
|
+
return;
|
|
2155
|
+
}
|
|
2156
|
+
|
|
2157
|
+
for (s in subscribers){
|
|
2158
|
+
if ( Object.prototype.hasOwnProperty.call(subscribers, s)){
|
|
2159
|
+
callSubscriber( subscribers[s], originalMessage, data );
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
|
|
2164
|
+
function createDeliveryFunction( message, data, immediateExceptions ){
|
|
2165
|
+
return function deliverNamespaced(){
|
|
2166
|
+
var topic = String( message ),
|
|
2167
|
+
position = topic.lastIndexOf( '.' );
|
|
2168
|
+
|
|
2169
|
+
// deliver the message as it is now
|
|
2170
|
+
deliverMessage(message, message, data, immediateExceptions);
|
|
2171
|
+
|
|
2172
|
+
// trim the hierarchy and deliver message to each level
|
|
2173
|
+
while( position !== -1 ){
|
|
2174
|
+
topic = topic.substr( 0, position );
|
|
2175
|
+
position = topic.lastIndexOf('.');
|
|
2176
|
+
deliverMessage( message, topic, data, immediateExceptions );
|
|
2177
|
+
}
|
|
2178
|
+
|
|
2179
|
+
deliverMessage(message, ALL_SUBSCRIBING_MSG, data, immediateExceptions);
|
|
2180
|
+
};
|
|
2181
|
+
}
|
|
2182
|
+
|
|
2183
|
+
function hasDirectSubscribersFor( message ) {
|
|
2184
|
+
var topic = String( message ),
|
|
2185
|
+
found = Boolean(Object.prototype.hasOwnProperty.call( messages, topic ) && hasKeys(messages[topic]));
|
|
2186
|
+
|
|
2187
|
+
return found;
|
|
2188
|
+
}
|
|
2189
|
+
|
|
2190
|
+
function messageHasSubscribers( message ){
|
|
2191
|
+
var topic = String( message ),
|
|
2192
|
+
found = hasDirectSubscribersFor(topic) || hasDirectSubscribersFor(ALL_SUBSCRIBING_MSG),
|
|
2193
|
+
position = topic.lastIndexOf( '.' );
|
|
2194
|
+
|
|
2195
|
+
while ( !found && position !== -1 ){
|
|
2196
|
+
topic = topic.substr( 0, position );
|
|
2197
|
+
position = topic.lastIndexOf( '.' );
|
|
2198
|
+
found = hasDirectSubscribersFor(topic);
|
|
2199
|
+
}
|
|
2200
|
+
|
|
2201
|
+
return found;
|
|
2202
|
+
}
|
|
2203
|
+
|
|
2204
|
+
function publish( message, data, sync, immediateExceptions ){
|
|
2205
|
+
message = (typeof message === 'symbol') ? message.toString() : message;
|
|
2206
|
+
|
|
2207
|
+
var deliver = createDeliveryFunction( message, data, immediateExceptions ),
|
|
2208
|
+
hasSubscribers = messageHasSubscribers( message );
|
|
2209
|
+
|
|
2210
|
+
if ( !hasSubscribers ){
|
|
2211
|
+
return false;
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2214
|
+
if ( sync === true ){
|
|
2215
|
+
deliver();
|
|
2216
|
+
} else {
|
|
2217
|
+
setTimeout( deliver, 0 );
|
|
2218
|
+
}
|
|
2219
|
+
return true;
|
|
2220
|
+
}
|
|
2221
|
+
|
|
2222
|
+
/**
|
|
2223
|
+
* Publishes the message, passing the data to it's subscribers
|
|
2224
|
+
* @function
|
|
2225
|
+
* @alias publish
|
|
2226
|
+
* @param { String } message The message to publish
|
|
2227
|
+
* @param {} data The data to pass to subscribers
|
|
2228
|
+
* @return { Boolean }
|
|
2229
|
+
*/
|
|
2230
|
+
PubSub.publish = function( message, data ){
|
|
2231
|
+
return publish( message, data, false, PubSub.immediateExceptions );
|
|
2232
|
+
};
|
|
2233
|
+
|
|
2234
|
+
/**
|
|
2235
|
+
* Publishes the message synchronously, passing the data to it's subscribers
|
|
2236
|
+
* @function
|
|
2237
|
+
* @alias publishSync
|
|
2238
|
+
* @param { String } message The message to publish
|
|
2239
|
+
* @param {} data The data to pass to subscribers
|
|
2240
|
+
* @return { Boolean }
|
|
2241
|
+
*/
|
|
2242
|
+
PubSub.publishSync = function( message, data ){
|
|
2243
|
+
return publish( message, data, true, PubSub.immediateExceptions );
|
|
2244
|
+
};
|
|
2245
|
+
|
|
2246
|
+
/**
|
|
2247
|
+
* Subscribes the passed function to the passed message. Every returned token is unique and should be stored if you need to unsubscribe
|
|
2248
|
+
* @function
|
|
2249
|
+
* @alias subscribe
|
|
2250
|
+
* @param { String } message The message to subscribe to
|
|
2251
|
+
* @param { Function } func The function to call when a new message is published
|
|
2252
|
+
* @return { String }
|
|
2253
|
+
*/
|
|
2254
|
+
PubSub.subscribe = function( message, func ){
|
|
2255
|
+
if ( typeof func !== 'function'){
|
|
2256
|
+
return false;
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2259
|
+
message = (typeof message === 'symbol') ? message.toString() : message;
|
|
2260
|
+
|
|
2261
|
+
// message is not registered yet
|
|
2262
|
+
if ( !Object.prototype.hasOwnProperty.call( messages, message ) ){
|
|
2263
|
+
messages[message] = {};
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
// forcing token as String, to allow for future expansions without breaking usage
|
|
2267
|
+
// and allow for easy use as key names for the 'messages' object
|
|
2268
|
+
var token = 'uid_' + String(++lastUid);
|
|
2269
|
+
messages[message][token] = func;
|
|
2270
|
+
|
|
2271
|
+
// return token for unsubscribing
|
|
2272
|
+
return token;
|
|
2273
|
+
};
|
|
2274
|
+
|
|
2275
|
+
PubSub.subscribeAll = function( func ){
|
|
2276
|
+
return PubSub.subscribe(ALL_SUBSCRIBING_MSG, func);
|
|
2277
|
+
};
|
|
2278
|
+
|
|
2279
|
+
/**
|
|
2280
|
+
* Subscribes the passed function to the passed message once
|
|
2281
|
+
* @function
|
|
2282
|
+
* @alias subscribeOnce
|
|
2283
|
+
* @param { String } message The message to subscribe to
|
|
2284
|
+
* @param { Function } func The function to call when a new message is published
|
|
2285
|
+
* @return { PubSub }
|
|
2286
|
+
*/
|
|
2287
|
+
PubSub.subscribeOnce = function( message, func ){
|
|
2288
|
+
var token = PubSub.subscribe( message, function(){
|
|
2289
|
+
// before func apply, unsubscribe message
|
|
2290
|
+
PubSub.unsubscribe( token );
|
|
2291
|
+
func.apply( this, arguments );
|
|
2292
|
+
});
|
|
2293
|
+
return PubSub;
|
|
2294
|
+
};
|
|
2295
|
+
|
|
2296
|
+
/**
|
|
2297
|
+
* Clears all subscriptions
|
|
2298
|
+
* @function
|
|
2299
|
+
* @public
|
|
2300
|
+
* @alias clearAllSubscriptions
|
|
2301
|
+
*/
|
|
2302
|
+
PubSub.clearAllSubscriptions = function clearAllSubscriptions(){
|
|
2303
|
+
messages = {};
|
|
2304
|
+
};
|
|
2305
|
+
|
|
2306
|
+
/**
|
|
2307
|
+
* Clear subscriptions by the topic
|
|
2308
|
+
* @function
|
|
2309
|
+
* @public
|
|
2310
|
+
* @alias clearAllSubscriptions
|
|
2311
|
+
* @return { int }
|
|
2312
|
+
*/
|
|
2313
|
+
PubSub.clearSubscriptions = function clearSubscriptions(topic){
|
|
2314
|
+
var m;
|
|
2315
|
+
for (m in messages){
|
|
2316
|
+
if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){
|
|
2317
|
+
delete messages[m];
|
|
2318
|
+
}
|
|
2319
|
+
}
|
|
2320
|
+
};
|
|
2321
|
+
|
|
2322
|
+
/**
|
|
2323
|
+
Count subscriptions by the topic
|
|
2324
|
+
* @function
|
|
2325
|
+
* @public
|
|
2326
|
+
* @alias countSubscriptions
|
|
2327
|
+
* @return { Array }
|
|
2328
|
+
*/
|
|
2329
|
+
PubSub.countSubscriptions = function countSubscriptions(topic){
|
|
2330
|
+
var m;
|
|
2331
|
+
// eslint-disable-next-line no-unused-vars
|
|
2332
|
+
var token;
|
|
2333
|
+
var count = 0;
|
|
2334
|
+
for (m in messages) {
|
|
2335
|
+
if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0) {
|
|
2336
|
+
for (token in messages[m]) {
|
|
2337
|
+
count++;
|
|
2338
|
+
}
|
|
2339
|
+
break;
|
|
2340
|
+
}
|
|
2341
|
+
}
|
|
2342
|
+
return count;
|
|
2343
|
+
};
|
|
2344
|
+
|
|
2345
|
+
|
|
2346
|
+
/**
|
|
2347
|
+
Gets subscriptions by the topic
|
|
2348
|
+
* @function
|
|
2349
|
+
* @public
|
|
2350
|
+
* @alias getSubscriptions
|
|
2351
|
+
*/
|
|
2352
|
+
PubSub.getSubscriptions = function getSubscriptions(topic){
|
|
2353
|
+
var m;
|
|
2354
|
+
var list = [];
|
|
2355
|
+
for (m in messages){
|
|
2356
|
+
if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){
|
|
2357
|
+
list.push(m);
|
|
2358
|
+
}
|
|
2359
|
+
}
|
|
2360
|
+
return list;
|
|
2361
|
+
};
|
|
2362
|
+
|
|
2363
|
+
/**
|
|
2364
|
+
* Removes subscriptions
|
|
2365
|
+
*
|
|
2366
|
+
* - When passed a token, removes a specific subscription.
|
|
2367
|
+
*
|
|
2368
|
+
* - When passed a function, removes all subscriptions for that function
|
|
2369
|
+
*
|
|
2370
|
+
* - When passed a topic, removes all subscriptions for that topic (hierarchy)
|
|
2371
|
+
* @function
|
|
2372
|
+
* @public
|
|
2373
|
+
* @alias subscribeOnce
|
|
2374
|
+
* @param { String | Function } value A token, function or topic to unsubscribe from
|
|
2375
|
+
* @example // Unsubscribing with a token
|
|
2376
|
+
* var token = PubSub.subscribe('mytopic', myFunc);
|
|
2377
|
+
* PubSub.unsubscribe(token);
|
|
2378
|
+
* @example // Unsubscribing with a function
|
|
2379
|
+
* PubSub.unsubscribe(myFunc);
|
|
2380
|
+
* @example // Unsubscribing from a topic
|
|
2381
|
+
* PubSub.unsubscribe('mytopic');
|
|
2382
|
+
*/
|
|
2383
|
+
PubSub.unsubscribe = function(value){
|
|
2384
|
+
var descendantTopicExists = function(topic) {
|
|
2385
|
+
var m;
|
|
2386
|
+
for ( m in messages ){
|
|
2387
|
+
if ( Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0 ){
|
|
2388
|
+
// a descendant of the topic exists:
|
|
2389
|
+
return true;
|
|
2390
|
+
}
|
|
2391
|
+
}
|
|
2392
|
+
|
|
2393
|
+
return false;
|
|
2394
|
+
},
|
|
2395
|
+
isTopic = typeof value === 'string' && ( Object.prototype.hasOwnProperty.call(messages, value) || descendantTopicExists(value) ),
|
|
2396
|
+
isToken = !isTopic && typeof value === 'string',
|
|
2397
|
+
isFunction = typeof value === 'function',
|
|
2398
|
+
result = false,
|
|
2399
|
+
m, message, t;
|
|
2400
|
+
|
|
2401
|
+
if (isTopic){
|
|
2402
|
+
PubSub.clearSubscriptions(value);
|
|
2403
|
+
return;
|
|
2404
|
+
}
|
|
2405
|
+
|
|
2406
|
+
for ( m in messages ){
|
|
2407
|
+
if ( Object.prototype.hasOwnProperty.call( messages, m ) ){
|
|
2408
|
+
message = messages[m];
|
|
2409
|
+
|
|
2410
|
+
if ( isToken && message[value] ){
|
|
2411
|
+
delete message[value];
|
|
2412
|
+
result = value;
|
|
2413
|
+
// tokens are unique, so we can just stop here
|
|
2414
|
+
break;
|
|
2415
|
+
}
|
|
2416
|
+
|
|
2417
|
+
if (isFunction) {
|
|
2418
|
+
for ( t in message ){
|
|
2419
|
+
if (Object.prototype.hasOwnProperty.call(message, t) && message[t] === value){
|
|
2420
|
+
delete message[t];
|
|
2421
|
+
result = true;
|
|
2422
|
+
}
|
|
2423
|
+
}
|
|
2424
|
+
}
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
|
|
2428
|
+
return result;
|
|
2429
|
+
};
|
|
2430
|
+
}));
|
|
2431
|
+
} (pubsub, pubsub.exports));
|
|
2432
|
+
|
|
2433
|
+
var pubsubExports = pubsub.exports;
|
|
2434
|
+
var PubSub = /*@__PURE__*/getDefaultExportFromCjs$1(pubsubExports);
|
|
2435
|
+
|
|
2436
|
+
const SDK_EVENTS = {
|
|
2437
|
+
TX_RECEIPT_ACCEPTED: 'TX_RECEIPT_ACCEPTED'
|
|
2438
|
+
};
|
|
2439
|
+
/**
|
|
2440
|
+
* Represents a message bus that allows publishing and subscribing to topics.
|
|
2441
|
+
*/
|
|
2442
|
+
class MessageBus {
|
|
2443
|
+
/**
|
|
2444
|
+
* Private constructor for the MessageBus class.
|
|
2445
|
+
*/
|
|
2446
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
2447
|
+
constructor() { }
|
|
2448
|
+
/**
|
|
2449
|
+
* Returns the singleton instance of the MessageBus class.
|
|
2450
|
+
* If the instance doesn't exist, it creates a new one.
|
|
2451
|
+
* @returns The singleton instance of the MessageBus class.
|
|
2452
|
+
*/
|
|
2453
|
+
static getInstance() {
|
|
2454
|
+
// If the instance doesn't exist, create it
|
|
2455
|
+
if (!MessageBus.instance) {
|
|
2456
|
+
MessageBus.instance = new MessageBus();
|
|
2457
|
+
}
|
|
2458
|
+
// Return the instance
|
|
2459
|
+
return MessageBus.instance;
|
|
2460
|
+
}
|
|
2461
|
+
/**
|
|
2462
|
+
* Publishes a message to the specified topic.
|
|
2463
|
+
*
|
|
2464
|
+
* @template T - The type of data being published.
|
|
2465
|
+
* @param {SdkTopic} topic - The topic to publish the message to.
|
|
2466
|
+
* @param {T} data - The data to be published.
|
|
2467
|
+
* @returns {boolean} - Returns true if the message was successfully published, false otherwise.
|
|
2468
|
+
*/
|
|
2469
|
+
publish(topic, data) {
|
|
2470
|
+
return PubSub.publish(topic.toString(), data);
|
|
2471
|
+
}
|
|
2472
|
+
/**
|
|
2473
|
+
* Subscribes to a specific topic and registers a callback function to be executed when a message is published.
|
|
2474
|
+
*
|
|
2475
|
+
* @param topic - The topic to subscribe to.
|
|
2476
|
+
* @param callback - The callback function to be executed when a message is published.
|
|
2477
|
+
*/
|
|
2478
|
+
subscribe(topic, callback) {
|
|
2479
|
+
return PubSub.subscribe(topic.toString(), (_, data) => callback(data));
|
|
2480
|
+
}
|
|
2481
|
+
/**
|
|
2482
|
+
* Subscribes to a specific topic and registers a callback function to be executed when a message is published.
|
|
2483
|
+
* The callback function is executed only once.
|
|
2484
|
+
*
|
|
2485
|
+
* @param topic - The topic to subscribe to.
|
|
2486
|
+
* @param callback - The callback function to be executed when a message is published.
|
|
2487
|
+
*/
|
|
2488
|
+
subscribeOnce(topic, callback) {
|
|
2489
|
+
PubSub.subscribeOnce(topic.toString(), (_, data) => callback(data));
|
|
2490
|
+
}
|
|
2491
|
+
/**
|
|
2492
|
+
* Unsubscribes from a specific topic in the message bus.
|
|
2493
|
+
*
|
|
2494
|
+
* @param topic - The topic to unsubscribe from.
|
|
2495
|
+
* @returns A string or boolean indicating the success of the unsubscribe operation.
|
|
2496
|
+
*/
|
|
2497
|
+
unsubscribe(topic) {
|
|
2498
|
+
return PubSub.unsubscribe(topic.toString());
|
|
2499
|
+
}
|
|
2500
|
+
}
|
|
2501
|
+
|
|
2502
|
+
const bigIntCompare = (a, b) => {
|
|
2503
|
+
if (a < b)
|
|
2504
|
+
return -1;
|
|
2505
|
+
if (a > b)
|
|
2506
|
+
return 1;
|
|
2507
|
+
return 0;
|
|
2508
|
+
};
|
|
2509
|
+
|
|
2510
|
+
/**
|
|
2511
|
+
* Provider for Ed25519 keys
|
|
2512
|
+
* @public
|
|
2513
|
+
* @class Ed25519Provider
|
|
2514
|
+
* @implements IKeyProvider interface
|
|
2515
|
+
*/
|
|
2516
|
+
class Ed25519Provider {
|
|
2517
|
+
/**
|
|
2518
|
+
* Creates an instance of Ed25519Provider.
|
|
2519
|
+
* @param {KmsKeyType} keyType - kms key type
|
|
2520
|
+
* @param {AbstractPrivateKeyStore} keyStore - key store for kms
|
|
2521
|
+
*/
|
|
2522
|
+
constructor(keyType, _keyStore) {
|
|
2523
|
+
this.keyType = keyType;
|
|
2524
|
+
this._keyStore = _keyStore;
|
|
2525
|
+
}
|
|
2526
|
+
/**
|
|
2527
|
+
* generates a ed25519 key from a seed phrase
|
|
2528
|
+
* @param {Uint8Array} seed - byte array seed
|
|
2529
|
+
* @returns {Promise<KmsKeyId>} kms key identifier
|
|
2530
|
+
*/
|
|
2531
|
+
async newPrivateKeyFromSeed(seed) {
|
|
2532
|
+
if (seed.length !== 32) {
|
|
2533
|
+
throw new Error('Seed should be 32 bytes');
|
|
2534
|
+
}
|
|
2535
|
+
const publicKey = ed25519$1.getPublicKey(seed);
|
|
2536
|
+
const kmsId = {
|
|
2537
|
+
type: this.keyType,
|
|
2538
|
+
id: keyPath(this.keyType, bytesToHex$2(publicKey))
|
|
2539
|
+
};
|
|
2540
|
+
await this._keyStore.importKey({
|
|
2541
|
+
alias: kmsId.id,
|
|
2542
|
+
key: bytesToHex$2(seed)
|
|
2543
|
+
});
|
|
2544
|
+
return kmsId;
|
|
2545
|
+
}
|
|
2546
|
+
/**
|
|
2547
|
+
* Gets public key by kmsKeyId
|
|
2548
|
+
* @param {KmsKeyId} keyId - key identifier
|
|
2549
|
+
* @returns {Promise<string>} Public key as a hex string
|
|
2550
|
+
*/
|
|
2551
|
+
async publicKey(keyId) {
|
|
2552
|
+
const privateKeyHex = await this.privateKey(keyId);
|
|
2553
|
+
const publicKey = ed25519$1.getPublicKey(privateKeyHex);
|
|
2554
|
+
return bytesToHex$2(publicKey);
|
|
2555
|
+
}
|
|
2556
|
+
/**
|
|
2557
|
+
* signs prepared payload of size,
|
|
2558
|
+
* with a key id
|
|
2559
|
+
* @param {KmsKeyId} keyId - key identifier
|
|
2560
|
+
* @param {Uint8Array} data - data to sign (32 bytes)
|
|
2561
|
+
* @returns {Promise<Uint8Array>} signature
|
|
2562
|
+
*/
|
|
2563
|
+
async sign(keyId, data) {
|
|
2564
|
+
const privateKeyHex = await this.privateKey(keyId);
|
|
2565
|
+
return ed25519$1.sign(data, privateKeyHex);
|
|
2566
|
+
}
|
|
2567
|
+
/**
|
|
2568
|
+
* Retrieves the private key for a given keyId from the key store.
|
|
2569
|
+
* @param {KmsKeyId} keyId - The identifier of the key to retrieve.
|
|
2570
|
+
* @returns {Promise<string>} The private key associated with the keyId.
|
|
2571
|
+
*/
|
|
2572
|
+
async privateKey(keyId) {
|
|
2573
|
+
return this._keyStore.get({ alias: keyId.id });
|
|
2574
|
+
}
|
|
2575
|
+
}
|
|
2576
|
+
|
|
242
2577
|
var elliptic$1 = {};
|
|
243
2578
|
|
|
244
2579
|
var name = "elliptic";
|
|
@@ -7052,7 +9387,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
7052
9387
|
for (var j = 0; j < 80; j++) {
|
|
7053
9388
|
var T = sum32(
|
|
7054
9389
|
rotl32(
|
|
7055
|
-
sum32_4(A, f$3(j, B, C, D), msg[r[j] + start], K$
|
|
9390
|
+
sum32_4(A, f$3(j, B, C, D), msg[r[j] + start], K$1(j)),
|
|
7056
9391
|
s$1[j]),
|
|
7057
9392
|
E);
|
|
7058
9393
|
A = E;
|
|
@@ -7099,7 +9434,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
7099
9434
|
return x ^ (y | (~z));
|
|
7100
9435
|
}
|
|
7101
9436
|
|
|
7102
|
-
function K$
|
|
9437
|
+
function K$1(j) {
|
|
7103
9438
|
if (j <= 15)
|
|
7104
9439
|
return 0x00000000;
|
|
7105
9440
|
else if (j <= 31)
|
|
@@ -9629,7 +11964,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
9629
11964
|
base58flickr: base58flickr
|
|
9630
11965
|
});
|
|
9631
11966
|
|
|
9632
|
-
const base64$
|
|
11967
|
+
const base64$1 = rfc4648({
|
|
9633
11968
|
prefix: 'm',
|
|
9634
11969
|
name: 'base64',
|
|
9635
11970
|
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
|
@@ -9641,7 +11976,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
9641
11976
|
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
|
|
9642
11977
|
bitsPerChar: 6
|
|
9643
11978
|
});
|
|
9644
|
-
const base64url
|
|
11979
|
+
const base64url = rfc4648({
|
|
9645
11980
|
prefix: 'u',
|
|
9646
11981
|
name: 'base64url',
|
|
9647
11982
|
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
|
|
@@ -9654,11 +11989,11 @@ var PolygonIdSdk = (function (exports) {
|
|
|
9654
11989
|
bitsPerChar: 6
|
|
9655
11990
|
});
|
|
9656
11991
|
|
|
9657
|
-
var base64$
|
|
11992
|
+
var base64$2 = /*#__PURE__*/Object.freeze({
|
|
9658
11993
|
__proto__: null,
|
|
9659
|
-
base64: base64$
|
|
11994
|
+
base64: base64$1,
|
|
9660
11995
|
base64pad: base64pad,
|
|
9661
|
-
base64url: base64url
|
|
11996
|
+
base64url: base64url,
|
|
9662
11997
|
base64urlpad: base64urlpad
|
|
9663
11998
|
});
|
|
9664
11999
|
|
|
@@ -9709,7 +12044,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
9709
12044
|
...base32$1,
|
|
9710
12045
|
...base36$1,
|
|
9711
12046
|
...base58,
|
|
9712
|
-
...base64$
|
|
12047
|
+
...base64$2,
|
|
9713
12048
|
...base256emoji$1
|
|
9714
12049
|
};
|
|
9715
12050
|
|
|
@@ -13027,27 +15362,27 @@ var PolygonIdSdk = (function (exports) {
|
|
|
13027
15362
|
var bech32 = dist$1.bech32 = getLibraryFromEncoding('bech32');
|
|
13028
15363
|
dist$1.bech32m = getLibraryFromEncoding('bech32m');
|
|
13029
15364
|
|
|
13030
|
-
function bytesToBase64url
|
|
15365
|
+
function bytesToBase64url(b) {
|
|
13031
15366
|
return toString$6(b, 'base64url');
|
|
13032
15367
|
}
|
|
13033
|
-
function base64ToBytes
|
|
15368
|
+
function base64ToBytes(s) {
|
|
13034
15369
|
const inputBase64Url = s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
13035
15370
|
return fromString$1(inputBase64Url, 'base64url');
|
|
13036
15371
|
}
|
|
13037
|
-
function base58ToBytes
|
|
15372
|
+
function base58ToBytes(s) {
|
|
13038
15373
|
return fromString$1(s, 'base58btc');
|
|
13039
15374
|
}
|
|
13040
|
-
function bytesToBase58
|
|
15375
|
+
function bytesToBase58(b) {
|
|
13041
15376
|
return toString$6(b, 'base58btc');
|
|
13042
15377
|
}
|
|
13043
|
-
function hexToBytes$
|
|
15378
|
+
function hexToBytes$1(s) {
|
|
13044
15379
|
const input = s.startsWith('0x') ? s.substring(2) : s;
|
|
13045
15380
|
return fromString$1(input.toLowerCase(), 'base16');
|
|
13046
15381
|
}
|
|
13047
|
-
function decodeBase64url
|
|
13048
|
-
return toString$6(base64ToBytes
|
|
15382
|
+
function decodeBase64url(s) {
|
|
15383
|
+
return toString$6(base64ToBytes(s));
|
|
13049
15384
|
}
|
|
13050
|
-
function bytesToHex$
|
|
15385
|
+
function bytesToHex$1(b) {
|
|
13051
15386
|
return toString$6(b, 'base16');
|
|
13052
15387
|
}
|
|
13053
15388
|
function stringToBytes$1(s) {
|
|
@@ -13070,7 +15405,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
13070
15405
|
jose[64] = recoveryParam;
|
|
13071
15406
|
}
|
|
13072
15407
|
|
|
13073
|
-
return bytesToBase64url
|
|
15408
|
+
return bytesToBase64url(jose);
|
|
13074
15409
|
}
|
|
13075
15410
|
function leftpad(data, size = 64) {
|
|
13076
15411
|
if (data.length === size) return data;
|
|
@@ -13146,1137 +15481,451 @@ var PolygonIdSdk = (function (exports) {
|
|
|
13146
15481
|
if (carry > 0) this._length[j] -= 0x0100000000 * carry;
|
|
13147
15482
|
}
|
|
13148
15483
|
|
|
13149
|
-
return this;
|
|
13150
|
-
};
|
|
13151
|
-
|
|
13152
|
-
this.digest = () => {
|
|
13153
|
-
if (this._finalized) throw new Error('Digest already called');
|
|
13154
|
-
this._finalized = true;
|
|
13155
|
-
|
|
13156
|
-
const digest = this._digest(); // reset state
|
|
13157
|
-
|
|
13158
|
-
|
|
13159
|
-
this._block.fill(0);
|
|
13160
|
-
|
|
13161
|
-
this._blockOffset = 0;
|
|
13162
|
-
|
|
13163
|
-
for (let i = 0; i < 4; ++i) this._length[i] = 0;
|
|
13164
|
-
|
|
13165
|
-
return digest;
|
|
13166
|
-
};
|
|
13167
|
-
|
|
13168
|
-
this._update = () => {
|
|
13169
|
-
const words = new Array(16);
|
|
13170
|
-
const temp = new DataView(this._block.buffer);
|
|
13171
|
-
|
|
13172
|
-
for (let j = 0; j < 16; ++j) words[j] = words[j] = temp.getInt32(j * 4, true);
|
|
13173
|
-
|
|
13174
|
-
let al = this._a | 0;
|
|
13175
|
-
let bl = this._b | 0;
|
|
13176
|
-
let cl = this._c | 0;
|
|
13177
|
-
let dl = this._d | 0;
|
|
13178
|
-
let el = this._e | 0;
|
|
13179
|
-
let ar = this._a | 0;
|
|
13180
|
-
let br = this._b | 0;
|
|
13181
|
-
let cr = this._c | 0;
|
|
13182
|
-
let dr = this._d | 0;
|
|
13183
|
-
let er = this._e | 0; // computation
|
|
13184
|
-
|
|
13185
|
-
for (let i = 0; i < 80; i += 1) {
|
|
13186
|
-
let tl;
|
|
13187
|
-
let tr;
|
|
13188
|
-
|
|
13189
|
-
if (i < 16) {
|
|
13190
|
-
tl = fn1(al, bl, cl, dl, el, words[zl$1[i]], hl$1[0], sl$1[i]);
|
|
13191
|
-
tr = fn5(ar, br, cr, dr, er, words[zr$1[i]], hr$1[0], sr$1[i]);
|
|
13192
|
-
} else if (i < 32) {
|
|
13193
|
-
tl = fn2(al, bl, cl, dl, el, words[zl$1[i]], hl$1[1], sl$1[i]);
|
|
13194
|
-
tr = fn4(ar, br, cr, dr, er, words[zr$1[i]], hr$1[1], sr$1[i]);
|
|
13195
|
-
} else if (i < 48) {
|
|
13196
|
-
tl = fn3(al, bl, cl, dl, el, words[zl$1[i]], hl$1[2], sl$1[i]);
|
|
13197
|
-
tr = fn3(ar, br, cr, dr, er, words[zr$1[i]], hr$1[2], sr$1[i]);
|
|
13198
|
-
} else if (i < 64) {
|
|
13199
|
-
tl = fn4(al, bl, cl, dl, el, words[zl$1[i]], hl$1[3], sl$1[i]);
|
|
13200
|
-
tr = fn2(ar, br, cr, dr, er, words[zr$1[i]], hr$1[3], sr$1[i]);
|
|
13201
|
-
} else {
|
|
13202
|
-
// if (i<80) {
|
|
13203
|
-
tl = fn5(al, bl, cl, dl, el, words[zl$1[i]], hl$1[4], sl$1[i]);
|
|
13204
|
-
tr = fn1(ar, br, cr, dr, er, words[zr$1[i]], hr$1[4], sr$1[i]);
|
|
13205
|
-
}
|
|
13206
|
-
|
|
13207
|
-
al = el;
|
|
13208
|
-
el = dl;
|
|
13209
|
-
dl = rotl(cl, 10);
|
|
13210
|
-
cl = bl;
|
|
13211
|
-
bl = tl;
|
|
13212
|
-
ar = er;
|
|
13213
|
-
er = dr;
|
|
13214
|
-
dr = rotl(cr, 10);
|
|
13215
|
-
cr = br;
|
|
13216
|
-
br = tr;
|
|
13217
|
-
} // update state
|
|
13218
|
-
|
|
13219
|
-
|
|
13220
|
-
const t = this._b + cl + dr | 0;
|
|
13221
|
-
this._b = this._c + dl + er | 0;
|
|
13222
|
-
this._c = this._d + el + ar | 0;
|
|
13223
|
-
this._d = this._e + al + br | 0;
|
|
13224
|
-
this._e = this._a + bl + cr | 0;
|
|
13225
|
-
this._a = t;
|
|
13226
|
-
};
|
|
13227
|
-
|
|
13228
|
-
this._digest = () => {
|
|
13229
|
-
// create padding and handle blocks
|
|
13230
|
-
this._block[this._blockOffset++] = 0x80;
|
|
13231
|
-
|
|
13232
|
-
if (this._blockOffset > 56) {
|
|
13233
|
-
this._block.fill(0, this._blockOffset, 64);
|
|
13234
|
-
|
|
13235
|
-
this._update();
|
|
13236
|
-
|
|
13237
|
-
this._blockOffset = 0;
|
|
13238
|
-
}
|
|
13239
|
-
|
|
13240
|
-
this._block.fill(0, this._blockOffset, 56);
|
|
13241
|
-
|
|
13242
|
-
const temp = new DataView(this._block.buffer);
|
|
13243
|
-
temp.setUint32(56, this._length[0], true);
|
|
13244
|
-
temp.setUint32(60, this._length[1], true);
|
|
13245
|
-
this._block = new Uint8Array(temp.buffer);
|
|
13246
|
-
|
|
13247
|
-
this._update(); // produce result
|
|
13248
|
-
|
|
13249
|
-
|
|
13250
|
-
const buffer = new DataView(new Uint8Array(20).buffer);
|
|
13251
|
-
buffer.setInt32(0, this._a, true);
|
|
13252
|
-
buffer.setInt32(4, this._b, true);
|
|
13253
|
-
buffer.setInt32(8, this._c, true);
|
|
13254
|
-
buffer.setInt32(12, this._d, true);
|
|
13255
|
-
buffer.setInt32(16, this._e, true);
|
|
13256
|
-
return new Uint8Array(buffer.buffer);
|
|
13257
|
-
};
|
|
13258
|
-
|
|
13259
|
-
this._block = new Uint8Array(blockSize);
|
|
13260
|
-
this._blockSize = blockSize;
|
|
13261
|
-
this._blockOffset = 0;
|
|
13262
|
-
this._length = [0, 0, 0, 0];
|
|
13263
|
-
this._finalized = false;
|
|
13264
|
-
}
|
|
13265
|
-
|
|
13266
|
-
}
|
|
13267
|
-
|
|
13268
|
-
function sha256$1(payload) {
|
|
13269
|
-
const data = typeof payload === 'string' ? fromString$1(payload) : payload;
|
|
13270
|
-
return sha256$2.hash(data);
|
|
13271
|
-
}
|
|
13272
|
-
function keccak(data) {
|
|
13273
|
-
return new Uint8Array(sha3$2.keccak_256.arrayBuffer(data));
|
|
13274
|
-
}
|
|
13275
|
-
function toEthereumAddress(hexPublicKey) {
|
|
13276
|
-
const hashInput = fromString$1(hexPublicKey.slice(2), 'base16');
|
|
13277
|
-
return `0x${toString$6(keccak(hashInput).slice(-20), 'base16')}`;
|
|
13278
|
-
}
|
|
13279
|
-
function ripemd160(data) {
|
|
13280
|
-
return new Ripemd160().update(data).digest();
|
|
13281
|
-
}
|
|
13282
|
-
|
|
13283
|
-
const secp256k1$1$1 = new elliptic.ec('secp256k1');
|
|
13284
|
-
/**
|
|
13285
|
-
* Creates a configured signer function for signing data using the ES256K (secp256k1 + sha256) algorithm.
|
|
13286
|
-
*
|
|
13287
|
-
* The signing function itself takes the data as a `Uint8Array` or `string` and returns a `base64Url`-encoded signature
|
|
13288
|
-
*
|
|
13289
|
-
* @example
|
|
13290
|
-
* ```typescript
|
|
13291
|
-
* const sign: Signer = ES256KSigner(process.env.PRIVATE_KEY)
|
|
13292
|
-
* const signature: string = await sign(data)
|
|
13293
|
-
* ```
|
|
13294
|
-
*
|
|
13295
|
-
* @param {String} privateKey a private key as `Uint8Array`
|
|
13296
|
-
* @param {Boolean} recoverable an optional flag to add the recovery param to the generated signatures
|
|
13297
|
-
* @return {Function} a configured signer function `(data: string | Uint8Array): Promise<string>`
|
|
13298
|
-
*/
|
|
13299
|
-
|
|
13300
|
-
function ES256KSigner(privateKey, recoverable = false) {
|
|
13301
|
-
const privateKeyBytes = privateKey;
|
|
13302
|
-
|
|
13303
|
-
if (privateKeyBytes.length !== 32) {
|
|
13304
|
-
throw new Error(`bad_key: Invalid private key format. Expecting 32 bytes, but got ${privateKeyBytes.length}`);
|
|
13305
|
-
}
|
|
13306
|
-
|
|
13307
|
-
const keyPair = secp256k1$1$1.keyFromPrivate(privateKeyBytes);
|
|
13308
|
-
return function (data) {
|
|
13309
|
-
try {
|
|
13310
|
-
const {
|
|
13311
|
-
r,
|
|
13312
|
-
s,
|
|
13313
|
-
recoveryParam
|
|
13314
|
-
} = keyPair.sign(sha256$1(data));
|
|
13315
|
-
return Promise.resolve(toJose({
|
|
13316
|
-
r: leftpad(r.toString('hex')),
|
|
13317
|
-
s: leftpad(s.toString('hex')),
|
|
13318
|
-
recoveryParam
|
|
13319
|
-
}, recoverable));
|
|
13320
|
-
} catch (e) {
|
|
13321
|
-
return Promise.reject(e);
|
|
13322
|
-
}
|
|
13323
|
-
};
|
|
13324
|
-
}
|
|
13325
|
-
|
|
13326
|
-
new elliptic.ec('p256');
|
|
13327
|
-
|
|
13328
|
-
const publicKeyToAddress$1 = (publicKey, otherAddress) => {
|
|
13329
|
-
// Use the same version/prefix byte as the given address.
|
|
13330
|
-
const version = toString$6(base58ToBytes$1(otherAddress).slice(0, 1), 'hex');
|
|
13331
|
-
const publicKeyBuffer = fromString$1(publicKey, 'hex');
|
|
13332
|
-
const publicKeyHash = ripemd160(sha256$1(publicKeyBuffer));
|
|
13333
|
-
const step1 = version + toString$6(publicKeyHash, 'hex');
|
|
13334
|
-
const step2 = sha256$1(fromString$1(step1, 'hex'));
|
|
13335
|
-
const step3 = sha256$1(step2);
|
|
13336
|
-
const checksum = toString$6(step3, 'hex').substring(0, 8);
|
|
13337
|
-
const step4 = step1 + checksum;
|
|
13338
|
-
return bytesToBase58$1(fromString$1(step4, 'hex'));
|
|
13339
|
-
};
|
|
13340
|
-
|
|
13341
|
-
const EC = elliptic.ec;
|
|
13342
|
-
const publicKeyToAddress = (publicKey, prefix) => {
|
|
13343
|
-
const ec = new EC('secp256k1');
|
|
13344
|
-
const compressedPublicKey = ec.keyFromPublic(publicKey, 'hex').getPublic().encode('hex', true);
|
|
13345
|
-
const publicKeyBuffer = fromString$1(compressedPublicKey, 'hex');
|
|
13346
|
-
const hash = ripemd160(sha256$1(publicKeyBuffer));
|
|
13347
|
-
const words = bech32.toWords(hash);
|
|
13348
|
-
return bech32.encode(prefix, words).replace(prefix, '');
|
|
13349
|
-
};
|
|
13350
|
-
|
|
13351
|
-
const verifyBlockchainAccountId = (publicKey, blockchainAccountId) => {
|
|
13352
|
-
if (blockchainAccountId) {
|
|
13353
|
-
const chain = blockchainAccountId.split(':');
|
|
13354
|
-
|
|
13355
|
-
switch (chain[0]) {
|
|
13356
|
-
case 'bip122':
|
|
13357
|
-
chain[chain.length - 1] = publicKeyToAddress$1(publicKey, chain[chain.length - 1]);
|
|
13358
|
-
break;
|
|
13359
|
-
|
|
13360
|
-
case 'cosmos':
|
|
13361
|
-
chain[chain.length - 1] = publicKeyToAddress(publicKey, chain[1]);
|
|
13362
|
-
break;
|
|
13363
|
-
|
|
13364
|
-
case 'eip155':
|
|
13365
|
-
chain[chain.length - 1] = toEthereumAddress(publicKey);
|
|
13366
|
-
break;
|
|
13367
|
-
|
|
13368
|
-
default:
|
|
13369
|
-
return false;
|
|
13370
|
-
}
|
|
13371
|
-
|
|
13372
|
-
return chain.join(':').toLowerCase() === blockchainAccountId.toLowerCase();
|
|
13373
|
-
}
|
|
13374
|
-
|
|
13375
|
-
return false;
|
|
13376
|
-
};
|
|
13377
|
-
|
|
13378
|
-
const secp256k1$2 = new elliptic.ec('secp256k1');
|
|
13379
|
-
const secp256r1 = new elliptic.ec('p256'); // converts a JOSE signature to it's components
|
|
13380
|
-
|
|
13381
|
-
function toSignatureObject(signature, recoverable = false) {
|
|
13382
|
-
const rawSig = base64ToBytes$1(signature);
|
|
13383
|
-
|
|
13384
|
-
if (rawSig.length !== (recoverable ? 65 : 64)) {
|
|
13385
|
-
throw new Error('wrong signature length');
|
|
13386
|
-
}
|
|
13387
|
-
|
|
13388
|
-
const r = bytesToHex$2(rawSig.slice(0, 32));
|
|
13389
|
-
const s = bytesToHex$2(rawSig.slice(32, 64));
|
|
13390
|
-
const sigObj = {
|
|
13391
|
-
r,
|
|
13392
|
-
s
|
|
13393
|
-
};
|
|
13394
|
-
|
|
13395
|
-
if (recoverable) {
|
|
13396
|
-
sigObj.recoveryParam = rawSig[64];
|
|
13397
|
-
}
|
|
13398
|
-
|
|
13399
|
-
return sigObj;
|
|
13400
|
-
}
|
|
13401
|
-
|
|
13402
|
-
function extractPublicKeyBytes$1(pk) {
|
|
13403
|
-
if (pk.publicKeyBase58) {
|
|
13404
|
-
return base58ToBytes$1(pk.publicKeyBase58);
|
|
13405
|
-
} else if (pk.publicKeyBase64) {
|
|
13406
|
-
return base64ToBytes$1(pk.publicKeyBase64);
|
|
13407
|
-
} else if (pk.publicKeyHex) {
|
|
13408
|
-
return hexToBytes$2(pk.publicKeyHex);
|
|
13409
|
-
} else if (pk.publicKeyJwk && pk.publicKeyJwk.crv === 'secp256k1' && pk.publicKeyJwk.x && pk.publicKeyJwk.y) {
|
|
13410
|
-
return hexToBytes$2(secp256k1$2.keyFromPublic({
|
|
13411
|
-
x: bytesToHex$2(base64ToBytes$1(pk.publicKeyJwk.x)),
|
|
13412
|
-
y: bytesToHex$2(base64ToBytes$1(pk.publicKeyJwk.y))
|
|
13413
|
-
}).getPublic('hex'));
|
|
13414
|
-
} else if (pk.publicKeyJwk && pk.publicKeyJwk.crv === 'P-256' && pk.publicKeyJwk.x && pk.publicKeyJwk.y) {
|
|
13415
|
-
return hexToBytes$2(secp256r1.keyFromPublic({
|
|
13416
|
-
x: bytesToHex$2(base64ToBytes$1(pk.publicKeyJwk.x)),
|
|
13417
|
-
y: bytesToHex$2(base64ToBytes$1(pk.publicKeyJwk.y))
|
|
13418
|
-
}).getPublic('hex'));
|
|
13419
|
-
} else if (pk.publicKeyJwk && pk.publicKeyJwk.kty === 'OKP' && pk.publicKeyJwk.crv === 'Ed25519' && pk.publicKeyJwk.x) {
|
|
13420
|
-
return base64ToBytes$1(pk.publicKeyJwk.x);
|
|
13421
|
-
} else if (pk.publicKeyMultibase) {
|
|
13422
|
-
const {
|
|
13423
|
-
base16,
|
|
13424
|
-
base58btc,
|
|
13425
|
-
base64,
|
|
13426
|
-
base64url
|
|
13427
|
-
} = bases;
|
|
13428
|
-
const baseDecoder = base16.decoder.or(base58btc.decoder.or(base64.decoder.or(base64url.decoder)));
|
|
13429
|
-
return baseDecoder.decode(pk.publicKeyMultibase);
|
|
13430
|
-
}
|
|
13431
|
-
|
|
13432
|
-
return new Uint8Array();
|
|
13433
|
-
}
|
|
13434
|
-
|
|
13435
|
-
function verifyES256(data, signature, authenticators) {
|
|
13436
|
-
const hash = sha256$1(data);
|
|
13437
|
-
const sigObj = toSignatureObject(signature);
|
|
13438
|
-
const fullPublicKeys = authenticators.filter(({
|
|
13439
|
-
ethereumAddress,
|
|
13440
|
-
blockchainAccountId
|
|
13441
|
-
}) => {
|
|
13442
|
-
return typeof ethereumAddress === 'undefined' && typeof blockchainAccountId === 'undefined';
|
|
13443
|
-
});
|
|
13444
|
-
const signer = fullPublicKeys.find(pk => {
|
|
13445
|
-
try {
|
|
13446
|
-
const pubBytes = extractPublicKeyBytes$1(pk);
|
|
13447
|
-
return secp256r1.keyFromPublic(pubBytes).verify(hash, sigObj);
|
|
13448
|
-
} catch (err) {
|
|
13449
|
-
return false;
|
|
13450
|
-
}
|
|
13451
|
-
});
|
|
13452
|
-
if (!signer) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
13453
|
-
return signer;
|
|
13454
|
-
}
|
|
13455
|
-
function verifyES256K(data, signature, authenticators) {
|
|
13456
|
-
const hash = sha256$1(data);
|
|
13457
|
-
const sigObj = toSignatureObject(signature);
|
|
13458
|
-
const fullPublicKeys = authenticators.filter(({
|
|
13459
|
-
ethereumAddress,
|
|
13460
|
-
blockchainAccountId
|
|
13461
|
-
}) => {
|
|
13462
|
-
return typeof ethereumAddress === 'undefined' && typeof blockchainAccountId === 'undefined';
|
|
13463
|
-
});
|
|
13464
|
-
const blockchainAddressKeys = authenticators.filter(({
|
|
13465
|
-
ethereumAddress,
|
|
13466
|
-
blockchainAccountId
|
|
13467
|
-
}) => {
|
|
13468
|
-
return typeof ethereumAddress !== 'undefined' || typeof blockchainAccountId !== 'undefined';
|
|
13469
|
-
});
|
|
13470
|
-
let signer = fullPublicKeys.find(pk => {
|
|
13471
|
-
try {
|
|
13472
|
-
const pubBytes = extractPublicKeyBytes$1(pk);
|
|
13473
|
-
return secp256k1$2.keyFromPublic(pubBytes).verify(hash, sigObj);
|
|
13474
|
-
} catch (err) {
|
|
13475
|
-
return false;
|
|
13476
|
-
}
|
|
13477
|
-
});
|
|
13478
|
-
|
|
13479
|
-
if (!signer && blockchainAddressKeys.length > 0) {
|
|
13480
|
-
signer = verifyRecoverableES256K(data, signature, blockchainAddressKeys);
|
|
13481
|
-
}
|
|
13482
|
-
|
|
13483
|
-
if (!signer) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
13484
|
-
return signer;
|
|
13485
|
-
}
|
|
13486
|
-
function verifyRecoverableES256K(data, signature, authenticators) {
|
|
13487
|
-
let signatures;
|
|
13488
|
-
|
|
13489
|
-
if (signature.length > 86) {
|
|
13490
|
-
signatures = [toSignatureObject(signature, true)];
|
|
13491
|
-
} else {
|
|
13492
|
-
const so = toSignatureObject(signature, false);
|
|
13493
|
-
signatures = [{ ...so,
|
|
13494
|
-
recoveryParam: 0
|
|
13495
|
-
}, { ...so,
|
|
13496
|
-
recoveryParam: 1
|
|
13497
|
-
}];
|
|
13498
|
-
}
|
|
13499
|
-
|
|
13500
|
-
const checkSignatureAgainstSigner = sigObj => {
|
|
13501
|
-
const hash = sha256$1(data); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13502
|
-
|
|
13503
|
-
const recoveredKey = secp256k1$2.recoverPubKey(hash, sigObj, sigObj.recoveryParam);
|
|
13504
|
-
const recoveredPublicKeyHex = recoveredKey.encode('hex');
|
|
13505
|
-
const recoveredCompressedPublicKeyHex = recoveredKey.encode('hex', true);
|
|
13506
|
-
const recoveredAddress = toEthereumAddress(recoveredPublicKeyHex).toLowerCase();
|
|
13507
|
-
const signer = authenticators.find(pk => {
|
|
13508
|
-
var _pk$ethereumAddress, _pk$blockchainAccount, _pk$blockchainAccount2;
|
|
13509
|
-
|
|
13510
|
-
const keyHex = bytesToHex$2(extractPublicKeyBytes$1(pk));
|
|
13511
|
-
return keyHex === recoveredPublicKeyHex || keyHex === recoveredCompressedPublicKeyHex || ((_pk$ethereumAddress = pk.ethereumAddress) == null ? void 0 : _pk$ethereumAddress.toLowerCase()) === recoveredAddress || ((_pk$blockchainAccount = pk.blockchainAccountId) == null ? void 0 : (_pk$blockchainAccount2 = _pk$blockchainAccount.split('@eip155')) == null ? void 0 : _pk$blockchainAccount2[0].toLowerCase()) === recoveredAddress || // CAIP-2
|
|
13512
|
-
verifyBlockchainAccountId(recoveredPublicKeyHex, pk.blockchainAccountId) // CAIP-10
|
|
13513
|
-
;
|
|
13514
|
-
});
|
|
13515
|
-
return signer;
|
|
13516
|
-
};
|
|
13517
|
-
|
|
13518
|
-
const signer = signatures.map(checkSignatureAgainstSigner).filter(key => typeof key !== 'undefined');
|
|
13519
|
-
if (signer.length === 0) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
13520
|
-
return signer[0];
|
|
13521
|
-
}
|
|
13522
|
-
function verifyEd25519(data, signature, authenticators) {
|
|
13523
|
-
const clear = stringToBytes$1(data);
|
|
13524
|
-
const sig = base64ToBytes$1(signature);
|
|
13525
|
-
const signer = authenticators.find(pk => {
|
|
13526
|
-
return ed25519.verify(extractPublicKeyBytes$1(pk), clear, sig);
|
|
13527
|
-
});
|
|
13528
|
-
if (!signer) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
13529
|
-
return signer;
|
|
13530
|
-
}
|
|
13531
|
-
const algorithms = {
|
|
13532
|
-
ES256: verifyES256,
|
|
13533
|
-
ES256K: verifyES256K,
|
|
13534
|
-
// This is a non-standard algorithm but retained for backwards compatibility
|
|
13535
|
-
// see https://github.com/decentralized-identity/did-jwt/issues/146
|
|
13536
|
-
'ES256K-R': verifyRecoverableES256K,
|
|
13537
|
-
// This is actually incorrect but retained for backwards compatibility
|
|
13538
|
-
// see https://github.com/decentralized-identity/did-jwt/issues/130
|
|
13539
|
-
Ed25519: verifyEd25519,
|
|
13540
|
-
EdDSA: verifyEd25519
|
|
13541
|
-
};
|
|
13542
|
-
|
|
13543
|
-
function VerifierAlgorithm(alg) {
|
|
13544
|
-
const impl = algorithms[alg];
|
|
13545
|
-
if (!impl) throw new Error(`not_supported: Unsupported algorithm ${alg}`);
|
|
13546
|
-
return impl;
|
|
13547
|
-
}
|
|
13548
|
-
|
|
13549
|
-
VerifierAlgorithm.toSignatureObject = toSignatureObject;
|
|
13550
|
-
|
|
13551
|
-
function decodeJWS(jws) {
|
|
13552
|
-
const parts = jws.match(/^([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)$/);
|
|
13553
|
-
|
|
13554
|
-
if (parts) {
|
|
13555
|
-
return {
|
|
13556
|
-
header: JSON.parse(decodeBase64url$1(parts[1])),
|
|
13557
|
-
payload: parts[2],
|
|
13558
|
-
signature: parts[3],
|
|
13559
|
-
data: `${parts[1]}.${parts[2]}`
|
|
13560
|
-
};
|
|
13561
|
-
}
|
|
13562
|
-
|
|
13563
|
-
throw new Error('invalid_argument: Incorrect format JWS');
|
|
13564
|
-
}
|
|
13565
|
-
|
|
13566
|
-
function verifyJWSDecoded({
|
|
13567
|
-
header,
|
|
13568
|
-
data,
|
|
13569
|
-
signature
|
|
13570
|
-
}, pubKeys) {
|
|
13571
|
-
if (!Array.isArray(pubKeys)) pubKeys = [pubKeys];
|
|
13572
|
-
const signer = VerifierAlgorithm(header.alg)(data, signature, pubKeys);
|
|
13573
|
-
return signer;
|
|
13574
|
-
}
|
|
13575
|
-
/**
|
|
13576
|
-
* Verifies given JWS. If the JWS is valid, returns the public key that was
|
|
13577
|
-
* used to sign the JWS, or throws an `Error` if none of the `pubKeys` match.
|
|
13578
|
-
*
|
|
13579
|
-
* @example
|
|
13580
|
-
* const pubKey = verifyJWS('eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJyZXF1Z....', { publicKeyHex: '0x12341...' })
|
|
13581
|
-
*
|
|
13582
|
-
* @param {String} jws A JWS string to verify
|
|
13583
|
-
* @param {Array<VerificationMethod> | VerificationMethod} pubKeys The public keys used to verify the JWS
|
|
13584
|
-
* @return {VerificationMethod} The public key used to sign the JWS
|
|
13585
|
-
*/
|
|
13586
|
-
|
|
13587
|
-
|
|
13588
|
-
function verifyJWS(jws, pubKeys) {
|
|
13589
|
-
const jwsDecoded = decodeJWS(jws);
|
|
13590
|
-
return verifyJWSDecoded(jwsDecoded, pubKeys);
|
|
13591
|
-
}
|
|
13592
|
-
|
|
13593
|
-
typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
|
|
13594
|
-
|
|
13595
|
-
/* eslint-disable @typescript-eslint/strict-boolean-expressions */
|
|
13596
|
-
function parse$2(string, encoding, opts) {
|
|
13597
|
-
var _opts$out;
|
|
13598
|
-
|
|
13599
|
-
if (opts === void 0) {
|
|
13600
|
-
opts = {};
|
|
13601
|
-
}
|
|
13602
|
-
|
|
13603
|
-
// Build the character lookup table:
|
|
13604
|
-
if (!encoding.codes) {
|
|
13605
|
-
encoding.codes = {};
|
|
13606
|
-
|
|
13607
|
-
for (var i = 0; i < encoding.chars.length; ++i) {
|
|
13608
|
-
encoding.codes[encoding.chars[i]] = i;
|
|
13609
|
-
}
|
|
13610
|
-
} // The string must have a whole number of bytes:
|
|
13611
|
-
|
|
13612
|
-
|
|
13613
|
-
if (!opts.loose && string.length * encoding.bits & 7) {
|
|
13614
|
-
throw new SyntaxError('Invalid padding');
|
|
13615
|
-
} // Count the padding bytes:
|
|
13616
|
-
|
|
13617
|
-
|
|
13618
|
-
var end = string.length;
|
|
13619
|
-
|
|
13620
|
-
while (string[end - 1] === '=') {
|
|
13621
|
-
--end; // If we get a whole number of bytes, there is too much padding:
|
|
13622
|
-
|
|
13623
|
-
if (!opts.loose && !((string.length - end) * encoding.bits & 7)) {
|
|
13624
|
-
throw new SyntaxError('Invalid padding');
|
|
13625
|
-
}
|
|
13626
|
-
} // Allocate the output:
|
|
13627
|
-
|
|
13628
|
-
|
|
13629
|
-
var out = new ((_opts$out = opts.out) != null ? _opts$out : Uint8Array)(end * encoding.bits / 8 | 0); // Parse the data:
|
|
13630
|
-
|
|
13631
|
-
var bits = 0; // Number of bits currently in the buffer
|
|
13632
|
-
|
|
13633
|
-
var buffer = 0; // Bits waiting to be written out, MSB first
|
|
13634
|
-
|
|
13635
|
-
var written = 0; // Next byte to write
|
|
13636
|
-
|
|
13637
|
-
for (var _i = 0; _i < end; ++_i) {
|
|
13638
|
-
// Read one character from the string:
|
|
13639
|
-
var value = encoding.codes[string[_i]];
|
|
13640
|
-
|
|
13641
|
-
if (value === undefined) {
|
|
13642
|
-
throw new SyntaxError('Invalid character ' + string[_i]);
|
|
13643
|
-
} // Append the bits to the buffer:
|
|
13644
|
-
|
|
13645
|
-
|
|
13646
|
-
buffer = buffer << encoding.bits | value;
|
|
13647
|
-
bits += encoding.bits; // Write out some bits if the buffer has a byte's worth:
|
|
13648
|
-
|
|
13649
|
-
if (bits >= 8) {
|
|
13650
|
-
bits -= 8;
|
|
13651
|
-
out[written++] = 0xff & buffer >> bits;
|
|
13652
|
-
}
|
|
13653
|
-
} // Verify that we have received just enough bits:
|
|
13654
|
-
|
|
13655
|
-
|
|
13656
|
-
if (bits >= encoding.bits || 0xff & buffer << 8 - bits) {
|
|
13657
|
-
throw new SyntaxError('Unexpected end of data');
|
|
13658
|
-
}
|
|
13659
|
-
|
|
13660
|
-
return out;
|
|
13661
|
-
}
|
|
13662
|
-
function stringify$1(data, encoding, opts) {
|
|
13663
|
-
if (opts === void 0) {
|
|
13664
|
-
opts = {};
|
|
13665
|
-
}
|
|
13666
|
-
|
|
13667
|
-
var _opts = opts,
|
|
13668
|
-
_opts$pad = _opts.pad,
|
|
13669
|
-
pad = _opts$pad === void 0 ? true : _opts$pad;
|
|
13670
|
-
var mask = (1 << encoding.bits) - 1;
|
|
13671
|
-
var out = '';
|
|
13672
|
-
var bits = 0; // Number of bits currently in the buffer
|
|
15484
|
+
return this;
|
|
15485
|
+
};
|
|
13673
15486
|
|
|
13674
|
-
|
|
15487
|
+
this.digest = () => {
|
|
15488
|
+
if (this._finalized) throw new Error('Digest already called');
|
|
15489
|
+
this._finalized = true;
|
|
13675
15490
|
|
|
13676
|
-
|
|
13677
|
-
// Slurp data into the buffer:
|
|
13678
|
-
buffer = buffer << 8 | 0xff & data[i];
|
|
13679
|
-
bits += 8; // Write out as much as we can:
|
|
15491
|
+
const digest = this._digest(); // reset state
|
|
13680
15492
|
|
|
13681
|
-
while (bits > encoding.bits) {
|
|
13682
|
-
bits -= encoding.bits;
|
|
13683
|
-
out += encoding.chars[mask & buffer >> bits];
|
|
13684
|
-
}
|
|
13685
|
-
} // Partial character:
|
|
13686
15493
|
|
|
15494
|
+
this._block.fill(0);
|
|
13687
15495
|
|
|
13688
|
-
|
|
13689
|
-
out += encoding.chars[mask & buffer << encoding.bits - bits];
|
|
13690
|
-
} // Add padding characters until we hit a byte boundary:
|
|
15496
|
+
this._blockOffset = 0;
|
|
13691
15497
|
|
|
15498
|
+
for (let i = 0; i < 4; ++i) this._length[i] = 0;
|
|
13692
15499
|
|
|
13693
|
-
|
|
13694
|
-
|
|
13695
|
-
out += '=';
|
|
13696
|
-
}
|
|
13697
|
-
}
|
|
15500
|
+
return digest;
|
|
15501
|
+
};
|
|
13698
15502
|
|
|
13699
|
-
|
|
13700
|
-
|
|
13701
|
-
|
|
13702
|
-
chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
|
13703
|
-
bits: 6
|
|
13704
|
-
};
|
|
13705
|
-
var base64UrlEncoding = {
|
|
13706
|
-
chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
|
|
13707
|
-
bits: 6
|
|
13708
|
-
};
|
|
13709
|
-
var base64$1 = {
|
|
13710
|
-
parse: function parse$1(string, opts) {
|
|
13711
|
-
return parse$2(string, base64Encoding, opts);
|
|
13712
|
-
},
|
|
13713
|
-
stringify: function stringify$1$1(data, opts) {
|
|
13714
|
-
return stringify$1(data, base64Encoding, opts);
|
|
13715
|
-
}
|
|
13716
|
-
};
|
|
13717
|
-
var base64url = {
|
|
13718
|
-
parse: function parse$1(string, opts) {
|
|
13719
|
-
return parse$2(string, base64UrlEncoding, opts);
|
|
13720
|
-
},
|
|
13721
|
-
stringify: function stringify$1$1(data, opts) {
|
|
13722
|
-
return stringify$1(data, base64UrlEncoding, opts);
|
|
13723
|
-
}
|
|
13724
|
-
};
|
|
15503
|
+
this._update = () => {
|
|
15504
|
+
const words = new Array(16);
|
|
15505
|
+
const temp = new DataView(this._block.buffer);
|
|
13725
15506
|
|
|
13726
|
-
|
|
13727
|
-
const byteDecoder = new TextDecoder();
|
|
13728
|
-
function bytesToBase64url(b, opts = { pad: false }) {
|
|
13729
|
-
return base64url.stringify(b, opts);
|
|
13730
|
-
}
|
|
13731
|
-
function base64ToBytes(s, opts = { loose: true }) {
|
|
13732
|
-
return base64$1.parse(s, opts);
|
|
13733
|
-
}
|
|
13734
|
-
function bytesToBase64(b, opts = { pad: false }) {
|
|
13735
|
-
return base64$1.stringify(b, opts);
|
|
13736
|
-
}
|
|
13737
|
-
function base64UrlToBytes(s, opts = { loose: true }) {
|
|
13738
|
-
const inputBase64Url = s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
13739
|
-
return base64url.parse(inputBase64Url, opts);
|
|
13740
|
-
}
|
|
13741
|
-
function base58ToBytes(s) {
|
|
13742
|
-
return yE(s);
|
|
13743
|
-
}
|
|
13744
|
-
function bytesToBase58(b) {
|
|
13745
|
-
return uE(b);
|
|
13746
|
-
}
|
|
13747
|
-
function hexToBytes$1(s) {
|
|
13748
|
-
const input = s.startsWith('0x') ? s.substring(2) : s;
|
|
13749
|
-
return b$5.decodeString(input.toLowerCase());
|
|
13750
|
-
}
|
|
13751
|
-
function encodeBase64url(s, opts = { pad: false }) {
|
|
13752
|
-
return base64url.stringify(byteEncoder.encode(s), opts);
|
|
13753
|
-
}
|
|
13754
|
-
function decodeBase64url(s, opts = { loose: true }) {
|
|
13755
|
-
return byteDecoder.decode(base64url.parse(s, opts));
|
|
13756
|
-
}
|
|
13757
|
-
function bytesToHex$1(b) {
|
|
13758
|
-
return b$5.encodeString(b);
|
|
13759
|
-
}
|
|
15507
|
+
for (let j = 0; j < 16; ++j) words[j] = words[j] = temp.getInt32(j * 4, true);
|
|
13760
15508
|
|
|
13761
|
-
|
|
13762
|
-
|
|
13763
|
-
|
|
13764
|
-
|
|
13765
|
-
|
|
13766
|
-
|
|
13767
|
-
|
|
13768
|
-
|
|
13769
|
-
|
|
13770
|
-
|
|
13771
|
-
const propertyOperators = Object.keys(subjectProperty);
|
|
13772
|
-
const subjectPropertyResult = {};
|
|
13773
|
-
for (const operatorKey of propertyOperators) {
|
|
13774
|
-
if (typeof otherSubjectProperty[operatorKey] !== 'undefined') {
|
|
13775
|
-
const operatorValue1 = subjectProperty[operatorKey];
|
|
13776
|
-
const operatorValue2 = otherSubjectProperty[operatorKey];
|
|
13777
|
-
subjectPropertyResult[operatorKey] = [
|
|
13778
|
-
...new Set([
|
|
13779
|
-
...(subjectPropertyResult[operatorKey] ?? []),
|
|
13780
|
-
operatorValue1,
|
|
13781
|
-
...(Array.isArray(operatorValue2) ? operatorValue2 : [operatorValue2])
|
|
13782
|
-
])
|
|
13783
|
-
];
|
|
13784
|
-
}
|
|
13785
|
-
else {
|
|
13786
|
-
subjectPropertyResult[operatorKey] = subjectProperty[operatorKey];
|
|
13787
|
-
}
|
|
13788
|
-
}
|
|
13789
|
-
result[key] = {
|
|
13790
|
-
...otherCredSubject[key],
|
|
13791
|
-
...subjectPropertyResult
|
|
13792
|
-
};
|
|
13793
|
-
}
|
|
13794
|
-
}
|
|
13795
|
-
// Add remaining keys from obj2
|
|
13796
|
-
result = { ...credSubject, ...otherCredSubject, ...result };
|
|
13797
|
-
return result;
|
|
13798
|
-
}
|
|
15509
|
+
let al = this._a | 0;
|
|
15510
|
+
let bl = this._b | 0;
|
|
15511
|
+
let cl = this._c | 0;
|
|
15512
|
+
let dl = this._d | 0;
|
|
15513
|
+
let el = this._e | 0;
|
|
15514
|
+
let ar = this._a | 0;
|
|
15515
|
+
let br = this._b | 0;
|
|
15516
|
+
let cr = this._c | 0;
|
|
15517
|
+
let dr = this._d | 0;
|
|
15518
|
+
let er = this._e | 0; // computation
|
|
13799
15519
|
|
|
13800
|
-
const i$1=32,n$1=1,o$1=new Uint8Array(65),h$2="empty",l$2=32,w$2=BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");w$2-BigInt("1");function g$2(t,e,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return "m"===i?s:"a"===i?s.call(t):s?s.value:e.get(t)}function v$2(t,e,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!n:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return "a"===s?n.call(t,i):n?n.value=i:e.set(t,i),i}const p$2=t=>t<w$2,b$3=(t,e)=>t.every(((t,i)=>t===e[i])),m$2=t=>t.slice().reverse(),x$2=t=>"0b"+t.reduce(((t,e)=>t+e.toString(2).padStart(8,"0")),""),A$2=(t,e)=>0!=(t[parseInt((e/8).toString())]&1<<e%8),I$2=(t,e)=>0!=(t[t.length-parseInt(""+e/8)-1]&1<<e%8),k$1=(t,e)=>{t[t.length-parseInt(""+e/8)-1]|=1<<e%8;},S$2="0123456789abcdef",R$1=t=>{const e=new Array(2*t.length);let i=0;return t.forEach((t=>{e[i]=S$2[parseInt((t>>4).toString(10))],e[i+1]=S$2[parseInt((15&t).toString(10))],i+=2;})),e.join("")},B$2=t=>new Uint8Array(2*t.length).map(((e,i)=>t.charCodeAt(i))),N$1=(t,e)=>{const i=new Array(t);for(let s=0;s<t;s+=1)i[s]=A$2(e,s);return i},U$1=t=>{const e=new ArrayBuffer(i$1*t.length),s=new Uint8Array(e);return t.forEach(((t,e)=>{s.set(t.value,e*i$1);})),s},K$1=t=>{const e=BigInt(256),s=new Uint8Array(i$1);let n=0;for(;t>BigInt(0);)s[31-n]=Number(t%e),t/=e,n+=1;return s};let V$1 = class V{constructor(t){if(t?.length){if(t.length!==i$1)throw new Error(`Expected 32 bytes, found ${t.length} bytes`);this.bytes=t;}else this.bytes=new Uint8Array(i$1);}get value(){return this.bytes}set value(t){if(t.length!==i$1)throw `Expected 32 bytes, found ${t.length} bytes`;this.bytes=m$2(t);}string(){return this.bigInt().toString(10)}hex(){return R$1(this.bytes)}equals(t){return b$3(this.value,t.value)}bigInt(){const t=m$2(this.value);return BigInt(x$2(t))}static fromString(t){try{return V.fromBigInt(BigInt(t))}catch(e){const i=JSON.parse(t),s=Uint8Array.from(Object.values(i.bytes));return new V(s)}}static fromBigInt(t){if(!p$2(t))throw new Error("NewBigIntFromHashBytes: Value not inside the Finite Field");const e=K$1(t);return new V(m$2(e))}static fromHex(e){return e?new V(b$5.decodeString(e)):M$2}toJSON(){return this.string()}};const M$2=new V$1,O$1=t=>V$1.fromString(t),_$1=t=>{const i=$$2.hash(t);return V$1.fromBigInt(i)},J$1=(t,i)=>{const s=$$2.hash([...i,t]);return V$1.fromBigInt(s)},P$1=(t,e)=>{for(let i=t.length;i<e;i+=1)t.push(M$2);return t};var T$2,H$1;let j$1 = class j{constructor(t){T$2.set(this,void 0),H$1.set(this,void 0),this.prefix=t,v$2(this,T$2,{},"f"),v$2(this,H$1,M$2,"f");}async get(t){const e=new Uint8Array([...this.prefix,...t]);return g$2(this,T$2,"f")[e.toString()]?g$2(this,T$2,"f")[e.toString()]:void 0}async put(t,e){const i=new Uint8Array([...this.prefix,...t]);g$2(this,T$2,"f")[i.toString()]=e;}async getRoot(){return g$2(this,H$1,"f")}async setRoot(t){v$2(this,H$1,t,"f");}};T$2=new WeakMap,H$1=new WeakMap;const z$2=async(t,e)=>J$1(BigInt(1),[t.bigInt(),e.bigInt()]),C$2=(t,e,i)=>{const s=new Uint8Array(65),n=K$1(e.bigInt()),r=K$1(i.bigInt());s[0]=t;for(let t=1;t<33;t+=1)s[t]=n[t-1];for(let t=33;t<=65;t+=1)s[t]=r[t-33];return s};var q$1,F$1,D$1,G$1;let Q$1 = class Q{constructor(t,e){q$1.set(this,void 0),this.type=1,this.entry=[t,e],v$2(this,q$1,M$2,"f");}async getKey(){return g$2(this,q$1,"f")===M$2?await z$2(this.entry[0],this.entry[1]):g$2(this,q$1,"f")}get value(){return C$2(this.type,this.entry[0],this.entry[1])}get string(){return `Leaf I:${this.entry[0]} D:${this.entry[1]}`}};q$1=new WeakMap;let X$1 = class X{constructor(t,e){F$1.set(this,void 0),this.type=0,this.childL=t,this.childR=e,v$2(this,F$1,M$2,"f");}async getKey(){return g$2(this,F$1,"f")===M$2?_$1([this.childL.bigInt(),this.childR.bigInt()]):g$2(this,F$1,"f")}get value(){return C$2(this.type,this.childL,this.childR)}get string(){return `Middle L:${this.childL} R:${this.childR}`}};F$1=new WeakMap;let Y$1 = class Y{constructor(){D$1.set(this,void 0),this.type=2,v$2(this,D$1,M$2,"f");}async getKey(){return M$2}get value(){return o$1}get string(){return h$2}};D$1=new WeakMap;let Z$1 = class Z{constructor(t){this._prefix=t,G$1.set(this,void 0);const e=localStorage.getItem(R$1(t));if(e){const t=JSON.parse(e);v$2(this,G$1,new V$1(Uint8Array.from(t)),"f");}else v$2(this,G$1,M$2,"f");}async get(t){const e=new Uint8Array([...this._prefix,...t]),i=R$1(e),s=localStorage.getItem(i);if(null===s)return;const n=JSON.parse(s);switch(n.type){case 2:return new Y$1;case 0:const t=new V$1(Uint8Array.from(n.childL)),e=new V$1(Uint8Array.from(n.childR));return new X$1(t,e);case 1:const i=new V$1(Uint8Array.from(n.entry[0])),s=new V$1(Uint8Array.from(n.entry[1]));return new Q$1(i,s)}throw `error: value found for key ${R$1(e)} is not of type Node`}async put(t,e){const i=new Uint8Array([...this._prefix,...t]),s=R$1(i),n={type:e.type};e instanceof X$1?(n.childL=Array.from(e.childL.bytes),n.childR=Array.from(e.childR.bytes)):e instanceof Q$1&&(n.entry=[Array.from(e.entry[0].bytes),Array.from(e.entry[1].bytes)]);const r=JSON.stringify(n);localStorage.setItem(s,r);}async getRoot(){return g$2(this,G$1,"f")}async setRoot(t){v$2(this,G$1,t,"f"),localStorage.setItem(R$1(this._prefix),JSON.stringify(Array.from(t.bytes)));}};function tt$1(t){return new Promise(((e,i)=>{t.oncomplete=t.onsuccess=()=>e(t.result),t.onabort=t.onerror=()=>i(t.error);}))}function et$1(t,e){const i=indexedDB.open(t);i.onupgradeneeded=()=>i.result.createObjectStore(e);const s=tt$1(i);return (t,i)=>s.then((s=>i(s.transaction(e,t).objectStore(e))))}let it$1;function st$1(){return it$1||(it$1=et$1("keyval-store","keyval")),it$1}function nt$1(t,e=st$1()){return e("readonly",(e=>tt$1(e.get(t))))}function rt$1(t,e,i=st$1()){return i("readwrite",(i=>(i.put(e,t),tt$1(i.transaction))))}var at$1;G$1=new WeakMap;let lt$2 = class lt{constructor(t,e){this._prefix=t,at$1.set(this,void 0),v$2(this,at$1,M$2,"f"),this._prefixHash=R$1(t),this._store=et$1(`${e??lt.storageName}-db`,lt.storageName);}async get(t){const e=new Uint8Array([...this._prefix,...t]),i=R$1(e),s=await nt$1(i,this._store);if(null!=s){if(2===s.type)return new Y$1;if(0===s.type){const t=new V$1(Uint8Array.from(s.childL.bytes)),e=new V$1(Uint8Array.from(s.childR.bytes));return new X$1(t,e)}if(1===s.type){const t=new V$1(Uint8Array.from(s.entry[0].bytes)),e=new V$1(Uint8Array.from(s.entry[1].bytes));return new Q$1(t,e)}throw new Error(`error: value found for key ${i} is not of type Node`)}}async put(t,e){const i=new Uint8Array([...this._prefix,...t]),s=R$1(i);await rt$1(s,e,this._store);}async getRoot(){if(!g$2(this,at$1,"f").equals(M$2))return g$2(this,at$1,"f");const t=await nt$1(this._prefixHash,this._store);return v$2(this,at$1,t?new V$1(t.bytes):M$2,"f"),g$2(this,at$1,"f")}async setRoot(t){await rt$1(this._prefixHash,t,this._store),v$2(this,at$1,t,"f");}};at$1=new WeakMap,lt$2.storageName="merkle-tree";const vt$1=t=>t.map((t=>t.bigInt())),pt$1=t=>{const e=vt$1(t.data.value);let i=!0;return e.forEach((t=>{p$2(t)||(i=!1);})),i},mt$1="Key not found in the MerkleTree",At$1="reached maximum level of the merkle tree",It$1="found an invalid node in the DB",Rt$1="the entry index already exists in the tree",Lt$1="Merkle Tree not writable",Bt$1="key not found";let Nt$1 = class Nt{constructor(t=M$2,e=[],i=M$2,s=M$2,n=!1,r=M$2,a=M$2,o=0){this.root=t,this.siblings=e,this.oldKey=i,this.oldValue=s,this.isOld0=n,this.key=r,this.value=a,this.fnc=o;}};let Ut$1 = class Ut{constructor(t=M$2,e=M$2,i=[],s=M$2,n=M$2,r=M$2,a=M$2,o=!1,h=0){this.oldRoot=t,this.newRoot=e,this.siblings=i,this.oldKey=s,this.oldValue=n,this.newKey=r,this.newValue=a,this.isOld0=o,this.fnc=h;}};const Et$1="non-existence proof being checked against hIndex equal to nodeAux";let Kt$1 = class Kt{constructor(t){this.existence=t?.existence??!1,this.depth=t?.siblings.length??0,this.nodeAux=t?.nodeAux;const{siblings:e,notEmpties:i}=this.reduceSiblings(t?.siblings);this.siblings=e,this.notEmpties=i;}bytes(){let t=2+this.notEmpties.length+l$2*this.siblings.length;void 0!==this.nodeAux&&(t+=64);const e=new ArrayBuffer(t),i=new Uint8Array(e);this.existence||(i[0]|=1),i[1]=this.depth,i.set(this.notEmpties,2);const s=U$1(this.siblings);return i.set(s,this.notEmpties.length+2),void 0!==this.nodeAux&&(i[0]|=2,i.set(this.nodeAux.key.value,i.length-64),i.set(this.nodeAux.value.value,i.length-32)),i}toJSON(){return {existence:this.existence,siblings:this.allSiblings().map((t=>t.toJSON())),nodeAux:this.nodeAux?{key:this.nodeAux.key.toJSON(),value:this.nodeAux.value.toJSON()}:void 0}}reduceSiblings(t){const e=[],i=new Uint8Array(30);if(!t)return {siblings:e,notEmpties:i};for(let s=0;s<t.length;s++){const n=t[s];JSON.stringify(t[s])!==JSON.stringify(M$2)&&(k$1(i,s),e.push(n));}return {notEmpties:i,siblings:e}}static fromJSON(t){let e;t.nodeAux&&(e={key:V$1.fromString(t.nodeAux.key),value:V$1.fromString(t.nodeAux.value)});const i=t.existence??!1,s=t.siblings.map((t=>V$1.fromString(t)));return new Kt({existence:i,nodeAux:e,siblings:s})}allSiblings(){return Kt.buildAllSiblings(this.depth,this.notEmpties,this.siblings)}static buildAllSiblings(t,e,i){let s=0;const n=[];for(let r=0;r<t;r+=1)I$2(e,r)?(n.push(i[s]),s+=1):n.push(M$2);return n}};const Mt$1=async(t,e,i,s)=>{try{const n=await Wt$1(e,i,s);return b$3(t.value,n.value)}catch(t){if(t===Et$1)return !1;throw t}},Wt$1=async(t,e,i)=>{const s=V$1.fromBigInt(e),n=V$1.fromBigInt(i);let r;if(t.existence)r=await z$2(s,n);else if(void 0===t.nodeAux)r=M$2;else {const e=t.nodeAux;if(b$3(s.value,e.key.value))throw Et$1;r=await z$2(e.key,e.value);}const a=t.allSiblings(),o=N$1(a.length,s.value);for(let t=a.length-1;t>=0;t-=1)r=o[t]?await new X$1(a[t],r).getKey():await new X$1(r,a[t]).getKey();return r};var $t$1,Ot$1,_t$1,Jt$1;let Pt$1 = class Pt{constructor(t,e,i){$t$1.set(this,void 0),Ot$1.set(this,void 0),_t$1.set(this,void 0),Jt$1.set(this,void 0),v$2(this,$t$1,t,"f"),v$2(this,_t$1,e,"f"),v$2(this,Jt$1,i,"f");}async root(){return g$2(this,Ot$1,"f")||v$2(this,Ot$1,await g$2(this,$t$1,"f").getRoot(),"f"),g$2(this,Ot$1,"f")}get maxLevels(){return g$2(this,Jt$1,"f")}async add(t,e){if(!g$2(this,_t$1,"f"))throw Lt$1;v$2(this,Ot$1,await this.root(),"f");const i=V$1.fromBigInt(t),s=V$1.fromBigInt(e),n=new Q$1(i,s),r=N$1(this.maxLevels,i.value),a=await this.addLeaf(n,g$2(this,Ot$1,"f"),0,r);v$2(this,Ot$1,a,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));}async updateNode(t){if(!g$2(this,_t$1,"f"))throw Lt$1;if(2===t.type)return await t.getKey();const e=await t.getKey();return await g$2(this,$t$1,"f").put(e.value,t),e}async addNode(t){if(!g$2(this,_t$1,"f"))throw Lt$1;if(2===t.type)return await t.getKey();const e=await t.getKey();return await g$2(this,$t$1,"f").put(e.value,t),e}async addEntry(t){if(!g$2(this,_t$1,"f"))throw Lt$1;if(!pt$1(t))throw "elements not inside the finite field over r";v$2(this,Ot$1,await g$2(this,$t$1,"f").getRoot(),"f");const e=await t.hIndex(),i=await t.hValue(),s=new Q$1(e,i),n=N$1(this.maxLevels,e.value),r=await this.addLeaf(s,g$2(this,Ot$1,"f"),0,n);v$2(this,Ot$1,r,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));}async pushLeaf(t,e,i,s,n){if(i>g$2(this,Jt$1,"f")-2)throw new Error(At$1);let r;if(s[i]===n[i]){const a=await this.pushLeaf(t,e,i+1,s,n);return r=s[i]?new X$1(new V$1,a):new X$1(a,new V$1),await this.addNode(r)}const a=await e.getKey(),o=await t.getKey();return r=s[i]?new X$1(a,o):new X$1(o,a),await this.addNode(t),await this.addNode(r)}async addLeaf(t,e,i,s){if(i>g$2(this,Jt$1,"f")-1)throw new Error(At$1);const n=await this.getNode(e);if(void 0===n)throw Bt$1;switch(n.type){case 2:return this.addNode(t);case 1:{const e=n.entry[0],r=t.entry[0];if(b$3(e.value,r.value))throw Rt$1;const a=N$1(this.maxLevels,e.value);return this.pushLeaf(t,n,i,s,a)}case 0:{let e;if(s[i]){const r=await this.addLeaf(t,n.childR,i+1,s);e=new X$1(n.childL,r);}else {const r=await this.addLeaf(t,n.childL,i+1,s);e=new X$1(r,n.childR);}return this.addNode(e)}default:throw It$1}}async get(t){const e=V$1.fromBigInt(t),i=N$1(this.maxLevels,e.value);let s=await this.root();const n=[];for(let t=0;t<this.maxLevels;t++){const e=await this.getNode(s);if(void 0===e)throw mt$1;switch(e.type){case 2:return {key:BigInt("0"),value:BigInt("0"),siblings:n};case 1:return {key:e.entry[0].bigInt(),value:e.entry[1].bigInt(),siblings:n};case 0:i[t]?(s=e.childR,n.push(e.childL)):(s=e.childL,n.push(e.childR));break;default:throw It$1}}throw new Error(At$1)}async update(t,e){if(!g$2(this,_t$1,"f"))throw Lt$1;if(!p$2(t))throw "key not inside the finite field";if(!p$2(e))throw "key not inside the finite field";const i=V$1.fromBigInt(t),s=V$1.fromBigInt(e),n=N$1(this.maxLevels,i.value),r=new Ut$1;r.fnc=1,r.oldRoot=await this.root(),r.oldKey=i,r.newKey=i,r.newValue=s;let a=await this.root();const o=[];for(let t=0;t<this.maxLevels;t+=1){const e=await this.getNode(a);if(void 0===e)throw Bt$1;switch(e.type){case 2:throw mt$1;case 1:if(b$3(i.value,e.entry[0].value)){r.oldValue=e.entry[1],r.siblings=P$1([...o],this.maxLevels);const t=new Q$1(i,s);await this.updateNode(t);const a=await this.recalculatePathUntilRoot(n,t,o);return v$2(this,Ot$1,a,"f"),await g$2(this,$t$1,"f").setRoot(a),r.newRoot=a,r}break;case 0:n[t]?(a=e.childR,o.push(e.childL)):(a=e.childL,o.push(e.childR));break;default:throw It$1}}throw mt$1}async getNode(t){return b$3(t.value,M$2.value)?new Y$1:await g$2(this,$t$1,"f").get(t.value)}async recalculatePathUntilRoot(t,e,i){for(let s=i.length-1;s>=0;s-=1){const n=await e.getKey();e=t[s]?new X$1(i[s],n):new X$1(n,i[s]),await this.addNode(e);}return await e.getKey()}async delete(t){if(!g$2(this,_t$1,"f"))throw Lt$1;const e=V$1.fromBigInt(t),i=N$1(this.maxLevels,e.value);let s=g$2(this,Ot$1,"f");const n=[];for(let t=0;t<g$2(this,Jt$1,"f");t+=1){const r=await this.getNode(s);if(void 0===r)throw Bt$1;switch(r.type){case 2:throw mt$1;case 1:if(b$3(e.bytes,r.entry[0].value))return void await this.rmAndUpload(i,e,n);throw mt$1;case 0:i[t]?(s=r.childR,n.push(r.childL)):(s=r.childL,n.push(r.childR));break;default:throw It$1}}throw mt$1}async rmAndUpload(t,e,i){if(0===i.length)return v$2(this,Ot$1,M$2,"f"),void await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));const s=i[i.length-1];i.length<2&&(v$2(this,Ot$1,i[0],"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f")));for(let e=i.length-2;e>=0;e-=1){if(!b$3(i[e].value,M$2.value)){let n;n=t[e]?new X$1(i[e],s):new X$1(s,i[e]),await this.addNode(n);const r=await this.recalculatePathUntilRoot(t,n,i.slice(0,e));v$2(this,Ot$1,r,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));break}if(0===e){v$2(this,Ot$1,s,"f"),await g$2(this,$t$1,"f").setRoot(g$2(this,Ot$1,"f"));break}}}async recWalk(t,e){const i=await this.getNode(t);if(void 0===i)throw Bt$1;switch(i.type){case 2:case 1:await e(i);break;case 0:await e(i),await this.recWalk(i.childL,e),await this.recWalk(i.childR,e);break;default:throw It$1}}async walk(t,e){b$3(t.value,M$2.value)&&(t=await this.root()),await this.recWalk(t,e);}async generateCircomVerifierProof(t,e){const i=await this.generateSCVerifierProof(t,e);return i.siblings=P$1(i.siblings,this.maxLevels),i}async generateSCVerifierProof(t,e){b$3(e.value,M$2.value)&&(e=await this.root());const{proof:i,value:s}=await this.generateProof(t,e),n=new Nt$1;return n.root=e,n.siblings=i.allSiblings(),void 0!==i.nodeAux?(n.oldKey=i.nodeAux.key,n.oldValue=i.nodeAux.value):(n.oldKey=M$2,n.oldValue=M$2),n.key=V$1.fromBigInt(t),n.value=V$1.fromBigInt(s),i.existence?n.fnc=0:n.fnc=1,n}async generateProof(t,e){let i;const s=V$1.fromBigInt(t),n=N$1(this.maxLevels,s.value);e||(e=await this.root());let r=e,a=0,o=!1;const h=[];let l;for(a=0;a<this.maxLevels;a+=1){const t=await this.getNode(r);if(void 0===t)throw Bt$1;switch(t.type){case 2:return {proof:new Kt$1({existence:o,nodeAux:l,siblings:h}),value:BigInt("0")};case 1:return b$3(s.value,t.entry[0].value)?(o=!0,{proof:new Kt$1({existence:o,nodeAux:l,siblings:h}),value:t.entry[1].bigInt()}):(l={key:t.entry[0],value:t.entry[1]},{proof:new Kt$1({existence:o,nodeAux:l,siblings:h}),value:t.entry[1].bigInt()});case 0:n[a]?(r=t.childR,i=t.childL):(r=t.childL,i=t.childR);break;default:throw It$1}h.push(i);}throw mt$1}async addAndGetCircomProof(t,e){const i=new Ut$1;i.fnc=2,i.oldRoot=await this.root();let s=BigInt("0"),n=BigInt("0"),r=[];try{const e=await this.get(t);s=e.key,n=e.value,r=e.siblings;}catch(t){if(t!==mt$1)throw t}if(void 0===s||void 0===n)throw "key/value undefined";return i.oldKey=V$1.fromBigInt(s),i.oldValue=V$1.fromBigInt(n),b$3(i.oldKey.value,M$2.value)&&(i.isOld0=!0),i.siblings=P$1(r,this.maxLevels),await this.add(t,e),i.newKey=V$1.fromBigInt(t),i.newValue=V$1.fromBigInt(e),i.newRoot=await this.root(),i}async graphViz(t){let e=0;await this.walk(t,(async t=>{const i=await t.getKey();let s,n;switch(t.type){case 2:break;case 1:console.log(`"${i.string()}" [style=filled]`);break;case 0:s=[t.childL.string(),t.childR.string()],n="",s.forEach(((t,i)=>{"0"===t&&(s[i]=`empty${e}`,n+=`"${s[i]}" [style=dashed,label=0];\n`,e+=1);})),console.log(`"${i.string()}" -> {"${s[1]}"}`),console.log(n);}})),console.log("}\n");}async printGraphViz(t){b$3(t.value,M$2.value)&&(t=await this.root()),console.log(`--------\nGraphViz of the MerkleTree with RootKey ${t.bigInt().toString(10)}\n`),await this.graphViz(M$2),console.log(`End of GraphViz of the MerkleTree with RootKey ${t.bigInt().toString(10)}\n--------\n`);}};$t$1=new WeakMap,Ot$1=new WeakMap,_t$1=new WeakMap,Jt$1=new WeakMap;
|
|
15520
|
+
for (let i = 0; i < 80; i += 1) {
|
|
15521
|
+
let tl;
|
|
15522
|
+
let tr;
|
|
13801
15523
|
|
|
13802
|
-
|
|
13803
|
-
|
|
13804
|
-
|
|
13805
|
-
|
|
13806
|
-
|
|
13807
|
-
|
|
13808
|
-
|
|
13809
|
-
|
|
13810
|
-
|
|
13811
|
-
|
|
13812
|
-
|
|
13813
|
-
|
|
13814
|
-
|
|
13815
|
-
|
|
13816
|
-
|
|
13817
|
-
|
|
13818
|
-
|
|
13819
|
-
const buildVerifierId = (address, info) => {
|
|
13820
|
-
address = address.replace('0x', '');
|
|
13821
|
-
const ethAddrBytes = b$5.decodeString(address);
|
|
13822
|
-
const ethAddr = ethAddrBytes.slice(0, 20);
|
|
13823
|
-
const genesis = O$2(ethAddr);
|
|
13824
|
-
const tp = P$2(info.method, info.blockchain, info.networkId);
|
|
13825
|
-
return new k$2(tp, genesis);
|
|
13826
|
-
};
|
|
13827
|
-
const validateDIDDocumentAuth = async (did, resolverURL, state) => {
|
|
13828
|
-
const vm = await resolveDIDDocumentAuth(did, resolverURL, state);
|
|
13829
|
-
if (!vm) {
|
|
13830
|
-
throw new Error(`can't resolve DID document`);
|
|
13831
|
-
}
|
|
13832
|
-
// published or genesis
|
|
13833
|
-
if (!vm.published &&
|
|
13834
|
-
!isGenesisState(did, state.bigInt())) {
|
|
13835
|
-
throw new Error(`issuer state not published and not genesis`);
|
|
13836
|
-
}
|
|
13837
|
-
};
|
|
13838
|
-
const resolveDIDDocumentAuth = async (did, resolveURL, state) => {
|
|
13839
|
-
let url = `${resolveURL}/${did.string().replace(/:/g, '%3A')}`;
|
|
13840
|
-
if (state) {
|
|
13841
|
-
url += `?state=${state.hex()}`;
|
|
13842
|
-
}
|
|
13843
|
-
const resp = await fetch(url);
|
|
13844
|
-
const didResolutionRes = (await resp.json());
|
|
13845
|
-
return didResolutionRes.didDocument?.verificationMethod?.find((i) => i.type === 'Iden3StateInfo2023');
|
|
13846
|
-
};
|
|
15524
|
+
if (i < 16) {
|
|
15525
|
+
tl = fn1(al, bl, cl, dl, el, words[zl$1[i]], hl$1[0], sl$1[i]);
|
|
15526
|
+
tr = fn5(ar, br, cr, dr, er, words[zr$1[i]], hr$1[0], sr$1[i]);
|
|
15527
|
+
} else if (i < 32) {
|
|
15528
|
+
tl = fn2(al, bl, cl, dl, el, words[zl$1[i]], hl$1[1], sl$1[i]);
|
|
15529
|
+
tr = fn4(ar, br, cr, dr, er, words[zr$1[i]], hr$1[1], sr$1[i]);
|
|
15530
|
+
} else if (i < 48) {
|
|
15531
|
+
tl = fn3(al, bl, cl, dl, el, words[zl$1[i]], hl$1[2], sl$1[i]);
|
|
15532
|
+
tr = fn3(ar, br, cr, dr, er, words[zr$1[i]], hr$1[2], sr$1[i]);
|
|
15533
|
+
} else if (i < 64) {
|
|
15534
|
+
tl = fn4(al, bl, cl, dl, el, words[zl$1[i]], hl$1[3], sl$1[i]);
|
|
15535
|
+
tr = fn2(ar, br, cr, dr, er, words[zr$1[i]], hr$1[3], sr$1[i]);
|
|
15536
|
+
} else {
|
|
15537
|
+
// if (i<80) {
|
|
15538
|
+
tl = fn5(al, bl, cl, dl, el, words[zl$1[i]], hl$1[4], sl$1[i]);
|
|
15539
|
+
tr = fn1(ar, br, cr, dr, er, words[zr$1[i]], hr$1[4], sr$1[i]);
|
|
15540
|
+
}
|
|
13847
15541
|
|
|
13848
|
-
|
|
15542
|
+
al = el;
|
|
15543
|
+
el = dl;
|
|
15544
|
+
dl = rotl(cl, 10);
|
|
15545
|
+
cl = bl;
|
|
15546
|
+
bl = tl;
|
|
15547
|
+
ar = er;
|
|
15548
|
+
er = dr;
|
|
15549
|
+
dr = rotl(cr, 10);
|
|
15550
|
+
cr = br;
|
|
15551
|
+
br = tr;
|
|
15552
|
+
} // update state
|
|
13849
15553
|
|
|
13850
|
-
/**
|
|
13851
|
-
* Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk
|
|
13852
|
-
* License: MIT - http://mrgnrdrck.mit-license.org
|
|
13853
|
-
*
|
|
13854
|
-
* https://github.com/mroderick/PubSubJS
|
|
13855
|
-
*/
|
|
13856
15554
|
|
|
13857
|
-
|
|
13858
|
-
|
|
15555
|
+
const t = this._b + cl + dr | 0;
|
|
15556
|
+
this._b = this._c + dl + er | 0;
|
|
15557
|
+
this._c = this._d + el + ar | 0;
|
|
15558
|
+
this._d = this._e + al + br | 0;
|
|
15559
|
+
this._e = this._a + bl + cr | 0;
|
|
15560
|
+
this._a = t;
|
|
15561
|
+
};
|
|
13859
15562
|
|
|
13860
|
-
|
|
15563
|
+
this._digest = () => {
|
|
15564
|
+
// create padding and handle blocks
|
|
15565
|
+
this._block[this._blockOffset++] = 0x80;
|
|
13861
15566
|
|
|
13862
|
-
|
|
13863
|
-
|
|
13864
|
-
console.warn("PubSub already loaded, using existing version");
|
|
13865
|
-
} else {
|
|
13866
|
-
root.PubSub = PubSub;
|
|
13867
|
-
factory(PubSub);
|
|
13868
|
-
}
|
|
13869
|
-
// CommonJS and Node.js module support
|
|
13870
|
-
{
|
|
13871
|
-
if (module !== undefined && module.exports) {
|
|
13872
|
-
exports = module.exports = PubSub; // Node.js specific `module.exports`
|
|
13873
|
-
}
|
|
13874
|
-
exports.PubSub = PubSub; // CommonJS module 1.1.1 spec
|
|
13875
|
-
module.exports = exports = PubSub; // CommonJS
|
|
13876
|
-
}
|
|
15567
|
+
if (this._blockOffset > 56) {
|
|
15568
|
+
this._block.fill(0, this._blockOffset, 64);
|
|
13877
15569
|
|
|
13878
|
-
|
|
15570
|
+
this._update();
|
|
13879
15571
|
|
|
13880
|
-
|
|
13881
|
-
|
|
13882
|
-
ALL_SUBSCRIBING_MSG = '*';
|
|
15572
|
+
this._blockOffset = 0;
|
|
15573
|
+
}
|
|
13883
15574
|
|
|
13884
|
-
|
|
13885
|
-
var key;
|
|
15575
|
+
this._block.fill(0, this._blockOffset, 56);
|
|
13886
15576
|
|
|
13887
|
-
|
|
13888
|
-
|
|
13889
|
-
|
|
13890
|
-
|
|
13891
|
-
}
|
|
13892
|
-
return false;
|
|
13893
|
-
}
|
|
15577
|
+
const temp = new DataView(this._block.buffer);
|
|
15578
|
+
temp.setUint32(56, this._length[0], true);
|
|
15579
|
+
temp.setUint32(60, this._length[1], true);
|
|
15580
|
+
this._block = new Uint8Array(temp.buffer);
|
|
13894
15581
|
|
|
13895
|
-
|
|
13896
|
-
* Returns a function that throws the passed exception, for use as argument for setTimeout
|
|
13897
|
-
* @alias throwException
|
|
13898
|
-
* @function
|
|
13899
|
-
* @param { Object } ex An Error object
|
|
13900
|
-
*/
|
|
13901
|
-
function throwException( ex ){
|
|
13902
|
-
return function reThrowException(){
|
|
13903
|
-
throw ex;
|
|
13904
|
-
};
|
|
13905
|
-
}
|
|
15582
|
+
this._update(); // produce result
|
|
13906
15583
|
|
|
13907
|
-
function callSubscriberWithDelayedExceptions( subscriber, message, data ){
|
|
13908
|
-
try {
|
|
13909
|
-
subscriber( message, data );
|
|
13910
|
-
} catch( ex ){
|
|
13911
|
-
setTimeout( throwException( ex ), 0);
|
|
13912
|
-
}
|
|
13913
|
-
}
|
|
13914
15584
|
|
|
13915
|
-
|
|
13916
|
-
|
|
13917
|
-
|
|
15585
|
+
const buffer = new DataView(new Uint8Array(20).buffer);
|
|
15586
|
+
buffer.setInt32(0, this._a, true);
|
|
15587
|
+
buffer.setInt32(4, this._b, true);
|
|
15588
|
+
buffer.setInt32(8, this._c, true);
|
|
15589
|
+
buffer.setInt32(12, this._d, true);
|
|
15590
|
+
buffer.setInt32(16, this._e, true);
|
|
15591
|
+
return new Uint8Array(buffer.buffer);
|
|
15592
|
+
};
|
|
13918
15593
|
|
|
13919
|
-
|
|
13920
|
-
|
|
13921
|
-
|
|
13922
|
-
|
|
15594
|
+
this._block = new Uint8Array(blockSize);
|
|
15595
|
+
this._blockSize = blockSize;
|
|
15596
|
+
this._blockOffset = 0;
|
|
15597
|
+
this._length = [0, 0, 0, 0];
|
|
15598
|
+
this._finalized = false;
|
|
15599
|
+
}
|
|
13923
15600
|
|
|
13924
|
-
|
|
13925
|
-
return;
|
|
13926
|
-
}
|
|
15601
|
+
}
|
|
13927
15602
|
|
|
13928
|
-
|
|
13929
|
-
|
|
13930
|
-
|
|
13931
|
-
|
|
13932
|
-
|
|
13933
|
-
|
|
15603
|
+
function sha256$1(payload) {
|
|
15604
|
+
const data = typeof payload === 'string' ? fromString$1(payload) : payload;
|
|
15605
|
+
return sha256$2.hash(data);
|
|
15606
|
+
}
|
|
15607
|
+
function keccak(data) {
|
|
15608
|
+
return new Uint8Array(sha3$2.keccak_256.arrayBuffer(data));
|
|
15609
|
+
}
|
|
15610
|
+
function toEthereumAddress(hexPublicKey) {
|
|
15611
|
+
const hashInput = fromString$1(hexPublicKey.slice(2), 'base16');
|
|
15612
|
+
return `0x${toString$6(keccak(hashInput).slice(-20), 'base16')}`;
|
|
15613
|
+
}
|
|
15614
|
+
function ripemd160(data) {
|
|
15615
|
+
return new Ripemd160().update(data).digest();
|
|
15616
|
+
}
|
|
13934
15617
|
|
|
13935
|
-
|
|
13936
|
-
|
|
13937
|
-
|
|
13938
|
-
|
|
15618
|
+
const secp256k1$1$1 = new elliptic.ec('secp256k1');
|
|
15619
|
+
/**
|
|
15620
|
+
* Creates a configured signer function for signing data using the ES256K (secp256k1 + sha256) algorithm.
|
|
15621
|
+
*
|
|
15622
|
+
* The signing function itself takes the data as a `Uint8Array` or `string` and returns a `base64Url`-encoded signature
|
|
15623
|
+
*
|
|
15624
|
+
* @example
|
|
15625
|
+
* ```typescript
|
|
15626
|
+
* const sign: Signer = ES256KSigner(process.env.PRIVATE_KEY)
|
|
15627
|
+
* const signature: string = await sign(data)
|
|
15628
|
+
* ```
|
|
15629
|
+
*
|
|
15630
|
+
* @param {String} privateKey a private key as `Uint8Array`
|
|
15631
|
+
* @param {Boolean} recoverable an optional flag to add the recovery param to the generated signatures
|
|
15632
|
+
* @return {Function} a configured signer function `(data: string | Uint8Array): Promise<string>`
|
|
15633
|
+
*/
|
|
13939
15634
|
|
|
13940
|
-
|
|
13941
|
-
|
|
15635
|
+
function ES256KSigner(privateKey, recoverable = false) {
|
|
15636
|
+
const privateKeyBytes = privateKey;
|
|
13942
15637
|
|
|
13943
|
-
|
|
13944
|
-
|
|
13945
|
-
|
|
13946
|
-
position = topic.lastIndexOf('.');
|
|
13947
|
-
deliverMessage( message, topic, data, immediateExceptions );
|
|
13948
|
-
}
|
|
15638
|
+
if (privateKeyBytes.length !== 32) {
|
|
15639
|
+
throw new Error(`bad_key: Invalid private key format. Expecting 32 bytes, but got ${privateKeyBytes.length}`);
|
|
15640
|
+
}
|
|
13949
15641
|
|
|
13950
|
-
|
|
13951
|
-
|
|
13952
|
-
|
|
15642
|
+
const keyPair = secp256k1$1$1.keyFromPrivate(privateKeyBytes);
|
|
15643
|
+
return function (data) {
|
|
15644
|
+
try {
|
|
15645
|
+
const {
|
|
15646
|
+
r,
|
|
15647
|
+
s,
|
|
15648
|
+
recoveryParam
|
|
15649
|
+
} = keyPair.sign(sha256$1(data));
|
|
15650
|
+
return Promise.resolve(toJose({
|
|
15651
|
+
r: leftpad(r.toString('hex')),
|
|
15652
|
+
s: leftpad(s.toString('hex')),
|
|
15653
|
+
recoveryParam
|
|
15654
|
+
}, recoverable));
|
|
15655
|
+
} catch (e) {
|
|
15656
|
+
return Promise.reject(e);
|
|
15657
|
+
}
|
|
15658
|
+
};
|
|
15659
|
+
}
|
|
13953
15660
|
|
|
13954
|
-
|
|
13955
|
-
var topic = String( message ),
|
|
13956
|
-
found = Boolean(Object.prototype.hasOwnProperty.call( messages, topic ) && hasKeys(messages[topic]));
|
|
15661
|
+
new elliptic.ec('p256');
|
|
13957
15662
|
|
|
13958
|
-
|
|
13959
|
-
|
|
15663
|
+
const publicKeyToAddress$1 = (publicKey, otherAddress) => {
|
|
15664
|
+
// Use the same version/prefix byte as the given address.
|
|
15665
|
+
const version = toString$6(base58ToBytes(otherAddress).slice(0, 1), 'hex');
|
|
15666
|
+
const publicKeyBuffer = fromString$1(publicKey, 'hex');
|
|
15667
|
+
const publicKeyHash = ripemd160(sha256$1(publicKeyBuffer));
|
|
15668
|
+
const step1 = version + toString$6(publicKeyHash, 'hex');
|
|
15669
|
+
const step2 = sha256$1(fromString$1(step1, 'hex'));
|
|
15670
|
+
const step3 = sha256$1(step2);
|
|
15671
|
+
const checksum = toString$6(step3, 'hex').substring(0, 8);
|
|
15672
|
+
const step4 = step1 + checksum;
|
|
15673
|
+
return bytesToBase58(fromString$1(step4, 'hex'));
|
|
15674
|
+
};
|
|
13960
15675
|
|
|
13961
|
-
|
|
13962
|
-
|
|
13963
|
-
|
|
13964
|
-
|
|
15676
|
+
const EC = elliptic.ec;
|
|
15677
|
+
const publicKeyToAddress = (publicKey, prefix) => {
|
|
15678
|
+
const ec = new EC('secp256k1');
|
|
15679
|
+
const compressedPublicKey = ec.keyFromPublic(publicKey, 'hex').getPublic().encode('hex', true);
|
|
15680
|
+
const publicKeyBuffer = fromString$1(compressedPublicKey, 'hex');
|
|
15681
|
+
const hash = ripemd160(sha256$1(publicKeyBuffer));
|
|
15682
|
+
const words = bech32.toWords(hash);
|
|
15683
|
+
return bech32.encode(prefix, words).replace(prefix, '');
|
|
15684
|
+
};
|
|
13965
15685
|
|
|
13966
|
-
|
|
13967
|
-
|
|
13968
|
-
|
|
13969
|
-
found = hasDirectSubscribersFor(topic);
|
|
13970
|
-
}
|
|
15686
|
+
const verifyBlockchainAccountId = (publicKey, blockchainAccountId) => {
|
|
15687
|
+
if (blockchainAccountId) {
|
|
15688
|
+
const chain = blockchainAccountId.split(':');
|
|
13971
15689
|
|
|
13972
|
-
|
|
13973
|
-
|
|
15690
|
+
switch (chain[0]) {
|
|
15691
|
+
case 'bip122':
|
|
15692
|
+
chain[chain.length - 1] = publicKeyToAddress$1(publicKey, chain[chain.length - 1]);
|
|
15693
|
+
break;
|
|
13974
15694
|
|
|
13975
|
-
|
|
13976
|
-
|
|
15695
|
+
case 'cosmos':
|
|
15696
|
+
chain[chain.length - 1] = publicKeyToAddress(publicKey, chain[1]);
|
|
15697
|
+
break;
|
|
13977
15698
|
|
|
13978
|
-
|
|
13979
|
-
|
|
15699
|
+
case 'eip155':
|
|
15700
|
+
chain[chain.length - 1] = toEthereumAddress(publicKey);
|
|
15701
|
+
break;
|
|
13980
15702
|
|
|
13981
|
-
|
|
13982
|
-
|
|
13983
|
-
|
|
15703
|
+
default:
|
|
15704
|
+
return false;
|
|
15705
|
+
}
|
|
13984
15706
|
|
|
13985
|
-
|
|
13986
|
-
|
|
13987
|
-
} else {
|
|
13988
|
-
setTimeout( deliver, 0 );
|
|
13989
|
-
}
|
|
13990
|
-
return true;
|
|
13991
|
-
}
|
|
15707
|
+
return chain.join(':').toLowerCase() === blockchainAccountId.toLowerCase();
|
|
15708
|
+
}
|
|
13992
15709
|
|
|
13993
|
-
|
|
13994
|
-
|
|
13995
|
-
* @function
|
|
13996
|
-
* @alias publish
|
|
13997
|
-
* @param { String } message The message to publish
|
|
13998
|
-
* @param {} data The data to pass to subscribers
|
|
13999
|
-
* @return { Boolean }
|
|
14000
|
-
*/
|
|
14001
|
-
PubSub.publish = function( message, data ){
|
|
14002
|
-
return publish( message, data, false, PubSub.immediateExceptions );
|
|
14003
|
-
};
|
|
15710
|
+
return false;
|
|
15711
|
+
};
|
|
14004
15712
|
|
|
14005
|
-
|
|
14006
|
-
|
|
14007
|
-
* @function
|
|
14008
|
-
* @alias publishSync
|
|
14009
|
-
* @param { String } message The message to publish
|
|
14010
|
-
* @param {} data The data to pass to subscribers
|
|
14011
|
-
* @return { Boolean }
|
|
14012
|
-
*/
|
|
14013
|
-
PubSub.publishSync = function( message, data ){
|
|
14014
|
-
return publish( message, data, true, PubSub.immediateExceptions );
|
|
14015
|
-
};
|
|
15713
|
+
const secp256k1$2 = new elliptic.ec('secp256k1');
|
|
15714
|
+
const secp256r1 = new elliptic.ec('p256'); // converts a JOSE signature to it's components
|
|
14016
15715
|
|
|
14017
|
-
|
|
14018
|
-
|
|
14019
|
-
* @function
|
|
14020
|
-
* @alias subscribe
|
|
14021
|
-
* @param { String } message The message to subscribe to
|
|
14022
|
-
* @param { Function } func The function to call when a new message is published
|
|
14023
|
-
* @return { String }
|
|
14024
|
-
*/
|
|
14025
|
-
PubSub.subscribe = function( message, func ){
|
|
14026
|
-
if ( typeof func !== 'function'){
|
|
14027
|
-
return false;
|
|
14028
|
-
}
|
|
15716
|
+
function toSignatureObject(signature, recoverable = false) {
|
|
15717
|
+
const rawSig = base64ToBytes(signature);
|
|
14029
15718
|
|
|
14030
|
-
|
|
15719
|
+
if (rawSig.length !== (recoverable ? 65 : 64)) {
|
|
15720
|
+
throw new Error('wrong signature length');
|
|
15721
|
+
}
|
|
14031
15722
|
|
|
14032
|
-
|
|
14033
|
-
|
|
14034
|
-
|
|
14035
|
-
|
|
15723
|
+
const r = bytesToHex$1(rawSig.slice(0, 32));
|
|
15724
|
+
const s = bytesToHex$1(rawSig.slice(32, 64));
|
|
15725
|
+
const sigObj = {
|
|
15726
|
+
r,
|
|
15727
|
+
s
|
|
15728
|
+
};
|
|
14036
15729
|
|
|
14037
|
-
|
|
14038
|
-
|
|
14039
|
-
|
|
14040
|
-
messages[message][token] = func;
|
|
15730
|
+
if (recoverable) {
|
|
15731
|
+
sigObj.recoveryParam = rawSig[64];
|
|
15732
|
+
}
|
|
14041
15733
|
|
|
14042
|
-
|
|
14043
|
-
|
|
14044
|
-
};
|
|
15734
|
+
return sigObj;
|
|
15735
|
+
}
|
|
14045
15736
|
|
|
14046
|
-
|
|
14047
|
-
|
|
14048
|
-
|
|
15737
|
+
function extractPublicKeyBytes$1(pk) {
|
|
15738
|
+
if (pk.publicKeyBase58) {
|
|
15739
|
+
return base58ToBytes(pk.publicKeyBase58);
|
|
15740
|
+
} else if (pk.publicKeyBase64) {
|
|
15741
|
+
return base64ToBytes(pk.publicKeyBase64);
|
|
15742
|
+
} else if (pk.publicKeyHex) {
|
|
15743
|
+
return hexToBytes$1(pk.publicKeyHex);
|
|
15744
|
+
} else if (pk.publicKeyJwk && pk.publicKeyJwk.crv === 'secp256k1' && pk.publicKeyJwk.x && pk.publicKeyJwk.y) {
|
|
15745
|
+
return hexToBytes$1(secp256k1$2.keyFromPublic({
|
|
15746
|
+
x: bytesToHex$1(base64ToBytes(pk.publicKeyJwk.x)),
|
|
15747
|
+
y: bytesToHex$1(base64ToBytes(pk.publicKeyJwk.y))
|
|
15748
|
+
}).getPublic('hex'));
|
|
15749
|
+
} else if (pk.publicKeyJwk && pk.publicKeyJwk.crv === 'P-256' && pk.publicKeyJwk.x && pk.publicKeyJwk.y) {
|
|
15750
|
+
return hexToBytes$1(secp256r1.keyFromPublic({
|
|
15751
|
+
x: bytesToHex$1(base64ToBytes(pk.publicKeyJwk.x)),
|
|
15752
|
+
y: bytesToHex$1(base64ToBytes(pk.publicKeyJwk.y))
|
|
15753
|
+
}).getPublic('hex'));
|
|
15754
|
+
} else if (pk.publicKeyJwk && pk.publicKeyJwk.kty === 'OKP' && pk.publicKeyJwk.crv === 'Ed25519' && pk.publicKeyJwk.x) {
|
|
15755
|
+
return base64ToBytes(pk.publicKeyJwk.x);
|
|
15756
|
+
} else if (pk.publicKeyMultibase) {
|
|
15757
|
+
const {
|
|
15758
|
+
base16,
|
|
15759
|
+
base58btc,
|
|
15760
|
+
base64,
|
|
15761
|
+
base64url
|
|
15762
|
+
} = bases;
|
|
15763
|
+
const baseDecoder = base16.decoder.or(base58btc.decoder.or(base64.decoder.or(base64url.decoder)));
|
|
15764
|
+
return baseDecoder.decode(pk.publicKeyMultibase);
|
|
15765
|
+
}
|
|
14049
15766
|
|
|
14050
|
-
|
|
14051
|
-
|
|
14052
|
-
* @function
|
|
14053
|
-
* @alias subscribeOnce
|
|
14054
|
-
* @param { String } message The message to subscribe to
|
|
14055
|
-
* @param { Function } func The function to call when a new message is published
|
|
14056
|
-
* @return { PubSub }
|
|
14057
|
-
*/
|
|
14058
|
-
PubSub.subscribeOnce = function( message, func ){
|
|
14059
|
-
var token = PubSub.subscribe( message, function(){
|
|
14060
|
-
// before func apply, unsubscribe message
|
|
14061
|
-
PubSub.unsubscribe( token );
|
|
14062
|
-
func.apply( this, arguments );
|
|
14063
|
-
});
|
|
14064
|
-
return PubSub;
|
|
14065
|
-
};
|
|
15767
|
+
return new Uint8Array();
|
|
15768
|
+
}
|
|
14066
15769
|
|
|
14067
|
-
|
|
14068
|
-
|
|
14069
|
-
|
|
14070
|
-
|
|
14071
|
-
|
|
14072
|
-
|
|
14073
|
-
|
|
14074
|
-
|
|
14075
|
-
|
|
15770
|
+
function verifyES256(data, signature, authenticators) {
|
|
15771
|
+
const hash = sha256$1(data);
|
|
15772
|
+
const sigObj = toSignatureObject(signature);
|
|
15773
|
+
const fullPublicKeys = authenticators.filter(({
|
|
15774
|
+
ethereumAddress,
|
|
15775
|
+
blockchainAccountId
|
|
15776
|
+
}) => {
|
|
15777
|
+
return typeof ethereumAddress === 'undefined' && typeof blockchainAccountId === 'undefined';
|
|
15778
|
+
});
|
|
15779
|
+
const signer = fullPublicKeys.find(pk => {
|
|
15780
|
+
try {
|
|
15781
|
+
const pubBytes = extractPublicKeyBytes$1(pk);
|
|
15782
|
+
return secp256r1.keyFromPublic(pubBytes).verify(hash, sigObj);
|
|
15783
|
+
} catch (err) {
|
|
15784
|
+
return false;
|
|
15785
|
+
}
|
|
15786
|
+
});
|
|
15787
|
+
if (!signer) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
15788
|
+
return signer;
|
|
15789
|
+
}
|
|
15790
|
+
function verifyES256K(data, signature, authenticators) {
|
|
15791
|
+
const hash = sha256$1(data);
|
|
15792
|
+
const sigObj = toSignatureObject(signature);
|
|
15793
|
+
const fullPublicKeys = authenticators.filter(({
|
|
15794
|
+
ethereumAddress,
|
|
15795
|
+
blockchainAccountId
|
|
15796
|
+
}) => {
|
|
15797
|
+
return typeof ethereumAddress === 'undefined' && typeof blockchainAccountId === 'undefined';
|
|
15798
|
+
});
|
|
15799
|
+
const blockchainAddressKeys = authenticators.filter(({
|
|
15800
|
+
ethereumAddress,
|
|
15801
|
+
blockchainAccountId
|
|
15802
|
+
}) => {
|
|
15803
|
+
return typeof ethereumAddress !== 'undefined' || typeof blockchainAccountId !== 'undefined';
|
|
15804
|
+
});
|
|
15805
|
+
let signer = fullPublicKeys.find(pk => {
|
|
15806
|
+
try {
|
|
15807
|
+
const pubBytes = extractPublicKeyBytes$1(pk);
|
|
15808
|
+
return secp256k1$2.keyFromPublic(pubBytes).verify(hash, sigObj);
|
|
15809
|
+
} catch (err) {
|
|
15810
|
+
return false;
|
|
15811
|
+
}
|
|
15812
|
+
});
|
|
14076
15813
|
|
|
14077
|
-
|
|
14078
|
-
|
|
14079
|
-
|
|
14080
|
-
* @public
|
|
14081
|
-
* @alias clearAllSubscriptions
|
|
14082
|
-
* @return { int }
|
|
14083
|
-
*/
|
|
14084
|
-
PubSub.clearSubscriptions = function clearSubscriptions(topic){
|
|
14085
|
-
var m;
|
|
14086
|
-
for (m in messages){
|
|
14087
|
-
if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){
|
|
14088
|
-
delete messages[m];
|
|
14089
|
-
}
|
|
14090
|
-
}
|
|
14091
|
-
};
|
|
15814
|
+
if (!signer && blockchainAddressKeys.length > 0) {
|
|
15815
|
+
signer = verifyRecoverableES256K(data, signature, blockchainAddressKeys);
|
|
15816
|
+
}
|
|
14092
15817
|
|
|
14093
|
-
|
|
14094
|
-
|
|
14095
|
-
|
|
14096
|
-
|
|
14097
|
-
|
|
14098
|
-
* @return { Array }
|
|
14099
|
-
*/
|
|
14100
|
-
PubSub.countSubscriptions = function countSubscriptions(topic){
|
|
14101
|
-
var m;
|
|
14102
|
-
// eslint-disable-next-line no-unused-vars
|
|
14103
|
-
var token;
|
|
14104
|
-
var count = 0;
|
|
14105
|
-
for (m in messages) {
|
|
14106
|
-
if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0) {
|
|
14107
|
-
for (token in messages[m]) {
|
|
14108
|
-
count++;
|
|
14109
|
-
}
|
|
14110
|
-
break;
|
|
14111
|
-
}
|
|
14112
|
-
}
|
|
14113
|
-
return count;
|
|
14114
|
-
};
|
|
15818
|
+
if (!signer) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
15819
|
+
return signer;
|
|
15820
|
+
}
|
|
15821
|
+
function verifyRecoverableES256K(data, signature, authenticators) {
|
|
15822
|
+
let signatures;
|
|
14115
15823
|
|
|
15824
|
+
if (signature.length > 86) {
|
|
15825
|
+
signatures = [toSignatureObject(signature, true)];
|
|
15826
|
+
} else {
|
|
15827
|
+
const so = toSignatureObject(signature, false);
|
|
15828
|
+
signatures = [{ ...so,
|
|
15829
|
+
recoveryParam: 0
|
|
15830
|
+
}, { ...so,
|
|
15831
|
+
recoveryParam: 1
|
|
15832
|
+
}];
|
|
15833
|
+
}
|
|
14116
15834
|
|
|
14117
|
-
|
|
14118
|
-
|
|
14119
|
-
* @function
|
|
14120
|
-
* @public
|
|
14121
|
-
* @alias getSubscriptions
|
|
14122
|
-
*/
|
|
14123
|
-
PubSub.getSubscriptions = function getSubscriptions(topic){
|
|
14124
|
-
var m;
|
|
14125
|
-
var list = [];
|
|
14126
|
-
for (m in messages){
|
|
14127
|
-
if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){
|
|
14128
|
-
list.push(m);
|
|
14129
|
-
}
|
|
14130
|
-
}
|
|
14131
|
-
return list;
|
|
14132
|
-
};
|
|
15835
|
+
const checkSignatureAgainstSigner = sigObj => {
|
|
15836
|
+
const hash = sha256$1(data); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14133
15837
|
|
|
14134
|
-
|
|
14135
|
-
|
|
14136
|
-
|
|
14137
|
-
|
|
14138
|
-
|
|
14139
|
-
|
|
14140
|
-
*
|
|
14141
|
-
* - When passed a topic, removes all subscriptions for that topic (hierarchy)
|
|
14142
|
-
* @function
|
|
14143
|
-
* @public
|
|
14144
|
-
* @alias subscribeOnce
|
|
14145
|
-
* @param { String | Function } value A token, function or topic to unsubscribe from
|
|
14146
|
-
* @example // Unsubscribing with a token
|
|
14147
|
-
* var token = PubSub.subscribe('mytopic', myFunc);
|
|
14148
|
-
* PubSub.unsubscribe(token);
|
|
14149
|
-
* @example // Unsubscribing with a function
|
|
14150
|
-
* PubSub.unsubscribe(myFunc);
|
|
14151
|
-
* @example // Unsubscribing from a topic
|
|
14152
|
-
* PubSub.unsubscribe('mytopic');
|
|
14153
|
-
*/
|
|
14154
|
-
PubSub.unsubscribe = function(value){
|
|
14155
|
-
var descendantTopicExists = function(topic) {
|
|
14156
|
-
var m;
|
|
14157
|
-
for ( m in messages ){
|
|
14158
|
-
if ( Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0 ){
|
|
14159
|
-
// a descendant of the topic exists:
|
|
14160
|
-
return true;
|
|
14161
|
-
}
|
|
14162
|
-
}
|
|
15838
|
+
const recoveredKey = secp256k1$2.recoverPubKey(hash, sigObj, sigObj.recoveryParam);
|
|
15839
|
+
const recoveredPublicKeyHex = recoveredKey.encode('hex');
|
|
15840
|
+
const recoveredCompressedPublicKeyHex = recoveredKey.encode('hex', true);
|
|
15841
|
+
const recoveredAddress = toEthereumAddress(recoveredPublicKeyHex).toLowerCase();
|
|
15842
|
+
const signer = authenticators.find(pk => {
|
|
15843
|
+
var _pk$ethereumAddress, _pk$blockchainAccount, _pk$blockchainAccount2;
|
|
14163
15844
|
|
|
14164
|
-
|
|
14165
|
-
|
|
14166
|
-
|
|
14167
|
-
|
|
14168
|
-
|
|
14169
|
-
|
|
14170
|
-
|
|
15845
|
+
const keyHex = bytesToHex$1(extractPublicKeyBytes$1(pk));
|
|
15846
|
+
return keyHex === recoveredPublicKeyHex || keyHex === recoveredCompressedPublicKeyHex || ((_pk$ethereumAddress = pk.ethereumAddress) == null ? void 0 : _pk$ethereumAddress.toLowerCase()) === recoveredAddress || ((_pk$blockchainAccount = pk.blockchainAccountId) == null ? void 0 : (_pk$blockchainAccount2 = _pk$blockchainAccount.split('@eip155')) == null ? void 0 : _pk$blockchainAccount2[0].toLowerCase()) === recoveredAddress || // CAIP-2
|
|
15847
|
+
verifyBlockchainAccountId(recoveredPublicKeyHex, pk.blockchainAccountId) // CAIP-10
|
|
15848
|
+
;
|
|
15849
|
+
});
|
|
15850
|
+
return signer;
|
|
15851
|
+
};
|
|
14171
15852
|
|
|
14172
|
-
|
|
14173
|
-
|
|
14174
|
-
|
|
14175
|
-
|
|
15853
|
+
const signer = signatures.map(checkSignatureAgainstSigner).filter(key => typeof key !== 'undefined');
|
|
15854
|
+
if (signer.length === 0) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
15855
|
+
return signer[0];
|
|
15856
|
+
}
|
|
15857
|
+
function verifyEd25519(data, signature, authenticators) {
|
|
15858
|
+
const clear = stringToBytes$1(data);
|
|
15859
|
+
const sig = base64ToBytes(signature);
|
|
15860
|
+
const signer = authenticators.find(pk => {
|
|
15861
|
+
return ed25519.verify(extractPublicKeyBytes$1(pk), clear, sig);
|
|
15862
|
+
});
|
|
15863
|
+
if (!signer) throw new Error('invalid_signature: Signature invalid for JWT');
|
|
15864
|
+
return signer;
|
|
15865
|
+
}
|
|
15866
|
+
const algorithms = {
|
|
15867
|
+
ES256: verifyES256,
|
|
15868
|
+
ES256K: verifyES256K,
|
|
15869
|
+
// This is a non-standard algorithm but retained for backwards compatibility
|
|
15870
|
+
// see https://github.com/decentralized-identity/did-jwt/issues/146
|
|
15871
|
+
'ES256K-R': verifyRecoverableES256K,
|
|
15872
|
+
// This is actually incorrect but retained for backwards compatibility
|
|
15873
|
+
// see https://github.com/decentralized-identity/did-jwt/issues/130
|
|
15874
|
+
Ed25519: verifyEd25519,
|
|
15875
|
+
EdDSA: verifyEd25519
|
|
15876
|
+
};
|
|
14176
15877
|
|
|
14177
|
-
|
|
14178
|
-
|
|
14179
|
-
|
|
15878
|
+
function VerifierAlgorithm(alg) {
|
|
15879
|
+
const impl = algorithms[alg];
|
|
15880
|
+
if (!impl) throw new Error(`not_supported: Unsupported algorithm ${alg}`);
|
|
15881
|
+
return impl;
|
|
15882
|
+
}
|
|
14180
15883
|
|
|
14181
|
-
|
|
14182
|
-
delete message[value];
|
|
14183
|
-
result = value;
|
|
14184
|
-
// tokens are unique, so we can just stop here
|
|
14185
|
-
break;
|
|
14186
|
-
}
|
|
15884
|
+
VerifierAlgorithm.toSignatureObject = toSignatureObject;
|
|
14187
15885
|
|
|
14188
|
-
|
|
14189
|
-
|
|
14190
|
-
if (Object.prototype.hasOwnProperty.call(message, t) && message[t] === value){
|
|
14191
|
-
delete message[t];
|
|
14192
|
-
result = true;
|
|
14193
|
-
}
|
|
14194
|
-
}
|
|
14195
|
-
}
|
|
14196
|
-
}
|
|
14197
|
-
}
|
|
15886
|
+
function decodeJWS(jws) {
|
|
15887
|
+
const parts = jws.match(/^([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)$/);
|
|
14198
15888
|
|
|
14199
|
-
|
|
14200
|
-
|
|
14201
|
-
|
|
14202
|
-
|
|
15889
|
+
if (parts) {
|
|
15890
|
+
return {
|
|
15891
|
+
header: JSON.parse(decodeBase64url(parts[1])),
|
|
15892
|
+
payload: parts[2],
|
|
15893
|
+
signature: parts[3],
|
|
15894
|
+
data: `${parts[1]}.${parts[2]}`
|
|
15895
|
+
};
|
|
15896
|
+
}
|
|
14203
15897
|
|
|
14204
|
-
|
|
14205
|
-
|
|
15898
|
+
throw new Error('invalid_argument: Incorrect format JWS');
|
|
15899
|
+
}
|
|
14206
15900
|
|
|
14207
|
-
|
|
14208
|
-
|
|
14209
|
-
|
|
14210
|
-
|
|
14211
|
-
|
|
15901
|
+
function verifyJWSDecoded({
|
|
15902
|
+
header,
|
|
15903
|
+
data,
|
|
15904
|
+
signature
|
|
15905
|
+
}, pubKeys) {
|
|
15906
|
+
if (!Array.isArray(pubKeys)) pubKeys = [pubKeys];
|
|
15907
|
+
const signer = VerifierAlgorithm(header.alg)(data, signature, pubKeys);
|
|
15908
|
+
return signer;
|
|
15909
|
+
}
|
|
15910
|
+
/**
|
|
15911
|
+
* Verifies given JWS. If the JWS is valid, returns the public key that was
|
|
15912
|
+
* used to sign the JWS, or throws an `Error` if none of the `pubKeys` match.
|
|
15913
|
+
*
|
|
15914
|
+
* @example
|
|
15915
|
+
* const pubKey = verifyJWS('eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJyZXF1Z....', { publicKeyHex: '0x12341...' })
|
|
15916
|
+
*
|
|
15917
|
+
* @param {String} jws A JWS string to verify
|
|
15918
|
+
* @param {Array<VerificationMethod> | VerificationMethod} pubKeys The public keys used to verify the JWS
|
|
15919
|
+
* @return {VerificationMethod} The public key used to sign the JWS
|
|
14212
15920
|
*/
|
|
14213
|
-
|
|
14214
|
-
|
|
14215
|
-
|
|
14216
|
-
|
|
14217
|
-
|
|
14218
|
-
constructor() { }
|
|
14219
|
-
/**
|
|
14220
|
-
* Returns the singleton instance of the MessageBus class.
|
|
14221
|
-
* If the instance doesn't exist, it creates a new one.
|
|
14222
|
-
* @returns The singleton instance of the MessageBus class.
|
|
14223
|
-
*/
|
|
14224
|
-
static getInstance() {
|
|
14225
|
-
// If the instance doesn't exist, create it
|
|
14226
|
-
if (!MessageBus.instance) {
|
|
14227
|
-
MessageBus.instance = new MessageBus();
|
|
14228
|
-
}
|
|
14229
|
-
// Return the instance
|
|
14230
|
-
return MessageBus.instance;
|
|
14231
|
-
}
|
|
14232
|
-
/**
|
|
14233
|
-
* Publishes a message to the specified topic.
|
|
14234
|
-
*
|
|
14235
|
-
* @template T - The type of data being published.
|
|
14236
|
-
* @param {SdkTopic} topic - The topic to publish the message to.
|
|
14237
|
-
* @param {T} data - The data to be published.
|
|
14238
|
-
* @returns {boolean} - Returns true if the message was successfully published, false otherwise.
|
|
14239
|
-
*/
|
|
14240
|
-
publish(topic, data) {
|
|
14241
|
-
return PubSub.publish(topic.toString(), data);
|
|
14242
|
-
}
|
|
14243
|
-
/**
|
|
14244
|
-
* Subscribes to a specific topic and registers a callback function to be executed when a message is published.
|
|
14245
|
-
*
|
|
14246
|
-
* @param topic - The topic to subscribe to.
|
|
14247
|
-
* @param callback - The callback function to be executed when a message is published.
|
|
14248
|
-
*/
|
|
14249
|
-
subscribe(topic, callback) {
|
|
14250
|
-
return PubSub.subscribe(topic.toString(), (_, data) => callback(data));
|
|
14251
|
-
}
|
|
14252
|
-
/**
|
|
14253
|
-
* Subscribes to a specific topic and registers a callback function to be executed when a message is published.
|
|
14254
|
-
* The callback function is executed only once.
|
|
14255
|
-
*
|
|
14256
|
-
* @param topic - The topic to subscribe to.
|
|
14257
|
-
* @param callback - The callback function to be executed when a message is published.
|
|
14258
|
-
*/
|
|
14259
|
-
subscribeOnce(topic, callback) {
|
|
14260
|
-
PubSub.subscribeOnce(topic.toString(), (_, data) => callback(data));
|
|
14261
|
-
}
|
|
14262
|
-
/**
|
|
14263
|
-
* Unsubscribes from a specific topic in the message bus.
|
|
14264
|
-
*
|
|
14265
|
-
* @param topic - The topic to unsubscribe from.
|
|
14266
|
-
* @returns A string or boolean indicating the success of the unsubscribe operation.
|
|
14267
|
-
*/
|
|
14268
|
-
unsubscribe(topic) {
|
|
14269
|
-
return PubSub.unsubscribe(topic.toString());
|
|
14270
|
-
}
|
|
15921
|
+
|
|
15922
|
+
|
|
15923
|
+
function verifyJWS(jws, pubKeys) {
|
|
15924
|
+
const jwsDecoded = decodeJWS(jws);
|
|
15925
|
+
return verifyJWSDecoded(jwsDecoded, pubKeys);
|
|
14271
15926
|
}
|
|
14272
15927
|
|
|
14273
|
-
|
|
14274
|
-
if (a < b)
|
|
14275
|
-
return -1;
|
|
14276
|
-
if (a > b)
|
|
14277
|
-
return 1;
|
|
14278
|
-
return 0;
|
|
14279
|
-
};
|
|
15928
|
+
typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
|
|
14280
15929
|
|
|
14281
15930
|
/**
|
|
14282
15931
|
* Provider for Sec256p1 keys256p1
|
|
@@ -14334,8 +15983,8 @@ var PolygonIdSdk = (function (exports) {
|
|
|
14334
15983
|
if (!privateKeyHex) {
|
|
14335
15984
|
throw new Error('Private key not found for keyId: ' + keyId.id);
|
|
14336
15985
|
}
|
|
14337
|
-
const signatureBase64 = await ES256KSigner(hexToBytes$
|
|
14338
|
-
const signatureHex = bytesToHex$
|
|
15986
|
+
const signatureBase64 = await ES256KSigner(hexToBytes$2(privateKeyHex), opts.alg === 'ES256K-R')(data);
|
|
15987
|
+
const signatureHex = bytesToHex$2(base64UrlToBytes(signatureBase64.toString()));
|
|
14339
15988
|
if (typeof signatureHex !== 'string') {
|
|
14340
15989
|
throw new Error('Signature is not a string');
|
|
14341
15990
|
}
|
|
@@ -14388,6 +16037,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
14388
16037
|
(function (KmsKeyType) {
|
|
14389
16038
|
KmsKeyType["BabyJubJub"] = "BJJ";
|
|
14390
16039
|
KmsKeyType["Secp256k1"] = "Secp256k1";
|
|
16040
|
+
KmsKeyType["Ed25519"] = "Ed25519";
|
|
14391
16041
|
})(exports.KmsKeyType || (exports.KmsKeyType = {}));
|
|
14392
16042
|
|
|
14393
16043
|
/**
|
|
@@ -56014,6 +57664,10 @@ var PolygonIdSdk = (function (exports) {
|
|
|
56014
57664
|
$sd: exports.Operators.SD,
|
|
56015
57665
|
$nullify: exports.Operators.NULLIFY
|
|
56016
57666
|
};
|
|
57667
|
+
const getOperatorNameByValue = (operator) => {
|
|
57668
|
+
const ops = Object.entries(QueryOperators).find(([, queryOp]) => queryOp === operator);
|
|
57669
|
+
return ops ? ops[0] : 'unknown';
|
|
57670
|
+
};
|
|
56017
57671
|
const allOperations$1 = Object.values(QueryOperators);
|
|
56018
57672
|
const availableTypesOperators = new Map([
|
|
56019
57673
|
[
|
|
@@ -83719,6 +85373,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
83719
85373
|
circuitInputs.claimSubjectProfileNonce = BigInt(params.credentialSubjectProfileNonce);
|
|
83720
85374
|
circuitInputs.profileNonce = BigInt(params.authProfileNonce);
|
|
83721
85375
|
circuitInputs.skipClaimRevocationCheck = params.skipRevocation;
|
|
85376
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
83722
85377
|
return circuitInputs.inputsMarshal();
|
|
83723
85378
|
};
|
|
83724
85379
|
this.credentialAtomicQueryMTPV2OnChainPrepareInputs = async ({ preparedCredential, identifier, proofReq, params, circuitQueries }) => {
|
|
@@ -83766,6 +85421,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
83766
85421
|
circuitInputs.claimSubjectProfileNonce = BigInt(params.credentialSubjectProfileNonce);
|
|
83767
85422
|
circuitInputs.profileNonce = BigInt(params.authProfileNonce);
|
|
83768
85423
|
circuitInputs.skipClaimRevocationCheck = params.skipRevocation;
|
|
85424
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
83769
85425
|
return circuitInputs.inputsMarshal();
|
|
83770
85426
|
};
|
|
83771
85427
|
this.credentialAtomicQuerySigV2PrepareInputs = async ({ preparedCredential, identifier, proofReq, params, circuitQueries }) => {
|
|
@@ -83787,6 +85443,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
83787
85443
|
query.operator = this.transformV2QueryOperator(query.operator);
|
|
83788
85444
|
circuitInputs.query = query;
|
|
83789
85445
|
circuitInputs.currentTimeStamp = S$3(new Date());
|
|
85446
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
83790
85447
|
return circuitInputs.inputsMarshal();
|
|
83791
85448
|
};
|
|
83792
85449
|
this.credentialAtomicQuerySigV2OnChainPrepareInputs = async ({ preparedCredential, identifier, proofReq, params, circuitQueries }) => {
|
|
@@ -83834,6 +85491,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
83834
85491
|
const signature = await this._identityWallet.signChallenge(params.challenge, authInfo.credential);
|
|
83835
85492
|
circuitInputs.signature = signature;
|
|
83836
85493
|
circuitInputs.challenge = params.challenge;
|
|
85494
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
83837
85495
|
return circuitInputs.inputsMarshal();
|
|
83838
85496
|
};
|
|
83839
85497
|
this.credentialAtomicQueryV3PrepareInputs = async ({ preparedCredential, identifier, proofReq, params, circuitQueries }) => {
|
|
@@ -83883,6 +85541,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
83883
85541
|
circuitInputs.nullifierSessionID = proofReq.params?.nullifierSessionId
|
|
83884
85542
|
? BigInt(proofReq.params?.nullifierSessionId?.toString())
|
|
83885
85543
|
: BigInt(0);
|
|
85544
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
83886
85545
|
return circuitInputs.inputsMarshal();
|
|
83887
85546
|
};
|
|
83888
85547
|
this.credentialAtomicQueryV3OnChainPrepareInputs = async ({ preparedCredential, identifier, proofReq, params, circuitQueries }) => {
|
|
@@ -83961,15 +85620,19 @@ var PolygonIdSdk = (function (exports) {
|
|
|
83961
85620
|
circuitInputs.treeState = authClaimData.treeState;
|
|
83962
85621
|
circuitInputs.signature = signature;
|
|
83963
85622
|
}
|
|
85623
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
83964
85624
|
return circuitInputs.inputsMarshal();
|
|
83965
85625
|
};
|
|
83966
|
-
this.linkedMultiQuery10PrepareInputs = async ({ preparedCredential, params, circuitQueries }) => {
|
|
85626
|
+
this.linkedMultiQuery10PrepareInputs = async ({ preparedCredential, params, proofReq, circuitQueries }) => {
|
|
83967
85627
|
const circuitClaimData = await this.newCircuitClaimData(preparedCredential);
|
|
83968
85628
|
circuitClaimData.nonRevProof = toClaimNonRevStatus(preparedCredential.revStatus);
|
|
83969
85629
|
const circuitInputs = new LinkedMultiQueryInputs();
|
|
83970
85630
|
circuitInputs.linkNonce = params.linkNonce ?? BigInt(0);
|
|
83971
85631
|
circuitInputs.claim = circuitClaimData.claim;
|
|
83972
85632
|
circuitInputs.query = circuitQueries;
|
|
85633
|
+
circuitQueries.forEach((query) => {
|
|
85634
|
+
this.checkOperatorSupport(proofReq.circuitId, query.operator);
|
|
85635
|
+
});
|
|
83973
85636
|
return circuitInputs.inputsMarshal();
|
|
83974
85637
|
};
|
|
83975
85638
|
}
|
|
@@ -84054,10 +85717,16 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84054
85717
|
transformV2QueryOperator(operator) {
|
|
84055
85718
|
return operator === exports.Operators.SD || operator === exports.Operators.NOOP ? exports.Operators.EQ : operator;
|
|
84056
85719
|
}
|
|
85720
|
+
checkOperatorSupport(circuitId, operator) {
|
|
85721
|
+
const supportedOperators = circuitValidator[circuitId].supportedOperations;
|
|
85722
|
+
if (!supportedOperators.includes(operator)) {
|
|
85723
|
+
throw new Error(`operator ${getOperatorNameByValue(operator)} is not supported by ${circuitId}`);
|
|
85724
|
+
}
|
|
85725
|
+
}
|
|
84057
85726
|
}
|
|
84058
85727
|
|
|
84059
85728
|
const defaultProofGenerationDelayOpts = 24 * 60 * 60 * 1000; // 24 hours
|
|
84060
|
-
async function checkQueryRequest(query, outputs, circuitId, schemaLoader,
|
|
85729
|
+
async function checkQueryRequest(query, queriesMetadata, ldContext, outputs, circuitId, schemaLoader, opts) {
|
|
84061
85730
|
// validate issuer
|
|
84062
85731
|
const userDID = W$2.parseFromId(outputs.issuerId);
|
|
84063
85732
|
const issuerAllowed = !query.allowedIssuers ||
|
|
@@ -84065,19 +85734,10 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84065
85734
|
if (!issuerAllowed) {
|
|
84066
85735
|
throw new Error('issuer is not in allowed list');
|
|
84067
85736
|
}
|
|
84068
|
-
// validate schema
|
|
84069
|
-
let schema;
|
|
84070
|
-
try {
|
|
84071
|
-
const loader = schemaLoader ?? af();
|
|
84072
|
-
schema = (await loader(query.context ?? '')).document;
|
|
84073
|
-
}
|
|
84074
|
-
catch (e) {
|
|
84075
|
-
throw new Error(`can't load schema for request query`);
|
|
84076
|
-
}
|
|
84077
85737
|
if (!query.type) {
|
|
84078
|
-
throw new Error(
|
|
85738
|
+
throw new Error('query type is missing');
|
|
84079
85739
|
}
|
|
84080
|
-
const schemaId = await lf.getTypeIDFromContext(JSON.stringify(
|
|
85740
|
+
const schemaId = await lf.getTypeIDFromContext(JSON.stringify(ldContext), query.type, {
|
|
84081
85741
|
documentLoader: schemaLoader
|
|
84082
85742
|
});
|
|
84083
85743
|
const schemaHash = calculateCoreSchemaHash(byteEncoder.encode(schemaId));
|
|
@@ -84087,75 +85747,67 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84087
85747
|
if (!query.skipClaimRevocationCheck && outputs.isRevocationChecked === 0) {
|
|
84088
85748
|
throw new Error(`check revocation is required`);
|
|
84089
85749
|
}
|
|
84090
|
-
|
|
84091
|
-
|
|
84092
|
-
|
|
85750
|
+
checkCircuitQueriesLength(circuitId, queriesMetadata);
|
|
85751
|
+
// verify timestamp
|
|
85752
|
+
let acceptedProofGenerationDelay = defaultProofGenerationDelayOpts;
|
|
85753
|
+
if (opts?.acceptedProofGenerationDelay) {
|
|
85754
|
+
acceptedProofGenerationDelay = opts.acceptedProofGenerationDelay;
|
|
85755
|
+
}
|
|
85756
|
+
const timeDiff = Date.now() - b$4(Number(outputs.timestamp)).getTime();
|
|
85757
|
+
if (timeDiff > acceptedProofGenerationDelay) {
|
|
85758
|
+
throw new Error('generated proof is outdated');
|
|
85759
|
+
}
|
|
85760
|
+
return;
|
|
85761
|
+
}
|
|
85762
|
+
function checkCircuitQueriesLength(circuitId, queriesMetadata) {
|
|
84093
85763
|
const circuitValidationData = circuitValidator[circuitId];
|
|
84094
85764
|
if (queriesMetadata.length > circuitValidationData.maxQueriesCount) {
|
|
84095
85765
|
throw new Error(`circuit ${circuitId} supports only ${circuitValidator[circuitId].maxQueriesCount} queries`);
|
|
84096
85766
|
}
|
|
84097
|
-
|
|
84098
|
-
|
|
84099
|
-
|
|
85767
|
+
}
|
|
85768
|
+
function checkCircuitOperator(circuitId, operator) {
|
|
85769
|
+
const circuitValidationData = circuitValidator[circuitId];
|
|
85770
|
+
if (!circuitValidationData.supportedOperations.includes(operator)) {
|
|
85771
|
+
throw new Error(`circuit ${circuitId} not support ${getOperatorNameByValue(operator)} operator`);
|
|
84100
85772
|
}
|
|
84101
|
-
|
|
84102
|
-
|
|
84103
|
-
|
|
84104
|
-
|
|
84105
|
-
|
|
84106
|
-
|
|
84107
|
-
if (
|
|
84108
|
-
|
|
84109
|
-
await validateDisclosure(metadata, outputs, verifiablePresentation, schemaLoader);
|
|
84110
|
-
}
|
|
84111
|
-
catch (e) {
|
|
84112
|
-
throw new Error(`failed to validate selective disclosure: ${e.message}`);
|
|
84113
|
-
}
|
|
84114
|
-
}
|
|
84115
|
-
else if (!metadata.fieldName && metadata.operator == exports.Operators.NOOP) {
|
|
84116
|
-
try {
|
|
84117
|
-
await validateEmptyCredentialSubject(metadata, outputs);
|
|
84118
|
-
return;
|
|
84119
|
-
}
|
|
84120
|
-
catch (e) {
|
|
84121
|
-
throw new Error(`failed to validate operators: ${e.message}`);
|
|
84122
|
-
}
|
|
84123
|
-
}
|
|
84124
|
-
else {
|
|
84125
|
-
try {
|
|
84126
|
-
await validateOperators(metadata, outputs);
|
|
84127
|
-
}
|
|
84128
|
-
catch (e) {
|
|
84129
|
-
throw new Error(`failed to validate operators: ${e.message}`);
|
|
84130
|
-
}
|
|
85773
|
+
}
|
|
85774
|
+
function verifyFieldValueInclusionV2(outputs, metadata) {
|
|
85775
|
+
if (outputs.operator == QueryOperators.$noop) {
|
|
85776
|
+
return;
|
|
85777
|
+
}
|
|
85778
|
+
if (outputs.merklized === 1) {
|
|
85779
|
+
if (outputs.claimPathNotExists === 1) {
|
|
85780
|
+
throw new Error(`proof doesn't contains target query key`);
|
|
84131
85781
|
}
|
|
84132
|
-
|
|
84133
|
-
|
|
84134
|
-
if (outputs.claimPathNotExists === 1) {
|
|
84135
|
-
throw new Error(`proof doesn't contains target query key`);
|
|
84136
|
-
}
|
|
84137
|
-
if (outputs.claimPathKey !== metadata.claimPathKey) {
|
|
84138
|
-
throw new Error(`proof was generated for another path`);
|
|
84139
|
-
}
|
|
85782
|
+
if (outputs.claimPathKey !== metadata.claimPathKey) {
|
|
85783
|
+
throw new Error(`proof was generated for another path`);
|
|
84140
85784
|
}
|
|
84141
|
-
|
|
84142
|
-
|
|
84143
|
-
|
|
84144
|
-
|
|
85785
|
+
}
|
|
85786
|
+
else {
|
|
85787
|
+
if (outputs.slotIndex !== metadata.slotIndex) {
|
|
85788
|
+
throw new Error(`wrong claim slot was used in claim`);
|
|
84145
85789
|
}
|
|
84146
|
-
|
|
84147
|
-
|
|
84148
|
-
|
|
84149
|
-
|
|
85790
|
+
}
|
|
85791
|
+
}
|
|
85792
|
+
function verifyFieldValueInclusionNativeExistsSupport(outputs, metadata) {
|
|
85793
|
+
if (outputs.operator == exports.Operators.NOOP) {
|
|
85794
|
+
return;
|
|
85795
|
+
}
|
|
85796
|
+
if (outputs.operator === exports.Operators.EXISTS && !outputs.merklized) {
|
|
85797
|
+
throw new Error('$exists operator is not supported for non-merklized credential');
|
|
85798
|
+
}
|
|
85799
|
+
if (outputs.merklized === 1) {
|
|
85800
|
+
if (outputs.claimPathKey !== metadata.claimPathKey) {
|
|
85801
|
+
throw new Error(`proof was generated for another path`);
|
|
84150
85802
|
}
|
|
84151
|
-
|
|
84152
|
-
|
|
84153
|
-
|
|
85803
|
+
}
|
|
85804
|
+
else {
|
|
85805
|
+
if (outputs.slotIndex !== metadata.slotIndex) {
|
|
85806
|
+
throw new Error(`wrong claim slot was used in claim`);
|
|
84154
85807
|
}
|
|
84155
85808
|
}
|
|
84156
|
-
return;
|
|
84157
85809
|
}
|
|
84158
|
-
async function
|
|
85810
|
+
async function validateEmptyCredentialSubjectV2Circuit(cq, outputs) {
|
|
84159
85811
|
if (outputs.operator !== exports.Operators.EQ) {
|
|
84160
85812
|
throw new Error('empty credentialSubject request available only for equal operation');
|
|
84161
85813
|
}
|
|
@@ -84188,7 +85840,11 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84188
85840
|
}
|
|
84189
85841
|
}
|
|
84190
85842
|
}
|
|
84191
|
-
async function
|
|
85843
|
+
async function validateDisclosureV2Circuit(cq, outputs, verifiablePresentation, ldLoader) {
|
|
85844
|
+
const bi = await fieldValueFromVerifiablePresentation(cq.fieldName, verifiablePresentation, ldLoader);
|
|
85845
|
+
if (bi !== outputs.value[0]) {
|
|
85846
|
+
throw new Error(`value that was used is not equal to requested in query`);
|
|
85847
|
+
}
|
|
84192
85848
|
if (outputs.operator !== exports.Operators.EQ) {
|
|
84193
85849
|
throw new Error(`operator for selective disclosure must be $eq`);
|
|
84194
85850
|
}
|
|
@@ -84197,9 +85853,29 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84197
85853
|
throw new Error(`selective disclosure not available for array of values`);
|
|
84198
85854
|
}
|
|
84199
85855
|
}
|
|
85856
|
+
}
|
|
85857
|
+
async function validateDisclosureNativeSDSupport(cq, outputs, verifiablePresentation, ldLoader) {
|
|
84200
85858
|
const bi = await fieldValueFromVerifiablePresentation(cq.fieldName, verifiablePresentation, ldLoader);
|
|
84201
|
-
if (bi !== outputs.
|
|
84202
|
-
throw new Error(`
|
|
85859
|
+
if (bi !== outputs.operatorOutput) {
|
|
85860
|
+
throw new Error(`operator output should be equal to disclosed value`);
|
|
85861
|
+
}
|
|
85862
|
+
if (outputs.operator !== exports.Operators.SD) {
|
|
85863
|
+
throw new Error(`operator for selective disclosure must be $sd`);
|
|
85864
|
+
}
|
|
85865
|
+
for (let index = 0; index < outputs.value.length; index++) {
|
|
85866
|
+
if (outputs.value[index] !== 0n) {
|
|
85867
|
+
throw new Error(`public signal values must be zero`);
|
|
85868
|
+
}
|
|
85869
|
+
}
|
|
85870
|
+
}
|
|
85871
|
+
async function validateEmptyCredentialSubjectNoopNativeSupport(outputs) {
|
|
85872
|
+
if (outputs.operator !== exports.Operators.NOOP) {
|
|
85873
|
+
throw new Error('empty credentialSubject request available only for $noop operation');
|
|
85874
|
+
}
|
|
85875
|
+
for (let index = 1; index < outputs.value.length; index++) {
|
|
85876
|
+
if (outputs.value[index] !== 0n) {
|
|
85877
|
+
throw new Error(`empty credentialSubject request not available for array of values`);
|
|
85878
|
+
}
|
|
84203
85879
|
}
|
|
84204
85880
|
}
|
|
84205
85881
|
const fieldValueFromVerifiablePresentation = async (fieldName, verifiablePresentation, ldLoader) => {
|
|
@@ -84320,7 +85996,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84320
85996
|
valueArraySize: mtpv2PubSignals.getValueArrSize(),
|
|
84321
85997
|
isRevocationChecked: mtpv2PubSignals.isRevocationChecked
|
|
84322
85998
|
};
|
|
84323
|
-
await
|
|
85999
|
+
await this.checkQueryV2Circuits(exports.CircuitId.AtomicQueryMTPV2, query, outs, opts, verifiablePresentation);
|
|
84324
86000
|
// verify state
|
|
84325
86001
|
await this.checkStateExistenceForId(mtpv2PubSignals.issuerID, mtpv2PubSignals.issuerClaimIdenState);
|
|
84326
86002
|
if (mtpv2PubSignals.isRevocationChecked !== 0) {
|
|
@@ -84349,7 +86025,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84349
86025
|
valueArraySize: sigV2PubSignals.getValueArrSize(),
|
|
84350
86026
|
isRevocationChecked: sigV2PubSignals.isRevocationChecked
|
|
84351
86027
|
};
|
|
84352
|
-
await
|
|
86028
|
+
await this.checkQueryV2Circuits(exports.CircuitId.AtomicQuerySigV2, query, outs, opts, verifiablePresentation);
|
|
84353
86029
|
// verify state
|
|
84354
86030
|
await this.checkStateExistenceForId(sigV2PubSignals.issuerID, sigV2PubSignals.issuerAuthState);
|
|
84355
86031
|
if (sigV2PubSignals.isRevocationChecked !== 0) {
|
|
@@ -84375,9 +86051,55 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84375
86051
|
merklized: v3PubSignals.merklized,
|
|
84376
86052
|
claimPathKey: v3PubSignals.claimPathKey,
|
|
84377
86053
|
valueArraySize: v3PubSignals.getValueArrSize(),
|
|
86054
|
+
operatorOutput: v3PubSignals.operatorOutput,
|
|
84378
86055
|
isRevocationChecked: v3PubSignals.isRevocationChecked
|
|
84379
86056
|
};
|
|
84380
|
-
|
|
86057
|
+
if (!query.type) {
|
|
86058
|
+
throw new Error(`proof query type is undefined`);
|
|
86059
|
+
}
|
|
86060
|
+
const loader = this._documentLoader ?? af();
|
|
86061
|
+
// validate schema
|
|
86062
|
+
let context;
|
|
86063
|
+
try {
|
|
86064
|
+
context = (await loader(query.context ?? '')).document;
|
|
86065
|
+
}
|
|
86066
|
+
catch (e) {
|
|
86067
|
+
throw new Error(`can't load schema for request query`);
|
|
86068
|
+
}
|
|
86069
|
+
const queriesMetadata = await parseQueriesMetadata(query.type, JSON.stringify(context), query.credentialSubject, {
|
|
86070
|
+
documentLoader: loader
|
|
86071
|
+
});
|
|
86072
|
+
const circuitId = exports.CircuitId.AtomicQueryV3;
|
|
86073
|
+
await checkQueryRequest(query, queriesMetadata, context, outs, circuitId, this._documentLoader, opts);
|
|
86074
|
+
const queryMetadata = queriesMetadata[0]; // only one query is supported
|
|
86075
|
+
checkCircuitOperator(circuitId, outs.operator);
|
|
86076
|
+
// validate selective disclosure
|
|
86077
|
+
if (queryMetadata.operator === exports.Operators.SD) {
|
|
86078
|
+
try {
|
|
86079
|
+
await validateDisclosureNativeSDSupport(queryMetadata, outs, verifiablePresentation, loader);
|
|
86080
|
+
}
|
|
86081
|
+
catch (e) {
|
|
86082
|
+
throw new Error(`failed to validate selective disclosure: ${e.message}`);
|
|
86083
|
+
}
|
|
86084
|
+
}
|
|
86085
|
+
else if (!queryMetadata.fieldName && queryMetadata.operator == exports.Operators.NOOP) {
|
|
86086
|
+
try {
|
|
86087
|
+
await validateEmptyCredentialSubjectNoopNativeSupport(outs);
|
|
86088
|
+
}
|
|
86089
|
+
catch (e) {
|
|
86090
|
+
throw new Error(`failed to validate operators: ${e.message}`);
|
|
86091
|
+
}
|
|
86092
|
+
}
|
|
86093
|
+
else {
|
|
86094
|
+
try {
|
|
86095
|
+
await validateOperators(queryMetadata, outs);
|
|
86096
|
+
}
|
|
86097
|
+
catch (e) {
|
|
86098
|
+
throw new Error(`failed to validate operators: ${e.message}`);
|
|
86099
|
+
}
|
|
86100
|
+
}
|
|
86101
|
+
// verify field inclusion / non-inclusion
|
|
86102
|
+
verifyFieldValueInclusionNativeExistsSupport(outs, queryMetadata);
|
|
84381
86103
|
const { proofType, verifierID, nullifier, nullifierSessionID, linkID } = v3PubSignals;
|
|
84382
86104
|
switch (query.proofType) {
|
|
84383
86105
|
case exports.ProofType.BJJSignature:
|
|
@@ -84552,6 +86274,53 @@ var PolygonIdSdk = (function (exports) {
|
|
|
84552
86274
|
}
|
|
84553
86275
|
return fn(ctx);
|
|
84554
86276
|
}
|
|
86277
|
+
async checkQueryV2Circuits(circuitId, query, outs, opts, verifiablePresentation) {
|
|
86278
|
+
if (!query.type) {
|
|
86279
|
+
throw new Error(`proof query type is undefined`);
|
|
86280
|
+
}
|
|
86281
|
+
const loader = this._documentLoader ?? af();
|
|
86282
|
+
// validate schema
|
|
86283
|
+
let context;
|
|
86284
|
+
try {
|
|
86285
|
+
context = (await loader(query.context ?? '')).document;
|
|
86286
|
+
}
|
|
86287
|
+
catch (e) {
|
|
86288
|
+
throw new Error(`can't load schema for request query`);
|
|
86289
|
+
}
|
|
86290
|
+
const queriesMetadata = await parseQueriesMetadata(query.type, JSON.stringify(context), query.credentialSubject, {
|
|
86291
|
+
documentLoader: loader
|
|
86292
|
+
});
|
|
86293
|
+
await checkQueryRequest(query, queriesMetadata, context, outs, circuitId, this._documentLoader, opts);
|
|
86294
|
+
const queryMetadata = queriesMetadata[0]; // only one query is supported
|
|
86295
|
+
checkCircuitOperator(circuitId, outs.operator);
|
|
86296
|
+
// validate selective disclosure
|
|
86297
|
+
if (queryMetadata.operator === exports.Operators.SD) {
|
|
86298
|
+
try {
|
|
86299
|
+
await validateDisclosureV2Circuit(queryMetadata, outs, verifiablePresentation, loader);
|
|
86300
|
+
}
|
|
86301
|
+
catch (e) {
|
|
86302
|
+
throw new Error(`failed to validate selective disclosure: ${e.message}`);
|
|
86303
|
+
}
|
|
86304
|
+
}
|
|
86305
|
+
else if (!queryMetadata.fieldName && queryMetadata.operator == exports.Operators.NOOP) {
|
|
86306
|
+
try {
|
|
86307
|
+
await validateEmptyCredentialSubjectV2Circuit(queryMetadata, outs);
|
|
86308
|
+
}
|
|
86309
|
+
catch (e) {
|
|
86310
|
+
throw new Error(`failed to validate operators: ${e.message}`);
|
|
86311
|
+
}
|
|
86312
|
+
}
|
|
86313
|
+
else {
|
|
86314
|
+
try {
|
|
86315
|
+
await validateOperators(queryMetadata, outs);
|
|
86316
|
+
}
|
|
86317
|
+
catch (e) {
|
|
86318
|
+
throw new Error(`failed to validate operators: ${e.message}`);
|
|
86319
|
+
}
|
|
86320
|
+
}
|
|
86321
|
+
// verify field inclusion
|
|
86322
|
+
verifyFieldValueInclusionV2(outs, queryMetadata);
|
|
86323
|
+
}
|
|
84555
86324
|
async resolve(id, state) {
|
|
84556
86325
|
const idBigInt = id.bigInt();
|
|
84557
86326
|
const did = W$2.parseFromId(id);
|
|
@@ -85048,7 +86817,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
85048
86817
|
}
|
|
85049
86818
|
else {
|
|
85050
86819
|
const header = envelope.split('.')[0];
|
|
85051
|
-
base64HeaderBytes = base64$
|
|
86820
|
+
base64HeaderBytes = base64$3.parse(header, { loose: true });
|
|
85052
86821
|
}
|
|
85053
86822
|
const header = bytesToHeaderStub(base64HeaderBytes);
|
|
85054
86823
|
return header.typ;
|
|
@@ -85261,7 +87030,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
85261
87030
|
const extractPublicKeyBytes = (vm) => {
|
|
85262
87031
|
const isSupportedVmType = Object.keys(SUPPORTED_PUBLIC_KEY_TYPES).some((key) => SUPPORTED_PUBLIC_KEY_TYPES[key].includes(vm.type));
|
|
85263
87032
|
if (vm.publicKeyBase58 && isSupportedVmType) {
|
|
85264
|
-
return { publicKeyBytes: base58ToBytes(vm.publicKeyBase58), kmsKeyType: exports.KmsKeyType.Secp256k1 };
|
|
87033
|
+
return { publicKeyBytes: base58ToBytes$1(vm.publicKeyBase58), kmsKeyType: exports.KmsKeyType.Secp256k1 };
|
|
85265
87034
|
}
|
|
85266
87035
|
if (vm.publicKeyBase64 && isSupportedVmType) {
|
|
85267
87036
|
return {
|
|
@@ -85270,17 +87039,17 @@ var PolygonIdSdk = (function (exports) {
|
|
|
85270
87039
|
};
|
|
85271
87040
|
}
|
|
85272
87041
|
if (vm.publicKeyHex && isSupportedVmType) {
|
|
85273
|
-
return { publicKeyBytes: hexToBytes$
|
|
87042
|
+
return { publicKeyBytes: hexToBytes$2(vm.publicKeyHex), kmsKeyType: exports.KmsKeyType.Secp256k1 };
|
|
85274
87043
|
}
|
|
85275
87044
|
if (vm.publicKeyJwk &&
|
|
85276
87045
|
vm.publicKeyJwk.crv === 'secp256k1' &&
|
|
85277
87046
|
vm.publicKeyJwk.x &&
|
|
85278
87047
|
vm.publicKeyJwk.y) {
|
|
85279
87048
|
return {
|
|
85280
|
-
publicKeyBytes: hexToBytes$
|
|
87049
|
+
publicKeyBytes: hexToBytes$2(secp256k1
|
|
85281
87050
|
.keyFromPublic({
|
|
85282
|
-
x: bytesToHex$
|
|
85283
|
-
y: bytesToHex$
|
|
87051
|
+
x: bytesToHex$2(base64UrlToBytes(vm.publicKeyJwk.x)),
|
|
87052
|
+
y: bytesToHex$2(base64UrlToBytes(vm.publicKeyJwk.y))
|
|
85284
87053
|
})
|
|
85285
87054
|
.getPublic('hex')),
|
|
85286
87055
|
kmsKeyType: exports.KmsKeyType.Secp256k1
|
|
@@ -85407,7 +87176,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
85407
87176
|
if (!kmsKeyType) {
|
|
85408
87177
|
throw new Error('No KMS key type found');
|
|
85409
87178
|
}
|
|
85410
|
-
const signatureBytes = await this._kms.sign({ type: kmsKeyType, id: keyPath(kmsKeyType, bytesToHex$
|
|
87179
|
+
const signatureBytes = await this._kms.sign({ type: kmsKeyType, id: keyPath(kmsKeyType, bytesToHex$2(publicKeyBytes)) }, signingInputBytes);
|
|
85411
87180
|
signatureBase64 = byteDecoder.decode(signatureBytes);
|
|
85412
87181
|
}
|
|
85413
87182
|
return byteEncoder.encode(`${signingInput}.${signatureBase64}`);
|
|
@@ -85421,8 +87190,8 @@ var PolygonIdSdk = (function (exports) {
|
|
|
85421
87190
|
async unpack(envelope) {
|
|
85422
87191
|
const jws = byteDecoder.decode(envelope);
|
|
85423
87192
|
const [headerStr, msgStr] = jws.split('.');
|
|
85424
|
-
const header = JSON.parse(decodeBase64url(headerStr));
|
|
85425
|
-
const message = JSON.parse(decodeBase64url(msgStr));
|
|
87193
|
+
const header = JSON.parse(decodeBase64url$1(headerStr));
|
|
87194
|
+
const message = JSON.parse(decodeBase64url$1(msgStr));
|
|
85426
87195
|
const explicitSender = parse(header.kid)?.did;
|
|
85427
87196
|
if (explicitSender && explicitSender !== message.from) {
|
|
85428
87197
|
throw new Error(`Sender does not match DID in message with kid ${header?.kid}`);
|
|
@@ -86156,6 +87925,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
86156
87925
|
exports.CredentialWallet = CredentialWallet;
|
|
86157
87926
|
exports.DIDDocumentJSONSchema = DIDDocumentJSONSchema;
|
|
86158
87927
|
exports.DataPrepareHandlerFunc = DataPrepareHandlerFunc;
|
|
87928
|
+
exports.Ed25519Provider = Ed25519Provider;
|
|
86159
87929
|
exports.ErrorEmptyAuthClaimNonRevProof = ErrorEmptyAuthClaimNonRevProof;
|
|
86160
87930
|
exports.ErrorEmptyAuthClaimProof = ErrorEmptyAuthClaimProof;
|
|
86161
87931
|
exports.ErrorEmptyChallengeSignature = ErrorEmptyChallengeSignature;
|
|
@@ -86221,8 +87991,8 @@ var PolygonIdSdk = (function (exports) {
|
|
|
86221
87991
|
exports.W3CCredential = W3CCredential;
|
|
86222
87992
|
exports.ZKPPacker = ZKPPacker;
|
|
86223
87993
|
exports.availableTypesOperators = availableTypesOperators;
|
|
86224
|
-
exports.base58ToBytes = base58ToBytes;
|
|
86225
|
-
exports.base64ToBytes = base64ToBytes;
|
|
87994
|
+
exports.base58ToBytes = base58ToBytes$1;
|
|
87995
|
+
exports.base64ToBytes = base64ToBytes$1;
|
|
86226
87996
|
exports.base64UrlToBytes = base64UrlToBytes;
|
|
86227
87997
|
exports.bigIntArrayToStringArray = bigIntArrayToStringArray;
|
|
86228
87998
|
exports.bigIntCompare = bigIntCompare;
|
|
@@ -86231,14 +88001,16 @@ var PolygonIdSdk = (function (exports) {
|
|
|
86231
88001
|
exports.buildVerifierId = buildVerifierId;
|
|
86232
88002
|
exports.byteDecoder = byteDecoder;
|
|
86233
88003
|
exports.byteEncoder = byteEncoder;
|
|
86234
|
-
exports.bytesToBase58 = bytesToBase58;
|
|
88004
|
+
exports.bytesToBase58 = bytesToBase58$1;
|
|
86235
88005
|
exports.bytesToBase64 = bytesToBase64;
|
|
86236
|
-
exports.bytesToBase64url = bytesToBase64url;
|
|
86237
|
-
exports.bytesToHex = bytesToHex$
|
|
88006
|
+
exports.bytesToBase64url = bytesToBase64url$1;
|
|
88007
|
+
exports.bytesToHex = bytesToHex$2;
|
|
86238
88008
|
exports.cacheLoader = cacheLoader;
|
|
86239
88009
|
exports.calculateCoreSchemaHash = calculateCoreSchemaHash;
|
|
86240
88010
|
exports.calculateQueryHashV2 = calculateQueryHashV2;
|
|
86241
88011
|
exports.calculateQueryHashV3 = calculateQueryHashV3;
|
|
88012
|
+
exports.checkCircuitOperator = checkCircuitOperator;
|
|
88013
|
+
exports.checkCircuitQueriesLength = checkCircuitQueriesLength;
|
|
86242
88014
|
exports.checkDataInField = checkDataInField;
|
|
86243
88015
|
exports.checkQueryRequest = checkQueryRequest;
|
|
86244
88016
|
exports.circuitValidator = circuitValidator;
|
|
@@ -86250,7 +88022,7 @@ var PolygonIdSdk = (function (exports) {
|
|
|
86250
88022
|
exports.createVerifiablePresentation = createVerifiablePresentation;
|
|
86251
88023
|
exports.credentialSubjectKey = credentialSubjectKey;
|
|
86252
88024
|
exports.dataFillsSlot = dataFillsSlot;
|
|
86253
|
-
exports.decodeBase64url = decodeBase64url;
|
|
88025
|
+
exports.decodeBase64url = decodeBase64url$1;
|
|
86254
88026
|
exports.defaultEthConnectionConfig = defaultEthConnectionConfig;
|
|
86255
88027
|
exports.defaultMTLevels = defaultMTLevels;
|
|
86256
88028
|
exports.defaultMTLevelsClaim = defaultMTLevelsClaim;
|
|
@@ -86273,11 +88045,12 @@ var PolygonIdSdk = (function (exports) {
|
|
|
86273
88045
|
exports.getKMSIdByAuthCredential = getKMSIdByAuthCredential;
|
|
86274
88046
|
exports.getNodeAuxValue = getNodeAuxValue;
|
|
86275
88047
|
exports.getNodesRepresentation = getNodesRepresentation;
|
|
88048
|
+
exports.getOperatorNameByValue = getOperatorNameByValue;
|
|
86276
88049
|
exports.getProperties = getProperties;
|
|
86277
88050
|
exports.getSerializationAttrFromContext = getSerializationAttrFromContext;
|
|
86278
88051
|
exports.getSerializationAttrFromParsedContext = getSerializationAttrFromParsedContext;
|
|
86279
88052
|
exports.getUserDIDFromCredential = getUserDIDFromCredential;
|
|
86280
|
-
exports.hexToBytes = hexToBytes$
|
|
88053
|
+
exports.hexToBytes = hexToBytes$2;
|
|
86281
88054
|
exports.isGenesisState = isGenesisState;
|
|
86282
88055
|
exports.isGenesisStateId = isGenesisStateId;
|
|
86283
88056
|
exports.isIssuerGenesis = isIssuerGenesis;
|
|
@@ -86307,7 +88080,14 @@ var PolygonIdSdk = (function (exports) {
|
|
|
86307
88080
|
exports.transformQueryValueToBigInts = transformQueryValueToBigInts;
|
|
86308
88081
|
exports.userStateError = userStateError;
|
|
86309
88082
|
exports.validateDIDDocumentAuth = validateDIDDocumentAuth;
|
|
88083
|
+
exports.validateDisclosureNativeSDSupport = validateDisclosureNativeSDSupport;
|
|
88084
|
+
exports.validateDisclosureV2Circuit = validateDisclosureV2Circuit;
|
|
88085
|
+
exports.validateEmptyCredentialSubjectNoopNativeSupport = validateEmptyCredentialSubjectNoopNativeSupport;
|
|
88086
|
+
exports.validateEmptyCredentialSubjectV2Circuit = validateEmptyCredentialSubjectV2Circuit;
|
|
88087
|
+
exports.validateOperators = validateOperators;
|
|
86310
88088
|
exports.validateTreeState = validateTreeState;
|
|
88089
|
+
exports.verifyFieldValueInclusionNativeExistsSupport = verifyFieldValueInclusionNativeExistsSupport;
|
|
88090
|
+
exports.verifyFieldValueInclusionV2 = verifyFieldValueInclusionV2;
|
|
86311
88091
|
exports.witnessBuilder = witnessBuilder;
|
|
86312
88092
|
|
|
86313
88093
|
return exports;
|