@leofcoin/chain 1.9.24 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/exports/browser/{browser-8BFql6K9-BMXXABIY.js → browser-BKlRwB0A-CKYDFr2l.js} +2 -2
- package/exports/browser/{browser-FVp_QbaL-C-GWIuv6.js → browser-Dx3X9MHO-DjR7iqyW.js} +2 -2
- package/exports/browser/chain.js +5166 -957
- package/exports/browser/{client-lPe0SUWx-DwxXCP5p.js → client-eYBPUrVq-CukSyZyC.js} +19 -14
- package/exports/browser/{constants-COpvMqFX.js → constants-CUoFxEp2.js} +195 -88
- package/exports/browser/{index-D6qd-AUn-cJS9xh8w.js → index-B91mcwxm-D4wHXLVh.js} +2 -2
- package/exports/browser/{messages-BfDvXW-x-BaHit_or.js → messages-D0Goitr6-BWN8uKkb.js} +2 -2
- package/exports/browser/{node-browser-Dc4HZiX0.js → node-browser-JBfPNMJs.js} +2020 -1910
- package/exports/browser/node-browser.js +2 -2
- package/exports/browser/workers/block-worker.js +46 -1
- package/exports/browser/workers/machine-worker.js +32 -61
- package/exports/browser/workers/{worker-Bsi6vKgF-Bsi6vKgF.js → worker-jeGMMCte-BwFbyiks.js} +17 -92
- package/exports/chain.d.ts +10 -0
- package/exports/chain.js +291 -194
- package/exports/{constants-C83ZCYKa.js → constants-D6gWzJZg.js} +2 -1
- package/exports/node.d.ts +15 -0
- package/exports/node.js +7 -5
- package/exports/workers/block-worker.js +46 -1
- package/exports/workers/machine-worker.js +32 -61
- package/exports/workers/{worker-Bsi6vKgF-Bsi6vKgF.js → worker-jeGMMCte-BwFbyiks.js} +17 -92
- package/package.json +13 -8
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { createHash as createHash$1 } from 'crypto';
|
|
2
|
-
import { T as TransactionMessage, C as ContractMessage, B as BlockMessage,
|
|
2
|
+
import { F as FormatInterface$2, T as TransactionMessage, C as ContractMessage, B as BlockMessage, q as BWMessage, V as ValidatorMessage, S as StateMessage, L as LastBlockMessage, D as DEFAULT_NODE_OPTIONS } from './constants-CUoFxEp2.js';
|
|
3
|
+
|
|
4
|
+
var proto = {};
|
|
5
|
+
|
|
6
|
+
class BWRequestMessage extends FormatInterface$2 {
|
|
7
|
+
get messageName() {
|
|
8
|
+
return "BWRequestMessage";
|
|
9
|
+
}
|
|
10
|
+
constructor(buffer) {
|
|
11
|
+
if (buffer instanceof BWRequestMessage)
|
|
12
|
+
return buffer;
|
|
13
|
+
const name = "bw-request-message";
|
|
14
|
+
super(buffer, proto, { name });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
3
17
|
|
|
4
18
|
var nodeConfig = async (config = {
|
|
5
19
|
network: "leofcoin:peach",
|
|
@@ -18,11 +32,11 @@ var nodeConfig = async (config = {
|
|
|
18
32
|
for (const proto of protos) {
|
|
19
33
|
peernet.addProto(proto.name, proto.handler);
|
|
20
34
|
}
|
|
21
|
-
let name = `.${config.network}`;
|
|
35
|
+
let name = config.root || `.${config.network}`;
|
|
22
36
|
const parts = config.network.split(":");
|
|
23
|
-
if (parts[1])
|
|
37
|
+
if (!config.root && parts[1])
|
|
24
38
|
name = `.${parts[0]}/${parts[1]}`;
|
|
25
|
-
if (typeof config.storeNamespace === "string" && config.storeNamespace.length > 0) {
|
|
39
|
+
if (!config.root && typeof config.storeNamespace === "string" && config.storeNamespace.length > 0) {
|
|
26
40
|
name = `${name}/${config.storeNamespace}`;
|
|
27
41
|
}
|
|
28
42
|
const stores = ["transactionPool", "state", "accounts", "contract", { name: "wallet", private: true }];
|
|
@@ -379,49 +393,17 @@ const base = (ALPHABET, options = {}) => {
|
|
|
379
393
|
};
|
|
380
394
|
};
|
|
381
395
|
|
|
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;
|
|
396
|
+
const ALPHABET$1$1 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
397
|
+
const ALPHABET_HEX$1 = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
|
|
398
|
+
const base58 = base(ALPHABET$1$1);
|
|
399
|
+
const base58Hex = base(ALPHABET_HEX$1);
|
|
400
|
+
const encode$4 = base58.encode;
|
|
401
|
+
const decode$5 = base58.decode;
|
|
402
|
+
const encodeHex$2 = base58Hex.encode;
|
|
403
|
+
const decodeHex$2 = base58Hex.decode;
|
|
422
404
|
const isBase58 = (string) => {
|
|
423
405
|
try {
|
|
424
|
-
decode$
|
|
406
|
+
decode$5(string);
|
|
425
407
|
return true;
|
|
426
408
|
}
|
|
427
409
|
catch (e) {
|
|
@@ -430,7 +412,7 @@ const isBase58 = (string) => {
|
|
|
430
412
|
};
|
|
431
413
|
const isBase58Hex = (string) => {
|
|
432
414
|
try {
|
|
433
|
-
decodeHex$
|
|
415
|
+
decodeHex$2(string);
|
|
434
416
|
return true;
|
|
435
417
|
}
|
|
436
418
|
catch (e) {
|
|
@@ -439,12 +421,12 @@ const isBase58Hex = (string) => {
|
|
|
439
421
|
};
|
|
440
422
|
const whatType = (string) => {
|
|
441
423
|
try {
|
|
442
|
-
decode$
|
|
424
|
+
decode$5(string);
|
|
443
425
|
return "base58";
|
|
444
426
|
}
|
|
445
427
|
catch (e) {
|
|
446
428
|
try {
|
|
447
|
-
decodeHex$
|
|
429
|
+
decodeHex$2(string);
|
|
448
430
|
return "base58Hex";
|
|
449
431
|
}
|
|
450
432
|
catch {
|
|
@@ -453,15 +435,143 @@ const whatType = (string) => {
|
|
|
453
435
|
}
|
|
454
436
|
};
|
|
455
437
|
var base58$1 = {
|
|
456
|
-
encode: encode$
|
|
457
|
-
decode: decode$
|
|
438
|
+
encode: encode$4,
|
|
439
|
+
decode: decode$5,
|
|
458
440
|
isBase58,
|
|
459
441
|
isBase58Hex,
|
|
460
|
-
encodeHex: encodeHex$
|
|
461
|
-
decodeHex: decodeHex$
|
|
442
|
+
encodeHex: encodeHex$2,
|
|
443
|
+
decodeHex: decodeHex$2,
|
|
462
444
|
whatType,
|
|
463
445
|
};
|
|
464
446
|
|
|
447
|
+
const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
|
|
448
|
+
|
|
449
|
+
const { subtle: subtle$1 } = crypto;
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* ```js
|
|
453
|
+
* const {createHash} = await import('@leofcoin/crypto')
|
|
454
|
+
* createHash(data, algorithm)
|
|
455
|
+
* ```
|
|
456
|
+
* @param {Uint8Array} data
|
|
457
|
+
* @param {string} algorithm
|
|
458
|
+
* @returns Uint8Array
|
|
459
|
+
*/
|
|
460
|
+
const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Hashes the created hash again
|
|
464
|
+
* ```js
|
|
465
|
+
* const {createDoubleHash} = await import('@leofcoin/crypto')
|
|
466
|
+
* createDoubleHash(data, algorithm)
|
|
467
|
+
* ```
|
|
468
|
+
* @param {Uint8Array} data
|
|
469
|
+
* @param {string} algorithm
|
|
470
|
+
* @returns Uint8Array
|
|
471
|
+
*/
|
|
472
|
+
const createDoubleHash = async (data, algorithm = 'SHA-512') =>
|
|
473
|
+
subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
|
|
474
|
+
|
|
475
|
+
const generatePbkdf2 = async (password) => {
|
|
476
|
+
return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
|
|
480
|
+
const key = await generatePbkdf2(password);
|
|
481
|
+
return subtle$1.deriveBits(
|
|
482
|
+
{
|
|
483
|
+
name: 'PBKDF2',
|
|
484
|
+
hash,
|
|
485
|
+
salt,
|
|
486
|
+
iterations
|
|
487
|
+
},
|
|
488
|
+
key,
|
|
489
|
+
length
|
|
490
|
+
)
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
|
|
494
|
+
if (!options) options = {};
|
|
495
|
+
|
|
496
|
+
if (typeof options.seperator === 'string')
|
|
497
|
+
options.seperator = new TextEncoder().encode(options.seperator);
|
|
498
|
+
|
|
499
|
+
const length = options.length || input.reduce((total, current, i) => {
|
|
500
|
+
total += current.length;
|
|
501
|
+
if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
|
|
502
|
+
return total
|
|
503
|
+
}, 0);
|
|
504
|
+
|
|
505
|
+
const typedArray = new Uint8Array(length);
|
|
506
|
+
|
|
507
|
+
let currentIndex = 0;
|
|
508
|
+
let index = 0;
|
|
509
|
+
for (const source of input) {
|
|
510
|
+
typedArray.set(source, currentIndex);
|
|
511
|
+
if (options.seperator && input.length - 1 > index) {
|
|
512
|
+
typedArray.set(options.seperator, currentIndex + source.length);
|
|
513
|
+
currentIndex+= options.seperator.length;
|
|
514
|
+
}
|
|
515
|
+
currentIndex += source.length;
|
|
516
|
+
index += 1;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return typedArray
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
const concatAndDoubleHash = async (input) => {
|
|
523
|
+
return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
const encode$3 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
527
|
+
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
528
|
+
throw new TypeError('Expected Uint8Array');
|
|
529
|
+
}
|
|
530
|
+
const hash = await concatAndDoubleHash([
|
|
531
|
+
prefix,
|
|
532
|
+
source
|
|
533
|
+
]);
|
|
534
|
+
const uint8Array = typedArrayConcat([
|
|
535
|
+
prefix,
|
|
536
|
+
source,
|
|
537
|
+
hash.subarray(0, 4)
|
|
538
|
+
]);
|
|
539
|
+
if (hex)
|
|
540
|
+
return base58$1.encodeHex(uint8Array);
|
|
541
|
+
return base58$1.encode(uint8Array);
|
|
542
|
+
};
|
|
543
|
+
const decode$4 = async (string, hex) => {
|
|
544
|
+
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
545
|
+
const prefix = uint8Array.subarray(0, 2);
|
|
546
|
+
const source = uint8Array.subarray(2, -4);
|
|
547
|
+
const hash = await concatAndDoubleHash([
|
|
548
|
+
prefix,
|
|
549
|
+
source
|
|
550
|
+
]);
|
|
551
|
+
let index = 0;
|
|
552
|
+
const slice = uint8Array.subarray(-4);
|
|
553
|
+
for (const check of slice) {
|
|
554
|
+
if (check !== hash[index]) {
|
|
555
|
+
throw new Error('Invalid checksum');
|
|
556
|
+
}
|
|
557
|
+
index++;
|
|
558
|
+
}
|
|
559
|
+
return { prefix, data: source };
|
|
560
|
+
};
|
|
561
|
+
const isBase58check = (string, hex) => {
|
|
562
|
+
try {
|
|
563
|
+
hex ? decode$4(string, true) : decode$4(string);
|
|
564
|
+
return true;
|
|
565
|
+
}
|
|
566
|
+
catch (e) {
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
const encodeHex$1 = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$3(uint8Array, prefix, true);
|
|
571
|
+
const decodeHex$1 = (string) => decode$4(string, true);
|
|
572
|
+
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
573
|
+
var base58check = { encode: encode$3, decode: decode$4, encodeHex: encodeHex$1, decodeHex: decodeHex$1, isBase58check, isBase58checkHex };
|
|
574
|
+
|
|
465
575
|
const MSB$1 = 0x80;
|
|
466
576
|
const MSBALL = -128;
|
|
467
577
|
const INT = Math.pow(2, 31);
|
|
@@ -530,16 +640,16 @@ var encodingLength = (value) => (value < N1 ? 1
|
|
|
530
640
|
: value < N9 ? 9
|
|
531
641
|
: 10);
|
|
532
642
|
|
|
533
|
-
var index$
|
|
643
|
+
var index$4 = {
|
|
534
644
|
encode: encode$2,
|
|
535
645
|
decode: decode$3,
|
|
536
646
|
encodingLength
|
|
537
647
|
};
|
|
538
648
|
|
|
539
|
-
var index$
|
|
649
|
+
var index$3 = (input, prefix) => {
|
|
540
650
|
const encodedArray = [];
|
|
541
651
|
const length = input.reduce((total, current) => {
|
|
542
|
-
const encoded = index$
|
|
652
|
+
const encoded = index$4.encode(current.length);
|
|
543
653
|
encodedArray.push(encoded);
|
|
544
654
|
total += current.length + encoded.length;
|
|
545
655
|
return total;
|
|
@@ -557,12 +667,12 @@ var index$2 = (input, prefix) => {
|
|
|
557
667
|
return typedArray;
|
|
558
668
|
};
|
|
559
669
|
|
|
560
|
-
var index$
|
|
670
|
+
var index$2 = (typedArray, prefix) => {
|
|
561
671
|
const set = [];
|
|
562
672
|
const varintAndSub = (typedArray) => {
|
|
563
|
-
const length = index$
|
|
673
|
+
const length = index$4.decode(typedArray);
|
|
564
674
|
// remove length
|
|
565
|
-
typedArray = typedArray.subarray(index$
|
|
675
|
+
typedArray = typedArray.subarray(index$4.decode.bytes);
|
|
566
676
|
// push value
|
|
567
677
|
set.push(typedArray.subarray(0, length));
|
|
568
678
|
// remove value
|
|
@@ -574,1814 +684,1686 @@ var index$1$1 = (typedArray, prefix) => {
|
|
|
574
684
|
return varintAndSub(typedArray);
|
|
575
685
|
};
|
|
576
686
|
|
|
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
|
-
|
|
687
|
+
const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
|
|
688
|
+
const decoded = base58$1.decode(multiWif);
|
|
689
|
+
let [version, codec, privateKey] = index$2(decoded);
|
|
690
|
+
version = Number(new TextDecoder().decode(version));
|
|
691
|
+
codec = Number(new TextDecoder().decode(codec));
|
|
692
|
+
if (expectedVersion && version !== expectedVersion)
|
|
693
|
+
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
694
|
+
if (expectedCodec && codec !== expectedCodec)
|
|
695
|
+
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
696
|
+
return { version, codec, privateKey };
|
|
697
|
+
};
|
|
698
|
+
var index$1$1 = {
|
|
699
|
+
encode: (version, codec, privateKey) => {
|
|
700
|
+
return base58$1.encode(index$3([
|
|
701
|
+
new TextEncoder().encode(version.toString()),
|
|
702
|
+
new TextEncoder().encode(codec.toString()),
|
|
703
|
+
privateKey
|
|
704
|
+
]));
|
|
705
|
+
},
|
|
706
|
+
decode: decode$2,
|
|
707
|
+
isMultiWif: (multiWif) => {
|
|
708
|
+
try {
|
|
709
|
+
const { version, codec, privateKey } = decode$2(multiWif);
|
|
710
|
+
if (version === undefined)
|
|
711
|
+
return false;
|
|
712
|
+
if (codec === undefined)
|
|
713
|
+
return false;
|
|
714
|
+
if (privateKey === undefined)
|
|
715
|
+
return false;
|
|
716
|
+
if (privateKey && privateKey.length !== 32)
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
catch {
|
|
720
|
+
return false;
|
|
721
|
+
}
|
|
722
|
+
return true;
|
|
723
|
+
}
|
|
614
724
|
};
|
|
615
725
|
|
|
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
|
-
|
|
726
|
+
/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
727
|
+
/**
|
|
728
|
+
* 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
|
|
729
|
+
* Compliant with RFC6979 & BIP340.
|
|
730
|
+
* @module
|
|
731
|
+
*/
|
|
732
|
+
/**
|
|
733
|
+
* Curve params from SEC 2 v2 §2.4.1.
|
|
734
|
+
* secp256k1 is a short Weierstrass / Koblitz curve with equation
|
|
735
|
+
* `y² == x³ + ax + b`.
|
|
736
|
+
* * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
|
|
737
|
+
* * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
|
|
738
|
+
* * h = `1n` // cofactor
|
|
739
|
+
* * a = `0n` // equation param
|
|
740
|
+
* * b = `7n` // equation param
|
|
741
|
+
* * Gx, Gy are coordinates of Generator / base point
|
|
742
|
+
*/
|
|
743
|
+
// Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
|
|
744
|
+
// callers cannot mutate them out from under the arithmetic constants captured below.
|
|
745
|
+
const secp256k1_CURVE = Object.freeze({
|
|
746
|
+
p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
|
|
747
|
+
n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
|
|
748
|
+
h: 1n,
|
|
749
|
+
a: 0n,
|
|
750
|
+
b: 7n,
|
|
751
|
+
Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
|
|
752
|
+
Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
|
|
753
|
+
});
|
|
754
|
+
const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
|
|
755
|
+
// 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
|
|
756
|
+
// by the RFC6979 paths here.
|
|
757
|
+
const L = 32;
|
|
758
|
+
const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
|
|
759
|
+
const lengths = {
|
|
760
|
+
publicKey: L + 1,
|
|
761
|
+
publicKeyUncompressed: L2 + 1,
|
|
762
|
+
// 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
|
|
763
|
+
// 352-bit recommendation for 256-bit prime curves.
|
|
764
|
+
seed: L + L / 2,
|
|
765
|
+
};
|
|
766
|
+
// Helpers and Precomputes sections are reused between libraries
|
|
767
|
+
// ## Helpers
|
|
768
|
+
// ----------
|
|
769
|
+
const err$1 = (message = '', E = Error) => {
|
|
770
|
+
const e = new E(message);
|
|
771
|
+
const { captureStackTrace } = Error;
|
|
772
|
+
if (typeof captureStackTrace === 'function')
|
|
773
|
+
captureStackTrace(e, err$1);
|
|
774
|
+
throw e;
|
|
775
|
+
};
|
|
776
|
+
// Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
|
|
777
|
+
// fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
|
|
778
|
+
// spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
|
|
779
|
+
const isBytes = (a) => a instanceof Uint8Array ||
|
|
780
|
+
(ArrayBuffer.isView(a) &&
|
|
781
|
+
a.constructor.name === 'Uint8Array' &&
|
|
782
|
+
a.BYTES_PER_ELEMENT === 1);
|
|
783
|
+
/** Asserts something is Bytes. */
|
|
784
|
+
const abytes = (value, length, title = '') => {
|
|
785
|
+
const bytes = isBytes(value);
|
|
786
|
+
const len = value?.length;
|
|
787
|
+
const needsLen = length !== undefined;
|
|
788
|
+
if (!bytes || (needsLen && len !== length)) {
|
|
789
|
+
const prefix = title && `"${title}" `;
|
|
790
|
+
const ofLen = needsLen ? ` of length ${length}` : '';
|
|
791
|
+
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
792
|
+
const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
|
|
793
|
+
return bytes ? err$1(msg, RangeError) : err$1(msg, TypeError);
|
|
669
794
|
}
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
795
|
+
return value;
|
|
796
|
+
};
|
|
797
|
+
/** create Uint8Array */
|
|
798
|
+
const u8n = (len) => new Uint8Array(len);
|
|
799
|
+
// Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
|
|
800
|
+
const padh = (n, pad) => n.toString(16).padStart(pad, '0');
|
|
801
|
+
/** Render bytes as lowercase hex. */
|
|
802
|
+
const bytesToHex = (b) => {
|
|
803
|
+
let hex = '';
|
|
804
|
+
for (const e of abytes(b))
|
|
805
|
+
hex += padh(e, 2);
|
|
806
|
+
return hex;
|
|
807
|
+
};
|
|
808
|
+
const C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
|
|
809
|
+
// Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
|
|
810
|
+
// prettier-ignore
|
|
811
|
+
const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
|
|
812
|
+
: ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
|
|
813
|
+
: ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
|
|
814
|
+
: undefined;
|
|
815
|
+
const hexToBytes = (hex) => {
|
|
816
|
+
const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
|
|
817
|
+
if (typeof hex !== 'string')
|
|
818
|
+
return err$1(e);
|
|
819
|
+
const hl = hex.length;
|
|
820
|
+
const al = hl / 2;
|
|
821
|
+
if (hl % 2)
|
|
822
|
+
return err$1(e);
|
|
823
|
+
const array = u8n(al);
|
|
824
|
+
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
825
|
+
// treat each char as ASCII
|
|
826
|
+
const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
|
|
827
|
+
const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
|
|
828
|
+
if (n1 === undefined || n2 === undefined)
|
|
829
|
+
return err$1(e);
|
|
830
|
+
array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
|
|
676
831
|
}
|
|
677
|
-
return
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
const
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
832
|
+
return array;
|
|
833
|
+
};
|
|
834
|
+
// WebCrypto is available in all modern environments
|
|
835
|
+
const subtle = () => globalThis?.crypto?.subtle ?? err$1('crypto.subtle must be defined, consider polyfill');
|
|
836
|
+
// prettier-ignore
|
|
837
|
+
const concatBytes = (...arrs) => {
|
|
838
|
+
let len = 0;
|
|
839
|
+
for (const a of arrs)
|
|
840
|
+
len += abytes(a).length; // validate every input and sum lengths before copying
|
|
841
|
+
const r = u8n(len);
|
|
842
|
+
let pad = 0; // walk through each array,
|
|
843
|
+
for (const a of arrs)
|
|
844
|
+
r.set(a, pad), pad += a.length; // ensure they have proper type
|
|
845
|
+
return r;
|
|
846
|
+
};
|
|
847
|
+
/**
|
|
848
|
+
* WebCrypto OS-level CSPRNG (random number generator).
|
|
849
|
+
* Will throw when not available; large-request ceilings are delegated to getRandomValues().
|
|
850
|
+
*/
|
|
851
|
+
const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
|
|
852
|
+
const big = BigInt;
|
|
853
|
+
const arange = (n, min, max, msg = 'bad number: out of range') => {
|
|
854
|
+
if (typeof n !== 'bigint')
|
|
855
|
+
return err$1(msg, TypeError);
|
|
856
|
+
if (min <= n && n < max)
|
|
857
|
+
return n;
|
|
858
|
+
return err$1(msg, RangeError);
|
|
859
|
+
};
|
|
860
|
+
/** Canonical modular reduction. Callers must provide a positive modulus. */
|
|
861
|
+
const M = (a, b = P) => {
|
|
862
|
+
const r = a % b;
|
|
863
|
+
return r >= 0n ? r : b + r;
|
|
864
|
+
};
|
|
865
|
+
const modN = (a) => M(a, N);
|
|
866
|
+
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
867
|
+
// prettier-ignore
|
|
868
|
+
const invert = (num, md) => {
|
|
869
|
+
if (num === 0n || md <= 0n)
|
|
870
|
+
err$1('no inverse n=' + num + ' mod=' + md);
|
|
871
|
+
let a = M(num, md), b = md, x = 0n, u = 1n;
|
|
872
|
+
while (a !== 0n) {
|
|
873
|
+
const q = b / a, r = b % a;
|
|
874
|
+
const m = x - u * q;
|
|
875
|
+
b = a, a = r, x = u, u = m;
|
|
688
876
|
}
|
|
689
|
-
return
|
|
690
|
-
}
|
|
691
|
-
const
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
877
|
+
return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
|
|
878
|
+
};
|
|
879
|
+
const callHash = (name) => {
|
|
880
|
+
// @ts-ignore
|
|
881
|
+
const fn = hashes[name];
|
|
882
|
+
if (typeof fn !== 'function')
|
|
883
|
+
err$1('hashes.' + name + ' not set');
|
|
884
|
+
return fn;
|
|
885
|
+
};
|
|
886
|
+
// All exported provider slots are caller-configurable and may be unset or return arbitrary values,
|
|
887
|
+
// so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
|
|
888
|
+
const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
|
|
889
|
+
const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
|
|
890
|
+
// also rejects structurally similar Point values from other realms / bundled copies
|
|
891
|
+
const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
|
|
892
|
+
// ## End of Helpers
|
|
893
|
+
// -----------------
|
|
894
|
+
/**
|
|
895
|
+
* secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
|
|
896
|
+
* making it x³+b; callers validate x first.
|
|
897
|
+
*/
|
|
898
|
+
const koblitz = (x) => M(M(x * x) * x + _b);
|
|
899
|
+
/** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
|
|
900
|
+
const FpIsValid = (n) => arange(n, 0n, P);
|
|
901
|
+
/** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
|
|
902
|
+
const FpIsValidNot0 = (n) => arange(n, 1n, P);
|
|
903
|
+
/** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
|
|
904
|
+
const FnIsValidNot0 = (n) => arange(n, 1n, N);
|
|
905
|
+
// Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
|
|
906
|
+
const isEven = (y) => !(y & 1n);
|
|
907
|
+
/** create Uint8Array of byte n */
|
|
908
|
+
const u8of = (n) => Uint8Array.of(n);
|
|
909
|
+
/** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
|
|
910
|
+
const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
|
|
911
|
+
/** lift_x from BIP340 returns the unique even square root for x³+7.
|
|
912
|
+
* SEC 1 callers still flip it for the odd-prefix branch. */
|
|
913
|
+
const lift_x = (x) => {
|
|
914
|
+
// Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
|
|
915
|
+
const c = koblitz(FpIsValidNot0(x));
|
|
916
|
+
// r = √c candidate
|
|
917
|
+
// r = c^((p+1)/4) mod p
|
|
918
|
+
// This formula works for fields p = 3 mod 4 -- a special, fast case.
|
|
919
|
+
// Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
|
|
920
|
+
let r = 1n;
|
|
921
|
+
for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
|
|
922
|
+
// powMod: modular exponentiation.
|
|
923
|
+
if (e & 1n)
|
|
924
|
+
r = (r * num) % P; // Uses exponentiation by squaring.
|
|
925
|
+
num = (num * num) % P; // Not constant-time.
|
|
704
926
|
}
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
927
|
+
if (M(r * r) !== c)
|
|
928
|
+
err$1('sqrt invalid'); // check if result is valid
|
|
929
|
+
return isEven(r) ? r : M(-r);
|
|
930
|
+
};
|
|
931
|
+
/**
|
|
932
|
+
* Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
|
|
933
|
+
* @param X - X coordinate.
|
|
934
|
+
* @param Y - Y coordinate.
|
|
935
|
+
* @param Z - projective Z coordinate.
|
|
936
|
+
* @example
|
|
937
|
+
* Do point arithmetic with the base point and encode the result as hex.
|
|
938
|
+
* ```ts
|
|
939
|
+
* import { Point } from '@noble/secp256k1';
|
|
940
|
+
* const hex = Point.BASE.double().toHex();
|
|
941
|
+
* ```
|
|
942
|
+
*/
|
|
943
|
+
class Point {
|
|
944
|
+
static BASE;
|
|
945
|
+
static ZERO;
|
|
946
|
+
X;
|
|
947
|
+
Y;
|
|
948
|
+
Z;
|
|
949
|
+
constructor(X, Y, Z) {
|
|
950
|
+
this.X = FpIsValid(X);
|
|
951
|
+
this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
|
|
952
|
+
this.Z = FpIsValid(Z);
|
|
953
|
+
Object.freeze(this);
|
|
954
|
+
}
|
|
955
|
+
/** Returns the shared curve metadata object by reference.
|
|
956
|
+
* It is readonly only at type level, and mutating it won't retarget arithmetic,
|
|
957
|
+
* which already uses module-load snapshots. */
|
|
958
|
+
static CURVE() {
|
|
959
|
+
return secp256k1_CURVE;
|
|
960
|
+
}
|
|
961
|
+
/** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
|
|
962
|
+
static fromAffine(ap) {
|
|
963
|
+
const { x, y } = ap;
|
|
964
|
+
return x === 0n && y === 0n ? I : new Point(x, y, 1n);
|
|
965
|
+
}
|
|
966
|
+
/** Convert Uint8Array or hex string to Point. */
|
|
967
|
+
static fromBytes(bytes) {
|
|
968
|
+
abytes(bytes);
|
|
969
|
+
const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
|
|
970
|
+
let p = undefined;
|
|
971
|
+
const length = bytes.length;
|
|
972
|
+
const head = bytes[0];
|
|
973
|
+
const tail = bytes.subarray(1);
|
|
974
|
+
const x = sliceBytesNumBE(tail, 0, L);
|
|
975
|
+
// SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
|
|
976
|
+
// infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
|
|
977
|
+
// and public-key validation helpers, so strict handling applies to all callers by default.
|
|
978
|
+
// Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
|
|
979
|
+
// Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
|
|
980
|
+
if (length === comp && (head === 0x02 || head === 0x03)) {
|
|
981
|
+
// Equation is y² == x³ + ax + b. We calculate y from x.
|
|
982
|
+
// lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
|
|
983
|
+
let y = lift_x(x);
|
|
984
|
+
if (head === 0x03)
|
|
985
|
+
y = M(-y);
|
|
986
|
+
p = new Point(x, y, 1n);
|
|
711
987
|
}
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
988
|
+
// Uncompressed 65-byte point, 0x04 prefix
|
|
989
|
+
if (length === uncomp && head === 0x04)
|
|
990
|
+
p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
|
|
991
|
+
// Validate point
|
|
992
|
+
return p ? p.assertValidity() : err$1('bad point: not on curve');
|
|
993
|
+
}
|
|
994
|
+
static fromHex(hex) {
|
|
995
|
+
return Point.fromBytes(hexToBytes(hex));
|
|
996
|
+
}
|
|
997
|
+
get x() {
|
|
998
|
+
return this.toAffine().x;
|
|
999
|
+
}
|
|
1000
|
+
get y() {
|
|
1001
|
+
return this.toAffine().y;
|
|
1002
|
+
}
|
|
1003
|
+
/** Equality check: compare points P&Q. */
|
|
1004
|
+
equals(other) {
|
|
1005
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
1006
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
|
|
1007
|
+
const X1Z2 = M(X1 * Z2);
|
|
1008
|
+
const X2Z1 = M(X2 * Z1);
|
|
1009
|
+
const Y1Z2 = M(Y1 * Z2);
|
|
1010
|
+
const Y2Z1 = M(Y2 * Z1);
|
|
1011
|
+
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
1012
|
+
}
|
|
1013
|
+
is0() {
|
|
1014
|
+
return this.equals(I);
|
|
1015
|
+
}
|
|
1016
|
+
/** Flip point over y coordinate. */
|
|
1017
|
+
negate() {
|
|
1018
|
+
return new Point(this.X, M(-this.Y), this.Z);
|
|
1019
|
+
}
|
|
1020
|
+
/** Point doubling: P+P, complete formula. */
|
|
1021
|
+
double() {
|
|
1022
|
+
return this.add(this);
|
|
1023
|
+
}
|
|
1024
|
+
/**
|
|
1025
|
+
* Point addition: P+Q, complete, exception-free formula
|
|
1026
|
+
* (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
|
|
1027
|
+
* Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
|
|
1028
|
+
*/
|
|
1029
|
+
// prettier-ignore
|
|
1030
|
+
add(other) {
|
|
1031
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
1032
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
|
|
1033
|
+
const a = 0n;
|
|
1034
|
+
const b = _b;
|
|
1035
|
+
let X3 = 0n, Y3 = 0n, Z3 = 0n;
|
|
1036
|
+
const b3 = M(b * 3n);
|
|
1037
|
+
let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
|
|
1038
|
+
let t4 = M(X2 + Y2); // step 5
|
|
1039
|
+
t3 = M(t3 * t4);
|
|
1040
|
+
t4 = M(t0 + t1);
|
|
1041
|
+
t3 = M(t3 - t4);
|
|
1042
|
+
t4 = M(X1 + Z1);
|
|
1043
|
+
let t5 = M(X2 + Z2); // step 10
|
|
1044
|
+
t4 = M(t4 * t5);
|
|
1045
|
+
t5 = M(t0 + t2);
|
|
1046
|
+
t4 = M(t4 - t5);
|
|
1047
|
+
t5 = M(Y1 + Z1);
|
|
1048
|
+
X3 = M(Y2 + Z2); // step 15
|
|
1049
|
+
t5 = M(t5 * X3);
|
|
1050
|
+
X3 = M(t1 + t2);
|
|
1051
|
+
t5 = M(t5 - X3);
|
|
1052
|
+
Z3 = M(a * t4);
|
|
1053
|
+
X3 = M(b3 * t2); // step 20
|
|
1054
|
+
Z3 = M(X3 + Z3);
|
|
1055
|
+
X3 = M(t1 - Z3);
|
|
1056
|
+
Z3 = M(t1 + Z3);
|
|
1057
|
+
Y3 = M(X3 * Z3);
|
|
1058
|
+
t1 = M(t0 + t0); // step 25
|
|
1059
|
+
t1 = M(t1 + t0);
|
|
1060
|
+
t2 = M(a * t2);
|
|
1061
|
+
t4 = M(b3 * t4);
|
|
1062
|
+
t1 = M(t1 + t2);
|
|
1063
|
+
t2 = M(t0 - t2); // step 30
|
|
1064
|
+
t2 = M(a * t2);
|
|
1065
|
+
t4 = M(t4 + t2);
|
|
1066
|
+
t0 = M(t1 * t4);
|
|
1067
|
+
Y3 = M(Y3 + t0);
|
|
1068
|
+
t0 = M(t5 * t4); // step 35
|
|
1069
|
+
X3 = M(t3 * X3);
|
|
1070
|
+
X3 = M(X3 - t0);
|
|
1071
|
+
t0 = M(t3 * t1);
|
|
1072
|
+
Z3 = M(t5 * Z3);
|
|
1073
|
+
Z3 = M(Z3 + t0); // step 40
|
|
1074
|
+
return new Point(X3, Y3, Z3);
|
|
1075
|
+
}
|
|
1076
|
+
subtract(other) {
|
|
1077
|
+
return this.add(apoint(other).negate());
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
1081
|
+
* Uses {@link wNAF} for base point.
|
|
1082
|
+
* Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
|
|
1083
|
+
* @param n scalar by which point is multiplied
|
|
1084
|
+
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
1085
|
+
*/
|
|
1086
|
+
multiply(n, safe = true) {
|
|
1087
|
+
// Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
|
|
1088
|
+
if (!safe && n === 0n)
|
|
1089
|
+
return I;
|
|
1090
|
+
FnIsValidNot0(n);
|
|
1091
|
+
if (n === 1n)
|
|
1092
|
+
return this;
|
|
1093
|
+
if (this.equals(G))
|
|
1094
|
+
return wNAF(n).p;
|
|
1095
|
+
// init result point & fake point
|
|
1096
|
+
let p = I;
|
|
1097
|
+
let f = G;
|
|
1098
|
+
for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
|
|
1099
|
+
// if bit is present, add to point
|
|
1100
|
+
// if not present, add to fake, for timing safety
|
|
1101
|
+
if (n & 1n)
|
|
1102
|
+
p = p.add(d);
|
|
1103
|
+
else if (safe)
|
|
1104
|
+
f = f.add(d);
|
|
726
1105
|
}
|
|
1106
|
+
return p;
|
|
727
1107
|
}
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
const
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
1108
|
+
multiplyUnsafe(scalar) {
|
|
1109
|
+
return this.multiply(scalar, false);
|
|
1110
|
+
}
|
|
1111
|
+
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
1112
|
+
toAffine() {
|
|
1113
|
+
const { X: x, Y: y, Z: z } = this;
|
|
1114
|
+
// fast-paths for ZERO point OR Z=1
|
|
1115
|
+
if (this.equals(I))
|
|
1116
|
+
return { x: 0n, y: 0n };
|
|
1117
|
+
if (z === 1n)
|
|
1118
|
+
return { x, y };
|
|
1119
|
+
const iz = invert(z, P);
|
|
1120
|
+
// (Z * Z^-1) must be 1, otherwise bad math
|
|
1121
|
+
if (M(z * iz) !== 1n)
|
|
1122
|
+
err$1('inverse invalid');
|
|
1123
|
+
// x = X*Z^-1; y = Y*Z^-1
|
|
1124
|
+
return { x: M(x * iz), y: M(y * iz) };
|
|
1125
|
+
}
|
|
1126
|
+
/** Checks if the point is valid and on-curve. */
|
|
1127
|
+
assertValidity() {
|
|
1128
|
+
const { x, y } = this.toAffine(); // convert to 2d xy affine point.
|
|
1129
|
+
FpIsValidNot0(x); // must be in range 1 <= x,y < P
|
|
1130
|
+
FpIsValidNot0(y);
|
|
1131
|
+
// y² == x³ + ax + b, equation sides must be equal
|
|
1132
|
+
return M(y * y) === koblitz(x) ? this : err$1('bad point: not on curve');
|
|
1133
|
+
}
|
|
1134
|
+
/** Converts point to 33/65-byte Uint8Array. */
|
|
1135
|
+
toBytes(isCompressed = true) {
|
|
1136
|
+
// Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
|
|
1137
|
+
// out of this byte surface because callers treat these encodings as public keys by default.
|
|
1138
|
+
const { x, y } = this.assertValidity().toAffine();
|
|
1139
|
+
const x32b = numTo32b(x);
|
|
1140
|
+
if (isCompressed)
|
|
1141
|
+
return concatBytes(getPrefix(y), x32b);
|
|
1142
|
+
return concatBytes(u8of(0x04), x32b, numTo32b(y));
|
|
1143
|
+
}
|
|
1144
|
+
toHex(isCompressed) {
|
|
1145
|
+
return bytesToHex(this.toBytes(isCompressed));
|
|
746
1146
|
}
|
|
747
|
-
return bytes;
|
|
748
1147
|
}
|
|
749
|
-
|
|
750
|
-
const
|
|
751
|
-
|
|
752
|
-
const
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
const getStateSize = () => {
|
|
774
|
-
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
775
|
-
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
776
|
-
return stateSize;
|
|
777
|
-
};
|
|
778
|
-
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
779
|
-
if (!wasmModuleCache.has(binary.name)) {
|
|
780
|
-
const asm = decodeBase64(binary.data);
|
|
781
|
-
const promise = WebAssembly.compile(asm);
|
|
782
|
-
wasmModuleCache.set(binary.name, promise);
|
|
783
|
-
}
|
|
784
|
-
const module = yield wasmModuleCache.get(binary.name);
|
|
785
|
-
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
786
|
-
// env: {
|
|
787
|
-
// emscripten_memcpy_big: (dest, src, num) => {
|
|
788
|
-
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
789
|
-
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
790
|
-
// memView.set(memView.subarray(src, src + num), dest);
|
|
791
|
-
// },
|
|
792
|
-
// print_memory: (offset, len) => {
|
|
793
|
-
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
794
|
-
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
795
|
-
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
796
|
-
// },
|
|
797
|
-
// },
|
|
798
|
-
});
|
|
799
|
-
// wasmInstance.exports._start();
|
|
800
|
-
}));
|
|
801
|
-
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
802
|
-
if (!wasmInstance) {
|
|
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
|
-
});
|
|
931
|
-
}
|
|
932
|
-
|
|
933
|
-
new Mutex();
|
|
934
|
-
|
|
935
|
-
new Mutex();
|
|
936
|
-
|
|
937
|
-
new Mutex();
|
|
938
|
-
|
|
939
|
-
new Mutex();
|
|
940
|
-
|
|
941
|
-
new Mutex();
|
|
942
|
-
|
|
943
|
-
new Mutex();
|
|
944
|
-
|
|
945
|
-
new Mutex();
|
|
946
|
-
|
|
947
|
-
new Mutex();
|
|
948
|
-
|
|
949
|
-
var name$c = "sha1";
|
|
950
|
-
var data$c = "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";
|
|
951
|
-
var hash$c = "6b530c24";
|
|
952
|
-
var wasmJson$c = {
|
|
953
|
-
name: name$c,
|
|
954
|
-
data: data$c,
|
|
955
|
-
hash: hash$c
|
|
1148
|
+
/** Generator / base point */
|
|
1149
|
+
const G = new Point(Gx, Gy, 1n);
|
|
1150
|
+
/** Identity / zero point */
|
|
1151
|
+
const I = new Point(0n, 1n, 0n);
|
|
1152
|
+
// Static aliases
|
|
1153
|
+
Point.BASE = G;
|
|
1154
|
+
Point.ZERO = I;
|
|
1155
|
+
/** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
|
|
1156
|
+
const doubleScalarMulUns = (R, u1, u2) => {
|
|
1157
|
+
return G.multiply(u1, false)
|
|
1158
|
+
.add(R.multiply(u2, false))
|
|
1159
|
+
.assertValidity();
|
|
1160
|
+
};
|
|
1161
|
+
// Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
|
|
1162
|
+
const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
|
|
1163
|
+
// Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
|
|
1164
|
+
const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
|
|
1165
|
+
const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
|
|
1166
|
+
/** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
|
|
1167
|
+
const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
|
|
1168
|
+
/** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
|
|
1169
|
+
const secretKeyToScalar = (secretKey) => {
|
|
1170
|
+
const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
|
|
1171
|
+
return arange(num, 1n, N, 'invalid secret key: outside of range');
|
|
956
1172
|
};
|
|
957
|
-
|
|
958
|
-
new Mutex();
|
|
959
1173
|
/**
|
|
960
|
-
* Creates a
|
|
1174
|
+
* Creates a SEC 1 public key from a 32-byte private key.
|
|
1175
|
+
* @param privKey - 32-byte secret key.
|
|
1176
|
+
* @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
|
|
1177
|
+
* @returns serialized secp256k1 public key in SEC 1 encoding.
|
|
1178
|
+
* @example
|
|
1179
|
+
* Derive the serialized public key for a secp256k1 secret key.
|
|
1180
|
+
* ```ts
|
|
1181
|
+
* import * as secp from '@noble/secp256k1';
|
|
1182
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1183
|
+
* const publicKey = secp.getPublicKey(secretKey);
|
|
1184
|
+
* ```
|
|
961
1185
|
*/
|
|
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 = "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";
|
|
990
|
-
var hash$b = "fb24e536";
|
|
991
|
-
var wasmJson$b = {
|
|
992
|
-
name: name$b,
|
|
993
|
-
data: data$b,
|
|
994
|
-
hash: hash$b
|
|
1186
|
+
const getPublicKey = (privKey, isCompressed = true) => {
|
|
1187
|
+
return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
|
|
995
1188
|
};
|
|
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");
|
|
1189
|
+
const isValidSecretKey = (secretKey) => {
|
|
1190
|
+
try {
|
|
1191
|
+
return !!secretKeyToScalar(secretKey);
|
|
1003
1192
|
}
|
|
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));
|
|
1193
|
+
catch (error) {
|
|
1194
|
+
return false;
|
|
1013
1195
|
}
|
|
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
1196
|
};
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
return obj;
|
|
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();
|
|
1197
|
+
const isValidPublicKey = (publicKey, isCompressed) => {
|
|
1198
|
+
const { publicKey: comp, publicKeyUncompressed } = lengths;
|
|
1199
|
+
try {
|
|
1200
|
+
const l = publicKey.length;
|
|
1201
|
+
if (isCompressed === true && l !== comp)
|
|
1202
|
+
return false;
|
|
1203
|
+
if (isCompressed === false && l !== publicKeyUncompressed)
|
|
1204
|
+
return false;
|
|
1205
|
+
return !!Point.fromBytes(publicKey);
|
|
1206
|
+
}
|
|
1207
|
+
catch (error) {
|
|
1208
|
+
return false;
|
|
1209
|
+
}
|
|
1210
|
+
};
|
|
1211
|
+
const _sha = 'SHA-256';
|
|
1080
1212
|
/**
|
|
1081
|
-
*
|
|
1213
|
+
* Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
|
|
1214
|
+
* All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
|
|
1215
|
+
* providers still return exact 32-byte Uint8Array digests.
|
|
1216
|
+
* @example
|
|
1217
|
+
* Provide sync hash helpers before calling the synchronous signing API.
|
|
1218
|
+
* ```ts
|
|
1219
|
+
* import * as secp from '@noble/secp256k1';
|
|
1220
|
+
* import { hmac } from '@noble/hashes/hmac.js';
|
|
1221
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1222
|
+
* secp.hashes.sha256 = sha256;
|
|
1223
|
+
* secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
|
|
1224
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1225
|
+
* const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
|
|
1226
|
+
* ```
|
|
1082
1227
|
*/
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
const
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
return obj;
|
|
1094
|
-
},
|
|
1095
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1096
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
1097
|
-
save: () => wasm.save(),
|
|
1098
|
-
load: (data) => {
|
|
1099
|
-
wasm.load(data);
|
|
1100
|
-
return obj;
|
|
1101
|
-
},
|
|
1102
|
-
blockSize: 64,
|
|
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
|
|
1228
|
+
const hashes = {
|
|
1229
|
+
hmacSha256Async: async (key, message) => {
|
|
1230
|
+
const s = subtle();
|
|
1231
|
+
const name = 'HMAC';
|
|
1232
|
+
const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
|
|
1233
|
+
return u8n(await s.sign(name, k, message));
|
|
1234
|
+
},
|
|
1235
|
+
hmacSha256: undefined,
|
|
1236
|
+
sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
|
|
1237
|
+
sha256: undefined,
|
|
1116
1238
|
};
|
|
1117
|
-
|
|
1118
|
-
new Mutex();
|
|
1119
1239
|
/**
|
|
1120
|
-
*
|
|
1240
|
+
* Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
|
|
1241
|
+
* Result is **NOT hashed** and returns the serialized shared point (compressed by default),
|
|
1242
|
+
* not the SEC 1 x-only primitive `z = x_P`.
|
|
1243
|
+
* secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
|
|
1244
|
+
* @param secretKeyA - local 32-byte secret key.
|
|
1245
|
+
* @param publicKeyB - peer public key.
|
|
1246
|
+
* @param isCompressed - return 33-byte compressed output when `true`.
|
|
1247
|
+
* @returns shared secret point bytes.
|
|
1248
|
+
* @example
|
|
1249
|
+
* Derive a shared secp256k1 secret with ECDH.
|
|
1250
|
+
* ```ts
|
|
1251
|
+
* import * as secp from '@noble/secp256k1';
|
|
1252
|
+
* const alice = secp.utils.randomSecretKey();
|
|
1253
|
+
* const bob = secp.utils.randomSecretKey();
|
|
1254
|
+
* const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
|
|
1255
|
+
* ```
|
|
1121
1256
|
*/
|
|
1122
|
-
|
|
1123
|
-
return
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
};
|
|
1144
|
-
return obj;
|
|
1145
|
-
});
|
|
1146
|
-
}
|
|
1147
|
-
|
|
1148
|
-
new Mutex();
|
|
1257
|
+
const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
|
|
1258
|
+
return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
|
|
1259
|
+
};
|
|
1260
|
+
// FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
|
|
1261
|
+
// The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
|
|
1262
|
+
const randomSecretKey = (seed) => {
|
|
1263
|
+
seed = seed === undefined ? randomBytes(lengths.seed) : seed;
|
|
1264
|
+
abytes(seed);
|
|
1265
|
+
// Keep the public range text aligned with the enforced 48-byte FIPS floor.
|
|
1266
|
+
if (seed.length < lengths.seed || seed.length > 1024)
|
|
1267
|
+
return err$1('expected 48-1024b', RangeError);
|
|
1268
|
+
const num = M(bytesToNumBE(seed), N - 1n);
|
|
1269
|
+
return numTo32b(num + 1n);
|
|
1270
|
+
};
|
|
1271
|
+
const createKeygen = (getPublicKey) => (seed) => {
|
|
1272
|
+
const secretKey = randomSecretKey(seed);
|
|
1273
|
+
return {
|
|
1274
|
+
secretKey,
|
|
1275
|
+
publicKey: getPublicKey(secretKey),
|
|
1276
|
+
};
|
|
1277
|
+
};
|
|
1149
1278
|
/**
|
|
1150
|
-
*
|
|
1279
|
+
* Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
|
|
1280
|
+
* @example
|
|
1281
|
+
* Convert bytes to a hex string with the low-level helper namespace.
|
|
1282
|
+
* ```ts
|
|
1283
|
+
* import { etc } from '@noble/secp256k1';
|
|
1284
|
+
* const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
|
|
1285
|
+
* ```
|
|
1151
1286
|
*/
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1165
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
1166
|
-
save: () => wasm.save(),
|
|
1167
|
-
load: (data) => {
|
|
1168
|
-
wasm.load(data);
|
|
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
|
|
1193
|
-
};
|
|
1194
|
-
|
|
1195
|
-
new Mutex();
|
|
1196
|
-
/**
|
|
1197
|
-
* Creates a new RIPEMD-160 hash instance
|
|
1198
|
-
*/
|
|
1199
|
-
function createRIPEMD160() {
|
|
1200
|
-
return WASMInterface(wasmJson$4, 20).then((wasm) => {
|
|
1201
|
-
wasm.init();
|
|
1202
|
-
const obj = {
|
|
1203
|
-
init: () => {
|
|
1204
|
-
wasm.init();
|
|
1205
|
-
return obj;
|
|
1206
|
-
},
|
|
1207
|
-
update: (data) => {
|
|
1208
|
-
wasm.update(data);
|
|
1209
|
-
return obj;
|
|
1210
|
-
},
|
|
1211
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1212
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
1213
|
-
save: () => wasm.save(),
|
|
1214
|
-
load: (data) => {
|
|
1215
|
-
wasm.load(data);
|
|
1216
|
-
return obj;
|
|
1217
|
-
},
|
|
1218
|
-
blockSize: 64,
|
|
1219
|
-
digestSize: 20,
|
|
1220
|
-
};
|
|
1221
|
-
return obj;
|
|
1222
|
-
});
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
function calculateKeyBuffer(hasher, key) {
|
|
1226
|
-
const { blockSize } = hasher;
|
|
1227
|
-
const buf = getUInt8Buffer(key);
|
|
1228
|
-
if (buf.length > blockSize) {
|
|
1229
|
-
hasher.update(buf);
|
|
1230
|
-
const uintArr = hasher.digest("binary");
|
|
1231
|
-
hasher.init();
|
|
1232
|
-
return uintArr;
|
|
1233
|
-
}
|
|
1234
|
-
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
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;
|
|
1247
|
-
}
|
|
1248
|
-
hasher.update(keyBuffer);
|
|
1249
|
-
const obj = {
|
|
1250
|
-
init: () => {
|
|
1251
|
-
hasher.init();
|
|
1252
|
-
hasher.update(keyBuffer);
|
|
1253
|
-
return obj;
|
|
1254
|
-
},
|
|
1255
|
-
update: (data) => {
|
|
1256
|
-
hasher.update(data);
|
|
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
|
-
|
|
1287
|
+
const etc = /* @__PURE__ */ Object.freeze({
|
|
1288
|
+
hexToBytes,
|
|
1289
|
+
bytesToHex,
|
|
1290
|
+
concatBytes,
|
|
1291
|
+
bytesToNumberBE: bytesToNumBE,
|
|
1292
|
+
numberToBytesBE: numTo32b,
|
|
1293
|
+
mod: M,
|
|
1294
|
+
invert: invert, // math utilities; keep public alias type aligned with runtime
|
|
1295
|
+
randomBytes,
|
|
1296
|
+
secretKeyToScalar: secretKeyToScalar,
|
|
1297
|
+
abytes: abytes,
|
|
1298
|
+
});
|
|
1298
1299
|
/**
|
|
1299
|
-
*
|
|
1300
|
-
*
|
|
1301
|
-
*
|
|
1300
|
+
* Curve-specific key utilities.
|
|
1301
|
+
* @example
|
|
1302
|
+
* Generate a fresh secret key and derive its public key.
|
|
1303
|
+
* ```ts
|
|
1304
|
+
* import * as secp from '@noble/secp256k1';
|
|
1305
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1306
|
+
* const publicKey = secp.getPublicKey(secretKey);
|
|
1302
1307
|
* ```
|
|
1303
|
-
* @param {Uint8Array} data
|
|
1304
|
-
* @param {string} algorithm
|
|
1305
|
-
* @returns Uint8Array
|
|
1306
1308
|
*/
|
|
1307
|
-
const
|
|
1308
|
-
|
|
1309
|
+
const utils$2 = /* @__PURE__ */ Object.freeze({
|
|
1310
|
+
isValidSecretKey: isValidSecretKey,
|
|
1311
|
+
isValidPublicKey: isValidPublicKey,
|
|
1312
|
+
randomSecretKey: randomSecretKey, // preserve the optional seeded call
|
|
1313
|
+
});
|
|
1314
|
+
// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
|
|
1315
|
+
// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
1316
|
+
// Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
|
|
1317
|
+
const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
|
|
1318
|
+
const T_AUX = 'aux';
|
|
1319
|
+
const T_NONCE = 'nonce';
|
|
1320
|
+
const T_CHALLENGE = 'challenge';
|
|
1321
|
+
// Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
|
|
1322
|
+
// wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
|
|
1323
|
+
const taggedHash = (tag, ...messages) => {
|
|
1324
|
+
const tagH = gh('sha256', getTag(tag));
|
|
1325
|
+
return gh('sha256', concatBytes(tagH, tagH, ...messages));
|
|
1326
|
+
};
|
|
1327
|
+
// Async twin of taggedHash with the same checked provider boundary.
|
|
1328
|
+
const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
|
|
1329
|
+
// BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
|
|
1330
|
+
// d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
|
|
1331
|
+
const extpubSchnorr = (priv) => {
|
|
1332
|
+
const d_ = secretKeyToScalar(priv);
|
|
1333
|
+
const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
|
|
1334
|
+
const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
|
|
1335
|
+
const d = isEven(y) ? d_ : modN(-d_);
|
|
1336
|
+
const px = numTo32b(x);
|
|
1337
|
+
return { d, px };
|
|
1338
|
+
};
|
|
1339
|
+
const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
|
|
1340
|
+
const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
|
|
1341
|
+
const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
|
|
1342
|
+
/** Schnorr public key is just `x` coordinate of Point as per BIP340. */
|
|
1343
|
+
const pubSchnorr = (secretKey) => {
|
|
1344
|
+
return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
|
|
1345
|
+
};
|
|
1346
|
+
const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
|
|
1347
|
+
// Common preparation fn for both sync and async signing
|
|
1348
|
+
const prepSigSchnorr = (message, secretKey, auxRand) => {
|
|
1349
|
+
const { px, d } = extpubSchnorr(secretKey);
|
|
1350
|
+
return { m: abytes(message), px, d, a: abytes(auxRand, L) };
|
|
1351
|
+
};
|
|
1352
|
+
const extractK = (rand) => {
|
|
1353
|
+
const k_ = bytesModN(rand); // Let k' = int(rand) mod n
|
|
1354
|
+
if (k_ === 0n)
|
|
1355
|
+
err$1('sign failed: k is zero'); // Fail if k' = 0.
|
|
1356
|
+
const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
|
|
1357
|
+
return { rx: px, k: d };
|
|
1358
|
+
};
|
|
1359
|
+
// Common signature creation helper
|
|
1360
|
+
const createSigSchnorr = (k, px, e, d) => {
|
|
1361
|
+
return concatBytes(px, numTo32b(modN(k + e * d)));
|
|
1362
|
+
};
|
|
1363
|
+
const E_INVSIG = 'invalid signature produced';
|
|
1309
1364
|
/**
|
|
1310
|
-
*
|
|
1311
|
-
*
|
|
1312
|
-
*
|
|
1313
|
-
* createDoubleHash(data, algorithm)
|
|
1314
|
-
* ```
|
|
1315
|
-
* @param {Uint8Array} data
|
|
1316
|
-
* @param {string} algorithm
|
|
1317
|
-
* @returns Uint8Array
|
|
1365
|
+
* Creates Schnorr signature as per BIP340. Verifies itself before returning anything.
|
|
1366
|
+
* auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
|
|
1367
|
+
* k generation, so bad CSPRNG won't be the only entropy source.
|
|
1318
1368
|
*/
|
|
1319
|
-
const
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1369
|
+
const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
|
|
1370
|
+
const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
|
|
1371
|
+
const aux = taggedHash(T_AUX, a);
|
|
1372
|
+
// Let t be the byte-wise xor of bytes(d) and hash/aux(a)
|
|
1373
|
+
const t = numTo32b(d ^ bytesToNumBE(aux));
|
|
1374
|
+
// Let rand = hash/nonce(t || bytes(P) || m)
|
|
1375
|
+
const rand = taggedHash(T_NONCE, t, px, m);
|
|
1376
|
+
const { rx, k } = extractK(rand);
|
|
1377
|
+
// Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
|
|
1378
|
+
const e = challenge(rx, px, m);
|
|
1379
|
+
const sig = createSigSchnorr(k, rx, e, d);
|
|
1380
|
+
// If Verify(bytes(P), m, sig) (see below) returns failure, abort
|
|
1381
|
+
if (!verifySchnorr(sig, m, px))
|
|
1382
|
+
err$1(E_INVSIG);
|
|
1383
|
+
return sig;
|
|
1324
1384
|
};
|
|
1325
|
-
|
|
1326
|
-
const
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1385
|
+
const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
|
|
1386
|
+
const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
|
|
1387
|
+
const aux = await taggedHashAsync(T_AUX, a);
|
|
1388
|
+
// Let t be the byte-wise xor of bytes(d) and hash/aux(a)
|
|
1389
|
+
const t = numTo32b(d ^ bytesToNumBE(aux));
|
|
1390
|
+
// Let rand = hash/nonce(t || bytes(P) || m)
|
|
1391
|
+
const rand = await taggedHashAsync(T_NONCE, t, px, m);
|
|
1392
|
+
const { rx, k } = extractK(rand);
|
|
1393
|
+
// Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
|
|
1394
|
+
const e = await challengeAsync(rx, px, m);
|
|
1395
|
+
const sig = createSigSchnorr(k, rx, e, d);
|
|
1396
|
+
// If Verify(bytes(P), m, sig) (see below) returns failure, abort
|
|
1397
|
+
if (!(await verifySchnorrAsync(sig, m, px)))
|
|
1398
|
+
err$1(E_INVSIG);
|
|
1399
|
+
return sig;
|
|
1338
1400
|
};
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
if (!options) options = {};
|
|
1342
|
-
|
|
1343
|
-
if (typeof options.seperator === 'string')
|
|
1344
|
-
options.seperator = new TextEncoder().encode(options.seperator);
|
|
1345
|
-
|
|
1346
|
-
const length = options.length || input.reduce((total, current, i) => {
|
|
1347
|
-
total += current.length;
|
|
1348
|
-
if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
|
|
1349
|
-
return total
|
|
1350
|
-
}, 0);
|
|
1351
|
-
|
|
1352
|
-
const typedArray = new Uint8Array(length);
|
|
1353
|
-
|
|
1354
|
-
let currentIndex = 0;
|
|
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
|
|
1401
|
+
const callSyncAsyncFn = (res, later) => {
|
|
1402
|
+
return res instanceof Promise ? res.then(later) : later(res);
|
|
1367
1403
|
};
|
|
1368
|
-
|
|
1369
|
-
const
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
const
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
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
|
-
}
|
|
1404
|
+
const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
|
|
1405
|
+
const sig = abytes(signature, L2, 'signature');
|
|
1406
|
+
const msg = abytes(message, undefined, 'message');
|
|
1407
|
+
const pub = abytes(publicKey, L, 'publicKey');
|
|
1408
|
+
try {
|
|
1409
|
+
// lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
|
|
1410
|
+
// Fail if x ≥ p. Let c = x³ + 7 mod p.
|
|
1411
|
+
const x = bytesToNumBE(pub);
|
|
1412
|
+
const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
|
|
1413
|
+
const P_ = new Point(x, y, 1n).assertValidity();
|
|
1414
|
+
const px = numTo32b(P_.toAffine().x);
|
|
1415
|
+
// P = lift_x(int(pk)); fail if that fails
|
|
1416
|
+
const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
|
|
1417
|
+
arange(r, 1n, P);
|
|
1418
|
+
const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
|
|
1419
|
+
// Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
|
|
1420
|
+
// s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
|
|
1421
|
+
// crafted edge cases and fail closed instead of carrying that extra verification surface.
|
|
1422
|
+
arange(s, 1n, N);
|
|
1423
|
+
const i = concatBytes(numTo32b(r), px, msg);
|
|
1424
|
+
// int(challenge(bytes(r)||bytes(P)||m))%n
|
|
1425
|
+
return callSyncAsyncFn(challengeFn(i), (e) => {
|
|
1426
|
+
const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
|
|
1427
|
+
if (!isEven(y) || x !== r)
|
|
1428
|
+
return false; // -eP == (n-e)P
|
|
1429
|
+
return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
|
|
1430
|
+
});
|
|
1431
|
+
}
|
|
1432
|
+
catch (error) {
|
|
1433
|
+
return false;
|
|
1434
|
+
}
|
|
1459
1435
|
};
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
*
|
|
1465
|
-
*
|
|
1466
|
-
*/
|
|
1436
|
+
/** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
|
|
1437
|
+
* after the initial byte checks. */
|
|
1438
|
+
const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
|
|
1439
|
+
/** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
|
|
1440
|
+
* become false, but async backend failures reject the promise. Missing crypto.subtle is a
|
|
1441
|
+
* runtime/backend error, not an "invalid signature" result, so we surface it instead of
|
|
1442
|
+
* turning it into false. */
|
|
1443
|
+
const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
|
|
1467
1444
|
/**
|
|
1468
|
-
*
|
|
1469
|
-
*
|
|
1470
|
-
*
|
|
1471
|
-
*
|
|
1472
|
-
* *
|
|
1473
|
-
*
|
|
1474
|
-
*
|
|
1475
|
-
*
|
|
1476
|
-
*
|
|
1445
|
+
* BIP340 Schnorr helpers over secp256k1.
|
|
1446
|
+
* @example
|
|
1447
|
+
* Sign and verify a BIP340 Schnorr signature.
|
|
1448
|
+
* ```ts
|
|
1449
|
+
* import * as secp from '@noble/secp256k1';
|
|
1450
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1451
|
+
* secp.hashes.sha256 = sha256;
|
|
1452
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1453
|
+
* const message = new Uint8Array([1, 2, 3]);
|
|
1454
|
+
* const sig = secp.schnorr.sign(message, secretKey);
|
|
1455
|
+
* const publicKey = secp.schnorr.getPublicKey(secretKey);
|
|
1456
|
+
* const isValid = secp.schnorr.verify(sig, message, publicKey);
|
|
1457
|
+
* ```
|
|
1477
1458
|
*/
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
b: 7n,
|
|
1486
|
-
Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
|
|
1487
|
-
Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
|
|
1459
|
+
const schnorr = /* @__PURE__ */ Object.freeze({
|
|
1460
|
+
keygen: keygenSchnorr,
|
|
1461
|
+
getPublicKey: pubSchnorr,
|
|
1462
|
+
sign: signSchnorr,
|
|
1463
|
+
verify: verifySchnorr,
|
|
1464
|
+
signAsync: signSchnorrAsync,
|
|
1465
|
+
verifyAsync: verifySchnorrAsync,
|
|
1488
1466
|
});
|
|
1489
|
-
|
|
1490
|
-
//
|
|
1491
|
-
//
|
|
1492
|
-
const
|
|
1493
|
-
const
|
|
1494
|
-
const
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1467
|
+
// ## Precomputes
|
|
1468
|
+
// --------------
|
|
1469
|
+
const W = 8; // W is window size
|
|
1470
|
+
const scalarBits = 256;
|
|
1471
|
+
const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
|
|
1472
|
+
const pwindowSize = 2 ** (W - 1); // 128 for W=8
|
|
1473
|
+
const precompute = () => {
|
|
1474
|
+
const points = [];
|
|
1475
|
+
let p = G;
|
|
1476
|
+
let b = p;
|
|
1477
|
+
for (let w = 0; w < pwindows; w++) {
|
|
1478
|
+
b = p;
|
|
1479
|
+
points.push(b);
|
|
1480
|
+
for (let i = 1; i < pwindowSize; i++) {
|
|
1481
|
+
b = b.add(p);
|
|
1482
|
+
points.push(b);
|
|
1483
|
+
} // i=1, bc we skip 0
|
|
1484
|
+
p = b.double();
|
|
1485
|
+
}
|
|
1486
|
+
return points;
|
|
1500
1487
|
};
|
|
1501
|
-
|
|
1502
|
-
//
|
|
1503
|
-
|
|
1504
|
-
const
|
|
1505
|
-
|
|
1506
|
-
const { captureStackTrace } = Error;
|
|
1507
|
-
if (typeof captureStackTrace === 'function')
|
|
1508
|
-
captureStackTrace(e, err$1);
|
|
1509
|
-
throw e;
|
|
1488
|
+
let Gpows = undefined; // precomputes for base point G
|
|
1489
|
+
// Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
|
|
1490
|
+
const ctneg = (cnd, p) => {
|
|
1491
|
+
const n = p.negate();
|
|
1492
|
+
return cnd ? n : p;
|
|
1510
1493
|
};
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1494
|
+
/**
|
|
1495
|
+
* Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
|
|
1496
|
+
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
1497
|
+
* Any time `G.multiply` is done, precomputes are used.
|
|
1498
|
+
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
1499
|
+
*
|
|
1500
|
+
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
1501
|
+
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
1502
|
+
*
|
|
1503
|
+
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
1504
|
+
*/
|
|
1505
|
+
const wNAF = (n) => {
|
|
1506
|
+
const comp = Gpows || (Gpows = precompute());
|
|
1507
|
+
let p = I;
|
|
1508
|
+
let f = G; // f must be G, or could become I in the end
|
|
1509
|
+
const pow_2_w = 2 ** W; // 256 for W=8
|
|
1510
|
+
const maxNum = pow_2_w; // 256 for W=8
|
|
1511
|
+
const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
|
|
1512
|
+
const shiftBy = big(W); // 8 for W=8
|
|
1513
|
+
for (let w = 0; w < pwindows; w++) {
|
|
1514
|
+
let wbits = Number(n & mask); // extract W bits.
|
|
1515
|
+
n >>= shiftBy; // shift number by W bits.
|
|
1516
|
+
// We use negative indexes to reduce size of precomputed table by 2x.
|
|
1517
|
+
// Instead of needing precomputes 0..256, we only calculate them for 0..128.
|
|
1518
|
+
// If an index > 128 is found, we do (256-index) - where 256 is next window.
|
|
1519
|
+
// Naive: index +127 => 127, +224 => 224
|
|
1520
|
+
// Optimized: index +127 => 127, +224 => 256-32
|
|
1521
|
+
if (wbits > pwindowSize) {
|
|
1522
|
+
wbits -= maxNum;
|
|
1523
|
+
n += 1n;
|
|
1524
|
+
}
|
|
1525
|
+
const off = w * pwindowSize;
|
|
1526
|
+
const offF = off; // offsets, evaluate both
|
|
1527
|
+
const offP = off + Math.abs(wbits) - 1;
|
|
1528
|
+
const isEven = w % 2 !== 0; // conditions, evaluate both
|
|
1529
|
+
const isNeg = wbits < 0;
|
|
1530
|
+
if (wbits === 0) {
|
|
1531
|
+
// off == I: can't add it. Adding random offF instead.
|
|
1532
|
+
f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
|
|
1533
|
+
}
|
|
1534
|
+
else {
|
|
1535
|
+
p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
|
|
1536
|
+
}
|
|
1529
1537
|
}
|
|
1530
|
-
|
|
1538
|
+
if (n !== 0n)
|
|
1539
|
+
err$1('invalid wnaf');
|
|
1540
|
+
return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
|
|
1531
1541
|
};
|
|
1532
|
-
|
|
1533
|
-
const
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
+
|
|
1543
|
+
const leofcoinOlivia = {
|
|
1544
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
1545
|
+
version: 1,
|
|
1546
|
+
pubKeyHash: 0x73, // o
|
|
1547
|
+
scriptHash: 0x76, // p
|
|
1548
|
+
multiTxHash: 0x8b4125, // omtx
|
|
1549
|
+
payments: {
|
|
1550
|
+
version: 0,
|
|
1551
|
+
unspent: 0x1fa443d7 // ounsp
|
|
1552
|
+
},
|
|
1553
|
+
wif: 0x7D, // s
|
|
1554
|
+
multiCodec: 0x7c4,
|
|
1555
|
+
bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
|
|
1542
1556
|
};
|
|
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;
|
|
1557
|
+
const bitcoinTestnet = {
|
|
1558
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
1559
|
+
version: 1,
|
|
1560
|
+
bech32: 'tb',
|
|
1561
|
+
pubKeyHash: 0x6f,
|
|
1562
|
+
scriptHash: 0xc4,
|
|
1563
|
+
wif: 0xef,
|
|
1564
|
+
bip32: {
|
|
1565
|
+
public: 0x043587cf,
|
|
1566
|
+
private: 0x04358394
|
|
1567
|
+
},
|
|
1568
|
+
multiCodec: 0
|
|
1568
1569
|
};
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
const concatBytes = (...arrs) => {
|
|
1573
|
-
let len = 0;
|
|
1574
|
-
for (const a of arrs)
|
|
1575
|
-
len += abytes(a).length; // validate every input and sum lengths before copying
|
|
1576
|
-
const r = u8n(len);
|
|
1577
|
-
let pad = 0; // walk through each array,
|
|
1578
|
-
for (const a of arrs)
|
|
1579
|
-
r.set(a, pad), pad += a.length; // ensure they have proper type
|
|
1580
|
-
return r;
|
|
1570
|
+
var testnets = {
|
|
1571
|
+
'leofcoin:olivia': leofcoinOlivia,
|
|
1572
|
+
'bitcoin:testnet': bitcoinTestnet
|
|
1581
1573
|
};
|
|
1574
|
+
|
|
1575
|
+
// https://en.bitcoin.it/wiki/List_of_address_prefixes
|
|
1576
|
+
// usage:
|
|
1577
|
+
// networks['bitcoin']['testnet']
|
|
1578
|
+
// networks.bitcoin.testnet
|
|
1582
1579
|
/**
|
|
1583
|
-
*
|
|
1584
|
-
*
|
|
1580
|
+
* Main network
|
|
1581
|
+
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
1585
1582
|
*/
|
|
1586
|
-
const
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1583
|
+
const leofcoin = {
|
|
1584
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
1585
|
+
version: 1,
|
|
1586
|
+
pubKeyHash: 0x30, // L
|
|
1587
|
+
scriptHash: 0x37, // P
|
|
1588
|
+
multiTxHash: 0x3adeed, // Lmtx
|
|
1589
|
+
payments: {
|
|
1590
|
+
version: 0,
|
|
1591
|
+
unspent: 0x0d6e0327 // Lunsp
|
|
1592
|
+
},
|
|
1593
|
+
coin_type: 640,
|
|
1594
|
+
wif: 0x3F, // S
|
|
1595
|
+
multiCodec: 0x3c4,
|
|
1596
|
+
bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
|
|
1597
|
+
testnet: testnets['leofcoin:olivia']
|
|
1594
1598
|
};
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
+
const bitcoin = {
|
|
1600
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
1601
|
+
version: 1,
|
|
1602
|
+
bech32: 'bc',
|
|
1603
|
+
pubKeyHash: 0x00,
|
|
1604
|
+
multiCodec: 0x00,
|
|
1605
|
+
scriptHash: 0x05,
|
|
1606
|
+
wif: 0x80,
|
|
1607
|
+
coin_type: 0,
|
|
1608
|
+
bip32: {
|
|
1609
|
+
public: 0x0488b21e, private: 0x0488ade4
|
|
1610
|
+
},
|
|
1611
|
+
testnet: testnets['bitcoin:testnet']
|
|
1599
1612
|
};
|
|
1600
|
-
const
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
|
|
1613
|
+
const litecoin = {
|
|
1614
|
+
messagePrefix: '\x19Litecoin Signed Message:\n',
|
|
1615
|
+
version: 1,
|
|
1616
|
+
pubKeyHash: 0x30,
|
|
1617
|
+
scriptHash: 0x32,
|
|
1618
|
+
wif: 0xb0,
|
|
1619
|
+
bip32: {
|
|
1620
|
+
public: 0x019da462,
|
|
1621
|
+
private: 0x019d9cfe
|
|
1622
|
+
},
|
|
1623
|
+
bech32: '',
|
|
1624
|
+
multiCodec: 0
|
|
1613
1625
|
};
|
|
1614
|
-
const
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1626
|
+
const ethereum = {
|
|
1627
|
+
messagePrefix: '\x19Ethereum Signed Message:\n',
|
|
1628
|
+
version: 1,
|
|
1629
|
+
pubKeyHash: 0x30,
|
|
1630
|
+
scriptHash: 0x32,
|
|
1631
|
+
bip32: {
|
|
1632
|
+
private: 0x0488ADE4, public: 0x0488B21E
|
|
1633
|
+
},
|
|
1634
|
+
coin_type: 60,
|
|
1635
|
+
wif: 0x45, //E
|
|
1636
|
+
multiCodec: 0x3c5
|
|
1620
1637
|
};
|
|
1621
|
-
// All exported provider slots are caller-configurable and may be unset or return arbitrary values,
|
|
1622
|
-
// so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
|
|
1623
|
-
const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
|
|
1624
|
-
const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
|
|
1625
|
-
// also rejects structurally similar Point values from other realms / bundled copies
|
|
1626
|
-
const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
|
|
1627
|
-
// ## End of Helpers
|
|
1628
|
-
// -----------------
|
|
1629
1638
|
/**
|
|
1630
|
-
*
|
|
1631
|
-
*
|
|
1639
|
+
* Our & supported networks
|
|
1640
|
+
* @return {leofcoin, olivia}
|
|
1632
1641
|
*/
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
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);
|
|
1642
|
+
var networks = {
|
|
1643
|
+
leofcoin,
|
|
1644
|
+
bitcoin,
|
|
1645
|
+
litecoin,
|
|
1646
|
+
ethereum
|
|
1665
1647
|
};
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
*
|
|
1669
|
-
*
|
|
1670
|
-
* @
|
|
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
|
-
* ```
|
|
1648
|
+
|
|
1649
|
+
/*!
|
|
1650
|
+
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
|
|
1651
|
+
* (c) Dani Biro
|
|
1652
|
+
* @license MIT
|
|
1677
1653
|
*/
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1654
|
+
|
|
1655
|
+
|
|
1656
|
+
/******************************************************************************
|
|
1657
|
+
Copyright (c) Microsoft Corporation.
|
|
1658
|
+
|
|
1659
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
1660
|
+
purpose with or without fee is hereby granted.
|
|
1661
|
+
|
|
1662
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
1663
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
1664
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
1665
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
1666
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
1667
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
1668
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
1669
|
+
***************************************************************************** */
|
|
1670
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
1674
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
1675
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
1676
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
1677
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
1678
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
1679
|
+
step((generator = generator.apply(thisArg, [])).next());
|
|
1680
|
+
});
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
1684
|
+
var e = new Error(message);
|
|
1685
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
1686
|
+
};
|
|
1687
|
+
|
|
1688
|
+
class Mutex {
|
|
1689
|
+
constructor() {
|
|
1690
|
+
this.mutex = Promise.resolve();
|
|
1695
1691
|
}
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
return
|
|
1692
|
+
lock() {
|
|
1693
|
+
let begin = () => { };
|
|
1694
|
+
this.mutex = this.mutex.then(() => new Promise(begin));
|
|
1695
|
+
return new Promise((res) => {
|
|
1696
|
+
begin = res;
|
|
1697
|
+
});
|
|
1700
1698
|
}
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
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');
|
|
1699
|
+
dispatch(fn) {
|
|
1700
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1701
|
+
const unlock = yield this.lock();
|
|
1702
|
+
try {
|
|
1703
|
+
return yield Promise.resolve(fn());
|
|
1704
|
+
}
|
|
1705
|
+
finally {
|
|
1706
|
+
unlock();
|
|
1707
|
+
}
|
|
1708
|
+
});
|
|
1728
1709
|
}
|
|
1729
|
-
|
|
1730
|
-
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
var _a;
|
|
1713
|
+
function getGlobal() {
|
|
1714
|
+
if (typeof globalThis !== "undefined")
|
|
1715
|
+
return globalThis;
|
|
1716
|
+
if (typeof self !== "undefined")
|
|
1717
|
+
return self;
|
|
1718
|
+
if (typeof window !== "undefined")
|
|
1719
|
+
return window;
|
|
1720
|
+
return global;
|
|
1721
|
+
}
|
|
1722
|
+
const globalObject = getGlobal();
|
|
1723
|
+
const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
|
|
1724
|
+
const textEncoder = globalObject.TextEncoder
|
|
1725
|
+
? new globalObject.TextEncoder()
|
|
1726
|
+
: null;
|
|
1727
|
+
function hexCharCodesToInt(a, b) {
|
|
1728
|
+
return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
|
|
1729
|
+
((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
|
|
1730
|
+
}
|
|
1731
|
+
function writeHexToUInt8(buf, str) {
|
|
1732
|
+
const size = str.length >> 1;
|
|
1733
|
+
for (let i = 0; i < size; i++) {
|
|
1734
|
+
const index = i << 1;
|
|
1735
|
+
buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
|
|
1731
1736
|
}
|
|
1732
|
-
|
|
1733
|
-
|
|
1737
|
+
}
|
|
1738
|
+
function hexStringEqualsUInt8(str, buf) {
|
|
1739
|
+
if (str.length !== buf.length * 2) {
|
|
1740
|
+
return false;
|
|
1734
1741
|
}
|
|
1735
|
-
|
|
1736
|
-
|
|
1742
|
+
for (let i = 0; i < buf.length; i++) {
|
|
1743
|
+
const strIndex = i << 1;
|
|
1744
|
+
if (buf[i] !==
|
|
1745
|
+
hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
|
|
1746
|
+
return false;
|
|
1747
|
+
}
|
|
1737
1748
|
}
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1749
|
+
return true;
|
|
1750
|
+
}
|
|
1751
|
+
const alpha = "a".charCodeAt(0) - 10;
|
|
1752
|
+
const digit = "0".charCodeAt(0);
|
|
1753
|
+
function getDigestHex(tmpBuffer, input, hashLength) {
|
|
1754
|
+
let p = 0;
|
|
1755
|
+
for (let i = 0; i < hashLength; i++) {
|
|
1756
|
+
let nibble = input[i] >>> 4;
|
|
1757
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
1758
|
+
nibble = input[i] & 0xf;
|
|
1759
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
1747
1760
|
}
|
|
1748
|
-
|
|
1749
|
-
|
|
1761
|
+
return String.fromCharCode.apply(null, tmpBuffer);
|
|
1762
|
+
}
|
|
1763
|
+
const getUInt8Buffer = nodeBuffer !== null
|
|
1764
|
+
? (data) => {
|
|
1765
|
+
if (typeof data === "string") {
|
|
1766
|
+
const buf = nodeBuffer.from(data, "utf8");
|
|
1767
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
1768
|
+
}
|
|
1769
|
+
if (nodeBuffer.isBuffer(data)) {
|
|
1770
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.length);
|
|
1771
|
+
}
|
|
1772
|
+
if (ArrayBuffer.isView(data)) {
|
|
1773
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
1774
|
+
}
|
|
1775
|
+
throw new Error("Invalid data type!");
|
|
1750
1776
|
}
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
let t4 = M(X2 + Y2); // step 5
|
|
1774
|
-
t3 = M(t3 * t4);
|
|
1775
|
-
t4 = M(t0 + t1);
|
|
1776
|
-
t3 = M(t3 - t4);
|
|
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));
|
|
1777
|
+
: (data) => {
|
|
1778
|
+
if (typeof data === "string") {
|
|
1779
|
+
return textEncoder.encode(data);
|
|
1780
|
+
}
|
|
1781
|
+
if (ArrayBuffer.isView(data)) {
|
|
1782
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
1783
|
+
}
|
|
1784
|
+
throw new Error("Invalid data type!");
|
|
1785
|
+
};
|
|
1786
|
+
const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
1787
|
+
const base64Lookup = new Uint8Array(256);
|
|
1788
|
+
for (let i = 0; i < base64Chars.length; i++) {
|
|
1789
|
+
base64Lookup[base64Chars.charCodeAt(i)] = i;
|
|
1790
|
+
}
|
|
1791
|
+
function getDecodeBase64Length(data) {
|
|
1792
|
+
let bufferLength = Math.floor(data.length * 0.75);
|
|
1793
|
+
const len = data.length;
|
|
1794
|
+
if (data[len - 1] === "=") {
|
|
1795
|
+
bufferLength -= 1;
|
|
1796
|
+
if (data[len - 2] === "=") {
|
|
1797
|
+
bufferLength -= 1;
|
|
1798
|
+
}
|
|
1881
1799
|
}
|
|
1800
|
+
return bufferLength;
|
|
1882
1801
|
}
|
|
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;
|
|
1802
|
+
function decodeBase64(data) {
|
|
1803
|
+
const bufferLength = getDecodeBase64Length(data);
|
|
1804
|
+
const len = data.length;
|
|
1805
|
+
const bytes = new Uint8Array(bufferLength);
|
|
1806
|
+
let p = 0;
|
|
1807
|
+
for (let i = 0; i < len; i += 4) {
|
|
1808
|
+
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
1809
|
+
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
1810
|
+
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
1811
|
+
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
1812
|
+
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
1813
|
+
p += 1;
|
|
1814
|
+
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
1815
|
+
p += 1;
|
|
1816
|
+
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
1817
|
+
p += 1;
|
|
1944
1818
|
}
|
|
1819
|
+
return bytes;
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
const MAX_HEAP = 16 * 1024;
|
|
1823
|
+
const WASM_FUNC_HASH_LENGTH = 4;
|
|
1824
|
+
const wasmMutex = new Mutex();
|
|
1825
|
+
const wasmModuleCache = new Map();
|
|
1826
|
+
function WASMInterface(binary, hashLength) {
|
|
1827
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1828
|
+
let wasmInstance = null;
|
|
1829
|
+
let memoryView = null;
|
|
1830
|
+
let initialized = false;
|
|
1831
|
+
if (typeof WebAssembly === "undefined") {
|
|
1832
|
+
throw new Error("WebAssembly is not supported in this environment!");
|
|
1833
|
+
}
|
|
1834
|
+
const writeMemory = (data, offset = 0) => {
|
|
1835
|
+
memoryView.set(data, offset);
|
|
1836
|
+
};
|
|
1837
|
+
const getMemory = () => memoryView;
|
|
1838
|
+
const getExports = () => wasmInstance.exports;
|
|
1839
|
+
const setMemorySize = (totalSize) => {
|
|
1840
|
+
wasmInstance.exports.Hash_SetMemorySize(totalSize);
|
|
1841
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
1842
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1843
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
|
|
1844
|
+
};
|
|
1845
|
+
const getStateSize = () => {
|
|
1846
|
+
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
1847
|
+
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
1848
|
+
return stateSize;
|
|
1849
|
+
};
|
|
1850
|
+
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
1851
|
+
if (!wasmModuleCache.has(binary.name)) {
|
|
1852
|
+
const asm = decodeBase64(binary.data);
|
|
1853
|
+
const promise = WebAssembly.compile(asm);
|
|
1854
|
+
wasmModuleCache.set(binary.name, promise);
|
|
1855
|
+
}
|
|
1856
|
+
const module = yield wasmModuleCache.get(binary.name);
|
|
1857
|
+
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
1858
|
+
// env: {
|
|
1859
|
+
// emscripten_memcpy_big: (dest, src, num) => {
|
|
1860
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1861
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
1862
|
+
// memView.set(memView.subarray(src, src + num), dest);
|
|
1863
|
+
// },
|
|
1864
|
+
// print_memory: (offset, len) => {
|
|
1865
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1866
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
1867
|
+
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
1868
|
+
// },
|
|
1869
|
+
// },
|
|
1870
|
+
});
|
|
1871
|
+
// wasmInstance.exports._start();
|
|
1872
|
+
}));
|
|
1873
|
+
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
1874
|
+
if (!wasmInstance) {
|
|
1875
|
+
yield loadWASMPromise;
|
|
1876
|
+
}
|
|
1877
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
1878
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1879
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
1880
|
+
});
|
|
1881
|
+
const init = (bits = null) => {
|
|
1882
|
+
initialized = true;
|
|
1883
|
+
wasmInstance.exports.Hash_Init(bits);
|
|
1884
|
+
};
|
|
1885
|
+
const updateUInt8Array = (data) => {
|
|
1886
|
+
let read = 0;
|
|
1887
|
+
while (read < data.length) {
|
|
1888
|
+
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
1889
|
+
read += chunk.length;
|
|
1890
|
+
memoryView.set(chunk);
|
|
1891
|
+
wasmInstance.exports.Hash_Update(chunk.length);
|
|
1892
|
+
}
|
|
1893
|
+
};
|
|
1894
|
+
const update = (data) => {
|
|
1895
|
+
if (!initialized) {
|
|
1896
|
+
throw new Error("update() called before init()");
|
|
1897
|
+
}
|
|
1898
|
+
const Uint8Buffer = getUInt8Buffer(data);
|
|
1899
|
+
updateUInt8Array(Uint8Buffer);
|
|
1900
|
+
};
|
|
1901
|
+
const digestChars = new Uint8Array(hashLength * 2);
|
|
1902
|
+
const digest = (outputType, padding = null) => {
|
|
1903
|
+
if (!initialized) {
|
|
1904
|
+
throw new Error("digest() called before init()");
|
|
1905
|
+
}
|
|
1906
|
+
initialized = false;
|
|
1907
|
+
wasmInstance.exports.Hash_Final(padding);
|
|
1908
|
+
if (outputType === "binary") {
|
|
1909
|
+
// the data is copied to allow GC of the original memory object
|
|
1910
|
+
return memoryView.slice(0, hashLength);
|
|
1911
|
+
}
|
|
1912
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
1913
|
+
};
|
|
1914
|
+
const save = () => {
|
|
1915
|
+
if (!initialized) {
|
|
1916
|
+
throw new Error("save() can only be called after init() and before digest()");
|
|
1917
|
+
}
|
|
1918
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
1919
|
+
const stateLength = getStateSize();
|
|
1920
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1921
|
+
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
1922
|
+
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
1923
|
+
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
1924
|
+
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
1925
|
+
writeHexToUInt8(prefixedState, binary.hash);
|
|
1926
|
+
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
1927
|
+
return prefixedState;
|
|
1928
|
+
};
|
|
1929
|
+
const load = (state) => {
|
|
1930
|
+
if (!(state instanceof Uint8Array)) {
|
|
1931
|
+
throw new Error("load() expects an Uint8Array generated by save()");
|
|
1932
|
+
}
|
|
1933
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
1934
|
+
const stateLength = getStateSize();
|
|
1935
|
+
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
1936
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1937
|
+
if (state.length !== overallLength) {
|
|
1938
|
+
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
1939
|
+
}
|
|
1940
|
+
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
1941
|
+
throw new Error("This state was written by an incompatible hash implementation");
|
|
1942
|
+
}
|
|
1943
|
+
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
1944
|
+
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
1945
|
+
initialized = true;
|
|
1946
|
+
};
|
|
1947
|
+
const isDataShort = (data) => {
|
|
1948
|
+
if (typeof data === "string") {
|
|
1949
|
+
// worst case is 4 bytes / char
|
|
1950
|
+
return data.length < MAX_HEAP / 4;
|
|
1951
|
+
}
|
|
1952
|
+
return data.byteLength < MAX_HEAP;
|
|
1953
|
+
};
|
|
1954
|
+
let canSimplify = isDataShort;
|
|
1955
|
+
switch (binary.name) {
|
|
1956
|
+
case "argon2":
|
|
1957
|
+
case "scrypt":
|
|
1958
|
+
canSimplify = () => true;
|
|
1959
|
+
break;
|
|
1960
|
+
case "blake2b":
|
|
1961
|
+
case "blake2s":
|
|
1962
|
+
// if there is a key at blake2 then cannot simplify
|
|
1963
|
+
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
1964
|
+
break;
|
|
1965
|
+
case "blake3":
|
|
1966
|
+
// if there is a key at blake3 then cannot simplify
|
|
1967
|
+
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
1968
|
+
break;
|
|
1969
|
+
case "xxhash64": // cannot simplify
|
|
1970
|
+
case "xxhash3":
|
|
1971
|
+
case "xxhash128":
|
|
1972
|
+
case "crc64":
|
|
1973
|
+
canSimplify = () => false;
|
|
1974
|
+
break;
|
|
1975
|
+
}
|
|
1976
|
+
// shorthand for (init + update + digest) for better performance
|
|
1977
|
+
const calculate = (data, initParam = null, digestParam = null) => {
|
|
1978
|
+
if (!canSimplify(data, initParam)) {
|
|
1979
|
+
init(initParam);
|
|
1980
|
+
update(data);
|
|
1981
|
+
return digest("hex", digestParam);
|
|
1982
|
+
}
|
|
1983
|
+
const buffer = getUInt8Buffer(data);
|
|
1984
|
+
memoryView.set(buffer);
|
|
1985
|
+
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
1986
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
1987
|
+
};
|
|
1988
|
+
yield setupInterface();
|
|
1989
|
+
return {
|
|
1990
|
+
getMemory,
|
|
1991
|
+
writeMemory,
|
|
1992
|
+
getExports,
|
|
1993
|
+
setMemorySize,
|
|
1994
|
+
init,
|
|
1995
|
+
update,
|
|
1996
|
+
digest,
|
|
1997
|
+
save,
|
|
1998
|
+
load,
|
|
1999
|
+
calculate,
|
|
2000
|
+
hashLength,
|
|
2001
|
+
};
|
|
2002
|
+
});
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
new Mutex();
|
|
2006
|
+
|
|
2007
|
+
new Mutex();
|
|
2008
|
+
|
|
2009
|
+
new Mutex();
|
|
2010
|
+
|
|
2011
|
+
new Mutex();
|
|
2012
|
+
|
|
2013
|
+
new Mutex();
|
|
2014
|
+
|
|
2015
|
+
new Mutex();
|
|
2016
|
+
|
|
2017
|
+
new Mutex();
|
|
2018
|
+
|
|
2019
|
+
new Mutex();
|
|
2020
|
+
|
|
2021
|
+
var name$c = "sha1";
|
|
2022
|
+
var data$c = "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";
|
|
2023
|
+
var hash$c = "6b530c24";
|
|
2024
|
+
var wasmJson$c = {
|
|
2025
|
+
name: name$c,
|
|
2026
|
+
data: data$c,
|
|
2027
|
+
hash: hash$c
|
|
1945
2028
|
};
|
|
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';
|
|
2029
|
+
|
|
2030
|
+
new Mutex();
|
|
2099
2031
|
/**
|
|
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.
|
|
2032
|
+
* Creates a new SHA-1 hash instance
|
|
2103
2033
|
*/
|
|
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
|
-
}
|
|
2034
|
+
function createSHA1() {
|
|
2035
|
+
return WASMInterface(wasmJson$c, 20).then((wasm) => {
|
|
2036
|
+
wasm.init();
|
|
2037
|
+
const obj = {
|
|
2038
|
+
init: () => {
|
|
2039
|
+
wasm.init();
|
|
2040
|
+
return obj;
|
|
2041
|
+
},
|
|
2042
|
+
update: (data) => {
|
|
2043
|
+
wasm.update(data);
|
|
2044
|
+
return obj;
|
|
2045
|
+
},
|
|
2046
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2047
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2048
|
+
save: () => wasm.save(),
|
|
2049
|
+
load: (data) => {
|
|
2050
|
+
wasm.load(data);
|
|
2051
|
+
return obj;
|
|
2052
|
+
},
|
|
2053
|
+
blockSize: 64,
|
|
2054
|
+
digestSize: 20,
|
|
2055
|
+
};
|
|
2056
|
+
return obj;
|
|
2057
|
+
});
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2060
|
+
var name$b = "sha3";
|
|
2061
|
+
var data$b = "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";
|
|
2062
|
+
var hash$b = "fb24e536";
|
|
2063
|
+
var wasmJson$b = {
|
|
2064
|
+
name: name$b,
|
|
2065
|
+
data: data$b,
|
|
2066
|
+
hash: hash$b
|
|
2170
2067
|
};
|
|
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
|
-
* ```
|
|
2068
|
+
|
|
2069
|
+
new Mutex();
|
|
2070
|
+
|
|
2071
|
+
new Mutex();
|
|
2072
|
+
function validateBits(bits) {
|
|
2073
|
+
if (![224, 256, 384, 512].includes(bits)) {
|
|
2074
|
+
return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
|
|
2075
|
+
}
|
|
2076
|
+
return null;
|
|
2077
|
+
}
|
|
2078
|
+
/**
|
|
2079
|
+
* Creates a new Keccak hash instance
|
|
2080
|
+
* @param bits Number of output bits. Valid values: 224, 256, 384, 512
|
|
2193
2081
|
*/
|
|
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();
|
|
2082
|
+
function createKeccak(bits = 512) {
|
|
2083
|
+
if (validateBits(bits)) {
|
|
2084
|
+
return Promise.reject(validateBits(bits));
|
|
2220
2085
|
}
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2086
|
+
const outputSize = bits / 8;
|
|
2087
|
+
return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
|
|
2088
|
+
wasm.init(bits);
|
|
2089
|
+
const obj = {
|
|
2090
|
+
init: () => {
|
|
2091
|
+
wasm.init(bits);
|
|
2092
|
+
return obj;
|
|
2093
|
+
},
|
|
2094
|
+
update: (data) => {
|
|
2095
|
+
wasm.update(data);
|
|
2096
|
+
return obj;
|
|
2097
|
+
},
|
|
2098
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2099
|
+
digest: (outputType) => wasm.digest(outputType, 0x01),
|
|
2100
|
+
save: () => wasm.save(),
|
|
2101
|
+
load: (data) => {
|
|
2102
|
+
wasm.load(data);
|
|
2103
|
+
return obj;
|
|
2104
|
+
},
|
|
2105
|
+
blockSize: 200 - 2 * outputSize,
|
|
2106
|
+
digestSize: outputSize,
|
|
2107
|
+
};
|
|
2108
|
+
return obj;
|
|
2109
|
+
});
|
|
2110
|
+
}
|
|
2111
|
+
|
|
2112
|
+
var name$a = "sha256";
|
|
2113
|
+
var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBhqIgFqIhNqICogEmogLSARaiApIAlqIBMgEiARc3EgEXNqIBNBGncgE0EVd3MgE0EHd3NqQcvM6cB6aiIYIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogFGoiAmoiCSATIBJzcSASc2ogCUEadyAJQRV3cyAJQQd3c2pB8JauknxqIhQgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAXaiIDaiIRIAkgE3NxIBNzaiARQRp3IBFBFXdzIBFBB3dzakGjo7G7fGoiFyADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBlqIgFqIhIgESAJc3EgCXNqIBJBGncgEkEVd3MgEkEHd3NqQZnQy4x9aiIZIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGmoiAmoiE2ogMCASaiAvIBFqICsgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBpIzktH1qIhogAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAYaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakGF67igf2oiGCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBRqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQfDAqoMBaiIUIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogF2oiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pBloKTzQFqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiITIDZqIDIgEmogNSARaiAxIAlqIBMgEiARc3EgEXNqIBNBGncgE0EVd3MgE0EHd3NqQYjY3fEBaiIZIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogGmoiAWoiCSATIBJzcSASc2ogCUEadyAJQRV3cyAJQQd3c2pBzO6hugJqIhogASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAYaiICaiIRIAkgE3NxIBNzaiARQRp3IBFBFXdzIBFBB3dzakG1+cKlA2oiGCACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBRqIgNqIhIgESAJc3EgCXNqIBJBGncgEkEVd3MgEkEHd3NqQbOZ8MgDaiIUIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogF2oiAWoiE2ogLEEZdyAsQQ53cyAsQQN2cyAoaiA0aiAzQQ93IDNBDXdzIDNBCnZzaiIXIBJqIDcgEWogMyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakHK1OL2BGoiGyABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBlqIgJqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQc+U89wFaiIZIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGmoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB89+5wQZqIhogAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAYaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakHuhb6kB2oiHCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBRqIgJqIhNqIC5BGXcgLkEOd3MgLkEDdnMgKmogNmogLUEZdyAtQQ53cyAtQQN2cyApaiA1aiAXQQ93IBdBDXdzIBdBCnZzaiIUQQ93IBRBDXdzIBRBCnZzaiIYIBJqIDkgEWogFCAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakHvxpXFB2oiCSACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBtqIgNqIhEgEyASc3EgEnNqIBFBGncgEUEVd3MgEUEHd3NqQZTwoaZ4aiIbIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogGWoiAWoiEiARIBNzcSATc2ogEkEadyASQRV3cyASQQd3c2pBiISc5nhqIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiITIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakH6//uFeWoiGiACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBxqIgNqIhQgPGo2AuSJAUEAID8gAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAJaiIBIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBtqIgIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGWoiAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAaaiIJajYC1IkBQQAgPSAvQRl3IC9BDndzIC9BA3ZzICtqIDdqIBhBD3cgGEENd3MgGEEKdnNqIhggEWogFCATIBJzcSASc2ogFEEadyAUQRV3cyAUQQd3c2pB69nBonpqIhkgAWoiEWo2AuCJAUEAIEEgCSADcyACcSAJIANxcyAJQR53IAlBE3dzIAlBCndzaiAZaiIBajYC0IkBQQAgPiAwQRl3IDBBDndzIDBBA3ZzIC9qIBdqIDpBD3cgOkENd3MgOkEKdnNqIBJqIBEgFCATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQffH5vd7aiIXIAJqIhJqNgLciQFBACBDIAEgCXMgA3EgASAJcXMgAUEedyABQRN3cyABQQp3c2ogF2oiAmo2AsyJAUEAIDsgNEEZdyA0QQ53cyA0QQN2cyAwaiA4aiAYQQ93IBhBDXdzIBhBCnZzaiATaiASIBEgFHNxIBRzaiASQRp3IBJBFXdzIBJBB3dzakHy8cWzfGoiESADamo2AtiJAUEAIAAgAiABcyAJcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiARamo2AsiJAQuyBgIEfwF+QQAoAsCJASIAQQJ2QQ9xIgFBAnRBgIkBaiICIAIoAgBBfyAAQQN0IgB0QX9zcUGAASAAdHM2AgACQAJAAkAgAUEOSQ0AAkAgAUEORw0AQQBBADYCvIkBC0GAiQEQA0EAIQIMAQsgAUENRg0BIAFBAWohAgsgAiEDAkBBBiACa0EHcSIARQ0AIAIgAGohAyACQQJ0QYCJAWohAQNAIAFBADYCACABQQRqIQEgAEF/aiIADQALCyACQXlqQQdJDQAgA0ECdCEBA0AgAUGYiQFqQgA3AgAgAUGQiQFqQgA3AgAgAUGIiQFqQgA3AgAgAUGAiQFqQgA3AgAgAUEgaiIBQThHDQALC0EAIQFBAEEAKQPAiQEiBKciAEEbdCAAQQt0QYCA/AdxciAAQQV2QYD+A3EgAEEDdEEYdnJyNgK8iQFBACAEQh2IpyIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYCuIkBQYCJARADQQBBACgC5IkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgLkiQFBAEEAKALgiQEiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AuCJAUEAQQAoAtyJASIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYC3IkBQQBBACgC2IkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgLYiQFBAEEAKALUiQEiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AtSJAUEAQQAoAtCJASIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYC0IkBQQBBACgCzIkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgLMiQFBAEEAKALIiQEiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AsiJAQJAQQAoAuiJASICRQ0AQQAhAANAIAFBgAlqIAFByIkBai0AADoAACABQQFqIQEgAiAAQQFqIgBB/wFxSw0ACwsLBgBBgIkBC6MBAEEAQgA3A8CJAUEAQRxBICABQeABRiIBGzYC6IkBQQBCp5/mp8b0k/2+f0Krs4/8kaOz8NsAIAEbNwPgiQFBAEKxloD+n6KFrOgAQv+kuYjFkdqCm38gARs3A9iJAUEAQpe6w4OTp5aHd0Ly5rvjo6f9p6V/IAEbNwPQiQFBAELYvZaI/KC1vjZC58yn0NbQ67O7fyABGzcDyIkBIAAQAhAECwsLAQBBgAgLBHAAAAA=";
|
|
2114
|
+
var hash$a = "8c18dd94";
|
|
2115
|
+
var wasmJson$a = {
|
|
2116
|
+
name: name$a,
|
|
2117
|
+
data: data$a,
|
|
2118
|
+
hash: hash$a
|
|
2228
2119
|
};
|
|
2120
|
+
|
|
2121
|
+
new Mutex();
|
|
2229
2122
|
/**
|
|
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().
|
|
2123
|
+
* Creates a new SHA-2 (SHA-224) hash instance
|
|
2239
2124
|
*/
|
|
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
|
-
|
|
2125
|
+
function createSHA224() {
|
|
2126
|
+
return WASMInterface(wasmJson$a, 28).then((wasm) => {
|
|
2127
|
+
wasm.init(224);
|
|
2128
|
+
const obj = {
|
|
2129
|
+
init: () => {
|
|
2130
|
+
wasm.init(224);
|
|
2131
|
+
return obj;
|
|
2132
|
+
},
|
|
2133
|
+
update: (data) => {
|
|
2134
|
+
wasm.update(data);
|
|
2135
|
+
return obj;
|
|
2136
|
+
},
|
|
2137
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2138
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2139
|
+
save: () => wasm.save(),
|
|
2140
|
+
load: (data) => {
|
|
2141
|
+
wasm.load(data);
|
|
2142
|
+
return obj;
|
|
2143
|
+
},
|
|
2144
|
+
blockSize: 64,
|
|
2145
|
+
digestSize: 28,
|
|
2146
|
+
};
|
|
2147
|
+
return obj;
|
|
2148
|
+
});
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
new Mutex();
|
|
2152
|
+
/**
|
|
2153
|
+
* Creates a new SHA-2 (SHA-256) hash instance
|
|
2154
|
+
*/
|
|
2155
|
+
function createSHA256() {
|
|
2156
|
+
return WASMInterface(wasmJson$a, 32).then((wasm) => {
|
|
2157
|
+
wasm.init(256);
|
|
2158
|
+
const obj = {
|
|
2159
|
+
init: () => {
|
|
2160
|
+
wasm.init(256);
|
|
2161
|
+
return obj;
|
|
2162
|
+
},
|
|
2163
|
+
update: (data) => {
|
|
2164
|
+
wasm.update(data);
|
|
2165
|
+
return obj;
|
|
2166
|
+
},
|
|
2167
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2168
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2169
|
+
save: () => wasm.save(),
|
|
2170
|
+
load: (data) => {
|
|
2171
|
+
wasm.load(data);
|
|
2172
|
+
return obj;
|
|
2173
|
+
},
|
|
2174
|
+
blockSize: 64,
|
|
2175
|
+
digestSize: 32,
|
|
2176
|
+
};
|
|
2177
|
+
return obj;
|
|
2178
|
+
});
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
var name$9 = "sha512";
|
|
2182
|
+
var data$9 = "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";
|
|
2183
|
+
var hash$9 = "f2e40eb1";
|
|
2184
|
+
var wasmJson$9 = {
|
|
2185
|
+
name: name$9,
|
|
2186
|
+
data: data$9,
|
|
2187
|
+
hash: hash$9
|
|
2276
2188
|
};
|
|
2277
2189
|
|
|
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
|
-
|
|
2190
|
+
new Mutex();
|
|
2191
|
+
/**
|
|
2192
|
+
* Creates a new SHA-2 (SHA-384) hash instance
|
|
2193
|
+
*/
|
|
2194
|
+
function createSHA384() {
|
|
2195
|
+
return WASMInterface(wasmJson$9, 48).then((wasm) => {
|
|
2196
|
+
wasm.init(384);
|
|
2197
|
+
const obj = {
|
|
2198
|
+
init: () => {
|
|
2199
|
+
wasm.init(384);
|
|
2200
|
+
return obj;
|
|
2201
|
+
},
|
|
2202
|
+
update: (data) => {
|
|
2203
|
+
wasm.update(data);
|
|
2204
|
+
return obj;
|
|
2205
|
+
},
|
|
2206
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2207
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2208
|
+
save: () => wasm.save(),
|
|
2209
|
+
load: (data) => {
|
|
2210
|
+
wasm.load(data);
|
|
2211
|
+
return obj;
|
|
2212
|
+
},
|
|
2213
|
+
blockSize: 128,
|
|
2214
|
+
digestSize: 48,
|
|
2215
|
+
};
|
|
2216
|
+
return obj;
|
|
2217
|
+
});
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
new Mutex();
|
|
2221
|
+
/**
|
|
2222
|
+
* Creates a new SHA-2 (SHA-512) hash instance
|
|
2223
|
+
*/
|
|
2224
|
+
function createSHA512() {
|
|
2225
|
+
return WASMInterface(wasmJson$9, 64).then((wasm) => {
|
|
2226
|
+
wasm.init(512);
|
|
2227
|
+
const obj = {
|
|
2228
|
+
init: () => {
|
|
2229
|
+
wasm.init(512);
|
|
2230
|
+
return obj;
|
|
2231
|
+
},
|
|
2232
|
+
update: (data) => {
|
|
2233
|
+
wasm.update(data);
|
|
2234
|
+
return obj;
|
|
2235
|
+
},
|
|
2236
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2237
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2238
|
+
save: () => wasm.save(),
|
|
2239
|
+
load: (data) => {
|
|
2240
|
+
wasm.load(data);
|
|
2241
|
+
return obj;
|
|
2242
|
+
},
|
|
2243
|
+
blockSize: 128,
|
|
2244
|
+
digestSize: 64,
|
|
2245
|
+
};
|
|
2246
|
+
return obj;
|
|
2247
|
+
});
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
new Mutex();
|
|
2251
|
+
|
|
2252
|
+
new Mutex();
|
|
2253
|
+
|
|
2254
|
+
new Mutex();
|
|
2255
|
+
|
|
2256
|
+
new Mutex();
|
|
2257
|
+
|
|
2258
|
+
var name$4 = "ripemd160";
|
|
2259
|
+
var data$4 = "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";
|
|
2260
|
+
var hash$4 = "6abbce74";
|
|
2261
|
+
var wasmJson$4 = {
|
|
2262
|
+
name: name$4,
|
|
2263
|
+
data: data$4,
|
|
2264
|
+
hash: hash$4
|
|
2308
2265
|
};
|
|
2309
2266
|
|
|
2310
|
-
|
|
2311
|
-
// usage:
|
|
2312
|
-
// networks['bitcoin']['testnet']
|
|
2313
|
-
// networks.bitcoin.testnet
|
|
2267
|
+
new Mutex();
|
|
2314
2268
|
/**
|
|
2315
|
-
*
|
|
2316
|
-
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
2269
|
+
* Creates a new RIPEMD-160 hash instance
|
|
2317
2270
|
*/
|
|
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
|
-
|
|
2271
|
+
function createRIPEMD160() {
|
|
2272
|
+
return WASMInterface(wasmJson$4, 20).then((wasm) => {
|
|
2273
|
+
wasm.init();
|
|
2274
|
+
const obj = {
|
|
2275
|
+
init: () => {
|
|
2276
|
+
wasm.init();
|
|
2277
|
+
return obj;
|
|
2278
|
+
},
|
|
2279
|
+
update: (data) => {
|
|
2280
|
+
wasm.update(data);
|
|
2281
|
+
return obj;
|
|
2282
|
+
},
|
|
2283
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2284
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2285
|
+
save: () => wasm.save(),
|
|
2286
|
+
load: (data) => {
|
|
2287
|
+
wasm.load(data);
|
|
2288
|
+
return obj;
|
|
2289
|
+
},
|
|
2290
|
+
blockSize: 64,
|
|
2291
|
+
digestSize: 20,
|
|
2292
|
+
};
|
|
2293
|
+
return obj;
|
|
2294
|
+
});
|
|
2295
|
+
}
|
|
2296
|
+
|
|
2297
|
+
function calculateKeyBuffer(hasher, key) {
|
|
2298
|
+
const { blockSize } = hasher;
|
|
2299
|
+
const buf = getUInt8Buffer(key);
|
|
2300
|
+
if (buf.length > blockSize) {
|
|
2301
|
+
hasher.update(buf);
|
|
2302
|
+
const uintArr = hasher.digest("binary");
|
|
2303
|
+
hasher.init();
|
|
2304
|
+
return uintArr;
|
|
2305
|
+
}
|
|
2306
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
2307
|
+
}
|
|
2308
|
+
function calculateHmac(hasher, key) {
|
|
2309
|
+
hasher.init();
|
|
2310
|
+
const { blockSize } = hasher;
|
|
2311
|
+
const keyBuf = calculateKeyBuffer(hasher, key);
|
|
2312
|
+
const keyBuffer = new Uint8Array(blockSize);
|
|
2313
|
+
keyBuffer.set(keyBuf);
|
|
2314
|
+
const opad = new Uint8Array(blockSize);
|
|
2315
|
+
for (let i = 0; i < blockSize; i++) {
|
|
2316
|
+
const v = keyBuffer[i];
|
|
2317
|
+
opad[i] = v ^ 0x5c;
|
|
2318
|
+
keyBuffer[i] = v ^ 0x36;
|
|
2319
|
+
}
|
|
2320
|
+
hasher.update(keyBuffer);
|
|
2321
|
+
const obj = {
|
|
2322
|
+
init: () => {
|
|
2323
|
+
hasher.init();
|
|
2324
|
+
hasher.update(keyBuffer);
|
|
2325
|
+
return obj;
|
|
2326
|
+
},
|
|
2327
|
+
update: (data) => {
|
|
2328
|
+
hasher.update(data);
|
|
2329
|
+
return obj;
|
|
2330
|
+
},
|
|
2331
|
+
digest: ((outputType) => {
|
|
2332
|
+
const uintArr = hasher.digest("binary");
|
|
2333
|
+
hasher.init();
|
|
2334
|
+
hasher.update(opad);
|
|
2335
|
+
hasher.update(uintArr);
|
|
2336
|
+
return hasher.digest(outputType);
|
|
2337
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2338
|
+
}),
|
|
2339
|
+
save: () => {
|
|
2340
|
+
throw new Error("save() not supported");
|
|
2341
|
+
},
|
|
2342
|
+
load: () => {
|
|
2343
|
+
throw new Error("load() not supported");
|
|
2344
|
+
},
|
|
2345
|
+
blockSize: hasher.blockSize,
|
|
2346
|
+
digestSize: hasher.digestSize,
|
|
2347
|
+
};
|
|
2348
|
+
return obj;
|
|
2349
|
+
}
|
|
2373
2350
|
/**
|
|
2374
|
-
*
|
|
2375
|
-
* @return
|
|
2351
|
+
* Calculates HMAC hash
|
|
2352
|
+
* @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
|
|
2353
|
+
* @param key Key (string, Buffer or TypedArray)
|
|
2376
2354
|
*/
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
}
|
|
2355
|
+
function createHMAC(hash, key) {
|
|
2356
|
+
if (!hash || !hash.then) {
|
|
2357
|
+
throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
|
|
2358
|
+
}
|
|
2359
|
+
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
new Mutex();
|
|
2383
2363
|
|
|
2384
|
-
|
|
2364
|
+
new Mutex();
|
|
2365
|
+
|
|
2366
|
+
const encode$1$1 = (version, privateKey, compressed) => {
|
|
2385
2367
|
if (privateKey.length !== 32)
|
|
2386
2368
|
throw new TypeError(`Invalid privateKey length: expected 32 got ${privateKey.length}`);
|
|
2387
2369
|
const uint8Array = new Uint8Array(compressed ? 34 : 33);
|
|
@@ -2392,7 +2374,7 @@ const encode$5 = (version, privateKey, compressed) => {
|
|
|
2392
2374
|
}
|
|
2393
2375
|
return base58check.encode(uint8Array);
|
|
2394
2376
|
};
|
|
2395
|
-
const decode$
|
|
2377
|
+
const decode$1$1 = async (wif, version) => {
|
|
2396
2378
|
wif = (await base58check.decode(wif)).data;
|
|
2397
2379
|
if (version && wif[0] !== version)
|
|
2398
2380
|
throw new Error('Invalid network version');
|
|
@@ -2407,7 +2389,7 @@ const decode$6 = async (wif, version) => {
|
|
|
2407
2389
|
compressed: wif.length === 33 ? false : true
|
|
2408
2390
|
};
|
|
2409
2391
|
};
|
|
2410
|
-
var wif = { encode: encode$
|
|
2392
|
+
var wif = { encode: encode$1$1, decode: decode$1$1 };
|
|
2411
2393
|
|
|
2412
2394
|
const HIGHEST_BIT = 0x80000000;
|
|
2413
2395
|
const privateKeyVerify = (privateKey) => utils$2.isValidSecretKey(privateKey);
|
|
@@ -2528,7 +2510,7 @@ class HdNode {
|
|
|
2528
2510
|
else {
|
|
2529
2511
|
set.push(new Uint8Array(this.publicKey));
|
|
2530
2512
|
}
|
|
2531
|
-
return base58check.encode(index$
|
|
2513
|
+
return base58check.encode(index$3(set));
|
|
2532
2514
|
}
|
|
2533
2515
|
toWIF() {
|
|
2534
2516
|
if (!this.#privateKey)
|
|
@@ -2544,14 +2526,14 @@ class HdNode {
|
|
|
2544
2526
|
if (this.isNeutered)
|
|
2545
2527
|
throw new TypeError('Missing private key for hardened child key');
|
|
2546
2528
|
// data = 0x00 || ser256(kpar) || ser32(index)
|
|
2547
|
-
data = index$
|
|
2529
|
+
data = index$3([
|
|
2548
2530
|
new TextEncoder().encode('0'),
|
|
2549
2531
|
this.privateKey,
|
|
2550
2532
|
new TextEncoder().encode(index.toString()),
|
|
2551
2533
|
]);
|
|
2552
2534
|
}
|
|
2553
2535
|
else {
|
|
2554
|
-
data = index$
|
|
2536
|
+
data = index$3([
|
|
2555
2537
|
this.publicKey,
|
|
2556
2538
|
new TextEncoder().encode(index.toString()),
|
|
2557
2539
|
]);
|
|
@@ -2611,7 +2593,7 @@ class HdNode {
|
|
|
2611
2593
|
let buffer = (await base58check.decode(string)).data;
|
|
2612
2594
|
// @ts-ignore
|
|
2613
2595
|
network = network || networks.leofcoin;
|
|
2614
|
-
const result = index$
|
|
2596
|
+
const result = index$2(buffer);
|
|
2615
2597
|
const version = Number(new TextDecoder().decode(result[0]));
|
|
2616
2598
|
const depth = Number(new TextDecoder().decode(result[1]));
|
|
2617
2599
|
const parentFingerprint = Number(new TextDecoder().decode(result[2]));
|
|
@@ -4881,6 +4863,38 @@ class HDWallet {
|
|
|
4881
4863
|
}
|
|
4882
4864
|
}
|
|
4883
4865
|
|
|
4866
|
+
const ALPHABET$2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
4867
|
+
const ALPHABET_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
|
|
4868
|
+
const base32 = base(ALPHABET$2);
|
|
4869
|
+
const base32Hex = base(ALPHABET_HEX);
|
|
4870
|
+
const decode$6 = base32.decode;
|
|
4871
|
+
const decodeHex = base32Hex.decode;
|
|
4872
|
+
const encode$5 = base32.encode;
|
|
4873
|
+
const encodeHex = base32Hex.encode;
|
|
4874
|
+
const isBase32 = (string, hex = false) => {
|
|
4875
|
+
try {
|
|
4876
|
+
if (hex)
|
|
4877
|
+
decodeHex(string);
|
|
4878
|
+
else
|
|
4879
|
+
decode$6(string);
|
|
4880
|
+
return true;
|
|
4881
|
+
}
|
|
4882
|
+
catch (e) {
|
|
4883
|
+
return false;
|
|
4884
|
+
}
|
|
4885
|
+
};
|
|
4886
|
+
const isBase32Hex = (string) => {
|
|
4887
|
+
return isBase32(string, true);
|
|
4888
|
+
};
|
|
4889
|
+
var index$5 = {
|
|
4890
|
+
encode: encode$5,
|
|
4891
|
+
decode: decode$6,
|
|
4892
|
+
encodeHex,
|
|
4893
|
+
decodeHex,
|
|
4894
|
+
isBase32,
|
|
4895
|
+
isBase32Hex,
|
|
4896
|
+
};
|
|
4897
|
+
|
|
4884
4898
|
hashes.sha256 = (message) => {
|
|
4885
4899
|
message = Buffer.isBuffer(message) ? new Uint8Array(message) : message;
|
|
4886
4900
|
return new Uint8Array(createHash$1("sha256").update(message).digest());
|
|
@@ -4950,8 +4964,8 @@ class MultiSignature {
|
|
|
4950
4964
|
if (!signature)
|
|
4951
4965
|
throw ReferenceError("signature undefined");
|
|
4952
4966
|
this.#multiSignature = typedArrayConcat([
|
|
4953
|
-
index$
|
|
4954
|
-
index$
|
|
4967
|
+
index$4.encode(this.version),
|
|
4968
|
+
index$4.encode(this.multiCodec),
|
|
4955
4969
|
signature,
|
|
4956
4970
|
]);
|
|
4957
4971
|
return this.multiSignature;
|
|
@@ -4967,10 +4981,10 @@ class MultiSignature {
|
|
|
4967
4981
|
if (!this.multiSignature)
|
|
4968
4982
|
throw ReferenceError("multiSignature undefined");
|
|
4969
4983
|
let buffer = this.multiSignature;
|
|
4970
|
-
const version = index$
|
|
4971
|
-
buffer = buffer.subarray(index$
|
|
4972
|
-
const codec = index$
|
|
4973
|
-
buffer = buffer.subarray(index$
|
|
4984
|
+
const version = index$4.decode(buffer);
|
|
4985
|
+
buffer = buffer.subarray(index$4.decode.bytes);
|
|
4986
|
+
const codec = index$4.decode(buffer);
|
|
4987
|
+
buffer = buffer.subarray(index$4.decode.bytes);
|
|
4974
4988
|
const signature = buffer.subarray(0, buffer.length);
|
|
4975
4989
|
console.log("[decode] extracted signature length:", signature.length);
|
|
4976
4990
|
console.log("[decode] extracted signature (hex):", Buffer.from(signature).toString("hex"));
|
|
@@ -4998,16 +5012,16 @@ class MultiSignature {
|
|
|
4998
5012
|
return this.decode(base58$1.decode(string));
|
|
4999
5013
|
}
|
|
5000
5014
|
toBs32() {
|
|
5001
|
-
return index$
|
|
5015
|
+
return index$5.encode(this.multiSignature);
|
|
5002
5016
|
}
|
|
5003
5017
|
fromBs32(string) {
|
|
5004
|
-
return this.decode(index$
|
|
5018
|
+
return this.decode(index$5.decode(string));
|
|
5005
5019
|
}
|
|
5006
5020
|
toBs32Hex() {
|
|
5007
|
-
return index$
|
|
5021
|
+
return index$5.encodeHex(this.multiSignature);
|
|
5008
5022
|
}
|
|
5009
5023
|
fromBs32Hex(string) {
|
|
5010
|
-
return this.decode(index$
|
|
5024
|
+
return this.decode(index$5.decodeHex(string));
|
|
5011
5025
|
}
|
|
5012
5026
|
toBs58Hex() {
|
|
5013
5027
|
return base58$1.encodeHex(this.multiSignature);
|
|
@@ -5038,11 +5052,11 @@ var encrypt = async (password, data, version = new TextEncoder().encode('1')) =>
|
|
|
5038
5052
|
name: 'AES-GCM',
|
|
5039
5053
|
iv
|
|
5040
5054
|
}, key, new TextEncoder().encode(data));
|
|
5041
|
-
return index$
|
|
5055
|
+
return index$3([version, salt, iv, new Uint8Array(encrypted)]);
|
|
5042
5056
|
};
|
|
5043
5057
|
|
|
5044
5058
|
var decrypt = async (password, concatecated) => {
|
|
5045
|
-
const [version, salt, iv, cipher] = index$
|
|
5059
|
+
const [version, salt, iv, cipher] = index$2(concatecated);
|
|
5046
5060
|
let iterations;
|
|
5047
5061
|
if (new TextDecoder().decode(version) === '1') {
|
|
5048
5062
|
iterations = 250000;
|
|
@@ -5062,7 +5076,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5062
5076
|
super(network, hdnode);
|
|
5063
5077
|
}
|
|
5064
5078
|
get id() {
|
|
5065
|
-
return base58check.encode(index$
|
|
5079
|
+
return base58check.encode(index$3([
|
|
5066
5080
|
new TextEncoder().encode(this.version.toString()),
|
|
5067
5081
|
this.account(0).hdnode.neutered.publicKey
|
|
5068
5082
|
]));
|
|
@@ -5072,8 +5086,8 @@ class MultiHDNode extends HDWallet {
|
|
|
5072
5086
|
}
|
|
5073
5087
|
async fromId(id) {
|
|
5074
5088
|
let buffer = (await base58check.decode(id)).data;
|
|
5075
|
-
index$
|
|
5076
|
-
buffer = buffer.slice(index$
|
|
5089
|
+
index$4.decode(buffer);
|
|
5090
|
+
buffer = buffer.slice(index$4.decode.bytes);
|
|
5077
5091
|
this.fromPublicKey(buffer, null, this.networkName);
|
|
5078
5092
|
}
|
|
5079
5093
|
async import(password, encrypted) {
|
|
@@ -5095,7 +5109,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5095
5109
|
this.locked = false;
|
|
5096
5110
|
}
|
|
5097
5111
|
fromMultiWif(string) {
|
|
5098
|
-
const { version, codec, privateKey } = index$
|
|
5112
|
+
const { version, codec, privateKey } = index$1$1.decode(string);
|
|
5099
5113
|
this.network = Object.values(networks).reduce((p, c) => {
|
|
5100
5114
|
if (c.multiCodec === codec)
|
|
5101
5115
|
return c;
|
|
@@ -5109,7 +5123,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5109
5123
|
return this.fromPrivateKey(privateKey, undefined, this.network);
|
|
5110
5124
|
}
|
|
5111
5125
|
toMultiWif() {
|
|
5112
|
-
return index$
|
|
5126
|
+
return index$1$1.encode(this.network.version, this.network.multiCodec, this.privateKey);
|
|
5113
5127
|
}
|
|
5114
5128
|
sign(hash) {
|
|
5115
5129
|
return new MultiSignature(this.version, this.network.multiCodec)
|
|
@@ -5156,7 +5170,7 @@ class MultiWallet extends MultiHDNode {
|
|
|
5156
5170
|
super(network, hdnode);
|
|
5157
5171
|
}
|
|
5158
5172
|
get id() {
|
|
5159
|
-
return base58check.encode(index$
|
|
5173
|
+
return base58check.encode(index$3([
|
|
5160
5174
|
new TextEncoder().encode(this.version.toString()),
|
|
5161
5175
|
this.account(0).hdnode.neutered.publicKey,
|
|
5162
5176
|
]));
|
|
@@ -8300,6 +8314,7 @@ var qrcode = /*@__PURE__*/getDefaultExportFromCjs(browserExports);
|
|
|
8300
8314
|
|
|
8301
8315
|
class Identity {
|
|
8302
8316
|
#wallet;
|
|
8317
|
+
#accountWallets = new Map();
|
|
8303
8318
|
network;
|
|
8304
8319
|
id;
|
|
8305
8320
|
selectedAccount;
|
|
@@ -8337,7 +8352,7 @@ class Identity {
|
|
|
8337
8352
|
this.selectedAccount = new TextDecoder().decode(selected);
|
|
8338
8353
|
}
|
|
8339
8354
|
else {
|
|
8340
|
-
const importee = await import(/* webpackChunkName: "generate-account" */ './index-
|
|
8355
|
+
const importee = await import(/* webpackChunkName: "generate-account" */ './index-B91mcwxm-D4wHXLVh.js');
|
|
8341
8356
|
const { identity, accounts } = await importee.default(password, this.network);
|
|
8342
8357
|
await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
|
|
8343
8358
|
await globalThis.walletStore.put('version', String(1));
|
|
@@ -8351,13 +8366,36 @@ class Identity {
|
|
|
8351
8366
|
this.#wallet = new MultiWallet(this.network);
|
|
8352
8367
|
const multiWIF = await decrypt(password, base58$1.decode(identity.multiWIF));
|
|
8353
8368
|
await this.#wallet.fromMultiWif(multiWIF);
|
|
8369
|
+
await this.#loadAccountWallets();
|
|
8370
|
+
}
|
|
8371
|
+
async #loadAccountWallets() {
|
|
8372
|
+
this.#accountWallets.clear();
|
|
8373
|
+
const accounts = await this.getAccounts();
|
|
8374
|
+
for (const [index, [, externalAddress, internalAddress]] of accounts.entries()) {
|
|
8375
|
+
const account = this.#wallet.account(index + 1);
|
|
8376
|
+
const external = (await account.external(1));
|
|
8377
|
+
const internal = (await account.internal(1));
|
|
8378
|
+
if ((await external.address) !== externalAddress || (await internal.address) !== internalAddress) {
|
|
8379
|
+
throw new Error(`stored account ${index + 1} does not match this identity`);
|
|
8380
|
+
}
|
|
8381
|
+
this.#accountWallets.set(externalAddress, external);
|
|
8382
|
+
this.#accountWallets.set(internalAddress, internal);
|
|
8383
|
+
}
|
|
8384
|
+
if (!this.#accountWallets.has(this.selectedAccount)) {
|
|
8385
|
+
throw new Error(`selected account ${this.selectedAccount} is not part of this identity`);
|
|
8386
|
+
}
|
|
8354
8387
|
}
|
|
8355
8388
|
selectAccount(account) {
|
|
8389
|
+
if (!this.#accountWallets.has(account))
|
|
8390
|
+
throw new Error(`unknown identity account ${account}`);
|
|
8356
8391
|
this.selectedAccount = account;
|
|
8357
8392
|
return walletStore.put('selected-account', account);
|
|
8358
8393
|
}
|
|
8359
8394
|
sign(hash) {
|
|
8360
|
-
|
|
8395
|
+
const wallet = this.#accountWallets.get(this.selectedAccount);
|
|
8396
|
+
if (!wallet)
|
|
8397
|
+
throw new Error(`no signer available for selected account ${this.selectedAccount}`);
|
|
8398
|
+
return wallet.sign(hash.subarray(0, 32));
|
|
8361
8399
|
}
|
|
8362
8400
|
lock(password) {
|
|
8363
8401
|
this.#wallet.lock(password);
|
|
@@ -8580,7 +8618,7 @@ var isHex = string => /^[A-F0-9]+$/i.test(
|
|
|
8580
8618
|
string
|
|
8581
8619
|
);
|
|
8582
8620
|
|
|
8583
|
-
/*! pako 2.
|
|
8621
|
+
/*! pako 2.2.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
|
|
8584
8622
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
|
8585
8623
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
|
8586
8624
|
//
|
|
@@ -10002,7 +10040,7 @@ const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = tr
|
|
|
10002
10040
|
|
|
10003
10041
|
const {
|
|
10004
10042
|
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$
|
|
10043
|
+
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
10044
|
Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,
|
|
10007
10045
|
Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,
|
|
10008
10046
|
Z_UNKNOWN,
|
|
@@ -10101,11 +10139,35 @@ const slide_hash = (s) => {
|
|
|
10101
10139
|
};
|
|
10102
10140
|
|
|
10103
10141
|
/* eslint-disable new-cap */
|
|
10104
|
-
let
|
|
10105
|
-
|
|
10106
|
-
|
|
10107
|
-
|
|
10108
|
-
|
|
10142
|
+
let HASH = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;
|
|
10143
|
+
|
|
10144
|
+
|
|
10145
|
+
/* ===========================================================================
|
|
10146
|
+
* Insert string str in the dictionary and set match_head to the previous head
|
|
10147
|
+
* of the hash chain (the most recent string with same hash key). Return
|
|
10148
|
+
* the previous length of the hash chain.
|
|
10149
|
+
* IN assertion: all calls to INSERT_STRING are made with consecutive input
|
|
10150
|
+
* characters and the first MIN_MATCH bytes of str are valid (except for
|
|
10151
|
+
* the last MIN_MATCH-1 bytes of the input file).
|
|
10152
|
+
*/
|
|
10153
|
+
const INSERT_STRING = (s, str) => {
|
|
10154
|
+
let h;
|
|
10155
|
+
if (s.legacy_hash) {
|
|
10156
|
+
/* UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); */
|
|
10157
|
+
h = s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
|
|
10158
|
+
} else {
|
|
10159
|
+
// ANZAC++ hash: reads 4 bytes, matches node.js zlib output (legacyHash
|
|
10160
|
+
// restores classic zlib hash). Faster, with fewer collisions.
|
|
10161
|
+
const w = s.window;
|
|
10162
|
+
// Read 4 bytes little-endian. Math.imul reproduces C uint32 overflow in
|
|
10163
|
+
// `(value * 66521 + 66521) >> 16` exactly.
|
|
10164
|
+
const value = w[str] | (w[str + 1] << 8) | (w[str + 2] << 16) | (w[str + 3] << 24);
|
|
10165
|
+
h = s.ins_h = ((Math.imul(value, 66521) + 66521) >>> 16) & s.hash_mask;
|
|
10166
|
+
}
|
|
10167
|
+
const hash_head = s.prev[str & s.w_mask] = s.head[h];
|
|
10168
|
+
s.head[h] = str;
|
|
10169
|
+
return hash_head;
|
|
10170
|
+
};
|
|
10109
10171
|
|
|
10110
10172
|
|
|
10111
10173
|
/* =========================================================================
|
|
@@ -10379,7 +10441,20 @@ const fill_window = (s) => {
|
|
|
10379
10441
|
s.lookahead += n;
|
|
10380
10442
|
|
|
10381
10443
|
/* Initialize the hash value now that we have some input: */
|
|
10382
|
-
if (s.
|
|
10444
|
+
if (!s.legacy_hash) {
|
|
10445
|
+
/* The 4-byte hash reads one extra byte, so it needs one more available. */
|
|
10446
|
+
if (s.lookahead + s.insert > MIN_MATCH) {
|
|
10447
|
+
str = s.strstart - s.insert;
|
|
10448
|
+
while (s.insert) {
|
|
10449
|
+
INSERT_STRING(s, str);
|
|
10450
|
+
str++;
|
|
10451
|
+
s.insert--;
|
|
10452
|
+
if (s.lookahead + s.insert <= MIN_MATCH) {
|
|
10453
|
+
break;
|
|
10454
|
+
}
|
|
10455
|
+
}
|
|
10456
|
+
}
|
|
10457
|
+
} else if (s.lookahead + s.insert >= MIN_MATCH) {
|
|
10383
10458
|
str = s.strstart - s.insert;
|
|
10384
10459
|
s.ins_h = s.window[str];
|
|
10385
10460
|
|
|
@@ -10389,11 +10464,7 @@ const fill_window = (s) => {
|
|
|
10389
10464
|
// Call update_hash() MIN_MATCH-3 more times
|
|
10390
10465
|
//#endif
|
|
10391
10466
|
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;
|
|
10467
|
+
INSERT_STRING(s, str);
|
|
10397
10468
|
str++;
|
|
10398
10469
|
s.insert--;
|
|
10399
10470
|
if (s.lookahead + s.insert < MIN_MATCH) {
|
|
@@ -10691,11 +10762,7 @@ const deflate_fast = (s, flush) => {
|
|
|
10691
10762
|
*/
|
|
10692
10763
|
hash_head = 0/*NIL*/;
|
|
10693
10764
|
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
|
-
/***/
|
|
10765
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10699
10766
|
}
|
|
10700
10767
|
|
|
10701
10768
|
/* Find the longest match, discarding those <= prev_length.
|
|
@@ -10725,11 +10792,7 @@ const deflate_fast = (s, flush) => {
|
|
|
10725
10792
|
s.match_length--; /* string at strstart already in table */
|
|
10726
10793
|
do {
|
|
10727
10794
|
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
|
-
/***/
|
|
10795
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10733
10796
|
/* strstart never exceeds WSIZE-MAX_MATCH, so there are
|
|
10734
10797
|
* always MIN_MATCH bytes ahead.
|
|
10735
10798
|
*/
|
|
@@ -10739,16 +10802,18 @@ const deflate_fast = (s, flush) => {
|
|
|
10739
10802
|
{
|
|
10740
10803
|
s.strstart += s.match_length;
|
|
10741
10804
|
s.match_length = 0;
|
|
10742
|
-
s.
|
|
10743
|
-
|
|
10744
|
-
|
|
10805
|
+
if (s.legacy_hash) {
|
|
10806
|
+
s.ins_h = s.window[s.strstart];
|
|
10807
|
+
/* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
|
|
10808
|
+
s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);
|
|
10745
10809
|
|
|
10746
10810
|
//#if MIN_MATCH != 3
|
|
10747
10811
|
// Call UPDATE_HASH() MIN_MATCH-3 more times
|
|
10748
10812
|
//#endif
|
|
10749
|
-
|
|
10750
|
-
|
|
10751
|
-
|
|
10813
|
+
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
|
|
10814
|
+
* matter since it will be recomputed at next deflate call.
|
|
10815
|
+
*/
|
|
10816
|
+
}
|
|
10752
10817
|
}
|
|
10753
10818
|
} else {
|
|
10754
10819
|
/* No match, output a literal byte */
|
|
@@ -10821,11 +10886,7 @@ const deflate_slow = (s, flush) => {
|
|
|
10821
10886
|
*/
|
|
10822
10887
|
hash_head = 0/*NIL*/;
|
|
10823
10888
|
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
|
-
/***/
|
|
10889
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10829
10890
|
}
|
|
10830
10891
|
|
|
10831
10892
|
/* Find the longest match, discarding those <= prev_length.
|
|
@@ -10873,11 +10934,7 @@ const deflate_slow = (s, flush) => {
|
|
|
10873
10934
|
s.prev_length -= 2;
|
|
10874
10935
|
do {
|
|
10875
10936
|
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
|
-
/***/
|
|
10937
|
+
hash_head = INSERT_STRING(s, s.strstart);
|
|
10881
10938
|
}
|
|
10882
10939
|
} while (--s.prev_length !== 0);
|
|
10883
10940
|
s.match_available = 0;
|
|
@@ -11202,6 +11259,7 @@ function DeflateState() {
|
|
|
11202
11259
|
this.head = null; /* Heads of the hash chains or NIL. */
|
|
11203
11260
|
|
|
11204
11261
|
this.ins_h = 0; /* hash index of string to be inserted */
|
|
11262
|
+
this.legacy_hash = 0; /* use classic zlib hash instead of default ANZAC++ */
|
|
11205
11263
|
this.hash_size = 0; /* number of elements in hash table */
|
|
11206
11264
|
this.hash_bits = 0; /* log2(hash_size) */
|
|
11207
11265
|
this.hash_mask = 0; /* hash_size-1 */
|
|
@@ -11424,7 +11482,7 @@ const deflateSetHeader = (strm, head) => {
|
|
|
11424
11482
|
};
|
|
11425
11483
|
|
|
11426
11484
|
|
|
11427
|
-
const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
|
|
11485
|
+
const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy, legacyHash) => {
|
|
11428
11486
|
|
|
11429
11487
|
if (!strm) { // === Z_NULL
|
|
11430
11488
|
return Z_STREAM_ERROR$2;
|
|
@@ -11470,7 +11528,13 @@ const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
|
|
|
11470
11528
|
s.w_size = 1 << s.w_bits;
|
|
11471
11529
|
s.w_mask = s.w_size - 1;
|
|
11472
11530
|
|
|
11531
|
+
s.legacy_hash = legacyHash ? 1 : 0;
|
|
11532
|
+
|
|
11473
11533
|
s.hash_bits = memLevel + 7;
|
|
11534
|
+
/* ANZAC++ hash needs >= 15 hash bits to span its 4 read bytes. */
|
|
11535
|
+
if (!s.legacy_hash && s.hash_bits < 15) {
|
|
11536
|
+
s.hash_bits = 15;
|
|
11537
|
+
}
|
|
11474
11538
|
s.hash_size = 1 << s.hash_bits;
|
|
11475
11539
|
s.hash_mask = s.hash_size - 1;
|
|
11476
11540
|
s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
|
|
@@ -11562,7 +11626,7 @@ const deflate$2 = (strm, flush) => {
|
|
|
11562
11626
|
if (!strm.output ||
|
|
11563
11627
|
(strm.avail_in !== 0 && !strm.input) ||
|
|
11564
11628
|
(s.status === FINISH_STATE && flush !== Z_FINISH$3)) {
|
|
11565
|
-
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$
|
|
11629
|
+
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2);
|
|
11566
11630
|
}
|
|
11567
11631
|
|
|
11568
11632
|
const old_flush = s.last_flush;
|
|
@@ -11588,12 +11652,12 @@ const deflate$2 = (strm, flush) => {
|
|
|
11588
11652
|
*/
|
|
11589
11653
|
} else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
|
|
11590
11654
|
flush !== Z_FINISH$3) {
|
|
11591
|
-
return err(strm, Z_BUF_ERROR$
|
|
11655
|
+
return err(strm, Z_BUF_ERROR$2);
|
|
11592
11656
|
}
|
|
11593
11657
|
|
|
11594
11658
|
/* User must not provide more input after the first FINISH: */
|
|
11595
11659
|
if (s.status === FINISH_STATE && strm.avail_in !== 0) {
|
|
11596
|
-
return err(strm, Z_BUF_ERROR$
|
|
11660
|
+
return err(strm, Z_BUF_ERROR$2);
|
|
11597
11661
|
}
|
|
11598
11662
|
|
|
11599
11663
|
/* Write the header */
|
|
@@ -11974,12 +12038,7 @@ const deflateSetDictionary = (strm, dictionary) => {
|
|
|
11974
12038
|
let str = s.strstart;
|
|
11975
12039
|
let n = s.lookahead - (MIN_MATCH - 1);
|
|
11976
12040
|
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;
|
|
12041
|
+
INSERT_STRING(s, str);
|
|
11983
12042
|
str++;
|
|
11984
12043
|
} while (--n);
|
|
11985
12044
|
s.strstart = str;
|
|
@@ -12103,7 +12162,7 @@ const _utf8len = new Uint8Array(256);
|
|
|
12103
12162
|
for (let q = 0; q < 256; q++) {
|
|
12104
12163
|
_utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
|
|
12105
12164
|
}
|
|
12106
|
-
_utf8len[254] = _utf8len[
|
|
12165
|
+
_utf8len[254] = _utf8len[255] = 1; // Invalid sequence start
|
|
12107
12166
|
|
|
12108
12167
|
|
|
12109
12168
|
// convert string to array (typed, when possible)
|
|
@@ -12324,6 +12383,15 @@ const {
|
|
|
12324
12383
|
|
|
12325
12384
|
/* ===========================================================================*/
|
|
12326
12385
|
|
|
12386
|
+
const defaultOptions$1 = {
|
|
12387
|
+
level: Z_DEFAULT_COMPRESSION,
|
|
12388
|
+
method: Z_DEFLATED$1,
|
|
12389
|
+
chunkSize: 16384,
|
|
12390
|
+
windowBits: 15,
|
|
12391
|
+
memLevel: 8,
|
|
12392
|
+
strategy: Z_DEFAULT_STRATEGY,
|
|
12393
|
+
legacyHash: true
|
|
12394
|
+
};
|
|
12327
12395
|
|
|
12328
12396
|
/**
|
|
12329
12397
|
* class Deflate
|
|
@@ -12379,6 +12447,10 @@ const {
|
|
|
12379
12447
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
|
12380
12448
|
* for more information on these.
|
|
12381
12449
|
*
|
|
12450
|
+
* - `legacyHash` (Boolean) - use the classic zlib hash (default), which matches
|
|
12451
|
+
* canonical zlib output byte-for-byte. Set to `false` to use the faster
|
|
12452
|
+
* ANZAC++ hash, which matches recent (chromium) node.js output instead.
|
|
12453
|
+
*
|
|
12382
12454
|
* Additional options, for internal needs:
|
|
12383
12455
|
*
|
|
12384
12456
|
* - `chunkSize` - size of generated data chunks (16K by default)
|
|
@@ -12411,14 +12483,7 @@ const {
|
|
|
12411
12483
|
* ```
|
|
12412
12484
|
**/
|
|
12413
12485
|
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 || {});
|
|
12486
|
+
this.options = common.assign({}, defaultOptions$1, options || {});
|
|
12422
12487
|
|
|
12423
12488
|
let opt = this.options;
|
|
12424
12489
|
|
|
@@ -12444,7 +12509,8 @@ function Deflate$1(options) {
|
|
|
12444
12509
|
opt.method,
|
|
12445
12510
|
opt.windowBits,
|
|
12446
12511
|
opt.memLevel,
|
|
12447
|
-
opt.strategy
|
|
12512
|
+
opt.strategy,
|
|
12513
|
+
opt.legacyHash
|
|
12448
12514
|
);
|
|
12449
12515
|
|
|
12450
12516
|
if (status !== Z_OK$2) {
|
|
@@ -13064,7 +13130,7 @@ const lbase = new Uint16Array([ /* Length codes 257..285 base */
|
|
|
13064
13130
|
|
|
13065
13131
|
const lext = new Uint8Array([ /* Length codes 257..285 extra */
|
|
13066
13132
|
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,
|
|
13133
|
+
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75
|
|
13068
13134
|
]);
|
|
13069
13135
|
|
|
13070
13136
|
const dbase = new Uint16Array([ /* Distance codes 0..29 base */
|
|
@@ -13401,7 +13467,7 @@ const DISTS = 2;
|
|
|
13401
13467
|
|
|
13402
13468
|
const {
|
|
13403
13469
|
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,
|
|
13470
|
+
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
13471
|
Z_DEFLATED
|
|
13406
13472
|
} = constants$2;
|
|
13407
13473
|
|
|
@@ -13711,11 +13777,14 @@ const updatewindow = (strm, src, end, copy) => {
|
|
|
13711
13777
|
|
|
13712
13778
|
/* if it hasn't been done already, allocate space for the window */
|
|
13713
13779
|
if (state.window === null) {
|
|
13780
|
+
state.window = new Uint8Array(1 << state.wbits);
|
|
13781
|
+
}
|
|
13782
|
+
|
|
13783
|
+
/* if window not in use yet, initialize */
|
|
13784
|
+
if (state.wsize === 0) {
|
|
13714
13785
|
state.wsize = 1 << state.wbits;
|
|
13715
13786
|
state.wnext = 0;
|
|
13716
13787
|
state.whave = 0;
|
|
13717
|
-
|
|
13718
|
-
state.window = new Uint8Array(state.wsize);
|
|
13719
13788
|
}
|
|
13720
13789
|
|
|
13721
13790
|
/* copy state->wsize or less output bytes into the circular window */
|
|
@@ -14841,7 +14910,7 @@ const inflate$2 = (strm, flush) => {
|
|
|
14841
14910
|
(state.mode === TYPE ? 128 : 0) +
|
|
14842
14911
|
(state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
|
|
14843
14912
|
if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {
|
|
14844
|
-
ret = Z_BUF_ERROR;
|
|
14913
|
+
ret = Z_BUF_ERROR$1;
|
|
14845
14914
|
}
|
|
14846
14915
|
return ret;
|
|
14847
14916
|
};
|
|
@@ -15013,11 +15082,16 @@ const toString$2 = Object.prototype.toString;
|
|
|
15013
15082
|
|
|
15014
15083
|
const {
|
|
15015
15084
|
Z_NO_FLUSH, Z_FINISH,
|
|
15016
|
-
Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR
|
|
15085
|
+
Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR, Z_BUF_ERROR
|
|
15017
15086
|
} = constants$2;
|
|
15018
15087
|
|
|
15019
15088
|
/* ===========================================================================*/
|
|
15020
15089
|
|
|
15090
|
+
const defaultOptions$2 = {
|
|
15091
|
+
chunkSize: 1024 * 64,
|
|
15092
|
+
windowBits: 15,
|
|
15093
|
+
to: ''
|
|
15094
|
+
};
|
|
15021
15095
|
|
|
15022
15096
|
/**
|
|
15023
15097
|
* class Inflate
|
|
@@ -15097,11 +15171,7 @@ const {
|
|
|
15097
15171
|
* ```
|
|
15098
15172
|
**/
|
|
15099
15173
|
function Inflate$1(options) {
|
|
15100
|
-
this.options = common.assign({
|
|
15101
|
-
chunkSize: 1024 * 64,
|
|
15102
|
-
windowBits: 15,
|
|
15103
|
-
to: ''
|
|
15104
|
-
}, options || {});
|
|
15174
|
+
this.options = common.assign({}, defaultOptions$2, options || {});
|
|
15105
15175
|
|
|
15106
15176
|
const opt = this.options;
|
|
15107
15177
|
|
|
@@ -15232,11 +15302,19 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15232
15302
|
}
|
|
15233
15303
|
}
|
|
15234
15304
|
|
|
15235
|
-
//
|
|
15305
|
+
// Only the gzip format defines concatenated members (RFC 1952: a gzip file
|
|
15306
|
+
// is "a series of members"). A zlib stream (RFC 1950) ends after its
|
|
15307
|
+
// ADLER32, and a raw DEFLATE stream (RFC 1951) ends after its final block -
|
|
15308
|
+
// neither format allows anything to follow, so bytes after the end are not
|
|
15309
|
+
// ours to interpret and must be left in the input. Restart decoding only
|
|
15310
|
+
// for a gzip member: `state.flags` is non-zero only once a gzip header has
|
|
15311
|
+
// actually been decoded (it stays 0 for a zlib member, even when the format
|
|
15312
|
+
// was auto-detected and the gzip bit of `wrap` is set). A trailing zero
|
|
15313
|
+
// byte is padding, not the start of a member (no member can begin with 0).
|
|
15236
15314
|
while (strm.avail_in > 0 &&
|
|
15237
15315
|
status === Z_STREAM_END &&
|
|
15238
|
-
strm.state.wrap
|
|
15239
|
-
|
|
15316
|
+
(strm.state.wrap & 2) && strm.state.flags !== 0 &&
|
|
15317
|
+
strm.input[strm.next_in] !== 0)
|
|
15240
15318
|
{
|
|
15241
15319
|
inflate_1$2.inflateReset(strm);
|
|
15242
15320
|
status = inflate_1$2.inflate(strm, _flush_mode);
|
|
@@ -15257,7 +15335,9 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15257
15335
|
last_avail_out = strm.avail_out;
|
|
15258
15336
|
|
|
15259
15337
|
if (strm.next_out) {
|
|
15260
|
-
if
|
|
15338
|
+
// Flush output if buffer is full, stream ended, or an explicit flush was
|
|
15339
|
+
// requested (e.g. Z_SYNC_FLUSH) - to push out the tail, same as node's zlib.
|
|
15340
|
+
if (strm.avail_out === 0 || status === Z_STREAM_END || _flush_mode > 0) {
|
|
15261
15341
|
|
|
15262
15342
|
if (this.options.to === 'string') {
|
|
15263
15343
|
|
|
@@ -15275,12 +15355,22 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15275
15355
|
|
|
15276
15356
|
} else {
|
|
15277
15357
|
this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));
|
|
15358
|
+
|
|
15359
|
+
// Force a fresh output buffer on next iteration / next push, so the
|
|
15360
|
+
// already emitted tail is not sent again.
|
|
15361
|
+
strm.avail_out = 0;
|
|
15362
|
+
strm.next_out = 0;
|
|
15278
15363
|
}
|
|
15279
15364
|
}
|
|
15280
15365
|
}
|
|
15281
15366
|
|
|
15282
|
-
//
|
|
15283
|
-
|
|
15367
|
+
// A full output buffer means there may be more to produce - allocate a new
|
|
15368
|
+
// one and call inflate again. The status depends on the flush mode: with
|
|
15369
|
+
// Z_NO_FLUSH a full buffer is reported as Z_OK, but with Z_FINISH the same
|
|
15370
|
+
// situation is reported as Z_BUF_ERROR ("could not make progress now",
|
|
15371
|
+
// non-fatal) even though output is still pending. Both must continue; the
|
|
15372
|
+
// distinction that matters is purely "was the output buffer exhausted".
|
|
15373
|
+
if ((status === Z_OK || status === Z_BUF_ERROR) && last_avail_out === 0) continue;
|
|
15284
15374
|
|
|
15285
15375
|
// Finalize if end of stream reached.
|
|
15286
15376
|
if (status === Z_STREAM_END) {
|
|
@@ -15290,7 +15380,23 @@ Inflate$1.prototype.push = function (data, flush_mode) {
|
|
|
15290
15380
|
return true;
|
|
15291
15381
|
}
|
|
15292
15382
|
|
|
15293
|
-
if (strm.avail_in === 0)
|
|
15383
|
+
if (strm.avail_in === 0) {
|
|
15384
|
+
// Input is exhausted. If the caller declared this the end of the stream
|
|
15385
|
+
// (Z_FINISH) but we never saw Z_STREAM_END, the compressed data ended
|
|
15386
|
+
// before its terminating marker - i.e. it is truncated/incomplete. That
|
|
15387
|
+
// is an error: returning the partial output as success would be
|
|
15388
|
+
// indistinguishable from a complete decode, hiding the data loss. Report
|
|
15389
|
+
// it via Z_BUF_ERROR. (Reached only when the output buffer still had room
|
|
15390
|
+
// - a full buffer is handled by the `continue` above - so this genuinely
|
|
15391
|
+
// means "ran out of input", not "ran out of output".)
|
|
15392
|
+
if (_flush_mode === Z_FINISH) {
|
|
15393
|
+
status = inflate_1$2.inflateEnd(this.strm);
|
|
15394
|
+
this.onEnd(status === Z_OK ? Z_BUF_ERROR : status);
|
|
15395
|
+
this.ended = true;
|
|
15396
|
+
return false;
|
|
15397
|
+
}
|
|
15398
|
+
break;
|
|
15399
|
+
}
|
|
15294
15400
|
}
|
|
15295
15401
|
|
|
15296
15402
|
return true;
|
|
@@ -15376,7 +15482,7 @@ Inflate$1.prototype.onEnd = function (status) {
|
|
|
15376
15482
|
function inflate$1(input, options) {
|
|
15377
15483
|
const inflator = new Inflate$1(options);
|
|
15378
15484
|
|
|
15379
|
-
inflator.push(input);
|
|
15485
|
+
inflator.push(input, true);
|
|
15380
15486
|
|
|
15381
15487
|
// That will never happens, if you don't cheat with options :)
|
|
15382
15488
|
if (inflator.err) throw inflator.msg || messages[inflator.err];
|
|
@@ -15505,7 +15611,7 @@ const encode = (proto, input, compress) => {
|
|
|
15505
15611
|
throw new Error(`minimumLength for ${token.key} is set to ${token.minimumLength} but got ${data.length}`);
|
|
15506
15612
|
set.push(toType(data !== undefined ? data : token.defaultValue));
|
|
15507
15613
|
}
|
|
15508
|
-
return compress ? pako.deflate(index$
|
|
15614
|
+
return compress ? pako.deflate(index$3(set)) : index$3(set);
|
|
15509
15615
|
};
|
|
15510
15616
|
|
|
15511
15617
|
const ALPHABET$1 = '0123456789ABCDEF';
|
|
@@ -15544,7 +15650,7 @@ const toHex = (bytes) => bytes.reduce((string, byte) => string + byte.toString(1
|
|
|
15544
15650
|
const fromArrayLike = (array) => Uint8Array.from(array);
|
|
15545
15651
|
const toBase58 = (uint8Array) => base58$1.encode(uint8Array);
|
|
15546
15652
|
const fromBase58 = (string) => base58$1.decode(string);
|
|
15547
|
-
const toBase32 = (uint8Array) => index$
|
|
15653
|
+
const toBase32 = (uint8Array) => index$5.encode(uint8Array);
|
|
15548
15654
|
var index$1 = {
|
|
15549
15655
|
toString: toString$1};
|
|
15550
15656
|
|
|
@@ -15553,7 +15659,7 @@ const decoder = new TextDecoder();
|
|
|
15553
15659
|
const decode = (proto, uint8Array, compressed) => {
|
|
15554
15660
|
if (compressed)
|
|
15555
15661
|
uint8Array = pako.inflate(uint8Array);
|
|
15556
|
-
let deconcated = index$
|
|
15662
|
+
let deconcated = index$2(uint8Array);
|
|
15557
15663
|
const output = {};
|
|
15558
15664
|
const tokens = getTokens(proto);
|
|
15559
15665
|
if (tokens.length !== deconcated.length)
|
|
@@ -15644,13 +15750,13 @@ class BasicInterface {
|
|
|
15644
15750
|
this.fromBs58(value);
|
|
15645
15751
|
}
|
|
15646
15752
|
catch {
|
|
15647
|
-
if (index$
|
|
15753
|
+
if (index$5.isBase32(value))
|
|
15648
15754
|
this.fromBs32(value);
|
|
15649
15755
|
else
|
|
15650
15756
|
throw new Error('Invalid base58/base32 input');
|
|
15651
15757
|
}
|
|
15652
15758
|
}
|
|
15653
|
-
else if (index$
|
|
15759
|
+
else if (index$5.isBase32(value))
|
|
15654
15760
|
this.fromBs32(value);
|
|
15655
15761
|
else
|
|
15656
15762
|
this.fromString(value);
|
|
@@ -15718,13 +15824,13 @@ class BasicInterface {
|
|
|
15718
15824
|
return isHex(string);
|
|
15719
15825
|
}
|
|
15720
15826
|
isBase32(string) {
|
|
15721
|
-
return index$
|
|
15827
|
+
return index$5.isBase32(string);
|
|
15722
15828
|
}
|
|
15723
15829
|
isBase58(string) {
|
|
15724
15830
|
return base58$1.isBase58(string);
|
|
15725
15831
|
}
|
|
15726
15832
|
fromBs32(encoded) {
|
|
15727
|
-
return this.decode(index$
|
|
15833
|
+
return this.decode(index$5.decode(encoded));
|
|
15728
15834
|
}
|
|
15729
15835
|
fromBs58(encoded) {
|
|
15730
15836
|
return this.decode(fromBase58(encoded));
|
|
@@ -16052,7 +16158,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16052
16158
|
super();
|
|
16053
16159
|
if (buffer) {
|
|
16054
16160
|
if (buffer instanceof Uint8Array) {
|
|
16055
|
-
const codec = index$
|
|
16161
|
+
const codec = index$4.decode(buffer);
|
|
16056
16162
|
const name = this.getCodecName(codec);
|
|
16057
16163
|
if (name) {
|
|
16058
16164
|
this.name = name;
|
|
@@ -16064,7 +16170,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16064
16170
|
}
|
|
16065
16171
|
}
|
|
16066
16172
|
else if (buffer instanceof ArrayBuffer) {
|
|
16067
|
-
const codec = index$
|
|
16173
|
+
const codec = index$4.decode(buffer);
|
|
16068
16174
|
const name = this.getCodecName(codec);
|
|
16069
16175
|
if (name) {
|
|
16070
16176
|
this.name = name;
|
|
@@ -16093,7 +16199,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16093
16199
|
}
|
|
16094
16200
|
}
|
|
16095
16201
|
fromEncoded(encoded) {
|
|
16096
|
-
const codec = index$
|
|
16202
|
+
const codec = index$4.decode(encoded);
|
|
16097
16203
|
const name = this.getCodecName(codec);
|
|
16098
16204
|
this.name = name;
|
|
16099
16205
|
this.encoded = encoded;
|
|
@@ -16112,7 +16218,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16112
16218
|
this.name = this.getCodecName(codec);
|
|
16113
16219
|
this.hashAlg = this.getHashAlg(this.name);
|
|
16114
16220
|
this.codec = this.getCodec(this.name);
|
|
16115
|
-
this.codecBuffer = index$
|
|
16221
|
+
this.codecBuffer = index$4.encode(this.codec);
|
|
16116
16222
|
this.decoded = {
|
|
16117
16223
|
name: this.name,
|
|
16118
16224
|
hashAlg: this.hashAlg,
|
|
@@ -16125,7 +16231,7 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16125
16231
|
this.name = name;
|
|
16126
16232
|
this.codec = codec;
|
|
16127
16233
|
this.hashAlg = this.getHashAlg(name);
|
|
16128
|
-
this.codecBuffer = index$
|
|
16234
|
+
this.codecBuffer = index$4.encode(this.codec);
|
|
16129
16235
|
this.decoded = {
|
|
16130
16236
|
name: this.name,
|
|
16131
16237
|
hashAlg: this.hashAlg,
|
|
@@ -16135,13 +16241,13 @@ let Codec$1 = class Codec extends BasicInterface {
|
|
|
16135
16241
|
}
|
|
16136
16242
|
decode(encoded) {
|
|
16137
16243
|
encoded = encoded || this.encoded;
|
|
16138
|
-
const codec = index$
|
|
16244
|
+
const codec = index$4.decode(encoded);
|
|
16139
16245
|
this.fromCodec(codec);
|
|
16140
16246
|
return this.decoded;
|
|
16141
16247
|
}
|
|
16142
16248
|
encode(codec) {
|
|
16143
16249
|
codec = codec || this.codec;
|
|
16144
|
-
this.encoded = index$
|
|
16250
|
+
this.encoded = index$4.encode(codec);
|
|
16145
16251
|
return this.encoded;
|
|
16146
16252
|
}
|
|
16147
16253
|
};
|
|
@@ -16212,7 +16318,7 @@ class CodecHash extends BasicInterface {
|
|
|
16212
16318
|
return uint8Array;
|
|
16213
16319
|
}
|
|
16214
16320
|
get length() {
|
|
16215
|
-
return index$
|
|
16321
|
+
return index$4.encode(this.size);
|
|
16216
16322
|
}
|
|
16217
16323
|
get buffer() {
|
|
16218
16324
|
return this.encoded;
|
|
@@ -16246,7 +16352,7 @@ class CodecHash extends BasicInterface {
|
|
|
16246
16352
|
if (!(buffer instanceof Uint8Array)) {
|
|
16247
16353
|
throw new Error('CodecHash only supports Uint8Array input');
|
|
16248
16354
|
}
|
|
16249
|
-
const codec = index$
|
|
16355
|
+
const codec = index$4.decode(buffer);
|
|
16250
16356
|
if (this.codecs[codec]) {
|
|
16251
16357
|
this.decode(buffer);
|
|
16252
16358
|
}
|
|
@@ -16256,12 +16362,12 @@ class CodecHash extends BasicInterface {
|
|
|
16256
16362
|
}
|
|
16257
16363
|
decode(buffer) {
|
|
16258
16364
|
this.encoded = buffer;
|
|
16259
|
-
const codec = index$
|
|
16365
|
+
const codec = index$4.decode(buffer);
|
|
16260
16366
|
this.discoCodec = new Codec$1(codec, this.codecs);
|
|
16261
16367
|
// TODO: validate codec
|
|
16262
|
-
buffer = buffer.slice(index$
|
|
16263
|
-
this.size = index$
|
|
16264
|
-
this.digest = buffer.slice(index$
|
|
16368
|
+
buffer = buffer.slice(index$4.decode.bytes);
|
|
16369
|
+
this.size = index$4.decode(buffer);
|
|
16370
|
+
this.digest = buffer.slice(index$4.decode.bytes);
|
|
16265
16371
|
if (this.digest.length !== this.size) {
|
|
16266
16372
|
throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
|
|
16267
16373
|
}
|
|
@@ -16871,6 +16977,7 @@ class Peernet {
|
|
|
16871
16977
|
client;
|
|
16872
16978
|
network;
|
|
16873
16979
|
stars;
|
|
16980
|
+
transport;
|
|
16874
16981
|
networkVersion;
|
|
16875
16982
|
bw;
|
|
16876
16983
|
hasDaemon = false;
|
|
@@ -16892,6 +16999,7 @@ class Peernet {
|
|
|
16892
16999
|
* @param {String} options.root - path to root directory
|
|
16893
17000
|
* @param {String} options.version - path to root directory
|
|
16894
17001
|
* @param {String} options.storePrefix - prefix for datatores (lfc)
|
|
17002
|
+
* @param {Object} options.transport - transport selection and fallback options passed to @netpeer/swarm
|
|
16895
17003
|
*
|
|
16896
17004
|
* @return {Promise} instance of Peernet
|
|
16897
17005
|
*
|
|
@@ -16905,6 +17013,7 @@ class Peernet {
|
|
|
16905
17013
|
this.network = options.network || 'leofcoin';
|
|
16906
17014
|
this.autoStart = options.autoStart === undefined ? true : options.autoStart;
|
|
16907
17015
|
this.stars = options.stars;
|
|
17016
|
+
this.transport = options.transport;
|
|
16908
17017
|
this.version = options.version;
|
|
16909
17018
|
const parts = this.network.split(':');
|
|
16910
17019
|
this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
|
|
@@ -16998,7 +17107,7 @@ class Peernet {
|
|
|
16998
17107
|
await getAddress();
|
|
16999
17108
|
this.storePrefix = options.storePrefix;
|
|
17000
17109
|
this.root = options.root;
|
|
17001
|
-
const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-
|
|
17110
|
+
const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-D0Goitr6-BWN8uKkb.js');
|
|
17002
17111
|
/**
|
|
17003
17112
|
* proto Object containing protos
|
|
17004
17113
|
* @type {Object}
|
|
@@ -17045,7 +17154,7 @@ class Peernet {
|
|
|
17045
17154
|
if (this.#starting || this.#started)
|
|
17046
17155
|
return;
|
|
17047
17156
|
this.#starting = true;
|
|
17048
|
-
const importee = await import('./client-
|
|
17157
|
+
const importee = await import('./client-eYBPUrVq-CukSyZyC.js');
|
|
17049
17158
|
/**
|
|
17050
17159
|
* @access public
|
|
17051
17160
|
* @type {PeernetClient}
|
|
@@ -17055,7 +17164,8 @@ class Peernet {
|
|
|
17055
17164
|
peerId: this.id,
|
|
17056
17165
|
networkVersion: this.networkVersion,
|
|
17057
17166
|
version: this.version,
|
|
17058
|
-
stars: this.stars
|
|
17167
|
+
stars: this.stars,
|
|
17168
|
+
transport: this.transport
|
|
17059
17169
|
});
|
|
17060
17170
|
this.#started = true;
|
|
17061
17171
|
this.#starting = false;
|