@leofcoin/chain 1.9.24 → 1.9.25
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/exports/browser/{browser-FVp_QbaL-C-GWIuv6.js → browser-DEjI2nFg-CL-zDjzl.js} +1 -1
- package/exports/browser/{browser-8BFql6K9-BMXXABIY.js → browser-tK3uOLQV-CtcRBohi.js} +1 -1
- package/exports/browser/chain.js +17 -4
- package/exports/browser/{client-lPe0SUWx-DwxXCP5p.js → client-Ba1cHcxF-B4lH2-fQ.js} +18 -13
- package/exports/browser/{index-D6qd-AUn-cJS9xh8w.js → index-DIhxISkU-Bdapw5qM.js} +1 -1
- package/exports/browser/{messages-BfDvXW-x-BaHit_or.js → messages-BX59GgBQ-DVjVrJBf.js} +1 -1
- package/exports/browser/{node-browser-Dc4HZiX0.js → node-browser-Cdgaf6tz.js} +1978 -1906
- package/exports/browser/node-browser.js +1 -1
- package/package.json +5 -5
|
@@ -379,49 +379,17 @@ const base = (ALPHABET, options = {}) => {
|
|
|
379
379
|
};
|
|
380
380
|
};
|
|
381
381
|
|
|
382
|
-
const ALPHABET$1$1 = "
|
|
383
|
-
const ALPHABET_HEX$1 = "
|
|
384
|
-
const
|
|
385
|
-
const
|
|
386
|
-
const
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
const
|
|
390
|
-
const isBase32 = (string, hex = false) => {
|
|
391
|
-
try {
|
|
392
|
-
if (hex)
|
|
393
|
-
decodeHex$2(string);
|
|
394
|
-
else
|
|
395
|
-
decode$5(string);
|
|
396
|
-
return true;
|
|
397
|
-
}
|
|
398
|
-
catch (e) {
|
|
399
|
-
return false;
|
|
400
|
-
}
|
|
401
|
-
};
|
|
402
|
-
const isBase32Hex = (string) => {
|
|
403
|
-
return isBase32(string, true);
|
|
404
|
-
};
|
|
405
|
-
var index$4 = {
|
|
406
|
-
encode: encode$4,
|
|
407
|
-
decode: decode$5,
|
|
408
|
-
encodeHex: encodeHex$2,
|
|
409
|
-
decodeHex: decodeHex$2,
|
|
410
|
-
isBase32,
|
|
411
|
-
isBase32Hex,
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
const ALPHABET$2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
415
|
-
const ALPHABET_HEX = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
|
|
416
|
-
const base58 = base(ALPHABET$2);
|
|
417
|
-
const base58Hex = base(ALPHABET_HEX);
|
|
418
|
-
const encode$3 = base58.encode;
|
|
419
|
-
const decode$4 = base58.decode;
|
|
420
|
-
const encodeHex$1 = base58Hex.encode;
|
|
421
|
-
const decodeHex$1 = base58Hex.decode;
|
|
382
|
+
const ALPHABET$1$1 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
383
|
+
const ALPHABET_HEX$1 = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
|
|
384
|
+
const base58 = base(ALPHABET$1$1);
|
|
385
|
+
const base58Hex = base(ALPHABET_HEX$1);
|
|
386
|
+
const encode$4 = base58.encode;
|
|
387
|
+
const decode$5 = base58.decode;
|
|
388
|
+
const encodeHex$2 = base58Hex.encode;
|
|
389
|
+
const decodeHex$2 = base58Hex.decode;
|
|
422
390
|
const isBase58 = (string) => {
|
|
423
391
|
try {
|
|
424
|
-
decode$
|
|
392
|
+
decode$5(string);
|
|
425
393
|
return true;
|
|
426
394
|
}
|
|
427
395
|
catch (e) {
|
|
@@ -430,7 +398,7 @@ const isBase58 = (string) => {
|
|
|
430
398
|
};
|
|
431
399
|
const isBase58Hex = (string) => {
|
|
432
400
|
try {
|
|
433
|
-
decodeHex$
|
|
401
|
+
decodeHex$2(string);
|
|
434
402
|
return true;
|
|
435
403
|
}
|
|
436
404
|
catch (e) {
|
|
@@ -439,12 +407,12 @@ const isBase58Hex = (string) => {
|
|
|
439
407
|
};
|
|
440
408
|
const whatType = (string) => {
|
|
441
409
|
try {
|
|
442
|
-
decode$
|
|
410
|
+
decode$5(string);
|
|
443
411
|
return "base58";
|
|
444
412
|
}
|
|
445
413
|
catch (e) {
|
|
446
414
|
try {
|
|
447
|
-
decodeHex$
|
|
415
|
+
decodeHex$2(string);
|
|
448
416
|
return "base58Hex";
|
|
449
417
|
}
|
|
450
418
|
catch {
|
|
@@ -453,15 +421,143 @@ const whatType = (string) => {
|
|
|
453
421
|
}
|
|
454
422
|
};
|
|
455
423
|
var base58$1 = {
|
|
456
|
-
encode: encode$
|
|
457
|
-
decode: decode$
|
|
424
|
+
encode: encode$4,
|
|
425
|
+
decode: decode$5,
|
|
458
426
|
isBase58,
|
|
459
427
|
isBase58Hex,
|
|
460
|
-
encodeHex: encodeHex$
|
|
461
|
-
decodeHex: decodeHex$
|
|
428
|
+
encodeHex: encodeHex$2,
|
|
429
|
+
decodeHex: decodeHex$2,
|
|
462
430
|
whatType,
|
|
463
431
|
};
|
|
464
432
|
|
|
433
|
+
const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
|
|
434
|
+
|
|
435
|
+
const { subtle: subtle$1 } = crypto;
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* ```js
|
|
439
|
+
* const {createHash} = await import('@leofcoin/crypto')
|
|
440
|
+
* createHash(data, algorithm)
|
|
441
|
+
* ```
|
|
442
|
+
* @param {Uint8Array} data
|
|
443
|
+
* @param {string} algorithm
|
|
444
|
+
* @returns Uint8Array
|
|
445
|
+
*/
|
|
446
|
+
const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Hashes the created hash again
|
|
450
|
+
* ```js
|
|
451
|
+
* const {createDoubleHash} = await import('@leofcoin/crypto')
|
|
452
|
+
* createDoubleHash(data, algorithm)
|
|
453
|
+
* ```
|
|
454
|
+
* @param {Uint8Array} data
|
|
455
|
+
* @param {string} algorithm
|
|
456
|
+
* @returns Uint8Array
|
|
457
|
+
*/
|
|
458
|
+
const createDoubleHash = async (data, algorithm = 'SHA-512') =>
|
|
459
|
+
subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
|
|
460
|
+
|
|
461
|
+
const generatePbkdf2 = async (password) => {
|
|
462
|
+
return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
|
|
466
|
+
const key = await generatePbkdf2(password);
|
|
467
|
+
return subtle$1.deriveBits(
|
|
468
|
+
{
|
|
469
|
+
name: 'PBKDF2',
|
|
470
|
+
hash,
|
|
471
|
+
salt,
|
|
472
|
+
iterations
|
|
473
|
+
},
|
|
474
|
+
key,
|
|
475
|
+
length
|
|
476
|
+
)
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
|
|
480
|
+
if (!options) options = {};
|
|
481
|
+
|
|
482
|
+
if (typeof options.seperator === 'string')
|
|
483
|
+
options.seperator = new TextEncoder().encode(options.seperator);
|
|
484
|
+
|
|
485
|
+
const length = options.length || input.reduce((total, current, i) => {
|
|
486
|
+
total += current.length;
|
|
487
|
+
if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
|
|
488
|
+
return total
|
|
489
|
+
}, 0);
|
|
490
|
+
|
|
491
|
+
const typedArray = new Uint8Array(length);
|
|
492
|
+
|
|
493
|
+
let currentIndex = 0;
|
|
494
|
+
let index = 0;
|
|
495
|
+
for (const source of input) {
|
|
496
|
+
typedArray.set(source, currentIndex);
|
|
497
|
+
if (options.seperator && input.length - 1 > index) {
|
|
498
|
+
typedArray.set(options.seperator, currentIndex + source.length);
|
|
499
|
+
currentIndex+= options.seperator.length;
|
|
500
|
+
}
|
|
501
|
+
currentIndex += source.length;
|
|
502
|
+
index += 1;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return typedArray
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
const concatAndDoubleHash = async (input) => {
|
|
509
|
+
return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
const encode$3 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
513
|
+
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
514
|
+
throw new TypeError('Expected Uint8Array');
|
|
515
|
+
}
|
|
516
|
+
const hash = await concatAndDoubleHash([
|
|
517
|
+
prefix,
|
|
518
|
+
source
|
|
519
|
+
]);
|
|
520
|
+
const uint8Array = typedArrayConcat([
|
|
521
|
+
prefix,
|
|
522
|
+
source,
|
|
523
|
+
hash.subarray(0, 4)
|
|
524
|
+
]);
|
|
525
|
+
if (hex)
|
|
526
|
+
return base58$1.encodeHex(uint8Array);
|
|
527
|
+
return base58$1.encode(uint8Array);
|
|
528
|
+
};
|
|
529
|
+
const decode$4 = async (string, hex) => {
|
|
530
|
+
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
531
|
+
const prefix = uint8Array.subarray(0, 2);
|
|
532
|
+
const source = uint8Array.subarray(2, -4);
|
|
533
|
+
const hash = await concatAndDoubleHash([
|
|
534
|
+
prefix,
|
|
535
|
+
source
|
|
536
|
+
]);
|
|
537
|
+
let index = 0;
|
|
538
|
+
const slice = uint8Array.subarray(-4);
|
|
539
|
+
for (const check of slice) {
|
|
540
|
+
if (check !== hash[index]) {
|
|
541
|
+
throw new Error('Invalid checksum');
|
|
542
|
+
}
|
|
543
|
+
index++;
|
|
544
|
+
}
|
|
545
|
+
return { prefix, data: source };
|
|
546
|
+
};
|
|
547
|
+
const isBase58check = (string, hex) => {
|
|
548
|
+
try {
|
|
549
|
+
hex ? decode$4(string, true) : decode$4(string);
|
|
550
|
+
return true;
|
|
551
|
+
}
|
|
552
|
+
catch (e) {
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
const encodeHex$1 = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$3(uint8Array, prefix, true);
|
|
557
|
+
const decodeHex$1 = (string) => decode$4(string, true);
|
|
558
|
+
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
559
|
+
var base58check = { encode: encode$3, decode: decode$4, encodeHex: encodeHex$1, decodeHex: decodeHex$1, isBase58check, isBase58checkHex };
|
|
560
|
+
|
|
465
561
|
const MSB$1 = 0x80;
|
|
466
562
|
const MSBALL = -128;
|
|
467
563
|
const INT = Math.pow(2, 31);
|
|
@@ -530,16 +626,16 @@ var encodingLength = (value) => (value < N1 ? 1
|
|
|
530
626
|
: value < N9 ? 9
|
|
531
627
|
: 10);
|
|
532
628
|
|
|
533
|
-
var index$
|
|
629
|
+
var index$4 = {
|
|
534
630
|
encode: encode$2,
|
|
535
631
|
decode: decode$3,
|
|
536
632
|
encodingLength
|
|
537
633
|
};
|
|
538
634
|
|
|
539
|
-
var index$
|
|
635
|
+
var index$3 = (input, prefix) => {
|
|
540
636
|
const encodedArray = [];
|
|
541
637
|
const length = input.reduce((total, current) => {
|
|
542
|
-
const encoded = index$
|
|
638
|
+
const encoded = index$4.encode(current.length);
|
|
543
639
|
encodedArray.push(encoded);
|
|
544
640
|
total += current.length + encoded.length;
|
|
545
641
|
return total;
|
|
@@ -557,12 +653,12 @@ var index$2 = (input, prefix) => {
|
|
|
557
653
|
return typedArray;
|
|
558
654
|
};
|
|
559
655
|
|
|
560
|
-
var index$
|
|
656
|
+
var index$2 = (typedArray, prefix) => {
|
|
561
657
|
const set = [];
|
|
562
658
|
const varintAndSub = (typedArray) => {
|
|
563
|
-
const length = index$
|
|
659
|
+
const length = index$4.decode(typedArray);
|
|
564
660
|
// remove length
|
|
565
|
-
typedArray = typedArray.subarray(index$
|
|
661
|
+
typedArray = typedArray.subarray(index$4.decode.bytes);
|
|
566
662
|
// push value
|
|
567
663
|
set.push(typedArray.subarray(0, length));
|
|
568
664
|
// remove value
|
|
@@ -574,1814 +670,1686 @@ var index$1$1 = (typedArray, prefix) => {
|
|
|
574
670
|
return varintAndSub(typedArray);
|
|
575
671
|
};
|
|
576
672
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
673
|
+
const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
|
|
674
|
+
const decoded = base58$1.decode(multiWif);
|
|
675
|
+
let [version, codec, privateKey] = index$2(decoded);
|
|
676
|
+
version = Number(new TextDecoder().decode(version));
|
|
677
|
+
codec = Number(new TextDecoder().decode(codec));
|
|
678
|
+
if (expectedVersion && version !== expectedVersion)
|
|
679
|
+
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
680
|
+
if (expectedCodec && codec !== expectedCodec)
|
|
681
|
+
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
682
|
+
return { version, codec, privateKey };
|
|
683
|
+
};
|
|
684
|
+
var index$1$1 = {
|
|
685
|
+
encode: (version, codec, privateKey) => {
|
|
686
|
+
return base58$1.encode(index$3([
|
|
687
|
+
new TextEncoder().encode(version.toString()),
|
|
688
|
+
new TextEncoder().encode(codec.toString()),
|
|
689
|
+
privateKey
|
|
690
|
+
]));
|
|
691
|
+
},
|
|
692
|
+
decode: decode$2,
|
|
693
|
+
isMultiWif: (multiWif) => {
|
|
694
|
+
try {
|
|
695
|
+
const { version, codec, privateKey } = decode$2(multiWif);
|
|
696
|
+
if (version === undefined)
|
|
697
|
+
return false;
|
|
698
|
+
if (codec === undefined)
|
|
699
|
+
return false;
|
|
700
|
+
if (privateKey === undefined)
|
|
701
|
+
return false;
|
|
702
|
+
if (privateKey && privateKey.length !== 32)
|
|
703
|
+
return false;
|
|
704
|
+
}
|
|
705
|
+
catch {
|
|
706
|
+
return false;
|
|
707
|
+
}
|
|
708
|
+
return true;
|
|
709
|
+
}
|
|
614
710
|
};
|
|
615
711
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
:
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
const
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
712
|
+
/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
713
|
+
/**
|
|
714
|
+
* 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
|
|
715
|
+
* Compliant with RFC6979 & BIP340.
|
|
716
|
+
* @module
|
|
717
|
+
*/
|
|
718
|
+
/**
|
|
719
|
+
* Curve params from SEC 2 v2 §2.4.1.
|
|
720
|
+
* secp256k1 is a short Weierstrass / Koblitz curve with equation
|
|
721
|
+
* `y² == x³ + ax + b`.
|
|
722
|
+
* * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
|
|
723
|
+
* * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
|
|
724
|
+
* * h = `1n` // cofactor
|
|
725
|
+
* * a = `0n` // equation param
|
|
726
|
+
* * b = `7n` // equation param
|
|
727
|
+
* * Gx, Gy are coordinates of Generator / base point
|
|
728
|
+
*/
|
|
729
|
+
// Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
|
|
730
|
+
// callers cannot mutate them out from under the arithmetic constants captured below.
|
|
731
|
+
const secp256k1_CURVE = Object.freeze({
|
|
732
|
+
p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
|
|
733
|
+
n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
|
|
734
|
+
h: 1n,
|
|
735
|
+
a: 0n,
|
|
736
|
+
b: 7n,
|
|
737
|
+
Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
|
|
738
|
+
Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
|
|
739
|
+
});
|
|
740
|
+
const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
|
|
741
|
+
// 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
|
|
742
|
+
// by the RFC6979 paths here.
|
|
743
|
+
const L = 32;
|
|
744
|
+
const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
|
|
745
|
+
const lengths = {
|
|
746
|
+
publicKey: L + 1,
|
|
747
|
+
publicKeyUncompressed: L2 + 1,
|
|
748
|
+
// 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
|
|
749
|
+
// 352-bit recommendation for 256-bit prime curves.
|
|
750
|
+
seed: L + L / 2,
|
|
751
|
+
};
|
|
752
|
+
// Helpers and Precomputes sections are reused between libraries
|
|
753
|
+
// ## Helpers
|
|
754
|
+
// ----------
|
|
755
|
+
const err$1 = (message = '', E = Error) => {
|
|
756
|
+
const e = new E(message);
|
|
757
|
+
const { captureStackTrace } = Error;
|
|
758
|
+
if (typeof captureStackTrace === 'function')
|
|
759
|
+
captureStackTrace(e, err$1);
|
|
760
|
+
throw e;
|
|
761
|
+
};
|
|
762
|
+
// Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
|
|
763
|
+
// fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
|
|
764
|
+
// spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
|
|
765
|
+
const isBytes = (a) => a instanceof Uint8Array ||
|
|
766
|
+
(ArrayBuffer.isView(a) &&
|
|
767
|
+
a.constructor.name === 'Uint8Array' &&
|
|
768
|
+
a.BYTES_PER_ELEMENT === 1);
|
|
769
|
+
/** Asserts something is Bytes. */
|
|
770
|
+
const abytes = (value, length, title = '') => {
|
|
771
|
+
const bytes = isBytes(value);
|
|
772
|
+
const len = value?.length;
|
|
773
|
+
const needsLen = length !== undefined;
|
|
774
|
+
if (!bytes || (needsLen && len !== length)) {
|
|
775
|
+
const prefix = title && `"${title}" `;
|
|
776
|
+
const ofLen = needsLen ? ` of length ${length}` : '';
|
|
777
|
+
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
778
|
+
const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
|
|
779
|
+
return bytes ? err$1(msg, RangeError) : err$1(msg, TypeError);
|
|
669
780
|
}
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
781
|
+
return value;
|
|
782
|
+
};
|
|
783
|
+
/** create Uint8Array */
|
|
784
|
+
const u8n = (len) => new Uint8Array(len);
|
|
785
|
+
// Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
|
|
786
|
+
const padh = (n, pad) => n.toString(16).padStart(pad, '0');
|
|
787
|
+
/** Render bytes as lowercase hex. */
|
|
788
|
+
const bytesToHex = (b) => {
|
|
789
|
+
let hex = '';
|
|
790
|
+
for (const e of abytes(b))
|
|
791
|
+
hex += padh(e, 2);
|
|
792
|
+
return hex;
|
|
793
|
+
};
|
|
794
|
+
const C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
|
|
795
|
+
// Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
|
|
796
|
+
// prettier-ignore
|
|
797
|
+
const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
|
|
798
|
+
: ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
|
|
799
|
+
: ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
|
|
800
|
+
: undefined;
|
|
801
|
+
const hexToBytes = (hex) => {
|
|
802
|
+
const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
|
|
803
|
+
if (typeof hex !== 'string')
|
|
804
|
+
return err$1(e);
|
|
805
|
+
const hl = hex.length;
|
|
806
|
+
const al = hl / 2;
|
|
807
|
+
if (hl % 2)
|
|
808
|
+
return err$1(e);
|
|
809
|
+
const array = u8n(al);
|
|
810
|
+
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
811
|
+
// treat each char as ASCII
|
|
812
|
+
const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
|
|
813
|
+
const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
|
|
814
|
+
if (n1 === undefined || n2 === undefined)
|
|
815
|
+
return err$1(e);
|
|
816
|
+
array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
|
|
676
817
|
}
|
|
677
|
-
return
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
const
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
818
|
+
return array;
|
|
819
|
+
};
|
|
820
|
+
// WebCrypto is available in all modern environments
|
|
821
|
+
const subtle = () => globalThis?.crypto?.subtle ?? err$1('crypto.subtle must be defined, consider polyfill');
|
|
822
|
+
// prettier-ignore
|
|
823
|
+
const concatBytes = (...arrs) => {
|
|
824
|
+
let len = 0;
|
|
825
|
+
for (const a of arrs)
|
|
826
|
+
len += abytes(a).length; // validate every input and sum lengths before copying
|
|
827
|
+
const r = u8n(len);
|
|
828
|
+
let pad = 0; // walk through each array,
|
|
829
|
+
for (const a of arrs)
|
|
830
|
+
r.set(a, pad), pad += a.length; // ensure they have proper type
|
|
831
|
+
return r;
|
|
832
|
+
};
|
|
833
|
+
/**
|
|
834
|
+
* WebCrypto OS-level CSPRNG (random number generator).
|
|
835
|
+
* Will throw when not available; large-request ceilings are delegated to getRandomValues().
|
|
836
|
+
*/
|
|
837
|
+
const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
|
|
838
|
+
const big = BigInt;
|
|
839
|
+
const arange = (n, min, max, msg = 'bad number: out of range') => {
|
|
840
|
+
if (typeof n !== 'bigint')
|
|
841
|
+
return err$1(msg, TypeError);
|
|
842
|
+
if (min <= n && n < max)
|
|
843
|
+
return n;
|
|
844
|
+
return err$1(msg, RangeError);
|
|
845
|
+
};
|
|
846
|
+
/** Canonical modular reduction. Callers must provide a positive modulus. */
|
|
847
|
+
const M = (a, b = P) => {
|
|
848
|
+
const r = a % b;
|
|
849
|
+
return r >= 0n ? r : b + r;
|
|
850
|
+
};
|
|
851
|
+
const modN = (a) => M(a, N);
|
|
852
|
+
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
853
|
+
// prettier-ignore
|
|
854
|
+
const invert = (num, md) => {
|
|
855
|
+
if (num === 0n || md <= 0n)
|
|
856
|
+
err$1('no inverse n=' + num + ' mod=' + md);
|
|
857
|
+
let a = M(num, md), b = md, x = 0n, u = 1n;
|
|
858
|
+
while (a !== 0n) {
|
|
859
|
+
const q = b / a, r = b % a;
|
|
860
|
+
const m = x - u * q;
|
|
861
|
+
b = a, a = r, x = u, u = m;
|
|
688
862
|
}
|
|
689
|
-
return
|
|
690
|
-
}
|
|
691
|
-
const
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
863
|
+
return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
|
|
864
|
+
};
|
|
865
|
+
const callHash = (name) => {
|
|
866
|
+
// @ts-ignore
|
|
867
|
+
const fn = hashes[name];
|
|
868
|
+
if (typeof fn !== 'function')
|
|
869
|
+
err$1('hashes.' + name + ' not set');
|
|
870
|
+
return fn;
|
|
871
|
+
};
|
|
872
|
+
// All exported provider slots are caller-configurable and may be unset or return arbitrary values,
|
|
873
|
+
// so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
|
|
874
|
+
const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
|
|
875
|
+
const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
|
|
876
|
+
// also rejects structurally similar Point values from other realms / bundled copies
|
|
877
|
+
const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
|
|
878
|
+
// ## End of Helpers
|
|
879
|
+
// -----------------
|
|
880
|
+
/**
|
|
881
|
+
* secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
|
|
882
|
+
* making it x³+b; callers validate x first.
|
|
883
|
+
*/
|
|
884
|
+
const koblitz = (x) => M(M(x * x) * x + _b);
|
|
885
|
+
/** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
|
|
886
|
+
const FpIsValid = (n) => arange(n, 0n, P);
|
|
887
|
+
/** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
|
|
888
|
+
const FpIsValidNot0 = (n) => arange(n, 1n, P);
|
|
889
|
+
/** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
|
|
890
|
+
const FnIsValidNot0 = (n) => arange(n, 1n, N);
|
|
891
|
+
// Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
|
|
892
|
+
const isEven = (y) => !(y & 1n);
|
|
893
|
+
/** create Uint8Array of byte n */
|
|
894
|
+
const u8of = (n) => Uint8Array.of(n);
|
|
895
|
+
/** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
|
|
896
|
+
const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
|
|
897
|
+
/** lift_x from BIP340 returns the unique even square root for x³+7.
|
|
898
|
+
* SEC 1 callers still flip it for the odd-prefix branch. */
|
|
899
|
+
const lift_x = (x) => {
|
|
900
|
+
// Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
|
|
901
|
+
const c = koblitz(FpIsValidNot0(x));
|
|
902
|
+
// r = √c candidate
|
|
903
|
+
// r = c^((p+1)/4) mod p
|
|
904
|
+
// This formula works for fields p = 3 mod 4 -- a special, fast case.
|
|
905
|
+
// Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
|
|
906
|
+
let r = 1n;
|
|
907
|
+
for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
|
|
908
|
+
// powMod: modular exponentiation.
|
|
909
|
+
if (e & 1n)
|
|
910
|
+
r = (r * num) % P; // Uses exponentiation by squaring.
|
|
911
|
+
num = (num * num) % P; // Not constant-time.
|
|
704
912
|
}
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
913
|
+
if (M(r * r) !== c)
|
|
914
|
+
err$1('sqrt invalid'); // check if result is valid
|
|
915
|
+
return isEven(r) ? r : M(-r);
|
|
916
|
+
};
|
|
917
|
+
/**
|
|
918
|
+
* Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
|
|
919
|
+
* @param X - X coordinate.
|
|
920
|
+
* @param Y - Y coordinate.
|
|
921
|
+
* @param Z - projective Z coordinate.
|
|
922
|
+
* @example
|
|
923
|
+
* Do point arithmetic with the base point and encode the result as hex.
|
|
924
|
+
* ```ts
|
|
925
|
+
* import { Point } from '@noble/secp256k1';
|
|
926
|
+
* const hex = Point.BASE.double().toHex();
|
|
927
|
+
* ```
|
|
928
|
+
*/
|
|
929
|
+
class Point {
|
|
930
|
+
static BASE;
|
|
931
|
+
static ZERO;
|
|
932
|
+
X;
|
|
933
|
+
Y;
|
|
934
|
+
Z;
|
|
935
|
+
constructor(X, Y, Z) {
|
|
936
|
+
this.X = FpIsValid(X);
|
|
937
|
+
this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
|
|
938
|
+
this.Z = FpIsValid(Z);
|
|
939
|
+
Object.freeze(this);
|
|
940
|
+
}
|
|
941
|
+
/** Returns the shared curve metadata object by reference.
|
|
942
|
+
* It is readonly only at type level, and mutating it won't retarget arithmetic,
|
|
943
|
+
* which already uses module-load snapshots. */
|
|
944
|
+
static CURVE() {
|
|
945
|
+
return secp256k1_CURVE;
|
|
946
|
+
}
|
|
947
|
+
/** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
|
|
948
|
+
static fromAffine(ap) {
|
|
949
|
+
const { x, y } = ap;
|
|
950
|
+
return x === 0n && y === 0n ? I : new Point(x, y, 1n);
|
|
951
|
+
}
|
|
952
|
+
/** Convert Uint8Array or hex string to Point. */
|
|
953
|
+
static fromBytes(bytes) {
|
|
954
|
+
abytes(bytes);
|
|
955
|
+
const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
|
|
956
|
+
let p = undefined;
|
|
957
|
+
const length = bytes.length;
|
|
958
|
+
const head = bytes[0];
|
|
959
|
+
const tail = bytes.subarray(1);
|
|
960
|
+
const x = sliceBytesNumBE(tail, 0, L);
|
|
961
|
+
// SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
|
|
962
|
+
// infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
|
|
963
|
+
// and public-key validation helpers, so strict handling applies to all callers by default.
|
|
964
|
+
// Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
|
|
965
|
+
// Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
|
|
966
|
+
if (length === comp && (head === 0x02 || head === 0x03)) {
|
|
967
|
+
// Equation is y² == x³ + ax + b. We calculate y from x.
|
|
968
|
+
// lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
|
|
969
|
+
let y = lift_x(x);
|
|
970
|
+
if (head === 0x03)
|
|
971
|
+
y = M(-y);
|
|
972
|
+
p = new Point(x, y, 1n);
|
|
726
973
|
}
|
|
974
|
+
// Uncompressed 65-byte point, 0x04 prefix
|
|
975
|
+
if (length === uncomp && head === 0x04)
|
|
976
|
+
p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
|
|
977
|
+
// Validate point
|
|
978
|
+
return p ? p.assertValidity() : err$1('bad point: not on curve');
|
|
727
979
|
}
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
function decodeBase64(data) {
|
|
731
|
-
const bufferLength = getDecodeBase64Length(data);
|
|
732
|
-
const len = data.length;
|
|
733
|
-
const bytes = new Uint8Array(bufferLength);
|
|
734
|
-
let p = 0;
|
|
735
|
-
for (let i = 0; i < len; i += 4) {
|
|
736
|
-
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
737
|
-
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
738
|
-
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
739
|
-
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
740
|
-
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
741
|
-
p += 1;
|
|
742
|
-
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
743
|
-
p += 1;
|
|
744
|
-
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
745
|
-
p += 1;
|
|
980
|
+
static fromHex(hex) {
|
|
981
|
+
return Point.fromBytes(hexToBytes(hex));
|
|
746
982
|
}
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
983
|
+
get x() {
|
|
984
|
+
return this.toAffine().x;
|
|
985
|
+
}
|
|
986
|
+
get y() {
|
|
987
|
+
return this.toAffine().y;
|
|
988
|
+
}
|
|
989
|
+
/** Equality check: compare points P&Q. */
|
|
990
|
+
equals(other) {
|
|
991
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
992
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
|
|
993
|
+
const X1Z2 = M(X1 * Z2);
|
|
994
|
+
const X2Z1 = M(X2 * Z1);
|
|
995
|
+
const Y1Z2 = M(Y1 * Z2);
|
|
996
|
+
const Y2Z1 = M(Y2 * Z1);
|
|
997
|
+
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
998
|
+
}
|
|
999
|
+
is0() {
|
|
1000
|
+
return this.equals(I);
|
|
1001
|
+
}
|
|
1002
|
+
/** Flip point over y coordinate. */
|
|
1003
|
+
negate() {
|
|
1004
|
+
return new Point(this.X, M(-this.Y), this.Z);
|
|
1005
|
+
}
|
|
1006
|
+
/** Point doubling: P+P, complete formula. */
|
|
1007
|
+
double() {
|
|
1008
|
+
return this.add(this);
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Point addition: P+Q, complete, exception-free formula
|
|
1012
|
+
* (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
|
|
1013
|
+
* Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
|
|
1014
|
+
*/
|
|
1015
|
+
// prettier-ignore
|
|
1016
|
+
add(other) {
|
|
1017
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
1018
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
|
|
1019
|
+
const a = 0n;
|
|
1020
|
+
const b = _b;
|
|
1021
|
+
let X3 = 0n, Y3 = 0n, Z3 = 0n;
|
|
1022
|
+
const b3 = M(b * 3n);
|
|
1023
|
+
let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
|
|
1024
|
+
let t4 = M(X2 + Y2); // step 5
|
|
1025
|
+
t3 = M(t3 * t4);
|
|
1026
|
+
t4 = M(t0 + t1);
|
|
1027
|
+
t3 = M(t3 - t4);
|
|
1028
|
+
t4 = M(X1 + Z1);
|
|
1029
|
+
let t5 = M(X2 + Z2); // step 10
|
|
1030
|
+
t4 = M(t4 * t5);
|
|
1031
|
+
t5 = M(t0 + t2);
|
|
1032
|
+
t4 = M(t4 - t5);
|
|
1033
|
+
t5 = M(Y1 + Z1);
|
|
1034
|
+
X3 = M(Y2 + Z2); // step 15
|
|
1035
|
+
t5 = M(t5 * X3);
|
|
1036
|
+
X3 = M(t1 + t2);
|
|
1037
|
+
t5 = M(t5 - X3);
|
|
1038
|
+
Z3 = M(a * t4);
|
|
1039
|
+
X3 = M(b3 * t2); // step 20
|
|
1040
|
+
Z3 = M(X3 + Z3);
|
|
1041
|
+
X3 = M(t1 - Z3);
|
|
1042
|
+
Z3 = M(t1 + Z3);
|
|
1043
|
+
Y3 = M(X3 * Z3);
|
|
1044
|
+
t1 = M(t0 + t0); // step 25
|
|
1045
|
+
t1 = M(t1 + t0);
|
|
1046
|
+
t2 = M(a * t2);
|
|
1047
|
+
t4 = M(b3 * t4);
|
|
1048
|
+
t1 = M(t1 + t2);
|
|
1049
|
+
t2 = M(t0 - t2); // step 30
|
|
1050
|
+
t2 = M(a * t2);
|
|
1051
|
+
t4 = M(t4 + t2);
|
|
1052
|
+
t0 = M(t1 * t4);
|
|
1053
|
+
Y3 = M(Y3 + t0);
|
|
1054
|
+
t0 = M(t5 * t4); // step 35
|
|
1055
|
+
X3 = M(t3 * X3);
|
|
1056
|
+
X3 = M(X3 - t0);
|
|
1057
|
+
t0 = M(t3 * t1);
|
|
1058
|
+
Z3 = M(t5 * Z3);
|
|
1059
|
+
Z3 = M(Z3 + t0); // step 40
|
|
1060
|
+
return new Point(X3, Y3, Z3);
|
|
1061
|
+
}
|
|
1062
|
+
subtract(other) {
|
|
1063
|
+
return this.add(apoint(other).negate());
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
1067
|
+
* Uses {@link wNAF} for base point.
|
|
1068
|
+
* Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
|
|
1069
|
+
* @param n scalar by which point is multiplied
|
|
1070
|
+
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
1071
|
+
*/
|
|
1072
|
+
multiply(n, safe = true) {
|
|
1073
|
+
// Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
|
|
1074
|
+
if (!safe && n === 0n)
|
|
1075
|
+
return I;
|
|
1076
|
+
FnIsValidNot0(n);
|
|
1077
|
+
if (n === 1n)
|
|
1078
|
+
return this;
|
|
1079
|
+
if (this.equals(G))
|
|
1080
|
+
return wNAF(n).p;
|
|
1081
|
+
// init result point & fake point
|
|
1082
|
+
let p = I;
|
|
1083
|
+
let f = G;
|
|
1084
|
+
for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
|
|
1085
|
+
// if bit is present, add to point
|
|
1086
|
+
// if not present, add to fake, for timing safety
|
|
1087
|
+
if (n & 1n)
|
|
1088
|
+
p = p.add(d);
|
|
1089
|
+
else if (safe)
|
|
1090
|
+
f = f.add(d);
|
|
761
1091
|
}
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
yield loadWASMPromise;
|
|
804
|
-
}
|
|
805
|
-
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
806
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
807
|
-
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
808
|
-
});
|
|
809
|
-
const init = (bits = null) => {
|
|
810
|
-
initialized = true;
|
|
811
|
-
wasmInstance.exports.Hash_Init(bits);
|
|
812
|
-
};
|
|
813
|
-
const updateUInt8Array = (data) => {
|
|
814
|
-
let read = 0;
|
|
815
|
-
while (read < data.length) {
|
|
816
|
-
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
817
|
-
read += chunk.length;
|
|
818
|
-
memoryView.set(chunk);
|
|
819
|
-
wasmInstance.exports.Hash_Update(chunk.length);
|
|
820
|
-
}
|
|
821
|
-
};
|
|
822
|
-
const update = (data) => {
|
|
823
|
-
if (!initialized) {
|
|
824
|
-
throw new Error("update() called before init()");
|
|
825
|
-
}
|
|
826
|
-
const Uint8Buffer = getUInt8Buffer(data);
|
|
827
|
-
updateUInt8Array(Uint8Buffer);
|
|
828
|
-
};
|
|
829
|
-
const digestChars = new Uint8Array(hashLength * 2);
|
|
830
|
-
const digest = (outputType, padding = null) => {
|
|
831
|
-
if (!initialized) {
|
|
832
|
-
throw new Error("digest() called before init()");
|
|
833
|
-
}
|
|
834
|
-
initialized = false;
|
|
835
|
-
wasmInstance.exports.Hash_Final(padding);
|
|
836
|
-
if (outputType === "binary") {
|
|
837
|
-
// the data is copied to allow GC of the original memory object
|
|
838
|
-
return memoryView.slice(0, hashLength);
|
|
839
|
-
}
|
|
840
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
841
|
-
};
|
|
842
|
-
const save = () => {
|
|
843
|
-
if (!initialized) {
|
|
844
|
-
throw new Error("save() can only be called after init() and before digest()");
|
|
845
|
-
}
|
|
846
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
847
|
-
const stateLength = getStateSize();
|
|
848
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
849
|
-
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
850
|
-
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
851
|
-
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
852
|
-
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
853
|
-
writeHexToUInt8(prefixedState, binary.hash);
|
|
854
|
-
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
855
|
-
return prefixedState;
|
|
856
|
-
};
|
|
857
|
-
const load = (state) => {
|
|
858
|
-
if (!(state instanceof Uint8Array)) {
|
|
859
|
-
throw new Error("load() expects an Uint8Array generated by save()");
|
|
860
|
-
}
|
|
861
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
862
|
-
const stateLength = getStateSize();
|
|
863
|
-
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
864
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
865
|
-
if (state.length !== overallLength) {
|
|
866
|
-
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
867
|
-
}
|
|
868
|
-
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
869
|
-
throw new Error("This state was written by an incompatible hash implementation");
|
|
870
|
-
}
|
|
871
|
-
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
872
|
-
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
873
|
-
initialized = true;
|
|
874
|
-
};
|
|
875
|
-
const isDataShort = (data) => {
|
|
876
|
-
if (typeof data === "string") {
|
|
877
|
-
// worst case is 4 bytes / char
|
|
878
|
-
return data.length < MAX_HEAP / 4;
|
|
879
|
-
}
|
|
880
|
-
return data.byteLength < MAX_HEAP;
|
|
881
|
-
};
|
|
882
|
-
let canSimplify = isDataShort;
|
|
883
|
-
switch (binary.name) {
|
|
884
|
-
case "argon2":
|
|
885
|
-
case "scrypt":
|
|
886
|
-
canSimplify = () => true;
|
|
887
|
-
break;
|
|
888
|
-
case "blake2b":
|
|
889
|
-
case "blake2s":
|
|
890
|
-
// if there is a key at blake2 then cannot simplify
|
|
891
|
-
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
892
|
-
break;
|
|
893
|
-
case "blake3":
|
|
894
|
-
// if there is a key at blake3 then cannot simplify
|
|
895
|
-
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
896
|
-
break;
|
|
897
|
-
case "xxhash64": // cannot simplify
|
|
898
|
-
case "xxhash3":
|
|
899
|
-
case "xxhash128":
|
|
900
|
-
case "crc64":
|
|
901
|
-
canSimplify = () => false;
|
|
902
|
-
break;
|
|
903
|
-
}
|
|
904
|
-
// shorthand for (init + update + digest) for better performance
|
|
905
|
-
const calculate = (data, initParam = null, digestParam = null) => {
|
|
906
|
-
if (!canSimplify(data, initParam)) {
|
|
907
|
-
init(initParam);
|
|
908
|
-
update(data);
|
|
909
|
-
return digest("hex", digestParam);
|
|
910
|
-
}
|
|
911
|
-
const buffer = getUInt8Buffer(data);
|
|
912
|
-
memoryView.set(buffer);
|
|
913
|
-
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
914
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
915
|
-
};
|
|
916
|
-
yield setupInterface();
|
|
917
|
-
return {
|
|
918
|
-
getMemory,
|
|
919
|
-
writeMemory,
|
|
920
|
-
getExports,
|
|
921
|
-
setMemorySize,
|
|
922
|
-
init,
|
|
923
|
-
update,
|
|
924
|
-
digest,
|
|
925
|
-
save,
|
|
926
|
-
load,
|
|
927
|
-
calculate,
|
|
928
|
-
hashLength,
|
|
929
|
-
};
|
|
930
|
-
});
|
|
1092
|
+
return p;
|
|
1093
|
+
}
|
|
1094
|
+
multiplyUnsafe(scalar) {
|
|
1095
|
+
return this.multiply(scalar, false);
|
|
1096
|
+
}
|
|
1097
|
+
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
1098
|
+
toAffine() {
|
|
1099
|
+
const { X: x, Y: y, Z: z } = this;
|
|
1100
|
+
// fast-paths for ZERO point OR Z=1
|
|
1101
|
+
if (this.equals(I))
|
|
1102
|
+
return { x: 0n, y: 0n };
|
|
1103
|
+
if (z === 1n)
|
|
1104
|
+
return { x, y };
|
|
1105
|
+
const iz = invert(z, P);
|
|
1106
|
+
// (Z * Z^-1) must be 1, otherwise bad math
|
|
1107
|
+
if (M(z * iz) !== 1n)
|
|
1108
|
+
err$1('inverse invalid');
|
|
1109
|
+
// x = X*Z^-1; y = Y*Z^-1
|
|
1110
|
+
return { x: M(x * iz), y: M(y * iz) };
|
|
1111
|
+
}
|
|
1112
|
+
/** Checks if the point is valid and on-curve. */
|
|
1113
|
+
assertValidity() {
|
|
1114
|
+
const { x, y } = this.toAffine(); // convert to 2d xy affine point.
|
|
1115
|
+
FpIsValidNot0(x); // must be in range 1 <= x,y < P
|
|
1116
|
+
FpIsValidNot0(y);
|
|
1117
|
+
// y² == x³ + ax + b, equation sides must be equal
|
|
1118
|
+
return M(y * y) === koblitz(x) ? this : err$1('bad point: not on curve');
|
|
1119
|
+
}
|
|
1120
|
+
/** Converts point to 33/65-byte Uint8Array. */
|
|
1121
|
+
toBytes(isCompressed = true) {
|
|
1122
|
+
// Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
|
|
1123
|
+
// out of this byte surface because callers treat these encodings as public keys by default.
|
|
1124
|
+
const { x, y } = this.assertValidity().toAffine();
|
|
1125
|
+
const x32b = numTo32b(x);
|
|
1126
|
+
if (isCompressed)
|
|
1127
|
+
return concatBytes(getPrefix(y), x32b);
|
|
1128
|
+
return concatBytes(u8of(0x04), x32b, numTo32b(y));
|
|
1129
|
+
}
|
|
1130
|
+
toHex(isCompressed) {
|
|
1131
|
+
return bytesToHex(this.toBytes(isCompressed));
|
|
1132
|
+
}
|
|
931
1133
|
}
|
|
932
|
-
|
|
933
|
-
new
|
|
934
|
-
|
|
935
|
-
new
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
1134
|
+
/** Generator / base point */
|
|
1135
|
+
const G = new Point(Gx, Gy, 1n);
|
|
1136
|
+
/** Identity / zero point */
|
|
1137
|
+
const I = new Point(0n, 1n, 0n);
|
|
1138
|
+
// Static aliases
|
|
1139
|
+
Point.BASE = G;
|
|
1140
|
+
Point.ZERO = I;
|
|
1141
|
+
/** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
|
|
1142
|
+
const doubleScalarMulUns = (R, u1, u2) => {
|
|
1143
|
+
return G.multiply(u1, false)
|
|
1144
|
+
.add(R.multiply(u2, false))
|
|
1145
|
+
.assertValidity();
|
|
1146
|
+
};
|
|
1147
|
+
// Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
|
|
1148
|
+
const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
|
|
1149
|
+
// Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
|
|
1150
|
+
const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
|
|
1151
|
+
const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
|
|
1152
|
+
/** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
|
|
1153
|
+
const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
|
|
1154
|
+
/** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
|
|
1155
|
+
const secretKeyToScalar = (secretKey) => {
|
|
1156
|
+
const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
|
|
1157
|
+
return arange(num, 1n, N, 'invalid secret key: outside of range');
|
|
956
1158
|
};
|
|
957
|
-
|
|
958
|
-
new Mutex();
|
|
959
1159
|
/**
|
|
960
|
-
* Creates a
|
|
1160
|
+
* Creates a SEC 1 public key from a 32-byte private key.
|
|
1161
|
+
* @param privKey - 32-byte secret key.
|
|
1162
|
+
* @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
|
|
1163
|
+
* @returns serialized secp256k1 public key in SEC 1 encoding.
|
|
1164
|
+
* @example
|
|
1165
|
+
* Derive the serialized public key for a secp256k1 secret key.
|
|
1166
|
+
* ```ts
|
|
1167
|
+
* import * as secp from '@noble/secp256k1';
|
|
1168
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1169
|
+
* const publicKey = secp.getPublicKey(secretKey);
|
|
1170
|
+
* ```
|
|
961
1171
|
*/
|
|
962
|
-
|
|
963
|
-
return
|
|
964
|
-
wasm.init();
|
|
965
|
-
const obj = {
|
|
966
|
-
init: () => {
|
|
967
|
-
wasm.init();
|
|
968
|
-
return obj;
|
|
969
|
-
},
|
|
970
|
-
update: (data) => {
|
|
971
|
-
wasm.update(data);
|
|
972
|
-
return obj;
|
|
973
|
-
},
|
|
974
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
975
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
976
|
-
save: () => wasm.save(),
|
|
977
|
-
load: (data) => {
|
|
978
|
-
wasm.load(data);
|
|
979
|
-
return obj;
|
|
980
|
-
},
|
|
981
|
-
blockSize: 64,
|
|
982
|
-
digestSize: 20,
|
|
983
|
-
};
|
|
984
|
-
return obj;
|
|
985
|
-
});
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
var name$b = "sha3";
|
|
989
|
-
var data$b = "AGFzbQEAAAABFARgAAF/YAF/AGACf38AYAN/f38AAwgHAAEBAgEAAwUEAQECAgYOAn8BQZCNBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKpBwHBQBBgAoL1wMAQQBCADcDgI0BQQBCADcD+IwBQQBCADcD8IwBQQBCADcD6IwBQQBCADcD4IwBQQBCADcD2IwBQQBCADcD0IwBQQBCADcDyIwBQQBCADcDwIwBQQBCADcDuIwBQQBCADcDsIwBQQBCADcDqIwBQQBCADcDoIwBQQBCADcDmIwBQQBCADcDkIwBQQBCADcDiIwBQQBCADcDgIwBQQBCADcD+IsBQQBCADcD8IsBQQBCADcD6IsBQQBCADcD4IsBQQBCADcD2IsBQQBCADcD0IsBQQBCADcDyIsBQQBCADcDwIsBQQBCADcDuIsBQQBCADcDsIsBQQBCADcDqIsBQQBCADcDoIsBQQBCADcDmIsBQQBCADcDkIsBQQBCADcDiIsBQQBCADcDgIsBQQBCADcD+IoBQQBCADcD8IoBQQBCADcD6IoBQQBCADcD4IoBQQBCADcD2IoBQQBCADcD0IoBQQBCADcDyIoBQQBCADcDwIoBQQBCADcDuIoBQQBCADcDsIoBQQBCADcDqIoBQQBCADcDoIoBQQBCADcDmIoBQQBCADcDkIoBQQBCADcDiIoBQQBCADcDgIoBQQBBwAwgAEEBdGtBA3Y2AoyNAUEAQQA2AoiNAQuMAwEIfwJAQQAoAoiNASIBQQBIDQBBACABIABqQQAoAoyNASICcDYCiI0BAkACQCABDQBBgAohAwwBCwJAIAIgAWsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFQQAhBgJAIANBBEkNACABQYCKAWohByADQXxxIQhBACEGA0AgByAGaiIDQcgBaiAGQYAKai0AADoAACADQckBaiAGQYEKai0AADoAACADQcoBaiAGQYIKai0AADoAACADQcsBaiAGQYMKai0AADoAACAIIAZBBGoiBkcNAAsLIAVFDQAgAUHIiwFqIQMDQCADIAZqIAZBgApqLQAAOgAAIAZBAWohBiAFQX9qIgUNAAsLIAAgBEkNAUHIiwEgAhADIAAgBGshACAEQYAKaiEDCwJAIAAgAkkNAANAIAMgAhADIAMgAmohAyAAIAJrIgAgAk8NAAsLIABFDQBBACECQcgBIQYDQCAGQYCKAWogAyAGakG4fmotAAA6AAAgBkEBaiEGIAAgAkEBaiICQf8BcUsNAAsLC+ALAS1+IAApA0AhAkEAKQPAigEhAyAAKQM4IQRBACkDuIoBIQUgACkDMCEGQQApA7CKASEHIAApAyghCEEAKQOoigEhCSAAKQMgIQpBACkDoIoBIQsgACkDGCEMQQApA5iKASENIAApAxAhDkEAKQOQigEhDyAAKQMIIRBBACkDiIoBIREgACkDACESQQApA4CKASETQQApA8iKASEUAkACQCABQcgASw0AQQApA+iKASEVQQApA/iKASEWQQApA/CKASEXQQApA4CLASEYQQApA9CKASEZQQApA+CKASEaQQApA9iKASEbDAELQQApA+CKASAAKQNghSEaQQApA9iKASAAKQNYhSEbQQApA9CKASAAKQNQhSEZIBQgACkDSIUhFEEAKQPoigEhFUEAKQP4igEhFkEAKQPwigEhF0EAKQOAiwEhGCABQekASQ0AIBggACkDgAGFIRggFiAAKQN4hSEWIBcgACkDcIUhFyAVIAApA2iFIRUgAUGJAUkNAEEAQQApA4iLASAAKQOIAYU3A4iLAQsgAyAChSEcIAUgBIUhHSAHIAaFIQcgCSAIhSEIIAsgCoUhHiANIAyFIQkgDyAOhSEKIBEgEIUhCyATIBKFIQxBACkDuIsBIRBBACkDkIsBIRFBACkDoIsBIRJBACkDsIsBIRNBACkDiIsBIQ1BACkDwIsBIQ5BACkDmIsBIR9BACkDqIsBIQ9BwH4hAANAIB4gByALhSAbhSAYhSAPhUIBiYUgFIUgF4UgH4UgDoUhAiAMIB0gCoUgGoUgDYUgE4VCAYmFIAiFIBmFIBaFIBKFIgMgB4UhICAJIAggDIUgGYUgFoUgEoVCAYmFIByFIBWFIBGFIBCFIgQgDoUhISAcIAogFCAehSAXhSAfhSAOhUIBiYUgHYUgGoUgDYUgE4UiBYVCN4kiIiALIBwgCYUgFYUgEYUgEIVCAYmFIAeFIBuFIBiFIA+FIgYgCoVCPokiI0J/hYMgAyAPhUICiSIkhSEOIBYgAoVCKYkiJSAEIBeFQieJIiZCf4WDICKFIQ8gECAFhUI4iSIQIAYgDYVCD4kiJ0J/hYMgAyAbhUIKiSIohSENIAQgHoVCG4kiKSAoIAggAoVCJIkiKkJ/hYOFIRYgBiAdhUIGiSIrIAMgC4VCAYkiLEJ/hYMgEiAChUISiSIthSEXICsgBCAfhUIIiSIuIBUgBYVCGYkiFUJ/hYOFIRsgBiAThUI9iSIdIAQgFIVCFIkiBCAJIAWFQhyJIghCf4WDhSEUIAggHUJ/hYMgAyAYhUItiSIDhSEcIB0gA0J/hYMgGSAChUIDiSIJhSEdIAQgAyAJQn+Fg4UhByAJIARCf4WDIAiFIQggDCAChSICICFCDokiA0J/hYMgESAFhUIViSIEhSEJIAYgGoVCK4kiBSADIARCf4WDhSEKIAQgBUJ/hYMgIEIsiSIEhSELIABB0AlqKQMAIAUgBEJ/hYOFIAKFIQwgJyAoQn+FgyAqhSIFIRggAyAEIAJCf4WDhSICIR4gKiApQn+FgyAQhSIDIR8gLSAuQn+FgyAVhSIEIRogJiAkICVCf4WDhSIGIRMgFSArQn+FgyAshSIoIRkgIyAmICJCf4WDhSIiIRIgLiAsIC1Cf4WDhSImIRUgJyApIBBCf4WDhSInIREgIyAkQn+FgyAlhSIjIRAgAEEIaiIADQALQQAgDzcDqIsBQQAgBTcDgIsBQQAgGzcD2IoBQQAgBzcDsIoBQQAgCzcDiIoBQQAgDjcDwIsBQQAgAzcDmIsBQQAgFzcD8IoBQQAgFDcDyIoBQQAgAjcDoIoBQQAgBjcDsIsBQQAgDTcDiIsBQQAgBDcD4IoBQQAgHTcDuIoBQQAgCjcDkIoBQQAgIjcDoIsBQQAgFjcD+IoBQQAgKDcD0IoBQQAgCDcDqIoBQQAgDDcDgIoBQQAgIzcDuIsBQQAgJzcDkIsBQQAgJjcD6IoBQQAgHDcDwIoBQQAgCTcDmIoBC/gCAQV/QeQAQQAoAoyNASIBQQF2ayECAkBBACgCiI0BIgNBAEgNACABIQQCQCABIANGDQAgA0HIiwFqIQVBACEDA0AgBSADakEAOgAAIANBAWoiAyABQQAoAoiNASIEa0kNAAsLIARByIsBaiIDIAMtAAAgAHI6AAAgAUHHiwFqIgMgAy0AAEGAAXI6AABByIsBIAEQA0EAQYCAgIB4NgKIjQELAkAgAkEESQ0AIAJBAnYiA0EDcSEFQQAhBAJAIANBf2pBA0kNACADQfz///8DcSEBQQAhA0EAIQQDQCADQYAKaiADQYCKAWooAgA2AgAgA0GECmogA0GEigFqKAIANgIAIANBiApqIANBiIoBaigCADYCACADQYwKaiADQYyKAWooAgA2AgAgA0EQaiEDIAEgBEEEaiIERw0ACwsgBUUNACAFQQJ0IQEgBEECdCEDA0AgA0GACmogA0GAigFqKAIANgIAIANBBGohAyABQXxqIgENAAsLCwYAQYCKAQvRBgEDf0EAQgA3A4CNAUEAQgA3A/iMAUEAQgA3A/CMAUEAQgA3A+iMAUEAQgA3A+CMAUEAQgA3A9iMAUEAQgA3A9CMAUEAQgA3A8iMAUEAQgA3A8CMAUEAQgA3A7iMAUEAQgA3A7CMAUEAQgA3A6iMAUEAQgA3A6CMAUEAQgA3A5iMAUEAQgA3A5CMAUEAQgA3A4iMAUEAQgA3A4CMAUEAQgA3A/iLAUEAQgA3A/CLAUEAQgA3A+iLAUEAQgA3A+CLAUEAQgA3A9iLAUEAQgA3A9CLAUEAQgA3A8iLAUEAQgA3A8CLAUEAQgA3A7iLAUEAQgA3A7CLAUEAQgA3A6iLAUEAQgA3A6CLAUEAQgA3A5iLAUEAQgA3A5CLAUEAQgA3A4iLAUEAQgA3A4CLAUEAQgA3A/iKAUEAQgA3A/CKAUEAQgA3A+iKAUEAQgA3A+CKAUEAQgA3A9iKAUEAQgA3A9CKAUEAQgA3A8iKAUEAQgA3A8CKAUEAQgA3A7iKAUEAQgA3A7CKAUEAQgA3A6iKAUEAQgA3A6CKAUEAQgA3A5iKAUEAQgA3A5CKAUEAQgA3A4iKAUEAQgA3A4CKAUEAQcAMIAFBAXRrQQN2NgKMjQFBAEEANgKIjQEgABACQeQAQQAoAoyNASIAQQF2ayEDAkBBACgCiI0BIgFBAEgNACAAIQQCQCAAIAFGDQAgAUHIiwFqIQVBACEBA0AgBSABakEAOgAAIAFBAWoiASAAQQAoAoiNASIEa0kNAAsLIARByIsBaiIBIAEtAAAgAnI6AAAgAEHHiwFqIgEgAS0AAEGAAXI6AABByIsBIAAQA0EAQYCAgIB4NgKIjQELAkAgA0EESQ0AIANBAnYiAUEDcSEFQQAhBAJAIAFBf2pBA0kNACABQfz///8DcSEAQQAhAUEAIQQDQCABQYAKaiABQYCKAWooAgA2AgAgAUGECmogAUGEigFqKAIANgIAIAFBiApqIAFBiIoBaigCADYCACABQYwKaiABQYyKAWooAgA2AgAgAUEQaiEBIAAgBEEEaiIERw0ACwsgBUUNACAFQQJ0IQAgBEECdCEBA0AgAUGACmogAUGAigFqKAIANgIAIAFBBGohASAAQXxqIgANAAsLCwvYAQEAQYAIC9ABkAEAAAAAAAAAAAAAAAAAAAEAAAAAAAAAgoAAAAAAAACKgAAAAAAAgACAAIAAAACAi4AAAAAAAAABAACAAAAAAIGAAIAAAACACYAAAAAAAICKAAAAAAAAAIgAAAAAAAAACYAAgAAAAAAKAACAAAAAAIuAAIAAAAAAiwAAAAAAAICJgAAAAAAAgAOAAAAAAACAAoAAAAAAAICAAAAAAAAAgAqAAAAAAAAACgAAgAAAAICBgACAAAAAgICAAAAAAACAAQAAgAAAAAAIgACAAAAAgA==";
|
|
990
|
-
var hash$b = "fb24e536";
|
|
991
|
-
var wasmJson$b = {
|
|
992
|
-
name: name$b,
|
|
993
|
-
data: data$b,
|
|
994
|
-
hash: hash$b
|
|
1172
|
+
const getPublicKey = (privKey, isCompressed = true) => {
|
|
1173
|
+
return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
|
|
995
1174
|
};
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
new Mutex();
|
|
1000
|
-
function validateBits(bits) {
|
|
1001
|
-
if (![224, 256, 384, 512].includes(bits)) {
|
|
1002
|
-
return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
|
|
1175
|
+
const isValidSecretKey = (secretKey) => {
|
|
1176
|
+
try {
|
|
1177
|
+
return !!secretKeyToScalar(secretKey);
|
|
1003
1178
|
}
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
/**
|
|
1007
|
-
* Creates a new Keccak hash instance
|
|
1008
|
-
* @param bits Number of output bits. Valid values: 224, 256, 384, 512
|
|
1009
|
-
*/
|
|
1010
|
-
function createKeccak(bits = 512) {
|
|
1011
|
-
if (validateBits(bits)) {
|
|
1012
|
-
return Promise.reject(validateBits(bits));
|
|
1179
|
+
catch (error) {
|
|
1180
|
+
return false;
|
|
1013
1181
|
}
|
|
1014
|
-
const outputSize = bits / 8;
|
|
1015
|
-
return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
|
|
1016
|
-
wasm.init(bits);
|
|
1017
|
-
const obj = {
|
|
1018
|
-
init: () => {
|
|
1019
|
-
wasm.init(bits);
|
|
1020
|
-
return obj;
|
|
1021
|
-
},
|
|
1022
|
-
update: (data) => {
|
|
1023
|
-
wasm.update(data);
|
|
1024
|
-
return obj;
|
|
1025
|
-
},
|
|
1026
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1027
|
-
digest: (outputType) => wasm.digest(outputType, 0x01),
|
|
1028
|
-
save: () => wasm.save(),
|
|
1029
|
-
load: (data) => {
|
|
1030
|
-
wasm.load(data);
|
|
1031
|
-
return obj;
|
|
1032
|
-
},
|
|
1033
|
-
blockSize: 200 - 2 * outputSize,
|
|
1034
|
-
digestSize: outputSize,
|
|
1035
|
-
};
|
|
1036
|
-
return obj;
|
|
1037
|
-
});
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
var name$a = "sha256";
|
|
1041
|
-
var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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";
|
|
1042
|
-
var hash$a = "8c18dd94";
|
|
1043
|
-
var wasmJson$a = {
|
|
1044
|
-
name: name$a,
|
|
1045
|
-
data: data$a,
|
|
1046
|
-
hash: hash$a
|
|
1047
1182
|
};
|
|
1048
|
-
|
|
1049
|
-
|
|
1183
|
+
const isValidPublicKey = (publicKey, isCompressed) => {
|
|
1184
|
+
const { publicKey: comp, publicKeyUncompressed } = lengths;
|
|
1185
|
+
try {
|
|
1186
|
+
const l = publicKey.length;
|
|
1187
|
+
if (isCompressed === true && l !== comp)
|
|
1188
|
+
return false;
|
|
1189
|
+
if (isCompressed === false && l !== publicKeyUncompressed)
|
|
1190
|
+
return false;
|
|
1191
|
+
return !!Point.fromBytes(publicKey);
|
|
1192
|
+
}
|
|
1193
|
+
catch (error) {
|
|
1194
|
+
return false;
|
|
1195
|
+
}
|
|
1196
|
+
};
|
|
1197
|
+
const _sha = 'SHA-256';
|
|
1050
1198
|
/**
|
|
1051
|
-
*
|
|
1199
|
+
* Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
|
|
1200
|
+
* All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
|
|
1201
|
+
* providers still return exact 32-byte Uint8Array digests.
|
|
1202
|
+
* @example
|
|
1203
|
+
* Provide sync hash helpers before calling the synchronous signing API.
|
|
1204
|
+
* ```ts
|
|
1205
|
+
* import * as secp from '@noble/secp256k1';
|
|
1206
|
+
* import { hmac } from '@noble/hashes/hmac.js';
|
|
1207
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1208
|
+
* secp.hashes.sha256 = sha256;
|
|
1209
|
+
* secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
|
|
1210
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1211
|
+
* const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
|
|
1212
|
+
* ```
|
|
1052
1213
|
*/
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
const
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
},
|
|
1065
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1066
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
1067
|
-
save: () => wasm.save(),
|
|
1068
|
-
load: (data) => {
|
|
1069
|
-
wasm.load(data);
|
|
1070
|
-
return obj;
|
|
1071
|
-
},
|
|
1072
|
-
blockSize: 64,
|
|
1073
|
-
digestSize: 28,
|
|
1074
|
-
};
|
|
1075
|
-
return obj;
|
|
1076
|
-
});
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
|
-
new Mutex();
|
|
1214
|
+
const hashes = {
|
|
1215
|
+
hmacSha256Async: async (key, message) => {
|
|
1216
|
+
const s = subtle();
|
|
1217
|
+
const name = 'HMAC';
|
|
1218
|
+
const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
|
|
1219
|
+
return u8n(await s.sign(name, k, message));
|
|
1220
|
+
},
|
|
1221
|
+
hmacSha256: undefined,
|
|
1222
|
+
sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
|
|
1223
|
+
sha256: undefined,
|
|
1224
|
+
};
|
|
1080
1225
|
/**
|
|
1081
|
-
*
|
|
1226
|
+
* Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
|
|
1227
|
+
* Result is **NOT hashed** and returns the serialized shared point (compressed by default),
|
|
1228
|
+
* not the SEC 1 x-only primitive `z = x_P`.
|
|
1229
|
+
* secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
|
|
1230
|
+
* @param secretKeyA - local 32-byte secret key.
|
|
1231
|
+
* @param publicKeyB - peer public key.
|
|
1232
|
+
* @param isCompressed - return 33-byte compressed output when `true`.
|
|
1233
|
+
* @returns shared secret point bytes.
|
|
1234
|
+
* @example
|
|
1235
|
+
* Derive a shared secp256k1 secret with ECDH.
|
|
1236
|
+
* ```ts
|
|
1237
|
+
* import * as secp from '@noble/secp256k1';
|
|
1238
|
+
* const alice = secp.utils.randomSecretKey();
|
|
1239
|
+
* const bob = secp.utils.randomSecretKey();
|
|
1240
|
+
* const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
|
|
1241
|
+
* ```
|
|
1082
1242
|
*/
|
|
1083
|
-
|
|
1084
|
-
return
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
digestSize: 32,
|
|
1104
|
-
};
|
|
1105
|
-
return obj;
|
|
1106
|
-
});
|
|
1107
|
-
}
|
|
1108
|
-
|
|
1109
|
-
var name$9 = "sha512";
|
|
1110
|
-
var data$9 = "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";
|
|
1111
|
-
var hash$9 = "f2e40eb1";
|
|
1112
|
-
var wasmJson$9 = {
|
|
1113
|
-
name: name$9,
|
|
1114
|
-
data: data$9,
|
|
1115
|
-
hash: hash$9
|
|
1243
|
+
const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
|
|
1244
|
+
return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
|
|
1245
|
+
};
|
|
1246
|
+
// FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
|
|
1247
|
+
// The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
|
|
1248
|
+
const randomSecretKey = (seed) => {
|
|
1249
|
+
seed = seed === undefined ? randomBytes(lengths.seed) : seed;
|
|
1250
|
+
abytes(seed);
|
|
1251
|
+
// Keep the public range text aligned with the enforced 48-byte FIPS floor.
|
|
1252
|
+
if (seed.length < lengths.seed || seed.length > 1024)
|
|
1253
|
+
return err$1('expected 48-1024b', RangeError);
|
|
1254
|
+
const num = M(bytesToNumBE(seed), N - 1n);
|
|
1255
|
+
return numTo32b(num + 1n);
|
|
1256
|
+
};
|
|
1257
|
+
const createKeygen = (getPublicKey) => (seed) => {
|
|
1258
|
+
const secretKey = randomSecretKey(seed);
|
|
1259
|
+
return {
|
|
1260
|
+
secretKey,
|
|
1261
|
+
publicKey: getPublicKey(secretKey),
|
|
1262
|
+
};
|
|
1116
1263
|
};
|
|
1117
|
-
|
|
1118
|
-
new Mutex();
|
|
1119
1264
|
/**
|
|
1120
|
-
*
|
|
1265
|
+
* Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
|
|
1266
|
+
* @example
|
|
1267
|
+
* Convert bytes to a hex string with the low-level helper namespace.
|
|
1268
|
+
* ```ts
|
|
1269
|
+
* import { etc } from '@noble/secp256k1';
|
|
1270
|
+
* const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
|
|
1271
|
+
* ```
|
|
1121
1272
|
*/
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1135
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
1136
|
-
save: () => wasm.save(),
|
|
1137
|
-
load: (data) => {
|
|
1138
|
-
wasm.load(data);
|
|
1139
|
-
return obj;
|
|
1140
|
-
},
|
|
1141
|
-
blockSize: 128,
|
|
1142
|
-
digestSize: 48,
|
|
1143
|
-
};
|
|
1144
|
-
return obj;
|
|
1145
|
-
});
|
|
1146
|
-
}
|
|
1147
|
-
|
|
1148
|
-
new Mutex();
|
|
1273
|
+
const etc = /* @__PURE__ */ Object.freeze({
|
|
1274
|
+
hexToBytes,
|
|
1275
|
+
bytesToHex,
|
|
1276
|
+
concatBytes,
|
|
1277
|
+
bytesToNumberBE: bytesToNumBE,
|
|
1278
|
+
numberToBytesBE: numTo32b,
|
|
1279
|
+
mod: M,
|
|
1280
|
+
invert: invert, // math utilities; keep public alias type aligned with runtime
|
|
1281
|
+
randomBytes,
|
|
1282
|
+
secretKeyToScalar: secretKeyToScalar,
|
|
1283
|
+
abytes: abytes,
|
|
1284
|
+
});
|
|
1149
1285
|
/**
|
|
1150
|
-
*
|
|
1286
|
+
* Curve-specific key utilities.
|
|
1287
|
+
* @example
|
|
1288
|
+
* Generate a fresh secret key and derive its public key.
|
|
1289
|
+
* ```ts
|
|
1290
|
+
* import * as secp from '@noble/secp256k1';
|
|
1291
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1292
|
+
* const publicKey = secp.getPublicKey(secretKey);
|
|
1293
|
+
* ```
|
|
1151
1294
|
*/
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
return obj;
|
|
1170
|
-
},
|
|
1171
|
-
blockSize: 128,
|
|
1172
|
-
digestSize: 64,
|
|
1173
|
-
};
|
|
1174
|
-
return obj;
|
|
1175
|
-
});
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
new Mutex();
|
|
1179
|
-
|
|
1180
|
-
new Mutex();
|
|
1181
|
-
|
|
1182
|
-
new Mutex();
|
|
1183
|
-
|
|
1184
|
-
new Mutex();
|
|
1185
|
-
|
|
1186
|
-
var name$4 = "ripemd160";
|
|
1187
|
-
var data$4 = "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";
|
|
1188
|
-
var hash$4 = "6abbce74";
|
|
1189
|
-
var wasmJson$4 = {
|
|
1190
|
-
name: name$4,
|
|
1191
|
-
data: data$4,
|
|
1192
|
-
hash: hash$4
|
|
1295
|
+
const utils$2 = /* @__PURE__ */ Object.freeze({
|
|
1296
|
+
isValidSecretKey: isValidSecretKey,
|
|
1297
|
+
isValidPublicKey: isValidPublicKey,
|
|
1298
|
+
randomSecretKey: randomSecretKey, // preserve the optional seeded call
|
|
1299
|
+
});
|
|
1300
|
+
// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
|
|
1301
|
+
// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
1302
|
+
// Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
|
|
1303
|
+
const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
|
|
1304
|
+
const T_AUX = 'aux';
|
|
1305
|
+
const T_NONCE = 'nonce';
|
|
1306
|
+
const T_CHALLENGE = 'challenge';
|
|
1307
|
+
// Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
|
|
1308
|
+
// wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
|
|
1309
|
+
const taggedHash = (tag, ...messages) => {
|
|
1310
|
+
const tagH = gh('sha256', getTag(tag));
|
|
1311
|
+
return gh('sha256', concatBytes(tagH, tagH, ...messages));
|
|
1193
1312
|
};
|
|
1194
|
-
|
|
1195
|
-
|
|
1313
|
+
// Async twin of taggedHash with the same checked provider boundary.
|
|
1314
|
+
const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
|
|
1315
|
+
// BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
|
|
1316
|
+
// d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
|
|
1317
|
+
const extpubSchnorr = (priv) => {
|
|
1318
|
+
const d_ = secretKeyToScalar(priv);
|
|
1319
|
+
const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
|
|
1320
|
+
const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
|
|
1321
|
+
const d = isEven(y) ? d_ : modN(-d_);
|
|
1322
|
+
const px = numTo32b(x);
|
|
1323
|
+
return { d, px };
|
|
1324
|
+
};
|
|
1325
|
+
const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
|
|
1326
|
+
const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
|
|
1327
|
+
const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
|
|
1328
|
+
/** Schnorr public key is just `x` coordinate of Point as per BIP340. */
|
|
1329
|
+
const pubSchnorr = (secretKey) => {
|
|
1330
|
+
return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
|
|
1331
|
+
};
|
|
1332
|
+
const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
|
|
1333
|
+
// Common preparation fn for both sync and async signing
|
|
1334
|
+
const prepSigSchnorr = (message, secretKey, auxRand) => {
|
|
1335
|
+
const { px, d } = extpubSchnorr(secretKey);
|
|
1336
|
+
return { m: abytes(message), px, d, a: abytes(auxRand, L) };
|
|
1337
|
+
};
|
|
1338
|
+
const extractK = (rand) => {
|
|
1339
|
+
const k_ = bytesModN(rand); // Let k' = int(rand) mod n
|
|
1340
|
+
if (k_ === 0n)
|
|
1341
|
+
err$1('sign failed: k is zero'); // Fail if k' = 0.
|
|
1342
|
+
const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
|
|
1343
|
+
return { rx: px, k: d };
|
|
1344
|
+
};
|
|
1345
|
+
// Common signature creation helper
|
|
1346
|
+
const createSigSchnorr = (k, px, e, d) => {
|
|
1347
|
+
return concatBytes(px, numTo32b(modN(k + e * d)));
|
|
1348
|
+
};
|
|
1349
|
+
const E_INVSIG = 'invalid signature produced';
|
|
1196
1350
|
/**
|
|
1197
|
-
* Creates
|
|
1351
|
+
* Creates Schnorr signature as per BIP340. Verifies itself before returning anything.
|
|
1352
|
+
* auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
|
|
1353
|
+
* k generation, so bad CSPRNG won't be the only entropy source.
|
|
1198
1354
|
*/
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
});
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1355
|
+
const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
|
|
1356
|
+
const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
|
|
1357
|
+
const aux = taggedHash(T_AUX, a);
|
|
1358
|
+
// Let t be the byte-wise xor of bytes(d) and hash/aux(a)
|
|
1359
|
+
const t = numTo32b(d ^ bytesToNumBE(aux));
|
|
1360
|
+
// Let rand = hash/nonce(t || bytes(P) || m)
|
|
1361
|
+
const rand = taggedHash(T_NONCE, t, px, m);
|
|
1362
|
+
const { rx, k } = extractK(rand);
|
|
1363
|
+
// Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
|
|
1364
|
+
const e = challenge(rx, px, m);
|
|
1365
|
+
const sig = createSigSchnorr(k, rx, e, d);
|
|
1366
|
+
// If Verify(bytes(P), m, sig) (see below) returns failure, abort
|
|
1367
|
+
if (!verifySchnorr(sig, m, px))
|
|
1368
|
+
err$1(E_INVSIG);
|
|
1369
|
+
return sig;
|
|
1370
|
+
};
|
|
1371
|
+
const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
|
|
1372
|
+
const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
|
|
1373
|
+
const aux = await taggedHashAsync(T_AUX, a);
|
|
1374
|
+
// Let t be the byte-wise xor of bytes(d) and hash/aux(a)
|
|
1375
|
+
const t = numTo32b(d ^ bytesToNumBE(aux));
|
|
1376
|
+
// Let rand = hash/nonce(t || bytes(P) || m)
|
|
1377
|
+
const rand = await taggedHashAsync(T_NONCE, t, px, m);
|
|
1378
|
+
const { rx, k } = extractK(rand);
|
|
1379
|
+
// Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
|
|
1380
|
+
const e = await challengeAsync(rx, px, m);
|
|
1381
|
+
const sig = createSigSchnorr(k, rx, e, d);
|
|
1382
|
+
// If Verify(bytes(P), m, sig) (see below) returns failure, abort
|
|
1383
|
+
if (!(await verifySchnorrAsync(sig, m, px)))
|
|
1384
|
+
err$1(E_INVSIG);
|
|
1385
|
+
return sig;
|
|
1386
|
+
};
|
|
1387
|
+
const callSyncAsyncFn = (res, later) => {
|
|
1388
|
+
return res instanceof Promise ? res.then(later) : later(res);
|
|
1389
|
+
};
|
|
1390
|
+
const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
|
|
1391
|
+
const sig = abytes(signature, L2, 'signature');
|
|
1392
|
+
const msg = abytes(message, undefined, 'message');
|
|
1393
|
+
const pub = abytes(publicKey, L, 'publicKey');
|
|
1394
|
+
try {
|
|
1395
|
+
// lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
|
|
1396
|
+
// Fail if x ≥ p. Let c = x³ + 7 mod p.
|
|
1397
|
+
const x = bytesToNumBE(pub);
|
|
1398
|
+
const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
|
|
1399
|
+
const P_ = new Point(x, y, 1n).assertValidity();
|
|
1400
|
+
const px = numTo32b(P_.toAffine().x);
|
|
1401
|
+
// P = lift_x(int(pk)); fail if that fails
|
|
1402
|
+
const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
|
|
1403
|
+
arange(r, 1n, P);
|
|
1404
|
+
const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
|
|
1405
|
+
// Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
|
|
1406
|
+
// s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
|
|
1407
|
+
// crafted edge cases and fail closed instead of carrying that extra verification surface.
|
|
1408
|
+
arange(s, 1n, N);
|
|
1409
|
+
const i = concatBytes(numTo32b(r), px, msg);
|
|
1410
|
+
// int(challenge(bytes(r)||bytes(P)||m))%n
|
|
1411
|
+
return callSyncAsyncFn(challengeFn(i), (e) => {
|
|
1412
|
+
const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
|
|
1413
|
+
if (!isEven(y) || x !== r)
|
|
1414
|
+
return false; // -eP == (n-e)P
|
|
1415
|
+
return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
|
|
1416
|
+
});
|
|
1233
1417
|
}
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
function calculateHmac(hasher, key) {
|
|
1237
|
-
hasher.init();
|
|
1238
|
-
const { blockSize } = hasher;
|
|
1239
|
-
const keyBuf = calculateKeyBuffer(hasher, key);
|
|
1240
|
-
const keyBuffer = new Uint8Array(blockSize);
|
|
1241
|
-
keyBuffer.set(keyBuf);
|
|
1242
|
-
const opad = new Uint8Array(blockSize);
|
|
1243
|
-
for (let i = 0; i < blockSize; i++) {
|
|
1244
|
-
const v = keyBuffer[i];
|
|
1245
|
-
opad[i] = v ^ 0x5c;
|
|
1246
|
-
keyBuffer[i] = v ^ 0x36;
|
|
1418
|
+
catch (error) {
|
|
1419
|
+
return false;
|
|
1247
1420
|
}
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
return obj;
|
|
1258
|
-
},
|
|
1259
|
-
digest: ((outputType) => {
|
|
1260
|
-
const uintArr = hasher.digest("binary");
|
|
1261
|
-
hasher.init();
|
|
1262
|
-
hasher.update(opad);
|
|
1263
|
-
hasher.update(uintArr);
|
|
1264
|
-
return hasher.digest(outputType);
|
|
1265
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1266
|
-
}),
|
|
1267
|
-
save: () => {
|
|
1268
|
-
throw new Error("save() not supported");
|
|
1269
|
-
},
|
|
1270
|
-
load: () => {
|
|
1271
|
-
throw new Error("load() not supported");
|
|
1272
|
-
},
|
|
1273
|
-
blockSize: hasher.blockSize,
|
|
1274
|
-
digestSize: hasher.digestSize,
|
|
1275
|
-
};
|
|
1276
|
-
return obj;
|
|
1277
|
-
}
|
|
1278
|
-
/**
|
|
1279
|
-
* Calculates HMAC hash
|
|
1280
|
-
* @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
|
|
1281
|
-
* @param key Key (string, Buffer or TypedArray)
|
|
1282
|
-
*/
|
|
1283
|
-
function createHMAC(hash, key) {
|
|
1284
|
-
if (!hash || !hash.then) {
|
|
1285
|
-
throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
|
|
1286
|
-
}
|
|
1287
|
-
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
1288
|
-
}
|
|
1289
|
-
|
|
1290
|
-
new Mutex();
|
|
1291
|
-
|
|
1292
|
-
new Mutex();
|
|
1293
|
-
|
|
1294
|
-
const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
|
|
1295
|
-
|
|
1296
|
-
const { subtle: subtle$1 } = crypto;
|
|
1297
|
-
|
|
1421
|
+
};
|
|
1422
|
+
/** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
|
|
1423
|
+
* after the initial byte checks. */
|
|
1424
|
+
const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
|
|
1425
|
+
/** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
|
|
1426
|
+
* become false, but async backend failures reject the promise. Missing crypto.subtle is a
|
|
1427
|
+
* runtime/backend error, not an "invalid signature" result, so we surface it instead of
|
|
1428
|
+
* turning it into false. */
|
|
1429
|
+
const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
|
|
1298
1430
|
/**
|
|
1299
|
-
*
|
|
1300
|
-
*
|
|
1301
|
-
*
|
|
1431
|
+
* BIP340 Schnorr helpers over secp256k1.
|
|
1432
|
+
* @example
|
|
1433
|
+
* Sign and verify a BIP340 Schnorr signature.
|
|
1434
|
+
* ```ts
|
|
1435
|
+
* import * as secp from '@noble/secp256k1';
|
|
1436
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1437
|
+
* secp.hashes.sha256 = sha256;
|
|
1438
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1439
|
+
* const message = new Uint8Array([1, 2, 3]);
|
|
1440
|
+
* const sig = secp.schnorr.sign(message, secretKey);
|
|
1441
|
+
* const publicKey = secp.schnorr.getPublicKey(secretKey);
|
|
1442
|
+
* const isValid = secp.schnorr.verify(sig, message, publicKey);
|
|
1302
1443
|
* ```
|
|
1303
|
-
* @param {Uint8Array} data
|
|
1304
|
-
* @param {string} algorithm
|
|
1305
|
-
* @returns Uint8Array
|
|
1306
1444
|
*/
|
|
1307
|
-
const
|
|
1308
|
-
|
|
1445
|
+
const schnorr = /* @__PURE__ */ Object.freeze({
|
|
1446
|
+
keygen: keygenSchnorr,
|
|
1447
|
+
getPublicKey: pubSchnorr,
|
|
1448
|
+
sign: signSchnorr,
|
|
1449
|
+
verify: verifySchnorr,
|
|
1450
|
+
signAsync: signSchnorrAsync,
|
|
1451
|
+
verifyAsync: verifySchnorrAsync,
|
|
1452
|
+
});
|
|
1453
|
+
// ## Precomputes
|
|
1454
|
+
// --------------
|
|
1455
|
+
const W = 8; // W is window size
|
|
1456
|
+
const scalarBits = 256;
|
|
1457
|
+
const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
|
|
1458
|
+
const pwindowSize = 2 ** (W - 1); // 128 for W=8
|
|
1459
|
+
const precompute = () => {
|
|
1460
|
+
const points = [];
|
|
1461
|
+
let p = G;
|
|
1462
|
+
let b = p;
|
|
1463
|
+
for (let w = 0; w < pwindows; w++) {
|
|
1464
|
+
b = p;
|
|
1465
|
+
points.push(b);
|
|
1466
|
+
for (let i = 1; i < pwindowSize; i++) {
|
|
1467
|
+
b = b.add(p);
|
|
1468
|
+
points.push(b);
|
|
1469
|
+
} // i=1, bc we skip 0
|
|
1470
|
+
p = b.double();
|
|
1471
|
+
}
|
|
1472
|
+
return points;
|
|
1473
|
+
};
|
|
1474
|
+
let Gpows = undefined; // precomputes for base point G
|
|
1475
|
+
// Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
|
|
1476
|
+
const ctneg = (cnd, p) => {
|
|
1477
|
+
const n = p.negate();
|
|
1478
|
+
return cnd ? n : p;
|
|
1479
|
+
};
|
|
1309
1480
|
/**
|
|
1310
|
-
*
|
|
1311
|
-
*
|
|
1312
|
-
*
|
|
1313
|
-
*
|
|
1314
|
-
*
|
|
1315
|
-
*
|
|
1316
|
-
*
|
|
1317
|
-
*
|
|
1481
|
+
* Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
|
|
1482
|
+
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
1483
|
+
* Any time `G.multiply` is done, precomputes are used.
|
|
1484
|
+
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
1485
|
+
*
|
|
1486
|
+
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
1487
|
+
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
1488
|
+
*
|
|
1489
|
+
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
1318
1490
|
*/
|
|
1319
|
-
const
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1491
|
+
const wNAF = (n) => {
|
|
1492
|
+
const comp = Gpows || (Gpows = precompute());
|
|
1493
|
+
let p = I;
|
|
1494
|
+
let f = G; // f must be G, or could become I in the end
|
|
1495
|
+
const pow_2_w = 2 ** W; // 256 for W=8
|
|
1496
|
+
const maxNum = pow_2_w; // 256 for W=8
|
|
1497
|
+
const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
|
|
1498
|
+
const shiftBy = big(W); // 8 for W=8
|
|
1499
|
+
for (let w = 0; w < pwindows; w++) {
|
|
1500
|
+
let wbits = Number(n & mask); // extract W bits.
|
|
1501
|
+
n >>= shiftBy; // shift number by W bits.
|
|
1502
|
+
// We use negative indexes to reduce size of precomputed table by 2x.
|
|
1503
|
+
// Instead of needing precomputes 0..256, we only calculate them for 0..128.
|
|
1504
|
+
// If an index > 128 is found, we do (256-index) - where 256 is next window.
|
|
1505
|
+
// Naive: index +127 => 127, +224 => 224
|
|
1506
|
+
// Optimized: index +127 => 127, +224 => 256-32
|
|
1507
|
+
if (wbits > pwindowSize) {
|
|
1508
|
+
wbits -= maxNum;
|
|
1509
|
+
n += 1n;
|
|
1510
|
+
}
|
|
1511
|
+
const off = w * pwindowSize;
|
|
1512
|
+
const offF = off; // offsets, evaluate both
|
|
1513
|
+
const offP = off + Math.abs(wbits) - 1;
|
|
1514
|
+
const isEven = w % 2 !== 0; // conditions, evaluate both
|
|
1515
|
+
const isNeg = wbits < 0;
|
|
1516
|
+
if (wbits === 0) {
|
|
1517
|
+
// off == I: can't add it. Adding random offF instead.
|
|
1518
|
+
f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
|
|
1519
|
+
}
|
|
1520
|
+
else {
|
|
1521
|
+
p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
if (n !== 0n)
|
|
1525
|
+
err$1('invalid wnaf');
|
|
1526
|
+
return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
|
|
1324
1527
|
};
|
|
1325
1528
|
|
|
1326
|
-
const
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1529
|
+
const leofcoinOlivia = {
|
|
1530
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
1531
|
+
version: 1,
|
|
1532
|
+
pubKeyHash: 0x73, // o
|
|
1533
|
+
scriptHash: 0x76, // p
|
|
1534
|
+
multiTxHash: 0x8b4125, // omtx
|
|
1535
|
+
payments: {
|
|
1536
|
+
version: 0,
|
|
1537
|
+
unspent: 0x1fa443d7 // ounsp
|
|
1334
1538
|
},
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1539
|
+
wif: 0x7D, // s
|
|
1540
|
+
multiCodec: 0x7c4,
|
|
1541
|
+
bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
|
|
1338
1542
|
};
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
let index = 0;
|
|
1356
|
-
for (const source of input) {
|
|
1357
|
-
typedArray.set(source, currentIndex);
|
|
1358
|
-
if (options.seperator && input.length - 1 > index) {
|
|
1359
|
-
typedArray.set(options.seperator, currentIndex + source.length);
|
|
1360
|
-
currentIndex+= options.seperator.length;
|
|
1361
|
-
}
|
|
1362
|
-
currentIndex += source.length;
|
|
1363
|
-
index += 1;
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
return typedArray
|
|
1543
|
+
const bitcoinTestnet = {
|
|
1544
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
1545
|
+
version: 1,
|
|
1546
|
+
bech32: 'tb',
|
|
1547
|
+
pubKeyHash: 0x6f,
|
|
1548
|
+
scriptHash: 0xc4,
|
|
1549
|
+
wif: 0xef,
|
|
1550
|
+
bip32: {
|
|
1551
|
+
public: 0x043587cf,
|
|
1552
|
+
private: 0x04358394
|
|
1553
|
+
},
|
|
1554
|
+
multiCodec: 0
|
|
1555
|
+
};
|
|
1556
|
+
var testnets = {
|
|
1557
|
+
'leofcoin:olivia': leofcoinOlivia,
|
|
1558
|
+
'bitcoin:testnet': bitcoinTestnet
|
|
1367
1559
|
};
|
|
1368
1560
|
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
const encode$1$1 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
1374
|
-
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
1375
|
-
throw new TypeError('Expected Uint8Array');
|
|
1376
|
-
}
|
|
1377
|
-
const hash = await concatAndDoubleHash([
|
|
1378
|
-
prefix,
|
|
1379
|
-
source
|
|
1380
|
-
]);
|
|
1381
|
-
const uint8Array = typedArrayConcat([
|
|
1382
|
-
prefix,
|
|
1383
|
-
source,
|
|
1384
|
-
hash.subarray(0, 4)
|
|
1385
|
-
]);
|
|
1386
|
-
if (hex)
|
|
1387
|
-
return base58$1.encodeHex(uint8Array);
|
|
1388
|
-
return base58$1.encode(uint8Array);
|
|
1389
|
-
};
|
|
1390
|
-
const decode$2 = async (string, hex) => {
|
|
1391
|
-
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
1392
|
-
const prefix = uint8Array.subarray(0, 2);
|
|
1393
|
-
const source = uint8Array.subarray(2, -4);
|
|
1394
|
-
const hash = await concatAndDoubleHash([
|
|
1395
|
-
prefix,
|
|
1396
|
-
source
|
|
1397
|
-
]);
|
|
1398
|
-
let index = 0;
|
|
1399
|
-
const slice = uint8Array.subarray(-4);
|
|
1400
|
-
for (const check of slice) {
|
|
1401
|
-
if (check !== hash[index]) {
|
|
1402
|
-
throw new Error('Invalid checksum');
|
|
1403
|
-
}
|
|
1404
|
-
index++;
|
|
1405
|
-
}
|
|
1406
|
-
return { prefix, data: source };
|
|
1407
|
-
};
|
|
1408
|
-
const isBase58check = (string, hex) => {
|
|
1409
|
-
try {
|
|
1410
|
-
hex ? decode$2(string, true) : decode$2(string);
|
|
1411
|
-
return true;
|
|
1412
|
-
}
|
|
1413
|
-
catch (e) {
|
|
1414
|
-
return false;
|
|
1415
|
-
}
|
|
1416
|
-
};
|
|
1417
|
-
const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$1$1(uint8Array, prefix, true);
|
|
1418
|
-
const decodeHex = (string) => decode$2(string, true);
|
|
1419
|
-
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
1420
|
-
var base58check = { encode: encode$1$1, decode: decode$2, encodeHex, decodeHex, isBase58check, isBase58checkHex };
|
|
1421
|
-
|
|
1422
|
-
const decode$1$1 = (multiWif, expectedVersion, expectedCodec) => {
|
|
1423
|
-
const decoded = base58$1.decode(multiWif);
|
|
1424
|
-
let [version, codec, privateKey] = index$1$1(decoded);
|
|
1425
|
-
version = Number(new TextDecoder().decode(version));
|
|
1426
|
-
codec = Number(new TextDecoder().decode(codec));
|
|
1427
|
-
if (expectedVersion && version !== expectedVersion)
|
|
1428
|
-
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
1429
|
-
if (expectedCodec && codec !== expectedCodec)
|
|
1430
|
-
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
1431
|
-
return { version, codec, privateKey };
|
|
1432
|
-
};
|
|
1433
|
-
var index$5 = {
|
|
1434
|
-
encode: (version, codec, privateKey) => {
|
|
1435
|
-
return base58$1.encode(index$2([
|
|
1436
|
-
new TextEncoder().encode(version.toString()),
|
|
1437
|
-
new TextEncoder().encode(codec.toString()),
|
|
1438
|
-
privateKey
|
|
1439
|
-
]));
|
|
1440
|
-
},
|
|
1441
|
-
decode: decode$1$1,
|
|
1442
|
-
isMultiWif: (multiWif) => {
|
|
1443
|
-
try {
|
|
1444
|
-
const { version, codec, privateKey } = decode$1$1(multiWif);
|
|
1445
|
-
if (version === undefined)
|
|
1446
|
-
return false;
|
|
1447
|
-
if (codec === undefined)
|
|
1448
|
-
return false;
|
|
1449
|
-
if (privateKey === undefined)
|
|
1450
|
-
return false;
|
|
1451
|
-
if (privateKey && privateKey.length !== 32)
|
|
1452
|
-
return false;
|
|
1453
|
-
}
|
|
1454
|
-
catch {
|
|
1455
|
-
return false;
|
|
1456
|
-
}
|
|
1457
|
-
return true;
|
|
1458
|
-
}
|
|
1459
|
-
};
|
|
1460
|
-
|
|
1461
|
-
/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
1462
|
-
/**
|
|
1463
|
-
* 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
|
|
1464
|
-
* Compliant with RFC6979 & BIP340.
|
|
1465
|
-
* @module
|
|
1466
|
-
*/
|
|
1561
|
+
// https://en.bitcoin.it/wiki/List_of_address_prefixes
|
|
1562
|
+
// usage:
|
|
1563
|
+
// networks['bitcoin']['testnet']
|
|
1564
|
+
// networks.bitcoin.testnet
|
|
1467
1565
|
/**
|
|
1468
|
-
*
|
|
1469
|
-
*
|
|
1470
|
-
* `y² == x³ + ax + b`.
|
|
1471
|
-
* * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
|
|
1472
|
-
* * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
|
|
1473
|
-
* * h = `1n` // cofactor
|
|
1474
|
-
* * a = `0n` // equation param
|
|
1475
|
-
* * b = `7n` // equation param
|
|
1476
|
-
* * Gx, Gy are coordinates of Generator / base point
|
|
1566
|
+
* Main network
|
|
1567
|
+
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
1477
1568
|
*/
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
|
|
1494
|
-
const lengths = {
|
|
1495
|
-
publicKey: L + 1,
|
|
1496
|
-
publicKeyUncompressed: L2 + 1,
|
|
1497
|
-
// 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
|
|
1498
|
-
// 352-bit recommendation for 256-bit prime curves.
|
|
1499
|
-
seed: L + L / 2,
|
|
1500
|
-
};
|
|
1501
|
-
// Helpers and Precomputes sections are reused between libraries
|
|
1502
|
-
// ## Helpers
|
|
1503
|
-
// ----------
|
|
1504
|
-
const err$1 = (message = '', E = Error) => {
|
|
1505
|
-
const e = new E(message);
|
|
1506
|
-
const { captureStackTrace } = Error;
|
|
1507
|
-
if (typeof captureStackTrace === 'function')
|
|
1508
|
-
captureStackTrace(e, err$1);
|
|
1509
|
-
throw e;
|
|
1510
|
-
};
|
|
1511
|
-
// Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
|
|
1512
|
-
// fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
|
|
1513
|
-
// spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
|
|
1514
|
-
const isBytes = (a) => a instanceof Uint8Array ||
|
|
1515
|
-
(ArrayBuffer.isView(a) &&
|
|
1516
|
-
a.constructor.name === 'Uint8Array' &&
|
|
1517
|
-
a.BYTES_PER_ELEMENT === 1);
|
|
1518
|
-
/** Asserts something is Bytes. */
|
|
1519
|
-
const abytes = (value, length, title = '') => {
|
|
1520
|
-
const bytes = isBytes(value);
|
|
1521
|
-
const len = value?.length;
|
|
1522
|
-
const needsLen = length !== undefined;
|
|
1523
|
-
if (!bytes || (needsLen && len !== length)) {
|
|
1524
|
-
const prefix = title && `"${title}" `;
|
|
1525
|
-
const ofLen = needsLen ? ` of length ${length}` : '';
|
|
1526
|
-
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
1527
|
-
const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
|
|
1528
|
-
return bytes ? err$1(msg, RangeError) : err$1(msg, TypeError);
|
|
1529
|
-
}
|
|
1530
|
-
return value;
|
|
1569
|
+
const leofcoin = {
|
|
1570
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
1571
|
+
version: 1,
|
|
1572
|
+
pubKeyHash: 0x30, // L
|
|
1573
|
+
scriptHash: 0x37, // P
|
|
1574
|
+
multiTxHash: 0x3adeed, // Lmtx
|
|
1575
|
+
payments: {
|
|
1576
|
+
version: 0,
|
|
1577
|
+
unspent: 0x0d6e0327 // Lunsp
|
|
1578
|
+
},
|
|
1579
|
+
coin_type: 640,
|
|
1580
|
+
wif: 0x3F, // S
|
|
1581
|
+
multiCodec: 0x3c4,
|
|
1582
|
+
bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
|
|
1583
|
+
testnet: testnets['leofcoin:olivia']
|
|
1531
1584
|
};
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1585
|
+
const bitcoin = {
|
|
1586
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
1587
|
+
version: 1,
|
|
1588
|
+
bech32: 'bc',
|
|
1589
|
+
pubKeyHash: 0x00,
|
|
1590
|
+
multiCodec: 0x00,
|
|
1591
|
+
scriptHash: 0x05,
|
|
1592
|
+
wif: 0x80,
|
|
1593
|
+
coin_type: 0,
|
|
1594
|
+
bip32: {
|
|
1595
|
+
public: 0x0488b21e, private: 0x0488ade4
|
|
1596
|
+
},
|
|
1597
|
+
testnet: testnets['bitcoin:testnet']
|
|
1542
1598
|
};
|
|
1543
|
-
const
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
:
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
const al = hl / 2;
|
|
1556
|
-
if (hl % 2)
|
|
1557
|
-
return err$1(e);
|
|
1558
|
-
const array = u8n(al);
|
|
1559
|
-
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
1560
|
-
// treat each char as ASCII
|
|
1561
|
-
const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
|
|
1562
|
-
const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
|
|
1563
|
-
if (n1 === undefined || n2 === undefined)
|
|
1564
|
-
return err$1(e);
|
|
1565
|
-
array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
|
|
1566
|
-
}
|
|
1567
|
-
return array;
|
|
1599
|
+
const litecoin = {
|
|
1600
|
+
messagePrefix: '\x19Litecoin Signed Message:\n',
|
|
1601
|
+
version: 1,
|
|
1602
|
+
pubKeyHash: 0x30,
|
|
1603
|
+
scriptHash: 0x32,
|
|
1604
|
+
wif: 0xb0,
|
|
1605
|
+
bip32: {
|
|
1606
|
+
public: 0x019da462,
|
|
1607
|
+
private: 0x019d9cfe
|
|
1608
|
+
},
|
|
1609
|
+
bech32: '',
|
|
1610
|
+
multiCodec: 0
|
|
1568
1611
|
};
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
return r;
|
|
1612
|
+
const ethereum = {
|
|
1613
|
+
messagePrefix: '\x19Ethereum Signed Message:\n',
|
|
1614
|
+
version: 1,
|
|
1615
|
+
pubKeyHash: 0x30,
|
|
1616
|
+
scriptHash: 0x32,
|
|
1617
|
+
bip32: {
|
|
1618
|
+
private: 0x0488ADE4, public: 0x0488B21E
|
|
1619
|
+
},
|
|
1620
|
+
coin_type: 60,
|
|
1621
|
+
wif: 0x45, //E
|
|
1622
|
+
multiCodec: 0x3c5
|
|
1581
1623
|
};
|
|
1582
1624
|
/**
|
|
1583
|
-
*
|
|
1584
|
-
*
|
|
1625
|
+
* Our & supported networks
|
|
1626
|
+
* @return {leofcoin, olivia}
|
|
1585
1627
|
*/
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
if (min <= n && n < max)
|
|
1592
|
-
return n;
|
|
1593
|
-
return err$1(msg, RangeError);
|
|
1594
|
-
};
|
|
1595
|
-
/** Canonical modular reduction. Callers must provide a positive modulus. */
|
|
1596
|
-
const M = (a, b = P) => {
|
|
1597
|
-
const r = a % b;
|
|
1598
|
-
return r >= 0n ? r : b + r;
|
|
1599
|
-
};
|
|
1600
|
-
const modN = (a) => M(a, N);
|
|
1601
|
-
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
1602
|
-
// prettier-ignore
|
|
1603
|
-
const invert = (num, md) => {
|
|
1604
|
-
if (num === 0n || md <= 0n)
|
|
1605
|
-
err$1('no inverse n=' + num + ' mod=' + md);
|
|
1606
|
-
let a = M(num, md), b = md, x = 0n, u = 1n;
|
|
1607
|
-
while (a !== 0n) {
|
|
1608
|
-
const q = b / a, r = b % a;
|
|
1609
|
-
const m = x - u * q;
|
|
1610
|
-
b = a, a = r, x = u, u = m;
|
|
1611
|
-
}
|
|
1612
|
-
return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
|
|
1613
|
-
};
|
|
1614
|
-
const callHash = (name) => {
|
|
1615
|
-
// @ts-ignore
|
|
1616
|
-
const fn = hashes[name];
|
|
1617
|
-
if (typeof fn !== 'function')
|
|
1618
|
-
err$1('hashes.' + name + ' not set');
|
|
1619
|
-
return fn;
|
|
1628
|
+
var networks = {
|
|
1629
|
+
leofcoin,
|
|
1630
|
+
bitcoin,
|
|
1631
|
+
litecoin,
|
|
1632
|
+
ethereum
|
|
1620
1633
|
};
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
|
|
1627
|
-
// ## End of Helpers
|
|
1628
|
-
// -----------------
|
|
1629
|
-
/**
|
|
1630
|
-
* secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
|
|
1631
|
-
* making it x³+b; callers validate x first.
|
|
1632
|
-
*/
|
|
1633
|
-
const koblitz = (x) => M(M(x * x) * x + _b);
|
|
1634
|
-
/** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
|
|
1635
|
-
const FpIsValid = (n) => arange(n, 0n, P);
|
|
1636
|
-
/** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
|
|
1637
|
-
const FpIsValidNot0 = (n) => arange(n, 1n, P);
|
|
1638
|
-
/** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
|
|
1639
|
-
const FnIsValidNot0 = (n) => arange(n, 1n, N);
|
|
1640
|
-
// Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
|
|
1641
|
-
const isEven = (y) => !(y & 1n);
|
|
1642
|
-
/** create Uint8Array of byte n */
|
|
1643
|
-
const u8of = (n) => Uint8Array.of(n);
|
|
1644
|
-
/** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
|
|
1645
|
-
const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
|
|
1646
|
-
/** lift_x from BIP340 returns the unique even square root for x³+7.
|
|
1647
|
-
* SEC 1 callers still flip it for the odd-prefix branch. */
|
|
1648
|
-
const lift_x = (x) => {
|
|
1649
|
-
// Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
|
|
1650
|
-
const c = koblitz(FpIsValidNot0(x));
|
|
1651
|
-
// r = √c candidate
|
|
1652
|
-
// r = c^((p+1)/4) mod p
|
|
1653
|
-
// This formula works for fields p = 3 mod 4 -- a special, fast case.
|
|
1654
|
-
// Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
|
|
1655
|
-
let r = 1n;
|
|
1656
|
-
for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
|
|
1657
|
-
// powMod: modular exponentiation.
|
|
1658
|
-
if (e & 1n)
|
|
1659
|
-
r = (r * num) % P; // Uses exponentiation by squaring.
|
|
1660
|
-
num = (num * num) % P; // Not constant-time.
|
|
1661
|
-
}
|
|
1662
|
-
if (M(r * r) !== c)
|
|
1663
|
-
err$1('sqrt invalid'); // check if result is valid
|
|
1664
|
-
return isEven(r) ? r : M(-r);
|
|
1665
|
-
};
|
|
1666
|
-
/**
|
|
1667
|
-
* Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
|
|
1668
|
-
* @param X - X coordinate.
|
|
1669
|
-
* @param Y - Y coordinate.
|
|
1670
|
-
* @param Z - projective Z coordinate.
|
|
1671
|
-
* @example
|
|
1672
|
-
* Do point arithmetic with the base point and encode the result as hex.
|
|
1673
|
-
* ```ts
|
|
1674
|
-
* import { Point } from '@noble/secp256k1';
|
|
1675
|
-
* const hex = Point.BASE.double().toHex();
|
|
1676
|
-
* ```
|
|
1634
|
+
|
|
1635
|
+
/*!
|
|
1636
|
+
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
|
|
1637
|
+
* (c) Dani Biro
|
|
1638
|
+
* @license MIT
|
|
1677
1639
|
*/
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
/******************************************************************************
|
|
1643
|
+
Copyright (c) Microsoft Corporation.
|
|
1644
|
+
|
|
1645
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
1646
|
+
purpose with or without fee is hereby granted.
|
|
1647
|
+
|
|
1648
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
1649
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
1650
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
1651
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
1652
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
1653
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
1654
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
1655
|
+
***************************************************************************** */
|
|
1656
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
1660
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
1661
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
1662
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
1663
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
1664
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
1665
|
+
step((generator = generator.apply(thisArg, [])).next());
|
|
1666
|
+
});
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
1670
|
+
var e = new Error(message);
|
|
1671
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
1672
|
+
};
|
|
1673
|
+
|
|
1674
|
+
class Mutex {
|
|
1675
|
+
constructor() {
|
|
1676
|
+
this.mutex = Promise.resolve();
|
|
1700
1677
|
}
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
const head = bytes[0];
|
|
1708
|
-
const tail = bytes.subarray(1);
|
|
1709
|
-
const x = sliceBytesNumBE(tail, 0, L);
|
|
1710
|
-
// SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
|
|
1711
|
-
// infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
|
|
1712
|
-
// and public-key validation helpers, so strict handling applies to all callers by default.
|
|
1713
|
-
// Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
|
|
1714
|
-
// Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
|
|
1715
|
-
if (length === comp && (head === 0x02 || head === 0x03)) {
|
|
1716
|
-
// Equation is y² == x³ + ax + b. We calculate y from x.
|
|
1717
|
-
// lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
|
|
1718
|
-
let y = lift_x(x);
|
|
1719
|
-
if (head === 0x03)
|
|
1720
|
-
y = M(-y);
|
|
1721
|
-
p = new Point(x, y, 1n);
|
|
1722
|
-
}
|
|
1723
|
-
// Uncompressed 65-byte point, 0x04 prefix
|
|
1724
|
-
if (length === uncomp && head === 0x04)
|
|
1725
|
-
p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
|
|
1726
|
-
// Validate point
|
|
1727
|
-
return p ? p.assertValidity() : err$1('bad point: not on curve');
|
|
1678
|
+
lock() {
|
|
1679
|
+
let begin = () => { };
|
|
1680
|
+
this.mutex = this.mutex.then(() => new Promise(begin));
|
|
1681
|
+
return new Promise((res) => {
|
|
1682
|
+
begin = res;
|
|
1683
|
+
});
|
|
1728
1684
|
}
|
|
1729
|
-
|
|
1730
|
-
return
|
|
1685
|
+
dispatch(fn) {
|
|
1686
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1687
|
+
const unlock = yield this.lock();
|
|
1688
|
+
try {
|
|
1689
|
+
return yield Promise.resolve(fn());
|
|
1690
|
+
}
|
|
1691
|
+
finally {
|
|
1692
|
+
unlock();
|
|
1693
|
+
}
|
|
1694
|
+
});
|
|
1731
1695
|
}
|
|
1732
|
-
|
|
1733
|
-
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1698
|
+
var _a;
|
|
1699
|
+
function getGlobal() {
|
|
1700
|
+
if (typeof globalThis !== "undefined")
|
|
1701
|
+
return globalThis;
|
|
1702
|
+
if (typeof self !== "undefined")
|
|
1703
|
+
return self;
|
|
1704
|
+
if (typeof window !== "undefined")
|
|
1705
|
+
return window;
|
|
1706
|
+
return global;
|
|
1707
|
+
}
|
|
1708
|
+
const globalObject = getGlobal();
|
|
1709
|
+
const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
|
|
1710
|
+
const textEncoder = globalObject.TextEncoder
|
|
1711
|
+
? new globalObject.TextEncoder()
|
|
1712
|
+
: null;
|
|
1713
|
+
function hexCharCodesToInt(a, b) {
|
|
1714
|
+
return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
|
|
1715
|
+
((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
|
|
1716
|
+
}
|
|
1717
|
+
function writeHexToUInt8(buf, str) {
|
|
1718
|
+
const size = str.length >> 1;
|
|
1719
|
+
for (let i = 0; i < size; i++) {
|
|
1720
|
+
const index = i << 1;
|
|
1721
|
+
buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
|
|
1734
1722
|
}
|
|
1735
|
-
|
|
1736
|
-
|
|
1723
|
+
}
|
|
1724
|
+
function hexStringEqualsUInt8(str, buf) {
|
|
1725
|
+
if (str.length !== buf.length * 2) {
|
|
1726
|
+
return false;
|
|
1737
1727
|
}
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
const Y1Z2 = M(Y1 * Z2);
|
|
1745
|
-
const Y2Z1 = M(Y2 * Z1);
|
|
1746
|
-
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
1728
|
+
for (let i = 0; i < buf.length; i++) {
|
|
1729
|
+
const strIndex = i << 1;
|
|
1730
|
+
if (buf[i] !==
|
|
1731
|
+
hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
|
|
1732
|
+
return false;
|
|
1733
|
+
}
|
|
1747
1734
|
}
|
|
1748
|
-
|
|
1749
|
-
|
|
1735
|
+
return true;
|
|
1736
|
+
}
|
|
1737
|
+
const alpha = "a".charCodeAt(0) - 10;
|
|
1738
|
+
const digit = "0".charCodeAt(0);
|
|
1739
|
+
function getDigestHex(tmpBuffer, input, hashLength) {
|
|
1740
|
+
let p = 0;
|
|
1741
|
+
for (let i = 0; i < hashLength; i++) {
|
|
1742
|
+
let nibble = input[i] >>> 4;
|
|
1743
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
1744
|
+
nibble = input[i] & 0xf;
|
|
1745
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
1750
1746
|
}
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1747
|
+
return String.fromCharCode.apply(null, tmpBuffer);
|
|
1748
|
+
}
|
|
1749
|
+
const getUInt8Buffer = nodeBuffer !== null
|
|
1750
|
+
? (data) => {
|
|
1751
|
+
if (typeof data === "string") {
|
|
1752
|
+
const buf = nodeBuffer.from(data, "utf8");
|
|
1753
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
1754
|
+
}
|
|
1755
|
+
if (nodeBuffer.isBuffer(data)) {
|
|
1756
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.length);
|
|
1757
|
+
}
|
|
1758
|
+
if (ArrayBuffer.isView(data)) {
|
|
1759
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
1760
|
+
}
|
|
1761
|
+
throw new Error("Invalid data type!");
|
|
1754
1762
|
}
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
t4 = M(X1 + Z1);
|
|
1778
|
-
let t5 = M(X2 + Z2); // step 10
|
|
1779
|
-
t4 = M(t4 * t5);
|
|
1780
|
-
t5 = M(t0 + t2);
|
|
1781
|
-
t4 = M(t4 - t5);
|
|
1782
|
-
t5 = M(Y1 + Z1);
|
|
1783
|
-
X3 = M(Y2 + Z2); // step 15
|
|
1784
|
-
t5 = M(t5 * X3);
|
|
1785
|
-
X3 = M(t1 + t2);
|
|
1786
|
-
t5 = M(t5 - X3);
|
|
1787
|
-
Z3 = M(a * t4);
|
|
1788
|
-
X3 = M(b3 * t2); // step 20
|
|
1789
|
-
Z3 = M(X3 + Z3);
|
|
1790
|
-
X3 = M(t1 - Z3);
|
|
1791
|
-
Z3 = M(t1 + Z3);
|
|
1792
|
-
Y3 = M(X3 * Z3);
|
|
1793
|
-
t1 = M(t0 + t0); // step 25
|
|
1794
|
-
t1 = M(t1 + t0);
|
|
1795
|
-
t2 = M(a * t2);
|
|
1796
|
-
t4 = M(b3 * t4);
|
|
1797
|
-
t1 = M(t1 + t2);
|
|
1798
|
-
t2 = M(t0 - t2); // step 30
|
|
1799
|
-
t2 = M(a * t2);
|
|
1800
|
-
t4 = M(t4 + t2);
|
|
1801
|
-
t0 = M(t1 * t4);
|
|
1802
|
-
Y3 = M(Y3 + t0);
|
|
1803
|
-
t0 = M(t5 * t4); // step 35
|
|
1804
|
-
X3 = M(t3 * X3);
|
|
1805
|
-
X3 = M(X3 - t0);
|
|
1806
|
-
t0 = M(t3 * t1);
|
|
1807
|
-
Z3 = M(t5 * Z3);
|
|
1808
|
-
Z3 = M(Z3 + t0); // step 40
|
|
1809
|
-
return new Point(X3, Y3, Z3);
|
|
1810
|
-
}
|
|
1811
|
-
subtract(other) {
|
|
1812
|
-
return this.add(apoint(other).negate());
|
|
1813
|
-
}
|
|
1814
|
-
/**
|
|
1815
|
-
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
1816
|
-
* Uses {@link wNAF} for base point.
|
|
1817
|
-
* Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
|
|
1818
|
-
* @param n scalar by which point is multiplied
|
|
1819
|
-
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
1820
|
-
*/
|
|
1821
|
-
multiply(n, safe = true) {
|
|
1822
|
-
// Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
|
|
1823
|
-
if (!safe && n === 0n)
|
|
1824
|
-
return I;
|
|
1825
|
-
FnIsValidNot0(n);
|
|
1826
|
-
if (n === 1n)
|
|
1827
|
-
return this;
|
|
1828
|
-
if (this.equals(G))
|
|
1829
|
-
return wNAF(n).p;
|
|
1830
|
-
// init result point & fake point
|
|
1831
|
-
let p = I;
|
|
1832
|
-
let f = G;
|
|
1833
|
-
for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
|
|
1834
|
-
// if bit is present, add to point
|
|
1835
|
-
// if not present, add to fake, for timing safety
|
|
1836
|
-
if (n & 1n)
|
|
1837
|
-
p = p.add(d);
|
|
1838
|
-
else if (safe)
|
|
1839
|
-
f = f.add(d);
|
|
1840
|
-
}
|
|
1841
|
-
return p;
|
|
1842
|
-
}
|
|
1843
|
-
multiplyUnsafe(scalar) {
|
|
1844
|
-
return this.multiply(scalar, false);
|
|
1845
|
-
}
|
|
1846
|
-
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
1847
|
-
toAffine() {
|
|
1848
|
-
const { X: x, Y: y, Z: z } = this;
|
|
1849
|
-
// fast-paths for ZERO point OR Z=1
|
|
1850
|
-
if (this.equals(I))
|
|
1851
|
-
return { x: 0n, y: 0n };
|
|
1852
|
-
if (z === 1n)
|
|
1853
|
-
return { x, y };
|
|
1854
|
-
const iz = invert(z, P);
|
|
1855
|
-
// (Z * Z^-1) must be 1, otherwise bad math
|
|
1856
|
-
if (M(z * iz) !== 1n)
|
|
1857
|
-
err$1('inverse invalid');
|
|
1858
|
-
// x = X*Z^-1; y = Y*Z^-1
|
|
1859
|
-
return { x: M(x * iz), y: M(y * iz) };
|
|
1860
|
-
}
|
|
1861
|
-
/** Checks if the point is valid and on-curve. */
|
|
1862
|
-
assertValidity() {
|
|
1863
|
-
const { x, y } = this.toAffine(); // convert to 2d xy affine point.
|
|
1864
|
-
FpIsValidNot0(x); // must be in range 1 <= x,y < P
|
|
1865
|
-
FpIsValidNot0(y);
|
|
1866
|
-
// y² == x³ + ax + b, equation sides must be equal
|
|
1867
|
-
return M(y * y) === koblitz(x) ? this : err$1('bad point: not on curve');
|
|
1868
|
-
}
|
|
1869
|
-
/** Converts point to 33/65-byte Uint8Array. */
|
|
1870
|
-
toBytes(isCompressed = true) {
|
|
1871
|
-
// Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
|
|
1872
|
-
// out of this byte surface because callers treat these encodings as public keys by default.
|
|
1873
|
-
const { x, y } = this.assertValidity().toAffine();
|
|
1874
|
-
const x32b = numTo32b(x);
|
|
1875
|
-
if (isCompressed)
|
|
1876
|
-
return concatBytes(getPrefix(y), x32b);
|
|
1877
|
-
return concatBytes(u8of(0x04), x32b, numTo32b(y));
|
|
1878
|
-
}
|
|
1879
|
-
toHex(isCompressed) {
|
|
1880
|
-
return bytesToHex(this.toBytes(isCompressed));
|
|
1763
|
+
: (data) => {
|
|
1764
|
+
if (typeof data === "string") {
|
|
1765
|
+
return textEncoder.encode(data);
|
|
1766
|
+
}
|
|
1767
|
+
if (ArrayBuffer.isView(data)) {
|
|
1768
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
1769
|
+
}
|
|
1770
|
+
throw new Error("Invalid data type!");
|
|
1771
|
+
};
|
|
1772
|
+
const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
1773
|
+
const base64Lookup = new Uint8Array(256);
|
|
1774
|
+
for (let i = 0; i < base64Chars.length; i++) {
|
|
1775
|
+
base64Lookup[base64Chars.charCodeAt(i)] = i;
|
|
1776
|
+
}
|
|
1777
|
+
function getDecodeBase64Length(data) {
|
|
1778
|
+
let bufferLength = Math.floor(data.length * 0.75);
|
|
1779
|
+
const len = data.length;
|
|
1780
|
+
if (data[len - 1] === "=") {
|
|
1781
|
+
bufferLength -= 1;
|
|
1782
|
+
if (data[len - 2] === "=") {
|
|
1783
|
+
bufferLength -= 1;
|
|
1784
|
+
}
|
|
1881
1785
|
}
|
|
1786
|
+
return bufferLength;
|
|
1882
1787
|
}
|
|
1883
|
-
|
|
1884
|
-
const
|
|
1885
|
-
|
|
1886
|
-
const
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
const
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
|
|
1900
|
-
const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
|
|
1901
|
-
/** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
|
|
1902
|
-
const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
|
|
1903
|
-
/** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
|
|
1904
|
-
const secretKeyToScalar = (secretKey) => {
|
|
1905
|
-
const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
|
|
1906
|
-
return arange(num, 1n, N, 'invalid secret key: outside of range');
|
|
1907
|
-
};
|
|
1908
|
-
/**
|
|
1909
|
-
* Creates a SEC 1 public key from a 32-byte private key.
|
|
1910
|
-
* @param privKey - 32-byte secret key.
|
|
1911
|
-
* @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
|
|
1912
|
-
* @returns serialized secp256k1 public key in SEC 1 encoding.
|
|
1913
|
-
* @example
|
|
1914
|
-
* Derive the serialized public key for a secp256k1 secret key.
|
|
1915
|
-
* ```ts
|
|
1916
|
-
* import * as secp from '@noble/secp256k1';
|
|
1917
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
1918
|
-
* const publicKey = secp.getPublicKey(secretKey);
|
|
1919
|
-
* ```
|
|
1920
|
-
*/
|
|
1921
|
-
const getPublicKey = (privKey, isCompressed = true) => {
|
|
1922
|
-
return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
|
|
1923
|
-
};
|
|
1924
|
-
const isValidSecretKey = (secretKey) => {
|
|
1925
|
-
try {
|
|
1926
|
-
return !!secretKeyToScalar(secretKey);
|
|
1927
|
-
}
|
|
1928
|
-
catch (error) {
|
|
1929
|
-
return false;
|
|
1930
|
-
}
|
|
1931
|
-
};
|
|
1932
|
-
const isValidPublicKey = (publicKey, isCompressed) => {
|
|
1933
|
-
const { publicKey: comp, publicKeyUncompressed } = lengths;
|
|
1934
|
-
try {
|
|
1935
|
-
const l = publicKey.length;
|
|
1936
|
-
if (isCompressed === true && l !== comp)
|
|
1937
|
-
return false;
|
|
1938
|
-
if (isCompressed === false && l !== publicKeyUncompressed)
|
|
1939
|
-
return false;
|
|
1940
|
-
return !!Point.fromBytes(publicKey);
|
|
1941
|
-
}
|
|
1942
|
-
catch (error) {
|
|
1943
|
-
return false;
|
|
1788
|
+
function decodeBase64(data) {
|
|
1789
|
+
const bufferLength = getDecodeBase64Length(data);
|
|
1790
|
+
const len = data.length;
|
|
1791
|
+
const bytes = new Uint8Array(bufferLength);
|
|
1792
|
+
let p = 0;
|
|
1793
|
+
for (let i = 0; i < len; i += 4) {
|
|
1794
|
+
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
1795
|
+
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
1796
|
+
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
1797
|
+
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
1798
|
+
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
1799
|
+
p += 1;
|
|
1800
|
+
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
1801
|
+
p += 1;
|
|
1802
|
+
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
1803
|
+
p += 1;
|
|
1944
1804
|
}
|
|
1805
|
+
return bytes;
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1808
|
+
const MAX_HEAP = 16 * 1024;
|
|
1809
|
+
const WASM_FUNC_HASH_LENGTH = 4;
|
|
1810
|
+
const wasmMutex = new Mutex();
|
|
1811
|
+
const wasmModuleCache = new Map();
|
|
1812
|
+
function WASMInterface(binary, hashLength) {
|
|
1813
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1814
|
+
let wasmInstance = null;
|
|
1815
|
+
let memoryView = null;
|
|
1816
|
+
let initialized = false;
|
|
1817
|
+
if (typeof WebAssembly === "undefined") {
|
|
1818
|
+
throw new Error("WebAssembly is not supported in this environment!");
|
|
1819
|
+
}
|
|
1820
|
+
const writeMemory = (data, offset = 0) => {
|
|
1821
|
+
memoryView.set(data, offset);
|
|
1822
|
+
};
|
|
1823
|
+
const getMemory = () => memoryView;
|
|
1824
|
+
const getExports = () => wasmInstance.exports;
|
|
1825
|
+
const setMemorySize = (totalSize) => {
|
|
1826
|
+
wasmInstance.exports.Hash_SetMemorySize(totalSize);
|
|
1827
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
1828
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1829
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
|
|
1830
|
+
};
|
|
1831
|
+
const getStateSize = () => {
|
|
1832
|
+
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
1833
|
+
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
1834
|
+
return stateSize;
|
|
1835
|
+
};
|
|
1836
|
+
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
1837
|
+
if (!wasmModuleCache.has(binary.name)) {
|
|
1838
|
+
const asm = decodeBase64(binary.data);
|
|
1839
|
+
const promise = WebAssembly.compile(asm);
|
|
1840
|
+
wasmModuleCache.set(binary.name, promise);
|
|
1841
|
+
}
|
|
1842
|
+
const module = yield wasmModuleCache.get(binary.name);
|
|
1843
|
+
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
1844
|
+
// env: {
|
|
1845
|
+
// emscripten_memcpy_big: (dest, src, num) => {
|
|
1846
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1847
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
1848
|
+
// memView.set(memView.subarray(src, src + num), dest);
|
|
1849
|
+
// },
|
|
1850
|
+
// print_memory: (offset, len) => {
|
|
1851
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1852
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
1853
|
+
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
1854
|
+
// },
|
|
1855
|
+
// },
|
|
1856
|
+
});
|
|
1857
|
+
// wasmInstance.exports._start();
|
|
1858
|
+
}));
|
|
1859
|
+
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
1860
|
+
if (!wasmInstance) {
|
|
1861
|
+
yield loadWASMPromise;
|
|
1862
|
+
}
|
|
1863
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
1864
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1865
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
1866
|
+
});
|
|
1867
|
+
const init = (bits = null) => {
|
|
1868
|
+
initialized = true;
|
|
1869
|
+
wasmInstance.exports.Hash_Init(bits);
|
|
1870
|
+
};
|
|
1871
|
+
const updateUInt8Array = (data) => {
|
|
1872
|
+
let read = 0;
|
|
1873
|
+
while (read < data.length) {
|
|
1874
|
+
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
1875
|
+
read += chunk.length;
|
|
1876
|
+
memoryView.set(chunk);
|
|
1877
|
+
wasmInstance.exports.Hash_Update(chunk.length);
|
|
1878
|
+
}
|
|
1879
|
+
};
|
|
1880
|
+
const update = (data) => {
|
|
1881
|
+
if (!initialized) {
|
|
1882
|
+
throw new Error("update() called before init()");
|
|
1883
|
+
}
|
|
1884
|
+
const Uint8Buffer = getUInt8Buffer(data);
|
|
1885
|
+
updateUInt8Array(Uint8Buffer);
|
|
1886
|
+
};
|
|
1887
|
+
const digestChars = new Uint8Array(hashLength * 2);
|
|
1888
|
+
const digest = (outputType, padding = null) => {
|
|
1889
|
+
if (!initialized) {
|
|
1890
|
+
throw new Error("digest() called before init()");
|
|
1891
|
+
}
|
|
1892
|
+
initialized = false;
|
|
1893
|
+
wasmInstance.exports.Hash_Final(padding);
|
|
1894
|
+
if (outputType === "binary") {
|
|
1895
|
+
// the data is copied to allow GC of the original memory object
|
|
1896
|
+
return memoryView.slice(0, hashLength);
|
|
1897
|
+
}
|
|
1898
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
1899
|
+
};
|
|
1900
|
+
const save = () => {
|
|
1901
|
+
if (!initialized) {
|
|
1902
|
+
throw new Error("save() can only be called after init() and before digest()");
|
|
1903
|
+
}
|
|
1904
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
1905
|
+
const stateLength = getStateSize();
|
|
1906
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1907
|
+
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
1908
|
+
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
1909
|
+
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
1910
|
+
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
1911
|
+
writeHexToUInt8(prefixedState, binary.hash);
|
|
1912
|
+
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
1913
|
+
return prefixedState;
|
|
1914
|
+
};
|
|
1915
|
+
const load = (state) => {
|
|
1916
|
+
if (!(state instanceof Uint8Array)) {
|
|
1917
|
+
throw new Error("load() expects an Uint8Array generated by save()");
|
|
1918
|
+
}
|
|
1919
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
1920
|
+
const stateLength = getStateSize();
|
|
1921
|
+
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
1922
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1923
|
+
if (state.length !== overallLength) {
|
|
1924
|
+
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
1925
|
+
}
|
|
1926
|
+
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
1927
|
+
throw new Error("This state was written by an incompatible hash implementation");
|
|
1928
|
+
}
|
|
1929
|
+
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
1930
|
+
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
1931
|
+
initialized = true;
|
|
1932
|
+
};
|
|
1933
|
+
const isDataShort = (data) => {
|
|
1934
|
+
if (typeof data === "string") {
|
|
1935
|
+
// worst case is 4 bytes / char
|
|
1936
|
+
return data.length < MAX_HEAP / 4;
|
|
1937
|
+
}
|
|
1938
|
+
return data.byteLength < MAX_HEAP;
|
|
1939
|
+
};
|
|
1940
|
+
let canSimplify = isDataShort;
|
|
1941
|
+
switch (binary.name) {
|
|
1942
|
+
case "argon2":
|
|
1943
|
+
case "scrypt":
|
|
1944
|
+
canSimplify = () => true;
|
|
1945
|
+
break;
|
|
1946
|
+
case "blake2b":
|
|
1947
|
+
case "blake2s":
|
|
1948
|
+
// if there is a key at blake2 then cannot simplify
|
|
1949
|
+
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
1950
|
+
break;
|
|
1951
|
+
case "blake3":
|
|
1952
|
+
// if there is a key at blake3 then cannot simplify
|
|
1953
|
+
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
1954
|
+
break;
|
|
1955
|
+
case "xxhash64": // cannot simplify
|
|
1956
|
+
case "xxhash3":
|
|
1957
|
+
case "xxhash128":
|
|
1958
|
+
case "crc64":
|
|
1959
|
+
canSimplify = () => false;
|
|
1960
|
+
break;
|
|
1961
|
+
}
|
|
1962
|
+
// shorthand for (init + update + digest) for better performance
|
|
1963
|
+
const calculate = (data, initParam = null, digestParam = null) => {
|
|
1964
|
+
if (!canSimplify(data, initParam)) {
|
|
1965
|
+
init(initParam);
|
|
1966
|
+
update(data);
|
|
1967
|
+
return digest("hex", digestParam);
|
|
1968
|
+
}
|
|
1969
|
+
const buffer = getUInt8Buffer(data);
|
|
1970
|
+
memoryView.set(buffer);
|
|
1971
|
+
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
1972
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
1973
|
+
};
|
|
1974
|
+
yield setupInterface();
|
|
1975
|
+
return {
|
|
1976
|
+
getMemory,
|
|
1977
|
+
writeMemory,
|
|
1978
|
+
getExports,
|
|
1979
|
+
setMemorySize,
|
|
1980
|
+
init,
|
|
1981
|
+
update,
|
|
1982
|
+
digest,
|
|
1983
|
+
save,
|
|
1984
|
+
load,
|
|
1985
|
+
calculate,
|
|
1986
|
+
hashLength,
|
|
1987
|
+
};
|
|
1988
|
+
});
|
|
1989
|
+
}
|
|
1990
|
+
|
|
1991
|
+
new Mutex();
|
|
1992
|
+
|
|
1993
|
+
new Mutex();
|
|
1994
|
+
|
|
1995
|
+
new Mutex();
|
|
1996
|
+
|
|
1997
|
+
new Mutex();
|
|
1998
|
+
|
|
1999
|
+
new Mutex();
|
|
2000
|
+
|
|
2001
|
+
new Mutex();
|
|
2002
|
+
|
|
2003
|
+
new Mutex();
|
|
2004
|
+
|
|
2005
|
+
new Mutex();
|
|
2006
|
+
|
|
2007
|
+
var name$c = "sha1";
|
|
2008
|
+
var data$c = "AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwkIAAECAwECAAEFBAEBAgIGDgJ/AUHgiQULfwBBgAgLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAILSGFzaF9VcGRhdGUABApIYXNoX0ZpbmFsAAUNSGFzaF9HZXRTdGF0ZQAGDkhhc2hfQ2FsY3VsYXRlAAcKU1RBVEVfU0laRQMBCpoqCAUAQYAJC68iCgF+An8BfgF/AX4DfwF+AX8Bfkd/QQAgACkDECIBQiCIpyICQRh0IAJBgP4DcUEIdHIgAUIoiKdBgP4DcSABQjiIp3JyIgMgACkDCCIEQiCIpyICQRh0IAJBgP4DcUEIdHIgBEIoiKdBgP4DcSAEQjiIp3JyIgVzIAApAygiBkIgiKciAkEYdCACQYD+A3FBCHRyIAZCKIinQYD+A3EgBkI4iKdyciIHcyAEpyICQRh0IAJBgP4DcUEIdHIgAkEIdkGA/gNxIAJBGHZyciIIIAApAwAiBKciAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiCXMgACkDICIKpyICQRh0IAJBgP4DcUEIdHIgAkEIdkGA/gNxIAJBGHZyciILcyAAKQMwIgxCIIinIgJBGHQgAkGA/gNxQQh0ciAMQiiIp0GA/gNxIAxCOIincnIiAnNBAXciDXNBAXciDiAFIARCIIinIg9BGHQgD0GA/gNxQQh0ciAEQiiIp0GA/gNxIARCOIincnIiEHMgCkIgiKciD0EYdCAPQYD+A3FBCHRyIApCKIinQYD+A3EgCkI4iKdyciIRcyAAKQM4IgSnIg9BGHQgD0GA/gNxQQh0ciAPQQh2QYD+A3EgD0EYdnJyIg9zQQF3IhJzIAcgEXMgEnMgCyAAKQMYIgqnIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyIhNzIA9zIA5zQQF3IgBzQQF3IhRzIA0gD3MgAHMgAiAHcyAOcyAGpyIVQRh0IBVBgP4DcUEIdHIgFUEIdkGA/gNxIBVBGHZyciIWIAtzIA1zIApCIIinIhVBGHQgFUGA/gNxQQh0ciAKQiiIp0GA/gNxIApCOIincnIiFyADcyACcyABpyIVQRh0IBVBgP4DcUEIdHIgFUEIdkGA/gNxIBVBGHZyciIYIAhzIBZzIARCIIinIhVBGHQgFUGA/gNxQQh0ciAEQiiIp0GA/gNxIARCOIincnIiFXNBAXciGXNBAXciGnNBAXciG3NBAXciHHNBAXciHXNBAXciHiASIBVzIBEgF3MgFXMgEyAYcyAMpyIfQRh0IB9BgP4DcUEIdHIgH0EIdkGA/gNxIB9BGHZyciIgcyASc0EBdyIfc0EBdyIhcyAPICBzIB9zIBRzQQF3IiJzQQF3IiNzIBQgIXMgI3MgACAfcyAicyAec0EBdyIkc0EBdyIlcyAdICJzICRzIBwgFHMgHnMgGyAAcyAdcyAaIA5zIBxzIBkgDXMgG3MgFSACcyAacyAgIBZzIBlzICFzQQF3IiZzQQF3IidzQQF3IihzQQF3IilzQQF3IipzQQF3IitzQQF3IixzQQF3Ii0gIyAncyAhIBpzICdzIB8gGXMgJnMgI3NBAXciLnNBAXciL3MgIiAmcyAucyAlc0EBdyIwc0EBdyIxcyAlIC9zIDFzICQgLnMgMHMgLXNBAXciMnNBAXciM3MgLCAwcyAycyArICVzIC1zICogJHMgLHMgKSAecyArcyAoIB1zICpzICcgHHMgKXMgJiAbcyAocyAvc0EBdyI0c0EBdyI1c0EBdyI2c0EBdyI3c0EBdyI4c0EBdyI5c0EBdyI6c0EBdyI7IDEgNXMgLyApcyA1cyAuIChzIDRzIDFzQQF3IjxzQQF3Ij1zIDAgNHMgPHMgM3NBAXciPnNBAXciP3MgMyA9cyA/cyAyIDxzID5zIDtzQQF3IkBzQQF3IkFzIDogPnMgQHMgOSAzcyA7cyA4IDJzIDpzIDcgLXMgOXMgNiAscyA4cyA1ICtzIDdzIDQgKnMgNnMgPXNBAXciQnNBAXciQ3NBAXciRHNBAXciRXNBAXciRnNBAXciR3NBAXciSHNBAXciSSA+IEJzIDwgNnMgQnMgP3NBAXciSnMgQXNBAXciSyA9IDdzIENzIEpzQQF3IkwgRCA5IDIgMSA0ICkgHSAUIB8gFSAWQQAoAoCJASJNQQV3QQAoApCJASJOaiAJakEAKAKMiQEiT0EAKAKIiQEiCXNBACgChIkBIlBxIE9zakGZ84nUBWoiUUEedyJSIANqIFBBHnciAyAFaiBPIAMgCXMgTXEgCXNqIBBqIFFBBXdqQZnzidQFaiIQIFIgTUEedyIFc3EgBXNqIAkgCGogUSADIAVzcSADc2ogEEEFd2pBmfOJ1AVqIlFBBXdqQZnzidQFaiJTIFFBHnciAyAQQR53IghzcSAIc2ogBSAYaiBRIAggUnNxIFJzaiBTQQV3akGZ84nUBWoiBUEFd2pBmfOJ1AVqIhhBHnciUmogU0EedyIWIAtqIAggE2ogBSAWIANzcSADc2ogGEEFd2pBmfOJ1AVqIgggUiAFQR53IgtzcSALc2ogAyAXaiAYIAsgFnNxIBZzaiAIQQV3akGZ84nUBWoiBUEFd2pBmfOJ1AVqIhMgBUEedyIWIAhBHnciA3NxIANzaiALIBFqIAUgAyBSc3EgUnNqIBNBBXdqQZnzidQFaiIRQQV3akGZ84nUBWoiUkEedyILaiACIBNBHnciFWogByADaiARIBUgFnNxIBZzaiBSQQV3akGZ84nUBWoiByALIBFBHnciAnNxIAJzaiAgIBZqIFIgAiAVc3EgFXNqIAdBBXdqQZnzidQFaiIRQQV3akGZ84nUBWoiFiARQR53IhUgB0EedyIHc3EgB3NqIA8gAmogESAHIAtzcSALc2ogFkEFd2pBmfOJ1AVqIgtBBXdqQZnzidQFaiIRQR53IgJqIBIgFWogESALQR53Ig8gFkEedyISc3EgEnNqIA0gB2ogCyASIBVzcSAVc2ogEUEFd2pBmfOJ1AVqIg1BBXdqQZnzidQFaiIVQR53Ih8gDUEedyIHcyAZIBJqIA0gAiAPc3EgD3NqIBVBBXdqQZnzidQFaiINc2ogDiAPaiAVIAcgAnNxIAJzaiANQQV3akGZ84nUBWoiAkEFd2pBodfn9gZqIg5BHnciD2ogACAfaiACQR53IgAgDUEedyINcyAOc2ogGiAHaiANIB9zIAJzaiAOQQV3akGh1+f2BmoiAkEFd2pBodfn9gZqIg5BHnciEiACQR53IhRzICEgDWogDyAAcyACc2ogDkEFd2pBodfn9gZqIgJzaiAbIABqIBQgD3MgDnNqIAJBBXdqQaHX5/YGaiIAQQV3akGh1+f2BmoiDUEedyIOaiAcIBJqIABBHnciDyACQR53IgJzIA1zaiAmIBRqIAIgEnMgAHNqIA1BBXdqQaHX5/YGaiIAQQV3akGh1+f2BmoiDUEedyISIABBHnciFHMgIiACaiAOIA9zIABzaiANQQV3akGh1+f2BmoiAHNqICcgD2ogFCAOcyANc2ogAEEFd2pBodfn9gZqIgJBBXdqQaHX5/YGaiINQR53Ig5qICggEmogAkEedyIPIABBHnciAHMgDXNqICMgFGogACAScyACc2ogDUEFd2pBodfn9gZqIgJBBXdqQaHX5/YGaiINQR53IhIgAkEedyIUcyAeIABqIA4gD3MgAnNqIA1BBXdqQaHX5/YGaiIAc2ogLiAPaiAUIA5zIA1zaiAAQQV3akGh1+f2BmoiAkEFd2pBodfn9gZqIg1BHnciDmogKiAAQR53IgBqIA4gAkEedyIPcyAkIBRqIAAgEnMgAnNqIA1BBXdqQaHX5/YGaiIUc2ogLyASaiAPIABzIA1zaiAUQQV3akGh1+f2BmoiDUEFd2pBodfn9gZqIgAgDUEedyICciAUQR53IhJxIAAgAnFyaiAlIA9qIBIgDnMgDXNqIABBBXdqQaHX5/YGaiINQQV3akHc+e74eGoiDkEedyIPaiA1IABBHnciAGogKyASaiANIAByIAJxIA0gAHFyaiAOQQV3akHc+e74eGoiEiAPciANQR53Ig1xIBIgD3FyaiAwIAJqIA4gDXIgAHEgDiANcXJqIBJBBXdqQdz57vh4aiIAQQV3akHc+e74eGoiAiAAQR53Ig5yIBJBHnciEnEgAiAOcXJqICwgDWogACASciAPcSAAIBJxcmogAkEFd2pB3Pnu+HhqIgBBBXdqQdz57vh4aiINQR53Ig9qIDwgAkEedyICaiA2IBJqIAAgAnIgDnEgACACcXJqIA1BBXdqQdz57vh4aiISIA9yIABBHnciAHEgEiAPcXJqIC0gDmogDSAAciACcSANIABxcmogEkEFd2pB3Pnu+HhqIgJBBXdqQdz57vh4aiINIAJBHnciDnIgEkEedyIScSANIA5xcmogNyAAaiACIBJyIA9xIAIgEnFyaiANQQV3akHc+e74eGoiAEEFd2pB3Pnu+HhqIgJBHnciD2ogMyANQR53Ig1qID0gEmogACANciAOcSAAIA1xcmogAkEFd2pB3Pnu+HhqIhIgD3IgAEEedyIAcSASIA9xcmogOCAOaiACIAByIA1xIAIgAHFyaiASQQV3akHc+e74eGoiAkEFd2pB3Pnu+HhqIg0gAkEedyIOciASQR53IhJxIA0gDnFyaiBCIABqIAIgEnIgD3EgAiAScXJqIA1BBXdqQdz57vh4aiIAQQV3akHc+e74eGoiAkEedyIPaiBDIA5qIAIgAEEedyIUciANQR53Ig1xIAIgFHFyaiA+IBJqIAAgDXIgDnEgACANcXJqIAJBBXdqQdz57vh4aiIAQQV3akHc+e74eGoiAkEedyISIABBHnciDnMgOiANaiAAIA9yIBRxIAAgD3FyaiACQQV3akHc+e74eGoiAHNqID8gFGogAiAOciAPcSACIA5xcmogAEEFd2pB3Pnu+HhqIgJBBXdqQdaDi9N8aiINQR53Ig9qIEogEmogAkEedyIUIABBHnciAHMgDXNqIDsgDmogACAScyACc2ogDUEFd2pB1oOL03xqIgJBBXdqQdaDi9N8aiINQR53Ig4gAkEedyIScyBFIABqIA8gFHMgAnNqIA1BBXdqQdaDi9N8aiIAc2ogQCAUaiASIA9zIA1zaiAAQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciD2ogQSAOaiACQR53IhQgAEEedyIAcyANc2ogRiASaiAAIA5zIAJzaiANQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciDiACQR53IhJzIEIgOHMgRHMgTHNBAXciFSAAaiAPIBRzIAJzaiANQQV3akHWg4vTfGoiAHNqIEcgFGogEiAPcyANc2ogAEEFd2pB1oOL03xqIgJBBXdqQdaDi9N8aiINQR53Ig9qIEggDmogAkEedyIUIABBHnciAHMgDXNqIEMgOXMgRXMgFXNBAXciGSASaiAAIA5zIAJzaiANQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciDiACQR53IhJzID8gQ3MgTHMgS3NBAXciGiAAaiAPIBRzIAJzaiANQQV3akHWg4vTfGoiAHNqIEQgOnMgRnMgGXNBAXciGyAUaiASIA9zIA1zaiAAQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciDyBOajYCkIkBQQAgTyBKIERzIBVzIBpzQQF3IhQgEmogAEEedyIAIA5zIAJzaiANQQV3akHWg4vTfGoiEkEedyIVajYCjIkBQQAgCSBFIDtzIEdzIBtzQQF3IA5qIAJBHnciAiAAcyANc2ogEkEFd2pB1oOL03xqIg1BHndqNgKIiQFBACBQIEAgSnMgS3MgSXNBAXcgAGogDyACcyASc2ogDUEFd2pB1oOL03xqIgBqNgKEiQFBACBNIEwgRXMgGXMgFHNBAXdqIAJqIBUgD3MgDXNqIABBBXdqQdaDi9N8ajYCgIkBCzoAQQBC/rnrxemOlZkQNwKIiQFBAEKBxpS6lvHq5m83AoCJAUEAQvDDy54MNwKQiQFBAEEANgKYiQELqAMBCH9BACECQQBBACgClIkBIgMgAUEDdGoiBDYClIkBQQBBACgCmIkBIAQgA0lqIAFBHXZqNgKYiQECQCADQQN2QT9xIgUgAWpBwABJDQBBwAAgBWsiAkEDcSEGQQAhAwJAIAVBP3NBA0kNACAFQYCJAWohByACQfwAcSEIQQAhAwNAIAcgA2oiBEEcaiAAIANqIgktAAA6AAAgBEEdaiAJQQFqLQAAOgAAIARBHmogCUECai0AADoAACAEQR9qIAlBA2otAAA6AAAgCCADQQRqIgNHDQALCwJAIAZFDQAgACADaiEEIAMgBWpBnIkBaiEDA0AgAyAELQAAOgAAIARBAWohBCADQQFqIQMgBkF/aiIGDQALC0GciQEQASAFQf8AcyEDQQAhBSADIAFPDQADQCAAIAJqEAEgAkH/AGohAyACQcAAaiIEIQIgAyABSQ0ACyAEIQILAkAgASACRg0AIAEgAmshCSAAIAJqIQIgBUGciQFqIQNBACEEA0AgAyACLQAAOgAAIAJBAWohAiADQQFqIQMgCSAEQQFqIgRB/wFxSw0ACwsLCQBBgAkgABADC6YDAQJ/IwBBEGsiACQAIABBgAE6AAcgAEEAKAKYiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AAggAEEAKAKUiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AAwgAEEHakEBEAMCQEEAKAKUiQFB+ANxQcADRg0AA0AgAEEAOgAHIABBB2pBARADQQAoApSJAUH4A3FBwANHDQALCyAAQQhqQQgQA0EAQQAoAoCJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCgAlBAEEAKAKEiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AoQJQQBBACgCiIkBIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgKICUEAQQAoAoyJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCjAlBAEEAKAKQiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2ApAJIABBEGokAAsGAEGAiQELQwBBAEL+uevF6Y6VmRA3AoiJAUEAQoHGlLqW8ermbzcCgIkBQQBC8MPLngw3ApCJAUEAQQA2ApiJAUGACSAAEAMQBQsLCwEAQYAICwRcAAAA";
|
|
2009
|
+
var hash$c = "6b530c24";
|
|
2010
|
+
var wasmJson$c = {
|
|
2011
|
+
name: name$c,
|
|
2012
|
+
data: data$c,
|
|
2013
|
+
hash: hash$c
|
|
1945
2014
|
};
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
* Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
|
|
1949
|
-
* All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
|
|
1950
|
-
* providers still return exact 32-byte Uint8Array digests.
|
|
1951
|
-
* @example
|
|
1952
|
-
* Provide sync hash helpers before calling the synchronous signing API.
|
|
1953
|
-
* ```ts
|
|
1954
|
-
* import * as secp from '@noble/secp256k1';
|
|
1955
|
-
* import { hmac } from '@noble/hashes/hmac.js';
|
|
1956
|
-
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1957
|
-
* secp.hashes.sha256 = sha256;
|
|
1958
|
-
* secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
|
|
1959
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
1960
|
-
* const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
|
|
1961
|
-
* ```
|
|
1962
|
-
*/
|
|
1963
|
-
const hashes = {
|
|
1964
|
-
hmacSha256Async: async (key, message) => {
|
|
1965
|
-
const s = subtle();
|
|
1966
|
-
const name = 'HMAC';
|
|
1967
|
-
const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
|
|
1968
|
-
return u8n(await s.sign(name, k, message));
|
|
1969
|
-
},
|
|
1970
|
-
hmacSha256: undefined,
|
|
1971
|
-
sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
|
|
1972
|
-
sha256: undefined,
|
|
1973
|
-
};
|
|
1974
|
-
/**
|
|
1975
|
-
* Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
|
|
1976
|
-
* Result is **NOT hashed** and returns the serialized shared point (compressed by default),
|
|
1977
|
-
* not the SEC 1 x-only primitive `z = x_P`.
|
|
1978
|
-
* secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
|
|
1979
|
-
* @param secretKeyA - local 32-byte secret key.
|
|
1980
|
-
* @param publicKeyB - peer public key.
|
|
1981
|
-
* @param isCompressed - return 33-byte compressed output when `true`.
|
|
1982
|
-
* @returns shared secret point bytes.
|
|
1983
|
-
* @example
|
|
1984
|
-
* Derive a shared secp256k1 secret with ECDH.
|
|
1985
|
-
* ```ts
|
|
1986
|
-
* import * as secp from '@noble/secp256k1';
|
|
1987
|
-
* const alice = secp.utils.randomSecretKey();
|
|
1988
|
-
* const bob = secp.utils.randomSecretKey();
|
|
1989
|
-
* const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
|
|
1990
|
-
* ```
|
|
1991
|
-
*/
|
|
1992
|
-
const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
|
|
1993
|
-
return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
|
|
1994
|
-
};
|
|
1995
|
-
// FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
|
|
1996
|
-
// The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
|
|
1997
|
-
const randomSecretKey = (seed) => {
|
|
1998
|
-
seed = seed === undefined ? randomBytes(lengths.seed) : seed;
|
|
1999
|
-
abytes(seed);
|
|
2000
|
-
// Keep the public range text aligned with the enforced 48-byte FIPS floor.
|
|
2001
|
-
if (seed.length < lengths.seed || seed.length > 1024)
|
|
2002
|
-
return err$1('expected 48-1024b', RangeError);
|
|
2003
|
-
const num = M(bytesToNumBE(seed), N - 1n);
|
|
2004
|
-
return numTo32b(num + 1n);
|
|
2005
|
-
};
|
|
2006
|
-
const createKeygen = (getPublicKey) => (seed) => {
|
|
2007
|
-
const secretKey = randomSecretKey(seed);
|
|
2008
|
-
return {
|
|
2009
|
-
secretKey,
|
|
2010
|
-
publicKey: getPublicKey(secretKey),
|
|
2011
|
-
};
|
|
2012
|
-
};
|
|
2013
|
-
/**
|
|
2014
|
-
* Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
|
|
2015
|
-
* @example
|
|
2016
|
-
* Convert bytes to a hex string with the low-level helper namespace.
|
|
2017
|
-
* ```ts
|
|
2018
|
-
* import { etc } from '@noble/secp256k1';
|
|
2019
|
-
* const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
|
|
2020
|
-
* ```
|
|
2021
|
-
*/
|
|
2022
|
-
const etc = /* @__PURE__ */ Object.freeze({
|
|
2023
|
-
hexToBytes,
|
|
2024
|
-
bytesToHex,
|
|
2025
|
-
concatBytes,
|
|
2026
|
-
bytesToNumberBE: bytesToNumBE,
|
|
2027
|
-
numberToBytesBE: numTo32b,
|
|
2028
|
-
mod: M,
|
|
2029
|
-
invert: invert, // math utilities; keep public alias type aligned with runtime
|
|
2030
|
-
randomBytes,
|
|
2031
|
-
secretKeyToScalar: secretKeyToScalar,
|
|
2032
|
-
abytes: abytes,
|
|
2033
|
-
});
|
|
2034
|
-
/**
|
|
2035
|
-
* Curve-specific key utilities.
|
|
2036
|
-
* @example
|
|
2037
|
-
* Generate a fresh secret key and derive its public key.
|
|
2038
|
-
* ```ts
|
|
2039
|
-
* import * as secp from '@noble/secp256k1';
|
|
2040
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
2041
|
-
* const publicKey = secp.getPublicKey(secretKey);
|
|
2042
|
-
* ```
|
|
2043
|
-
*/
|
|
2044
|
-
const utils$2 = /* @__PURE__ */ Object.freeze({
|
|
2045
|
-
isValidSecretKey: isValidSecretKey,
|
|
2046
|
-
isValidPublicKey: isValidPublicKey,
|
|
2047
|
-
randomSecretKey: randomSecretKey, // preserve the optional seeded call
|
|
2048
|
-
});
|
|
2049
|
-
// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
|
|
2050
|
-
// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
2051
|
-
// Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
|
|
2052
|
-
const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
|
|
2053
|
-
const T_AUX = 'aux';
|
|
2054
|
-
const T_NONCE = 'nonce';
|
|
2055
|
-
const T_CHALLENGE = 'challenge';
|
|
2056
|
-
// Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
|
|
2057
|
-
// wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
|
|
2058
|
-
const taggedHash = (tag, ...messages) => {
|
|
2059
|
-
const tagH = gh('sha256', getTag(tag));
|
|
2060
|
-
return gh('sha256', concatBytes(tagH, tagH, ...messages));
|
|
2061
|
-
};
|
|
2062
|
-
// Async twin of taggedHash with the same checked provider boundary.
|
|
2063
|
-
const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
|
|
2064
|
-
// BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
|
|
2065
|
-
// d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
|
|
2066
|
-
const extpubSchnorr = (priv) => {
|
|
2067
|
-
const d_ = secretKeyToScalar(priv);
|
|
2068
|
-
const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
|
|
2069
|
-
const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
|
|
2070
|
-
const d = isEven(y) ? d_ : modN(-d_);
|
|
2071
|
-
const px = numTo32b(x);
|
|
2072
|
-
return { d, px };
|
|
2073
|
-
};
|
|
2074
|
-
const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
|
|
2075
|
-
const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
|
|
2076
|
-
const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
|
|
2077
|
-
/** Schnorr public key is just `x` coordinate of Point as per BIP340. */
|
|
2078
|
-
const pubSchnorr = (secretKey) => {
|
|
2079
|
-
return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
|
|
2080
|
-
};
|
|
2081
|
-
const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
|
|
2082
|
-
// Common preparation fn for both sync and async signing
|
|
2083
|
-
const prepSigSchnorr = (message, secretKey, auxRand) => {
|
|
2084
|
-
const { px, d } = extpubSchnorr(secretKey);
|
|
2085
|
-
return { m: abytes(message), px, d, a: abytes(auxRand, L) };
|
|
2086
|
-
};
|
|
2087
|
-
const extractK = (rand) => {
|
|
2088
|
-
const k_ = bytesModN(rand); // Let k' = int(rand) mod n
|
|
2089
|
-
if (k_ === 0n)
|
|
2090
|
-
err$1('sign failed: k is zero'); // Fail if k' = 0.
|
|
2091
|
-
const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
|
|
2092
|
-
return { rx: px, k: d };
|
|
2093
|
-
};
|
|
2094
|
-
// Common signature creation helper
|
|
2095
|
-
const createSigSchnorr = (k, px, e, d) => {
|
|
2096
|
-
return concatBytes(px, numTo32b(modN(k + e * d)));
|
|
2097
|
-
};
|
|
2098
|
-
const E_INVSIG = 'invalid signature produced';
|
|
2015
|
+
|
|
2016
|
+
new Mutex();
|
|
2099
2017
|
/**
|
|
2100
|
-
* Creates
|
|
2101
|
-
* auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
|
|
2102
|
-
* k generation, so bad CSPRNG won't be the only entropy source.
|
|
2018
|
+
* Creates a new SHA-1 hash instance
|
|
2103
2019
|
*/
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
return res instanceof Promise ? res.then(later) : later(res);
|
|
2138
|
-
};
|
|
2139
|
-
const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
|
|
2140
|
-
const sig = abytes(signature, L2, 'signature');
|
|
2141
|
-
const msg = abytes(message, undefined, 'message');
|
|
2142
|
-
const pub = abytes(publicKey, L, 'publicKey');
|
|
2143
|
-
try {
|
|
2144
|
-
// lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
|
|
2145
|
-
// Fail if x ≥ p. Let c = x³ + 7 mod p.
|
|
2146
|
-
const x = bytesToNumBE(pub);
|
|
2147
|
-
const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
|
|
2148
|
-
const P_ = new Point(x, y, 1n).assertValidity();
|
|
2149
|
-
const px = numTo32b(P_.toAffine().x);
|
|
2150
|
-
// P = lift_x(int(pk)); fail if that fails
|
|
2151
|
-
const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
|
|
2152
|
-
arange(r, 1n, P);
|
|
2153
|
-
const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
|
|
2154
|
-
// Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
|
|
2155
|
-
// s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
|
|
2156
|
-
// crafted edge cases and fail closed instead of carrying that extra verification surface.
|
|
2157
|
-
arange(s, 1n, N);
|
|
2158
|
-
const i = concatBytes(numTo32b(r), px, msg);
|
|
2159
|
-
// int(challenge(bytes(r)||bytes(P)||m))%n
|
|
2160
|
-
return callSyncAsyncFn(challengeFn(i), (e) => {
|
|
2161
|
-
const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
|
|
2162
|
-
if (!isEven(y) || x !== r)
|
|
2163
|
-
return false; // -eP == (n-e)P
|
|
2164
|
-
return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
|
|
2165
|
-
});
|
|
2166
|
-
}
|
|
2167
|
-
catch (error) {
|
|
2168
|
-
return false;
|
|
2169
|
-
}
|
|
2020
|
+
function createSHA1() {
|
|
2021
|
+
return WASMInterface(wasmJson$c, 20).then((wasm) => {
|
|
2022
|
+
wasm.init();
|
|
2023
|
+
const obj = {
|
|
2024
|
+
init: () => {
|
|
2025
|
+
wasm.init();
|
|
2026
|
+
return obj;
|
|
2027
|
+
},
|
|
2028
|
+
update: (data) => {
|
|
2029
|
+
wasm.update(data);
|
|
2030
|
+
return obj;
|
|
2031
|
+
},
|
|
2032
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2033
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2034
|
+
save: () => wasm.save(),
|
|
2035
|
+
load: (data) => {
|
|
2036
|
+
wasm.load(data);
|
|
2037
|
+
return obj;
|
|
2038
|
+
},
|
|
2039
|
+
blockSize: 64,
|
|
2040
|
+
digestSize: 20,
|
|
2041
|
+
};
|
|
2042
|
+
return obj;
|
|
2043
|
+
});
|
|
2044
|
+
}
|
|
2045
|
+
|
|
2046
|
+
var name$b = "sha3";
|
|
2047
|
+
var data$b = "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";
|
|
2048
|
+
var hash$b = "fb24e536";
|
|
2049
|
+
var wasmJson$b = {
|
|
2050
|
+
name: name$b,
|
|
2051
|
+
data: data$b,
|
|
2052
|
+
hash: hash$b
|
|
2170
2053
|
};
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
*
|
|
2183
|
-
*
|
|
2184
|
-
* import * as secp from '@noble/secp256k1';
|
|
2185
|
-
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
2186
|
-
* secp.hashes.sha256 = sha256;
|
|
2187
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
2188
|
-
* const message = new Uint8Array([1, 2, 3]);
|
|
2189
|
-
* const sig = secp.schnorr.sign(message, secretKey);
|
|
2190
|
-
* const publicKey = secp.schnorr.getPublicKey(secretKey);
|
|
2191
|
-
* const isValid = secp.schnorr.verify(sig, message, publicKey);
|
|
2192
|
-
* ```
|
|
2054
|
+
|
|
2055
|
+
new Mutex();
|
|
2056
|
+
|
|
2057
|
+
new Mutex();
|
|
2058
|
+
function validateBits(bits) {
|
|
2059
|
+
if (![224, 256, 384, 512].includes(bits)) {
|
|
2060
|
+
return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
|
|
2061
|
+
}
|
|
2062
|
+
return null;
|
|
2063
|
+
}
|
|
2064
|
+
/**
|
|
2065
|
+
* Creates a new Keccak hash instance
|
|
2066
|
+
* @param bits Number of output bits. Valid values: 224, 256, 384, 512
|
|
2193
2067
|
*/
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
sign: signSchnorr,
|
|
2198
|
-
verify: verifySchnorr,
|
|
2199
|
-
signAsync: signSchnorrAsync,
|
|
2200
|
-
verifyAsync: verifySchnorrAsync,
|
|
2201
|
-
});
|
|
2202
|
-
// ## Precomputes
|
|
2203
|
-
// --------------
|
|
2204
|
-
const W = 8; // W is window size
|
|
2205
|
-
const scalarBits = 256;
|
|
2206
|
-
const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
|
|
2207
|
-
const pwindowSize = 2 ** (W - 1); // 128 for W=8
|
|
2208
|
-
const precompute = () => {
|
|
2209
|
-
const points = [];
|
|
2210
|
-
let p = G;
|
|
2211
|
-
let b = p;
|
|
2212
|
-
for (let w = 0; w < pwindows; w++) {
|
|
2213
|
-
b = p;
|
|
2214
|
-
points.push(b);
|
|
2215
|
-
for (let i = 1; i < pwindowSize; i++) {
|
|
2216
|
-
b = b.add(p);
|
|
2217
|
-
points.push(b);
|
|
2218
|
-
} // i=1, bc we skip 0
|
|
2219
|
-
p = b.double();
|
|
2068
|
+
function createKeccak(bits = 512) {
|
|
2069
|
+
if (validateBits(bits)) {
|
|
2070
|
+
return Promise.reject(validateBits(bits));
|
|
2220
2071
|
}
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2072
|
+
const outputSize = bits / 8;
|
|
2073
|
+
return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
|
|
2074
|
+
wasm.init(bits);
|
|
2075
|
+
const obj = {
|
|
2076
|
+
init: () => {
|
|
2077
|
+
wasm.init(bits);
|
|
2078
|
+
return obj;
|
|
2079
|
+
},
|
|
2080
|
+
update: (data) => {
|
|
2081
|
+
wasm.update(data);
|
|
2082
|
+
return obj;
|
|
2083
|
+
},
|
|
2084
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2085
|
+
digest: (outputType) => wasm.digest(outputType, 0x01),
|
|
2086
|
+
save: () => wasm.save(),
|
|
2087
|
+
load: (data) => {
|
|
2088
|
+
wasm.load(data);
|
|
2089
|
+
return obj;
|
|
2090
|
+
},
|
|
2091
|
+
blockSize: 200 - 2 * outputSize,
|
|
2092
|
+
digestSize: outputSize,
|
|
2093
|
+
};
|
|
2094
|
+
return obj;
|
|
2095
|
+
});
|
|
2096
|
+
}
|
|
2097
|
+
|
|
2098
|
+
var name$a = "sha256";
|
|
2099
|
+
var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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";
|
|
2100
|
+
var hash$a = "8c18dd94";
|
|
2101
|
+
var wasmJson$a = {
|
|
2102
|
+
name: name$a,
|
|
2103
|
+
data: data$a,
|
|
2104
|
+
hash: hash$a
|
|
2228
2105
|
};
|
|
2106
|
+
|
|
2107
|
+
new Mutex();
|
|
2229
2108
|
/**
|
|
2230
|
-
*
|
|
2231
|
-
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
2232
|
-
* Any time `G.multiply` is done, precomputes are used.
|
|
2233
|
-
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
2234
|
-
*
|
|
2235
|
-
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
2236
|
-
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
2237
|
-
*
|
|
2238
|
-
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
2109
|
+
* Creates a new SHA-2 (SHA-224) hash instance
|
|
2239
2110
|
*/
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2111
|
+
function createSHA224() {
|
|
2112
|
+
return WASMInterface(wasmJson$a, 28).then((wasm) => {
|
|
2113
|
+
wasm.init(224);
|
|
2114
|
+
const obj = {
|
|
2115
|
+
init: () => {
|
|
2116
|
+
wasm.init(224);
|
|
2117
|
+
return obj;
|
|
2118
|
+
},
|
|
2119
|
+
update: (data) => {
|
|
2120
|
+
wasm.update(data);
|
|
2121
|
+
return obj;
|
|
2122
|
+
},
|
|
2123
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2124
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2125
|
+
save: () => wasm.save(),
|
|
2126
|
+
load: (data) => {
|
|
2127
|
+
wasm.load(data);
|
|
2128
|
+
return obj;
|
|
2129
|
+
},
|
|
2130
|
+
blockSize: 64,
|
|
2131
|
+
digestSize: 28,
|
|
2132
|
+
};
|
|
2133
|
+
return obj;
|
|
2134
|
+
});
|
|
2135
|
+
}
|
|
2136
|
+
|
|
2137
|
+
new Mutex();
|
|
2138
|
+
/**
|
|
2139
|
+
* Creates a new SHA-2 (SHA-256) hash instance
|
|
2140
|
+
*/
|
|
2141
|
+
function createSHA256() {
|
|
2142
|
+
return WASMInterface(wasmJson$a, 32).then((wasm) => {
|
|
2143
|
+
wasm.init(256);
|
|
2144
|
+
const obj = {
|
|
2145
|
+
init: () => {
|
|
2146
|
+
wasm.init(256);
|
|
2147
|
+
return obj;
|
|
2148
|
+
},
|
|
2149
|
+
update: (data) => {
|
|
2150
|
+
wasm.update(data);
|
|
2151
|
+
return obj;
|
|
2152
|
+
},
|
|
2153
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2154
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2155
|
+
save: () => wasm.save(),
|
|
2156
|
+
load: (data) => {
|
|
2157
|
+
wasm.load(data);
|
|
2158
|
+
return obj;
|
|
2159
|
+
},
|
|
2160
|
+
blockSize: 64,
|
|
2161
|
+
digestSize: 32,
|
|
2162
|
+
};
|
|
2163
|
+
return obj;
|
|
2164
|
+
});
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
var name$9 = "sha512";
|
|
2168
|
+
var data$9 = "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";
|
|
2169
|
+
var hash$9 = "f2e40eb1";
|
|
2170
|
+
var wasmJson$9 = {
|
|
2171
|
+
name: name$9,
|
|
2172
|
+
data: data$9,
|
|
2173
|
+
hash: hash$9
|
|
2276
2174
|
};
|
|
2277
2175
|
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2176
|
+
new Mutex();
|
|
2177
|
+
/**
|
|
2178
|
+
* Creates a new SHA-2 (SHA-384) hash instance
|
|
2179
|
+
*/
|
|
2180
|
+
function createSHA384() {
|
|
2181
|
+
return WASMInterface(wasmJson$9, 48).then((wasm) => {
|
|
2182
|
+
wasm.init(384);
|
|
2183
|
+
const obj = {
|
|
2184
|
+
init: () => {
|
|
2185
|
+
wasm.init(384);
|
|
2186
|
+
return obj;
|
|
2187
|
+
},
|
|
2188
|
+
update: (data) => {
|
|
2189
|
+
wasm.update(data);
|
|
2190
|
+
return obj;
|
|
2191
|
+
},
|
|
2192
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2193
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2194
|
+
save: () => wasm.save(),
|
|
2195
|
+
load: (data) => {
|
|
2196
|
+
wasm.load(data);
|
|
2197
|
+
return obj;
|
|
2198
|
+
},
|
|
2199
|
+
blockSize: 128,
|
|
2200
|
+
digestSize: 48,
|
|
2201
|
+
};
|
|
2202
|
+
return obj;
|
|
2203
|
+
});
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2206
|
+
new Mutex();
|
|
2207
|
+
/**
|
|
2208
|
+
* Creates a new SHA-2 (SHA-512) hash instance
|
|
2209
|
+
*/
|
|
2210
|
+
function createSHA512() {
|
|
2211
|
+
return WASMInterface(wasmJson$9, 64).then((wasm) => {
|
|
2212
|
+
wasm.init(512);
|
|
2213
|
+
const obj = {
|
|
2214
|
+
init: () => {
|
|
2215
|
+
wasm.init(512);
|
|
2216
|
+
return obj;
|
|
2217
|
+
},
|
|
2218
|
+
update: (data) => {
|
|
2219
|
+
wasm.update(data);
|
|
2220
|
+
return obj;
|
|
2221
|
+
},
|
|
2222
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2223
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2224
|
+
save: () => wasm.save(),
|
|
2225
|
+
load: (data) => {
|
|
2226
|
+
wasm.load(data);
|
|
2227
|
+
return obj;
|
|
2228
|
+
},
|
|
2229
|
+
blockSize: 128,
|
|
2230
|
+
digestSize: 64,
|
|
2231
|
+
};
|
|
2232
|
+
return obj;
|
|
2233
|
+
});
|
|
2234
|
+
}
|
|
2235
|
+
|
|
2236
|
+
new Mutex();
|
|
2237
|
+
|
|
2238
|
+
new Mutex();
|
|
2239
|
+
|
|
2240
|
+
new Mutex();
|
|
2241
|
+
|
|
2242
|
+
new Mutex();
|
|
2243
|
+
|
|
2244
|
+
var name$4 = "ripemd160";
|
|
2245
|
+
var data$4 = "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";
|
|
2246
|
+
var hash$4 = "6abbce74";
|
|
2247
|
+
var wasmJson$4 = {
|
|
2248
|
+
name: name$4,
|
|
2249
|
+
data: data$4,
|
|
2250
|
+
hash: hash$4
|
|
2308
2251
|
};
|
|
2309
2252
|
|
|
2310
|
-
|
|
2311
|
-
// usage:
|
|
2312
|
-
// networks['bitcoin']['testnet']
|
|
2313
|
-
// networks.bitcoin.testnet
|
|
2253
|
+
new Mutex();
|
|
2314
2254
|
/**
|
|
2315
|
-
*
|
|
2316
|
-
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
2255
|
+
* Creates a new RIPEMD-160 hash instance
|
|
2317
2256
|
*/
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
}
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
}
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
const
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2257
|
+
function createRIPEMD160() {
|
|
2258
|
+
return WASMInterface(wasmJson$4, 20).then((wasm) => {
|
|
2259
|
+
wasm.init();
|
|
2260
|
+
const obj = {
|
|
2261
|
+
init: () => {
|
|
2262
|
+
wasm.init();
|
|
2263
|
+
return obj;
|
|
2264
|
+
},
|
|
2265
|
+
update: (data) => {
|
|
2266
|
+
wasm.update(data);
|
|
2267
|
+
return obj;
|
|
2268
|
+
},
|
|
2269
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2270
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2271
|
+
save: () => wasm.save(),
|
|
2272
|
+
load: (data) => {
|
|
2273
|
+
wasm.load(data);
|
|
2274
|
+
return obj;
|
|
2275
|
+
},
|
|
2276
|
+
blockSize: 64,
|
|
2277
|
+
digestSize: 20,
|
|
2278
|
+
};
|
|
2279
|
+
return obj;
|
|
2280
|
+
});
|
|
2281
|
+
}
|
|
2282
|
+
|
|
2283
|
+
function calculateKeyBuffer(hasher, key) {
|
|
2284
|
+
const { blockSize } = hasher;
|
|
2285
|
+
const buf = getUInt8Buffer(key);
|
|
2286
|
+
if (buf.length > blockSize) {
|
|
2287
|
+
hasher.update(buf);
|
|
2288
|
+
const uintArr = hasher.digest("binary");
|
|
2289
|
+
hasher.init();
|
|
2290
|
+
return uintArr;
|
|
2291
|
+
}
|
|
2292
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
2293
|
+
}
|
|
2294
|
+
function calculateHmac(hasher, key) {
|
|
2295
|
+
hasher.init();
|
|
2296
|
+
const { blockSize } = hasher;
|
|
2297
|
+
const keyBuf = calculateKeyBuffer(hasher, key);
|
|
2298
|
+
const keyBuffer = new Uint8Array(blockSize);
|
|
2299
|
+
keyBuffer.set(keyBuf);
|
|
2300
|
+
const opad = new Uint8Array(blockSize);
|
|
2301
|
+
for (let i = 0; i < blockSize; i++) {
|
|
2302
|
+
const v = keyBuffer[i];
|
|
2303
|
+
opad[i] = v ^ 0x5c;
|
|
2304
|
+
keyBuffer[i] = v ^ 0x36;
|
|
2305
|
+
}
|
|
2306
|
+
hasher.update(keyBuffer);
|
|
2307
|
+
const obj = {
|
|
2308
|
+
init: () => {
|
|
2309
|
+
hasher.init();
|
|
2310
|
+
hasher.update(keyBuffer);
|
|
2311
|
+
return obj;
|
|
2312
|
+
},
|
|
2313
|
+
update: (data) => {
|
|
2314
|
+
hasher.update(data);
|
|
2315
|
+
return obj;
|
|
2316
|
+
},
|
|
2317
|
+
digest: ((outputType) => {
|
|
2318
|
+
const uintArr = hasher.digest("binary");
|
|
2319
|
+
hasher.init();
|
|
2320
|
+
hasher.update(opad);
|
|
2321
|
+
hasher.update(uintArr);
|
|
2322
|
+
return hasher.digest(outputType);
|
|
2323
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2324
|
+
}),
|
|
2325
|
+
save: () => {
|
|
2326
|
+
throw new Error("save() not supported");
|
|
2327
|
+
},
|
|
2328
|
+
load: () => {
|
|
2329
|
+
throw new Error("load() not supported");
|
|
2330
|
+
},
|
|
2331
|
+
blockSize: hasher.blockSize,
|
|
2332
|
+
digestSize: hasher.digestSize,
|
|
2333
|
+
};
|
|
2334
|
+
return obj;
|
|
2335
|
+
}
|
|
2373
2336
|
/**
|
|
2374
|
-
*
|
|
2375
|
-
* @return
|
|
2337
|
+
* Calculates HMAC hash
|
|
2338
|
+
* @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
|
|
2339
|
+
* @param key Key (string, Buffer or TypedArray)
|
|
2376
2340
|
*/
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
}
|
|
2341
|
+
function createHMAC(hash, key) {
|
|
2342
|
+
if (!hash || !hash.then) {
|
|
2343
|
+
throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
|
|
2344
|
+
}
|
|
2345
|
+
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
2346
|
+
}
|
|
2347
|
+
|
|
2348
|
+
new Mutex();
|
|
2349
|
+
|
|
2350
|
+
new Mutex();
|
|
2383
2351
|
|
|
2384
|
-
const encode$
|
|
2352
|
+
const encode$1$1 = (version, privateKey, compressed) => {
|
|
2385
2353
|
if (privateKey.length !== 32)
|
|
2386
2354
|
throw new TypeError(`Invalid privateKey length: expected 32 got ${privateKey.length}`);
|
|
2387
2355
|
const uint8Array = new Uint8Array(compressed ? 34 : 33);
|
|
@@ -2392,7 +2360,7 @@ const encode$5 = (version, privateKey, compressed) => {
|
|
|
2392
2360
|
}
|
|
2393
2361
|
return base58check.encode(uint8Array);
|
|
2394
2362
|
};
|
|
2395
|
-
const decode$
|
|
2363
|
+
const decode$1$1 = async (wif, version) => {
|
|
2396
2364
|
wif = (await base58check.decode(wif)).data;
|
|
2397
2365
|
if (version && wif[0] !== version)
|
|
2398
2366
|
throw new Error('Invalid network version');
|
|
@@ -2407,7 +2375,7 @@ const decode$6 = async (wif, version) => {
|
|
|
2407
2375
|
compressed: wif.length === 33 ? false : true
|
|
2408
2376
|
};
|
|
2409
2377
|
};
|
|
2410
|
-
var wif = { encode: encode$
|
|
2378
|
+
var wif = { encode: encode$1$1, decode: decode$1$1 };
|
|
2411
2379
|
|
|
2412
2380
|
const HIGHEST_BIT = 0x80000000;
|
|
2413
2381
|
const privateKeyVerify = (privateKey) => utils$2.isValidSecretKey(privateKey);
|
|
@@ -2528,7 +2496,7 @@ class HdNode {
|
|
|
2528
2496
|
else {
|
|
2529
2497
|
set.push(new Uint8Array(this.publicKey));
|
|
2530
2498
|
}
|
|
2531
|
-
return base58check.encode(index$
|
|
2499
|
+
return base58check.encode(index$3(set));
|
|
2532
2500
|
}
|
|
2533
2501
|
toWIF() {
|
|
2534
2502
|
if (!this.#privateKey)
|
|
@@ -2544,14 +2512,14 @@ class HdNode {
|
|
|
2544
2512
|
if (this.isNeutered)
|
|
2545
2513
|
throw new TypeError('Missing private key for hardened child key');
|
|
2546
2514
|
// data = 0x00 || ser256(kpar) || ser32(index)
|
|
2547
|
-
data = index$
|
|
2515
|
+
data = index$3([
|
|
2548
2516
|
new TextEncoder().encode('0'),
|
|
2549
2517
|
this.privateKey,
|
|
2550
2518
|
new TextEncoder().encode(index.toString()),
|
|
2551
2519
|
]);
|
|
2552
2520
|
}
|
|
2553
2521
|
else {
|
|
2554
|
-
data = index$
|
|
2522
|
+
data = index$3([
|
|
2555
2523
|
this.publicKey,
|
|
2556
2524
|
new TextEncoder().encode(index.toString()),
|
|
2557
2525
|
]);
|
|
@@ -2611,7 +2579,7 @@ class HdNode {
|
|
|
2611
2579
|
let buffer = (await base58check.decode(string)).data;
|
|
2612
2580
|
// @ts-ignore
|
|
2613
2581
|
network = network || networks.leofcoin;
|
|
2614
|
-
const result = index$
|
|
2582
|
+
const result = index$2(buffer);
|
|
2615
2583
|
const version = Number(new TextDecoder().decode(result[0]));
|
|
2616
2584
|
const depth = Number(new TextDecoder().decode(result[1]));
|
|
2617
2585
|
const parentFingerprint = Number(new TextDecoder().decode(result[2]));
|
|
@@ -4881,6 +4849,38 @@ class HDWallet {
|
|
|
4881
4849
|
}
|
|
4882
4850
|
}
|
|
4883
4851
|
|
|
4852
|
+
const ALPHABET$2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
4853
|
+
const ALPHABET_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
|
|
4854
|
+
const base32 = base(ALPHABET$2);
|
|
4855
|
+
const base32Hex = base(ALPHABET_HEX);
|
|
4856
|
+
const decode$6 = base32.decode;
|
|
4857
|
+
const decodeHex = base32Hex.decode;
|
|
4858
|
+
const encode$5 = base32.encode;
|
|
4859
|
+
const encodeHex = base32Hex.encode;
|
|
4860
|
+
const isBase32 = (string, hex = false) => {
|
|
4861
|
+
try {
|
|
4862
|
+
if (hex)
|
|
4863
|
+
decodeHex(string);
|
|
4864
|
+
else
|
|
4865
|
+
decode$6(string);
|
|
4866
|
+
return true;
|
|
4867
|
+
}
|
|
4868
|
+
catch (e) {
|
|
4869
|
+
return false;
|
|
4870
|
+
}
|
|
4871
|
+
};
|
|
4872
|
+
const isBase32Hex = (string) => {
|
|
4873
|
+
return isBase32(string, true);
|
|
4874
|
+
};
|
|
4875
|
+
var index$5 = {
|
|
4876
|
+
encode: encode$5,
|
|
4877
|
+
decode: decode$6,
|
|
4878
|
+
encodeHex,
|
|
4879
|
+
decodeHex,
|
|
4880
|
+
isBase32,
|
|
4881
|
+
isBase32Hex,
|
|
4882
|
+
};
|
|
4883
|
+
|
|
4884
4884
|
hashes.sha256 = (message) => {
|
|
4885
4885
|
message = Buffer.isBuffer(message) ? new Uint8Array(message) : message;
|
|
4886
4886
|
return new Uint8Array(createHash$1("sha256").update(message).digest());
|
|
@@ -4950,8 +4950,8 @@ class MultiSignature {
|
|
|
4950
4950
|
if (!signature)
|
|
4951
4951
|
throw ReferenceError("signature undefined");
|
|
4952
4952
|
this.#multiSignature = typedArrayConcat([
|
|
4953
|
-
index$
|
|
4954
|
-
index$
|
|
4953
|
+
index$4.encode(this.version),
|
|
4954
|
+
index$4.encode(this.multiCodec),
|
|
4955
4955
|
signature,
|
|
4956
4956
|
]);
|
|
4957
4957
|
return this.multiSignature;
|
|
@@ -4967,10 +4967,10 @@ class MultiSignature {
|
|
|
4967
4967
|
if (!this.multiSignature)
|
|
4968
4968
|
throw ReferenceError("multiSignature undefined");
|
|
4969
4969
|
let buffer = this.multiSignature;
|
|
4970
|
-
const version = index$
|
|
4971
|
-
buffer = buffer.subarray(index$
|
|
4972
|
-
const codec = index$
|
|
4973
|
-
buffer = buffer.subarray(index$
|
|
4970
|
+
const version = index$4.decode(buffer);
|
|
4971
|
+
buffer = buffer.subarray(index$4.decode.bytes);
|
|
4972
|
+
const codec = index$4.decode(buffer);
|
|
4973
|
+
buffer = buffer.subarray(index$4.decode.bytes);
|
|
4974
4974
|
const signature = buffer.subarray(0, buffer.length);
|
|
4975
4975
|
console.log("[decode] extracted signature length:", signature.length);
|
|
4976
4976
|
console.log("[decode] extracted signature (hex):", Buffer.from(signature).toString("hex"));
|
|
@@ -4998,16 +4998,16 @@ class MultiSignature {
|
|
|
4998
4998
|
return this.decode(base58$1.decode(string));
|
|
4999
4999
|
}
|
|
5000
5000
|
toBs32() {
|
|
5001
|
-
return index$
|
|
5001
|
+
return index$5.encode(this.multiSignature);
|
|
5002
5002
|
}
|
|
5003
5003
|
fromBs32(string) {
|
|
5004
|
-
return this.decode(index$
|
|
5004
|
+
return this.decode(index$5.decode(string));
|
|
5005
5005
|
}
|
|
5006
5006
|
toBs32Hex() {
|
|
5007
|
-
return index$
|
|
5007
|
+
return index$5.encodeHex(this.multiSignature);
|
|
5008
5008
|
}
|
|
5009
5009
|
fromBs32Hex(string) {
|
|
5010
|
-
return this.decode(index$
|
|
5010
|
+
return this.decode(index$5.decodeHex(string));
|
|
5011
5011
|
}
|
|
5012
5012
|
toBs58Hex() {
|
|
5013
5013
|
return base58$1.encodeHex(this.multiSignature);
|
|
@@ -5038,11 +5038,11 @@ var encrypt = async (password, data, version = new TextEncoder().encode('1')) =>
|
|
|
5038
5038
|
name: 'AES-GCM',
|
|
5039
5039
|
iv
|
|
5040
5040
|
}, key, new TextEncoder().encode(data));
|
|
5041
|
-
return index$
|
|
5041
|
+
return index$3([version, salt, iv, new Uint8Array(encrypted)]);
|
|
5042
5042
|
};
|
|
5043
5043
|
|
|
5044
5044
|
var decrypt = async (password, concatecated) => {
|
|
5045
|
-
const [version, salt, iv, cipher] = index$
|
|
5045
|
+
const [version, salt, iv, cipher] = index$2(concatecated);
|
|
5046
5046
|
let iterations;
|
|
5047
5047
|
if (new TextDecoder().decode(version) === '1') {
|
|
5048
5048
|
iterations = 250000;
|
|
@@ -5062,7 +5062,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5062
5062
|
super(network, hdnode);
|
|
5063
5063
|
}
|
|
5064
5064
|
get id() {
|
|
5065
|
-
return base58check.encode(index$
|
|
5065
|
+
return base58check.encode(index$3([
|
|
5066
5066
|
new TextEncoder().encode(this.version.toString()),
|
|
5067
5067
|
this.account(0).hdnode.neutered.publicKey
|
|
5068
5068
|
]));
|
|
@@ -5072,8 +5072,8 @@ class MultiHDNode extends HDWallet {
|
|
|
5072
5072
|
}
|
|
5073
5073
|
async fromId(id) {
|
|
5074
5074
|
let buffer = (await base58check.decode(id)).data;
|
|
5075
|
-
index$
|
|
5076
|
-
buffer = buffer.slice(index$
|
|
5075
|
+
index$4.decode(buffer);
|
|
5076
|
+
buffer = buffer.slice(index$4.decode.bytes);
|
|
5077
5077
|
this.fromPublicKey(buffer, null, this.networkName);
|
|
5078
5078
|
}
|
|
5079
5079
|
async import(password, encrypted) {
|
|
@@ -5095,7 +5095,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5095
5095
|
this.locked = false;
|
|
5096
5096
|
}
|
|
5097
5097
|
fromMultiWif(string) {
|
|
5098
|
-
const { version, codec, privateKey } = index$
|
|
5098
|
+
const { version, codec, privateKey } = index$1$1.decode(string);
|
|
5099
5099
|
this.network = Object.values(networks).reduce((p, c) => {
|
|
5100
5100
|
if (c.multiCodec === codec)
|
|
5101
5101
|
return c;
|
|
@@ -5109,7 +5109,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5109
5109
|
return this.fromPrivateKey(privateKey, undefined, this.network);
|
|
5110
5110
|
}
|
|
5111
5111
|
toMultiWif() {
|
|
5112
|
-
return index$
|
|
5112
|
+
return index$1$1.encode(this.network.version, this.network.multiCodec, this.privateKey);
|
|
5113
5113
|
}
|
|
5114
5114
|
sign(hash) {
|
|
5115
5115
|
return new MultiSignature(this.version, this.network.multiCodec)
|
|
@@ -5156,7 +5156,7 @@ class MultiWallet extends MultiHDNode {
|
|
|
5156
5156
|
super(network, hdnode);
|
|
5157
5157
|
}
|
|
5158
5158
|
get id() {
|
|
5159
|
-
return base58check.encode(index$
|
|
5159
|
+
return base58check.encode(index$3([
|
|
5160
5160
|
new TextEncoder().encode(this.version.toString()),
|
|
5161
5161
|
this.account(0).hdnode.neutered.publicKey,
|
|
5162
5162
|
]));
|
|
@@ -8337,7 +8337,7 @@ class Identity {
|
|
|
8337
8337
|
this.selectedAccount = new TextDecoder().decode(selected);
|
|
8338
8338
|
}
|
|
8339
8339
|
else {
|
|
8340
|
-
const importee = await import(/* webpackChunkName: "generate-account" */ './index-
|
|
8340
|
+
const importee = await import(/* webpackChunkName: "generate-account" */ './index-DIhxISkU-Bdapw5qM.js');
|
|
8341
8341
|
const { identity, accounts } = await importee.default(password, this.network);
|
|
8342
8342
|
await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
|
|
8343
8343
|
await globalThis.walletStore.put('version', String(1));
|
|
@@ -8580,7 +8580,7 @@ var isHex = string => /^[A-F0-9]+$/i.test(
|
|
|
8580
8580
|
string
|
|
8581
8581
|
);
|
|
8582
8582
|
|
|
8583
|
-
/*! pako 2.
|
|
8583
|
+
/*! pako 2.2.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
|
|
8584
8584
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
|
8585
8585
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
|
8586
8586
|
//
|
|
@@ -10002,7 +10002,7 @@ const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = tr
|
|
|
10002
10002
|
|
|
10003
10003
|
const {
|
|
10004
10004
|
Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,
|
|
10005
|
-
Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$
|
|
10005
|
+
Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$2,
|
|
10006
10006
|
Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,
|
|
10007
10007
|
Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,
|
|
10008
10008
|
Z_UNKNOWN,
|
|
@@ -10101,11 +10101,35 @@ const slide_hash = (s) => {
|
|
|
10101
10101
|
};
|
|
10102
10102
|
|
|
10103
10103
|
/* eslint-disable new-cap */
|
|
10104
|
-
let
|
|
10105
|
-
|
|
10106
|
-
|
|
10107
|
-
|
|
10108
|
-
|
|
10104
|
+
let HASH = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;
|
|
10105
|
+
|
|
10106
|
+
|
|
10107
|
+
/* ===========================================================================
|
|
10108
|
+
* Insert string str in the dictionary and set match_head to the previous head
|
|
10109
|
+
* of the hash chain (the most recent string with same hash key). Return
|
|
10110
|
+
* the previous length of the hash chain.
|
|
10111
|
+
* IN assertion: all calls to INSERT_STRING are made with consecutive input
|
|
10112
|
+
* characters and the first MIN_MATCH bytes of str are valid (except for
|
|
10113
|
+
* the last MIN_MATCH-1 bytes of the input file).
|
|
10114
|
+
*/
|
|
10115
|
+
const INSERT_STRING = (s, str) => {
|
|
10116
|
+
let h;
|
|
10117
|
+
if (s.legacy_hash) {
|
|
10118
|
+
/* UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); */
|
|
10119
|
+
h = s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
|
|
10120
|
+
} else {
|
|
10121
|
+
// ANZAC++ hash: reads 4 bytes, matches node.js zlib output (legacyHash
|
|
10122
|
+
// restores classic zlib hash). Faster, with fewer collisions.
|
|
10123
|
+
const w = s.window;
|
|
10124
|
+
// Read 4 bytes little-endian. Math.imul reproduces C uint32 overflow in
|
|
10125
|
+
// `(value * 66521 + 66521) >> 16` exactly.
|
|
10126
|
+
const value = w[str] | (w[str + 1] << 8) | (w[str + 2] << 16) | (w[str + 3] << 24);
|
|
10127
|
+
h = s.ins_h = ((Math.imul(value, 66521) + 66521) >>> 16) & s.hash_mask;
|
|
10128
|
+
}
|
|
10129
|
+
const hash_head = s.prev[str & s.w_mask] = s.head[h];
|
|
10130
|
+
s.head[h] = str;
|
|
10131
|
+
return hash_head;
|
|
10132
|
+
};
|
|
10109
10133
|
|
|
10110
10134
|
|
|
10111
10135
|
/* =========================================================================
|
|
@@ -10379,7 +10403,20 @@ const fill_window = (s) => {
|
|
|
10379
10403
|
s.lookahead += n;
|
|
10380
10404
|
|
|
10381
10405
|
/* Initialize the hash value now that we have some input: */
|
|
10382
|
-
if (s.
|
|
10406
|
+
if (!s.legacy_hash) {
|
|
10407
|
+
/* The 4-byte hash reads one extra byte, so it needs one more available. */
|
|
10408
|
+
if (s.lookahead + s.insert > MIN_MATCH) {
|
|
10409
|
+
str = s.strstart - s.insert;
|
|
10410
|
+
while (s.insert) {
|
|
10411
|
+
INSERT_STRING(s, str);
|
|
10412
|
+
str++;
|
|
10413
|
+
s.insert--;
|
|
10414
|
+
if (s.lookahead + s.insert <= MIN_MATCH) {
|
|
10415
|
+
break;
|
|
10416
|
+
}
|
|
10417
|
+
}
|
|
10418
|
+
}
|
|
10419
|
+
} else if (s.lookahead + s.insert >= MIN_MATCH) {
|
|
10383
10420
|
str = s.strstart - s.insert;
|
|
10384
10421
|
s.ins_h = s.window[str];
|
|
10385
10422
|
|
|
@@ -10389,11 +10426,7 @@ const fill_window = (s) => {
|
|
|
10389
10426
|
// Call update_hash() MIN_MATCH-3 more times
|
|
10390
10427
|
//#endif
|
|
10391
10428
|
while (s.insert) {
|
|
10392
|
-
|
|
10393
|
-
s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
|
|
10394
|
-
|
|
10395
|
-
s.prev[str & s.w_mask] = s.head[s.ins_h];
|
|
10396
|
-
s.head[s.ins_h] = str;
|
|
10429
|
+
INSERT_STRING(s, str);
|
|
10397
10430
|
str++;
|
|
10398
10431
|
s.insert--;
|
|
10399
10432
|
if (s.lookahead + s.insert < MIN_MATCH) {
|
|
@@ -10691,11 +10724,7 @@ const deflate_fast = (s, flush) => {
|
|
|
10691
10724
|
*/
|
|
10692
10725
|
hash_head = 0/*NIL*/;
|
|
10693
10726
|
if (s.lookahead >= MIN_MATCH) {
|
|
10694
|
-
|
|
10695
|
-
s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
|
|
10696
|
-
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
|
|
10697
|
-
s.head[s.ins_h] = s.strstart;
|
|
10698
|
-
/***/
|
|
10727
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10699
10728
|
}
|
|
10700
10729
|
|
|
10701
10730
|
/* Find the longest match, discarding those <= prev_length.
|
|
@@ -10725,11 +10754,7 @@ const deflate_fast = (s, flush) => {
|
|
|
10725
10754
|
s.match_length--; /* string at strstart already in table */
|
|
10726
10755
|
do {
|
|
10727
10756
|
s.strstart++;
|
|
10728
|
-
|
|
10729
|
-
s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
|
|
10730
|
-
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
|
|
10731
|
-
s.head[s.ins_h] = s.strstart;
|
|
10732
|
-
/***/
|
|
10757
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10733
10758
|
/* strstart never exceeds WSIZE-MAX_MATCH, so there are
|
|
10734
10759
|
* always MIN_MATCH bytes ahead.
|
|
10735
10760
|
*/
|
|
@@ -10739,16 +10764,18 @@ const deflate_fast = (s, flush) => {
|
|
|
10739
10764
|
{
|
|
10740
10765
|
s.strstart += s.match_length;
|
|
10741
10766
|
s.match_length = 0;
|
|
10742
|
-
s.
|
|
10743
|
-
|
|
10744
|
-
|
|
10767
|
+
if (s.legacy_hash) {
|
|
10768
|
+
s.ins_h = s.window[s.strstart];
|
|
10769
|
+
/* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
|
|
10770
|
+
s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);
|
|
10745
10771
|
|
|
10746
10772
|
//#if MIN_MATCH != 3
|
|
10747
10773
|
// Call UPDATE_HASH() MIN_MATCH-3 more times
|
|
10748
10774
|
//#endif
|
|
10749
|
-
|
|
10750
|
-
|
|
10751
|
-
|
|
10775
|
+
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
|
|
10776
|
+
* matter since it will be recomputed at next deflate call.
|
|
10777
|
+
*/
|
|
10778
|
+
}
|
|
10752
10779
|
}
|
|
10753
10780
|
} else {
|
|
10754
10781
|
/* No match, output a literal byte */
|
|
@@ -10821,11 +10848,7 @@ const deflate_slow = (s, flush) => {
|
|
|
10821
10848
|
*/
|
|
10822
10849
|
hash_head = 0/*NIL*/;
|
|
10823
10850
|
if (s.lookahead >= MIN_MATCH) {
|
|
10824
|
-
|
|
10825
|
-
s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
|
|
10826
|
-
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
|
|
10827
|
-
s.head[s.ins_h] = s.strstart;
|
|
10828
|
-
/***/
|
|
10851
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10829
10852
|
}
|
|
10830
10853
|
|
|
10831
10854
|
/* Find the longest match, discarding those <= prev_length.
|
|
@@ -10873,11 +10896,7 @@ const deflate_slow = (s, flush) => {
|
|
|
10873
10896
|
s.prev_length -= 2;
|
|
10874
10897
|
do {
|
|
10875
10898
|
if (++s.strstart <= max_insert) {
|
|
10876
|
-
|
|
10877
|
-
s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
|
|
10878
|
-
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
|
|
10879
|
-
s.head[s.ins_h] = s.strstart;
|
|
10880
|
-
/***/
|
|
10899
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10881
10900
|
}
|
|
10882
10901
|
} while (--s.prev_length !== 0);
|
|
10883
10902
|
s.match_available = 0;
|
|
@@ -11202,6 +11221,7 @@ function DeflateState() {
|
|
|
11202
11221
|
this.head = null; /* Heads of the hash chains or NIL. */
|
|
11203
11222
|
|
|
11204
11223
|
this.ins_h = 0; /* hash index of string to be inserted */
|
|
11224
|
+
this.legacy_hash = 0; /* use classic zlib hash instead of default ANZAC++ */
|
|
11205
11225
|
this.hash_size = 0; /* number of elements in hash table */
|
|
11206
11226
|
this.hash_bits = 0; /* log2(hash_size) */
|
|
11207
11227
|
this.hash_mask = 0; /* hash_size-1 */
|
|
@@ -11424,7 +11444,7 @@ const deflateSetHeader = (strm, head) => {
|
|
|
11424
11444
|
};
|
|
11425
11445
|
|
|
11426
11446
|
|
|
11427
|
-
const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
|
|
11447
|
+
const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy, legacyHash) => {
|
|
11428
11448
|
|
|
11429
11449
|
if (!strm) { // === Z_NULL
|
|
11430
11450
|
return Z_STREAM_ERROR$2;
|
|
@@ -11470,7 +11490,13 @@ const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
|
|
|
11470
11490
|
s.w_size = 1 << s.w_bits;
|
|
11471
11491
|
s.w_mask = s.w_size - 1;
|
|
11472
11492
|
|
|
11493
|
+
s.legacy_hash = legacyHash ? 1 : 0;
|
|
11494
|
+
|
|
11473
11495
|
s.hash_bits = memLevel + 7;
|
|
11496
|
+
/* ANZAC++ hash needs >= 15 hash bits to span its 4 read bytes. */
|
|
11497
|
+
if (!s.legacy_hash && s.hash_bits < 15) {
|
|
11498
|
+
s.hash_bits = 15;
|
|
11499
|
+
}
|
|
11474
11500
|
s.hash_size = 1 << s.hash_bits;
|
|
11475
11501
|
s.hash_mask = s.hash_size - 1;
|
|
11476
11502
|
s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
|
|
@@ -11562,7 +11588,7 @@ const deflate$2 = (strm, flush) => {
|
|
|
11562
11588
|
if (!strm.output ||
|
|
11563
11589
|
(strm.avail_in !== 0 && !strm.input) ||
|
|
11564
11590
|
(s.status === FINISH_STATE && flush !== Z_FINISH$3)) {
|
|
11565
|
-
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$
|
|
11591
|
+
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2);
|
|
11566
11592
|
}
|
|
11567
11593
|
|
|
11568
11594
|
const old_flush = s.last_flush;
|
|
@@ -11588,12 +11614,12 @@ const deflate$2 = (strm, flush) => {
|
|
|
11588
11614
|
*/
|
|
11589
11615
|
} else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
|
|
11590
11616
|
flush !== Z_FINISH$3) {
|
|
11591
|
-
return err(strm, Z_BUF_ERROR$
|
|
11617
|
+
return err(strm, Z_BUF_ERROR$2);
|
|
11592
11618
|
}
|
|
11593
11619
|
|
|
11594
11620
|
/* User must not provide more input after the first FINISH: */
|
|
11595
11621
|
if (s.status === FINISH_STATE && strm.avail_in !== 0) {
|
|
11596
|
-
return err(strm, Z_BUF_ERROR$
|
|
11622
|
+
return err(strm, Z_BUF_ERROR$2);
|
|
11597
11623
|
}
|
|
11598
11624
|
|
|
11599
11625
|
/* Write the header */
|
|
@@ -11974,12 +12000,7 @@ const deflateSetDictionary = (strm, dictionary) => {
|
|
|
11974
12000
|
let str = s.strstart;
|
|
11975
12001
|
let n = s.lookahead - (MIN_MATCH - 1);
|
|
11976
12002
|
do {
|
|
11977
|
-
|
|
11978
|
-
s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
|
|
11979
|
-
|
|
11980
|
-
s.prev[str & s.w_mask] = s.head[s.ins_h];
|
|
11981
|
-
|
|
11982
|
-
s.head[s.ins_h] = str;
|
|
12003
|
+
INSERT_STRING(s, str);
|
|
11983
12004
|
str++;
|
|
11984
12005
|
} while (--n);
|
|
11985
12006
|
s.strstart = str;
|
|
@@ -12103,7 +12124,7 @@ const _utf8len = new Uint8Array(256);
|
|
|
12103
12124
|
for (let q = 0; q < 256; q++) {
|
|
12104
12125
|
_utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
|
|
12105
12126
|
}
|
|
12106
|
-
_utf8len[254] = _utf8len[
|
|
12127
|
+
_utf8len[254] = _utf8len[255] = 1; // Invalid sequence start
|
|
12107
12128
|
|
|
12108
12129
|
|
|
12109
12130
|
// convert string to array (typed, when possible)
|
|
@@ -12324,6 +12345,15 @@ const {
|
|
|
12324
12345
|
|
|
12325
12346
|
/* ===========================================================================*/
|
|
12326
12347
|
|
|
12348
|
+
const defaultOptions$1 = {
|
|
12349
|
+
level: Z_DEFAULT_COMPRESSION,
|
|
12350
|
+
method: Z_DEFLATED$1,
|
|
12351
|
+
chunkSize: 16384,
|
|
12352
|
+
windowBits: 15,
|
|
12353
|
+
memLevel: 8,
|
|
12354
|
+
strategy: Z_DEFAULT_STRATEGY,
|
|
12355
|
+
legacyHash: true
|
|
12356
|
+
};
|
|
12327
12357
|
|
|
12328
12358
|
/**
|
|
12329
12359
|
* class Deflate
|
|
@@ -12379,6 +12409,10 @@ const {
|
|
|
12379
12409
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
|
12380
12410
|
* for more information on these.
|
|
12381
12411
|
*
|
|
12412
|
+
* - `legacyHash` (Boolean) - use the classic zlib hash (default), which matches
|
|
12413
|
+
* canonical zlib output byte-for-byte. Set to `false` to use the faster
|
|
12414
|
+
* ANZAC++ hash, which matches recent (chromium) node.js output instead.
|
|
12415
|
+
*
|
|
12382
12416
|
* Additional options, for internal needs:
|
|
12383
12417
|
*
|
|
12384
12418
|
* - `chunkSize` - size of generated data chunks (16K by default)
|
|
@@ -12411,14 +12445,7 @@ const {
|
|
|
12411
12445
|
* ```
|
|
12412
12446
|
**/
|
|
12413
12447
|
function Deflate$1(options) {
|
|
12414
|
-
this.options = common.assign({
|
|
12415
|
-
level: Z_DEFAULT_COMPRESSION,
|
|
12416
|
-
method: Z_DEFLATED$1,
|
|
12417
|
-
chunkSize: 16384,
|
|
12418
|
-
windowBits: 15,
|
|
12419
|
-
memLevel: 8,
|
|
12420
|
-
strategy: Z_DEFAULT_STRATEGY
|
|
12421
|
-
}, options || {});
|
|
12448
|
+
this.options = common.assign({}, defaultOptions$1, options || {});
|
|
12422
12449
|
|
|
12423
12450
|
let opt = this.options;
|
|
12424
12451
|
|
|
@@ -12444,7 +12471,8 @@ function Deflate$1(options) {
|
|
|
12444
12471
|
opt.method,
|
|
12445
12472
|
opt.windowBits,
|
|
12446
12473
|
opt.memLevel,
|
|
12447
|
-
opt.strategy
|
|
12474
|
+
opt.strategy,
|
|
12475
|
+
opt.legacyHash
|
|
12448
12476
|
);
|
|
12449
12477
|
|
|
12450
12478
|
if (status !== Z_OK$2) {
|
|
@@ -13064,7 +13092,7 @@ const lbase = new Uint16Array([ /* Length codes 257..285 base */
|
|
|
13064
13092
|
|
|
13065
13093
|
const lext = new Uint8Array([ /* Length codes 257..285 extra */
|
|
13066
13094
|
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
|
13067
|
-
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16,
|
|
13095
|
+
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75
|
|
13068
13096
|
]);
|
|
13069
13097
|
|
|
13070
13098
|
const dbase = new Uint16Array([ /* Distance codes 0..29 base */
|
|
@@ -13401,7 +13429,7 @@ const DISTS = 2;
|
|
|
13401
13429
|
|
|
13402
13430
|
const {
|
|
13403
13431
|
Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,
|
|
13404
|
-
Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,
|
|
13432
|
+
Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR: Z_BUF_ERROR$1,
|
|
13405
13433
|
Z_DEFLATED
|
|
13406
13434
|
} = constants$2;
|
|
13407
13435
|
|
|
@@ -13711,11 +13739,14 @@ const updatewindow = (strm, src, end, copy) => {
|
|
|
13711
13739
|
|
|
13712
13740
|
/* if it hasn't been done already, allocate space for the window */
|
|
13713
13741
|
if (state.window === null) {
|
|
13742
|
+
state.window = new Uint8Array(1 << state.wbits);
|
|
13743
|
+
}
|
|
13744
|
+
|
|
13745
|
+
/* if window not in use yet, initialize */
|
|
13746
|
+
if (state.wsize === 0) {
|
|
13714
13747
|
state.wsize = 1 << state.wbits;
|
|
13715
13748
|
state.wnext = 0;
|
|
13716
13749
|
state.whave = 0;
|
|
13717
|
-
|
|
13718
|
-
state.window = new Uint8Array(state.wsize);
|
|
13719
13750
|
}
|
|
13720
13751
|
|
|
13721
13752
|
/* copy state->wsize or less output bytes into the circular window */
|
|
@@ -14841,7 +14872,7 @@ const inflate$2 = (strm, flush) => {
|
|
|
14841
14872
|
(state.mode === TYPE ? 128 : 0) +
|
|
14842
14873
|
(state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
|
|
14843
14874
|
if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {
|
|
14844
|
-
ret = Z_BUF_ERROR;
|
|
14875
|
+
ret = Z_BUF_ERROR$1;
|
|
14845
14876
|
}
|
|
14846
14877
|
return ret;
|
|
14847
14878
|
};
|
|
@@ -15013,11 +15044,16 @@ const toString$2 = Object.prototype.toString;
|
|
|
15013
15044
|
|
|
15014
15045
|
const {
|
|
15015
15046
|
Z_NO_FLUSH, Z_FINISH,
|
|
15016
|
-
Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR
|
|
15047
|
+
Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR, Z_BUF_ERROR
|
|
15017
15048
|
} = constants$2;
|
|
15018
15049
|
|
|
15019
15050
|
/* ===========================================================================*/
|
|
15020
15051
|
|
|
15052
|
+
const defaultOptions$2 = {
|
|
15053
|
+
chunkSize: 1024 * 64,
|
|
15054
|
+
windowBits: 15,
|
|
15055
|
+
to: ''
|
|
15056
|
+
};
|
|
15021
15057
|
|
|
15022
15058
|
/**
|
|
15023
15059
|
* class Inflate
|
|
@@ -15097,11 +15133,7 @@ const {
|
|
|
15097
15133
|
* ```
|
|
15098
15134
|
**/
|
|
15099
15135
|
function Inflate$1(options) {
|
|
15100
|
-
this.options = common.assign({
|
|
15101
|
-
chunkSize: 1024 * 64,
|
|
15102
|
-
windowBits: 15,
|
|
15103
|
-
to: ''
|
|
15104
|
-
}, options || {});
|
|
15136
|
+
this.options = common.assign({}, defaultOptions$2, options || {});
|
|
15105
15137
|
|
|
15106
15138
|
const opt = this.options;
|
|
15107
15139
|
|
|
@@ -15232,11 +15264,19 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15232
15264
|
}
|
|
15233
15265
|
}
|
|
15234
15266
|
|
|
15235
|
-
//
|
|
15267
|
+
// Only the gzip format defines concatenated members (RFC 1952: a gzip file
|
|
15268
|
+
// is "a series of members"). A zlib stream (RFC 1950) ends after its
|
|
15269
|
+
// ADLER32, and a raw DEFLATE stream (RFC 1951) ends after its final block -
|
|
15270
|
+
// neither format allows anything to follow, so bytes after the end are not
|
|
15271
|
+
// ours to interpret and must be left in the input. Restart decoding only
|
|
15272
|
+
// for a gzip member: `state.flags` is non-zero only once a gzip header has
|
|
15273
|
+
// actually been decoded (it stays 0 for a zlib member, even when the format
|
|
15274
|
+
// was auto-detected and the gzip bit of `wrap` is set). A trailing zero
|
|
15275
|
+
// byte is padding, not the start of a member (no member can begin with 0).
|
|
15236
15276
|
while (strm.avail_in > 0 &&
|
|
15237
15277
|
status === Z_STREAM_END &&
|
|
15238
|
-
strm.state.wrap
|
|
15239
|
-
|
|
15278
|
+
(strm.state.wrap & 2) && strm.state.flags !== 0 &&
|
|
15279
|
+
strm.input[strm.next_in] !== 0)
|
|
15240
15280
|
{
|
|
15241
15281
|
inflate_1$2.inflateReset(strm);
|
|
15242
15282
|
status = inflate_1$2.inflate(strm, _flush_mode);
|
|
@@ -15257,7 +15297,9 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15257
15297
|
last_avail_out = strm.avail_out;
|
|
15258
15298
|
|
|
15259
15299
|
if (strm.next_out) {
|
|
15260
|
-
if
|
|
15300
|
+
// Flush output if buffer is full, stream ended, or an explicit flush was
|
|
15301
|
+
// requested (e.g. Z_SYNC_FLUSH) - to push out the tail, same as node's zlib.
|
|
15302
|
+
if (strm.avail_out === 0 || status === Z_STREAM_END || _flush_mode > 0) {
|
|
15261
15303
|
|
|
15262
15304
|
if (this.options.to === 'string') {
|
|
15263
15305
|
|
|
@@ -15275,12 +15317,22 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15275
15317
|
|
|
15276
15318
|
} else {
|
|
15277
15319
|
this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));
|
|
15320
|
+
|
|
15321
|
+
// Force a fresh output buffer on next iteration / next push, so the
|
|
15322
|
+
// already emitted tail is not sent again.
|
|
15323
|
+
strm.avail_out = 0;
|
|
15324
|
+
strm.next_out = 0;
|
|
15278
15325
|
}
|
|
15279
15326
|
}
|
|
15280
15327
|
}
|
|
15281
15328
|
|
|
15282
|
-
//
|
|
15283
|
-
|
|
15329
|
+
// A full output buffer means there may be more to produce - allocate a new
|
|
15330
|
+
// one and call inflate again. The status depends on the flush mode: with
|
|
15331
|
+
// Z_NO_FLUSH a full buffer is reported as Z_OK, but with Z_FINISH the same
|
|
15332
|
+
// situation is reported as Z_BUF_ERROR ("could not make progress now",
|
|
15333
|
+
// non-fatal) even though output is still pending. Both must continue; the
|
|
15334
|
+
// distinction that matters is purely "was the output buffer exhausted".
|
|
15335
|
+
if ((status === Z_OK || status === Z_BUF_ERROR) && last_avail_out === 0) continue;
|
|
15284
15336
|
|
|
15285
15337
|
// Finalize if end of stream reached.
|
|
15286
15338
|
if (status === Z_STREAM_END) {
|
|
@@ -15290,7 +15342,23 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15290
15342
|
return true;
|
|
15291
15343
|
}
|
|
15292
15344
|
|
|
15293
|
-
if (strm.avail_in === 0)
|
|
15345
|
+
if (strm.avail_in === 0) {
|
|
15346
|
+
// Input is exhausted. If the caller declared this the end of the stream
|
|
15347
|
+
// (Z_FINISH) but we never saw Z_STREAM_END, the compressed data ended
|
|
15348
|
+
// before its terminating marker - i.e. it is truncated/incomplete. That
|
|
15349
|
+
// is an error: returning the partial output as success would be
|
|
15350
|
+
// indistinguishable from a complete decode, hiding the data loss. Report
|
|
15351
|
+
// it via Z_BUF_ERROR. (Reached only when the output buffer still had room
|
|
15352
|
+
// - a full buffer is handled by the `continue` above - so this genuinely
|
|
15353
|
+
// means "ran out of input", not "ran out of output".)
|
|
15354
|
+
if (_flush_mode === Z_FINISH) {
|
|
15355
|
+
status = inflate_1$2.inflateEnd(this.strm);
|
|
15356
|
+
this.onEnd(status === Z_OK ? Z_BUF_ERROR : status);
|
|
15357
|
+
this.ended = true;
|
|
15358
|
+
return false;
|
|
15359
|
+
}
|
|
15360
|
+
break;
|
|
15361
|
+
}
|
|
15294
15362
|
}
|
|
15295
15363
|
|
|
15296
15364
|
return true;
|
|
@@ -15376,7 +15444,7 @@ Inflate$1.prototype.onEnd = function (status) {
|
|
|
15376
15444
|
function inflate$1(input, options) {
|
|
15377
15445
|
const inflator = new Inflate$1(options);
|
|
15378
15446
|
|
|
15379
|
-
inflator.push(input);
|
|
15447
|
+
inflator.push(input, true);
|
|
15380
15448
|
|
|
15381
15449
|
// That will never happens, if you don't cheat with options :)
|
|
15382
15450
|
if (inflator.err) throw inflator.msg || messages[inflator.err];
|
|
@@ -15505,7 +15573,7 @@ const encode = (proto, input, compress) => {
|
|
|
15505
15573
|
throw new Error(`minimumLength for ${token.key} is set to ${token.minimumLength} but got ${data.length}`);
|
|
15506
15574
|
set.push(toType(data !== undefined ? data : token.defaultValue));
|
|
15507
15575
|
}
|
|
15508
|
-
return compress ? pako.deflate(index$
|
|
15576
|
+
return compress ? pako.deflate(index$3(set)) : index$3(set);
|
|
15509
15577
|
};
|
|
15510
15578
|
|
|
15511
15579
|
const ALPHABET$1 = '0123456789ABCDEF';
|
|
@@ -15544,7 +15612,7 @@ const toHex = (bytes) => bytes.reduce((string, byte) => string + byte.toString(1
|
|
|
15544
15612
|
const fromArrayLike = (array) => Uint8Array.from(array);
|
|
15545
15613
|
const toBase58 = (uint8Array) => base58$1.encode(uint8Array);
|
|
15546
15614
|
const fromBase58 = (string) => base58$1.decode(string);
|
|
15547
|
-
const toBase32 = (uint8Array) => index$
|
|
15615
|
+
const toBase32 = (uint8Array) => index$5.encode(uint8Array);
|
|
15548
15616
|
var index$1 = {
|
|
15549
15617
|
toString: toString$1};
|
|
15550
15618
|
|
|
@@ -15553,7 +15621,7 @@ const decoder = new TextDecoder();
|
|
|
15553
15621
|
const decode = (proto, uint8Array, compressed) => {
|
|
15554
15622
|
if (compressed)
|
|
15555
15623
|
uint8Array = pako.inflate(uint8Array);
|
|
15556
|
-
let deconcated = index$
|
|
15624
|
+
let deconcated = index$2(uint8Array);
|
|
15557
15625
|
const output = {};
|
|
15558
15626
|
const tokens = getTokens(proto);
|
|
15559
15627
|
if (tokens.length !== deconcated.length)
|
|
@@ -15644,13 +15712,13 @@ class BasicInterface {
|
|
|
15644
15712
|
this.fromBs58(value);
|
|
15645
15713
|
}
|
|
15646
15714
|
catch {
|
|
15647
|
-
if (index$
|
|
15715
|
+
if (index$5.isBase32(value))
|
|
15648
15716
|
this.fromBs32(value);
|
|
15649
15717
|
else
|
|
15650
15718
|
throw new Error('Invalid base58/base32 input');
|
|
15651
15719
|
}
|
|
15652
15720
|
}
|
|
15653
|
-
else if (index$
|
|
15721
|
+
else if (index$5.isBase32(value))
|
|
15654
15722
|
this.fromBs32(value);
|
|
15655
15723
|
else
|
|
15656
15724
|
this.fromString(value);
|
|
@@ -15718,13 +15786,13 @@ class BasicInterface {
|
|
|
15718
15786
|
return isHex(string);
|
|
15719
15787
|
}
|
|
15720
15788
|
isBase32(string) {
|
|
15721
|
-
return index$
|
|
15789
|
+
return index$5.isBase32(string);
|
|
15722
15790
|
}
|
|
15723
15791
|
isBase58(string) {
|
|
15724
15792
|
return base58$1.isBase58(string);
|
|
15725
15793
|
}
|
|
15726
15794
|
fromBs32(encoded) {
|
|
15727
|
-
return this.decode(index$
|
|
15795
|
+
return this.decode(index$5.decode(encoded));
|
|
15728
15796
|
}
|
|
15729
15797
|
fromBs58(encoded) {
|
|
15730
15798
|
return this.decode(fromBase58(encoded));
|
|
@@ -16052,7 +16120,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16052
16120
|
super();
|
|
16053
16121
|
if (buffer) {
|
|
16054
16122
|
if (buffer instanceof Uint8Array) {
|
|
16055
|
-
const codec = index$
|
|
16123
|
+
const codec = index$4.decode(buffer);
|
|
16056
16124
|
const name = this.getCodecName(codec);
|
|
16057
16125
|
if (name) {
|
|
16058
16126
|
this.name = name;
|
|
@@ -16064,7 +16132,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16064
16132
|
}
|
|
16065
16133
|
}
|
|
16066
16134
|
else if (buffer instanceof ArrayBuffer) {
|
|
16067
|
-
const codec = index$
|
|
16135
|
+
const codec = index$4.decode(buffer);
|
|
16068
16136
|
const name = this.getCodecName(codec);
|
|
16069
16137
|
if (name) {
|
|
16070
16138
|
this.name = name;
|
|
@@ -16093,7 +16161,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16093
16161
|
}
|
|
16094
16162
|
}
|
|
16095
16163
|
fromEncoded(encoded) {
|
|
16096
|
-
const codec = index$
|
|
16164
|
+
const codec = index$4.decode(encoded);
|
|
16097
16165
|
const name = this.getCodecName(codec);
|
|
16098
16166
|
this.name = name;
|
|
16099
16167
|
this.encoded = encoded;
|
|
@@ -16112,7 +16180,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16112
16180
|
this.name = this.getCodecName(codec);
|
|
16113
16181
|
this.hashAlg = this.getHashAlg(this.name);
|
|
16114
16182
|
this.codec = this.getCodec(this.name);
|
|
16115
|
-
this.codecBuffer = index$
|
|
16183
|
+
this.codecBuffer = index$4.encode(this.codec);
|
|
16116
16184
|
this.decoded = {
|
|
16117
16185
|
name: this.name,
|
|
16118
16186
|
hashAlg: this.hashAlg,
|
|
@@ -16125,7 +16193,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16125
16193
|
this.name = name;
|
|
16126
16194
|
this.codec = codec;
|
|
16127
16195
|
this.hashAlg = this.getHashAlg(name);
|
|
16128
|
-
this.codecBuffer = index$
|
|
16196
|
+
this.codecBuffer = index$4.encode(this.codec);
|
|
16129
16197
|
this.decoded = {
|
|
16130
16198
|
name: this.name,
|
|
16131
16199
|
hashAlg: this.hashAlg,
|
|
@@ -16135,13 +16203,13 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16135
16203
|
}
|
|
16136
16204
|
decode(encoded) {
|
|
16137
16205
|
encoded = encoded || this.encoded;
|
|
16138
|
-
const codec = index$
|
|
16206
|
+
const codec = index$4.decode(encoded);
|
|
16139
16207
|
this.fromCodec(codec);
|
|
16140
16208
|
return this.decoded;
|
|
16141
16209
|
}
|
|
16142
16210
|
encode(codec) {
|
|
16143
16211
|
codec = codec || this.codec;
|
|
16144
|
-
this.encoded = index$
|
|
16212
|
+
this.encoded = index$4.encode(codec);
|
|
16145
16213
|
return this.encoded;
|
|
16146
16214
|
}
|
|
16147
16215
|
};
|
|
@@ -16212,7 +16280,7 @@ class CodecHash extends BasicInterface {
|
|
|
16212
16280
|
return uint8Array;
|
|
16213
16281
|
}
|
|
16214
16282
|
get length() {
|
|
16215
|
-
return index$
|
|
16283
|
+
return index$4.encode(this.size);
|
|
16216
16284
|
}
|
|
16217
16285
|
get buffer() {
|
|
16218
16286
|
return this.encoded;
|
|
@@ -16246,7 +16314,7 @@ class CodecHash extends BasicInterface {
|
|
|
16246
16314
|
if (!(buffer instanceof Uint8Array)) {
|
|
16247
16315
|
throw new Error('CodecHash only supports Uint8Array input');
|
|
16248
16316
|
}
|
|
16249
|
-
const codec = index$
|
|
16317
|
+
const codec = index$4.decode(buffer);
|
|
16250
16318
|
if (this.codecs[codec]) {
|
|
16251
16319
|
this.decode(buffer);
|
|
16252
16320
|
}
|
|
@@ -16256,12 +16324,12 @@ class CodecHash extends BasicInterface {
|
|
|
16256
16324
|
}
|
|
16257
16325
|
decode(buffer) {
|
|
16258
16326
|
this.encoded = buffer;
|
|
16259
|
-
const codec = index$
|
|
16327
|
+
const codec = index$4.decode(buffer);
|
|
16260
16328
|
this.discoCodec = new Codec$1(codec, this.codecs);
|
|
16261
16329
|
// TODO: validate codec
|
|
16262
|
-
buffer = buffer.slice(index$
|
|
16263
|
-
this.size = index$
|
|
16264
|
-
this.digest = buffer.slice(index$
|
|
16330
|
+
buffer = buffer.slice(index$4.decode.bytes);
|
|
16331
|
+
this.size = index$4.decode(buffer);
|
|
16332
|
+
this.digest = buffer.slice(index$4.decode.bytes);
|
|
16265
16333
|
if (this.digest.length !== this.size) {
|
|
16266
16334
|
throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
|
|
16267
16335
|
}
|
|
@@ -16871,6 +16939,7 @@ class Peernet {
|
|
|
16871
16939
|
client;
|
|
16872
16940
|
network;
|
|
16873
16941
|
stars;
|
|
16942
|
+
transport;
|
|
16874
16943
|
networkVersion;
|
|
16875
16944
|
bw;
|
|
16876
16945
|
hasDaemon = false;
|
|
@@ -16892,6 +16961,7 @@ class Peernet {
|
|
|
16892
16961
|
* @param {String} options.root - path to root directory
|
|
16893
16962
|
* @param {String} options.version - path to root directory
|
|
16894
16963
|
* @param {String} options.storePrefix - prefix for datatores (lfc)
|
|
16964
|
+
* @param {Object} options.transport - transport selection and fallback options passed to @netpeer/swarm
|
|
16895
16965
|
*
|
|
16896
16966
|
* @return {Promise} instance of Peernet
|
|
16897
16967
|
*
|
|
@@ -16905,6 +16975,7 @@ class Peernet {
|
|
|
16905
16975
|
this.network = options.network || 'leofcoin';
|
|
16906
16976
|
this.autoStart = options.autoStart === undefined ? true : options.autoStart;
|
|
16907
16977
|
this.stars = options.stars;
|
|
16978
|
+
this.transport = options.transport;
|
|
16908
16979
|
this.version = options.version;
|
|
16909
16980
|
const parts = this.network.split(':');
|
|
16910
16981
|
this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
|
|
@@ -16998,7 +17069,7 @@ class Peernet {
|
|
|
16998
17069
|
await getAddress();
|
|
16999
17070
|
this.storePrefix = options.storePrefix;
|
|
17000
17071
|
this.root = options.root;
|
|
17001
|
-
const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-
|
|
17072
|
+
const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-BX59GgBQ-DVjVrJBf.js');
|
|
17002
17073
|
/**
|
|
17003
17074
|
* proto Object containing protos
|
|
17004
17075
|
* @type {Object}
|
|
@@ -17045,7 +17116,7 @@ class Peernet {
|
|
|
17045
17116
|
if (this.#starting || this.#started)
|
|
17046
17117
|
return;
|
|
17047
17118
|
this.#starting = true;
|
|
17048
|
-
const importee = await import('./client-
|
|
17119
|
+
const importee = await import('./client-Ba1cHcxF-B4lH2-fQ.js');
|
|
17049
17120
|
/**
|
|
17050
17121
|
* @access public
|
|
17051
17122
|
* @type {PeernetClient}
|
|
@@ -17055,7 +17126,8 @@ class Peernet {
|
|
|
17055
17126
|
peerId: this.id,
|
|
17056
17127
|
networkVersion: this.networkVersion,
|
|
17057
17128
|
version: this.version,
|
|
17058
|
-
stars: this.stars
|
|
17129
|
+
stars: this.stars,
|
|
17130
|
+
transport: this.transport
|
|
17059
17131
|
});
|
|
17060
17132
|
this.#started = true;
|
|
17061
17133
|
this.#starting = false;
|