@leofcoin/peernet 1.2.21 → 1.2.23
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.js → browser-BKlRwB0A.js} +1 -1
- package/exports/browser/{browser-FVp_QbaL.js → browser-Dx3X9MHO.js} +1 -1
- package/exports/browser/{client-lPe0SUWx.js → client-eYBPUrVq.js} +19 -14
- package/exports/browser/{identity-BeVZQ2Dp.js → identity-BS_eDrwh.js} +1830 -1806
- package/exports/browser/identity.js +1 -1
- package/exports/browser/{index-D6qd-AUn.js → index-B91mcwxm.js} +1 -1
- package/exports/browser/{messages-BfDvXW-x.js → messages-D0Goitr6.js} +2 -2
- package/exports/browser/{peernet-DFiLLjUD.js → peernet-CgU-ZdIe.js} +154 -82
- package/exports/browser/peernet.js +2 -2
- package/exports/identity.js +25 -1
- package/exports/peernet.js +5 -1
- package/exports/store.js +3 -0
- package/exports/types/identity.d.ts +1 -1
- package/exports/types/peernet.d.ts +2 -0
- package/package.json +4 -3
- package/src/identity.ts +30 -1
- package/src/peernet.ts +5 -1
- package/test/peernet.test.js +11 -1
|
@@ -340,49 +340,17 @@ const base = (ALPHABET, options = {}) => {
|
|
|
340
340
|
};
|
|
341
341
|
};
|
|
342
342
|
|
|
343
|
-
const ALPHABET$1 = "
|
|
344
|
-
const ALPHABET_HEX$1 = "
|
|
345
|
-
const
|
|
346
|
-
const
|
|
347
|
-
const
|
|
348
|
-
const
|
|
349
|
-
const
|
|
350
|
-
const
|
|
351
|
-
const isBase32 = (string, hex = false) => {
|
|
352
|
-
try {
|
|
353
|
-
if (hex)
|
|
354
|
-
decodeHex$2(string);
|
|
355
|
-
else
|
|
356
|
-
decode$5(string);
|
|
357
|
-
return true;
|
|
358
|
-
}
|
|
359
|
-
catch (e) {
|
|
360
|
-
return false;
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
const isBase32Hex = (string) => {
|
|
364
|
-
return isBase32(string, true);
|
|
365
|
-
};
|
|
366
|
-
var index$4 = {
|
|
367
|
-
encode: encode$4,
|
|
368
|
-
decode: decode$5,
|
|
369
|
-
encodeHex: encodeHex$2,
|
|
370
|
-
decodeHex: decodeHex$2,
|
|
371
|
-
isBase32,
|
|
372
|
-
isBase32Hex,
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
376
|
-
const ALPHABET_HEX = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
|
|
377
|
-
const base58 = base(ALPHABET);
|
|
378
|
-
const base58Hex = base(ALPHABET_HEX);
|
|
379
|
-
const encode$3 = base58.encode;
|
|
380
|
-
const decode$4 = base58.decode;
|
|
381
|
-
const encodeHex$1 = base58Hex.encode;
|
|
382
|
-
const decodeHex$1 = base58Hex.decode;
|
|
343
|
+
const ALPHABET$1 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
344
|
+
const ALPHABET_HEX$1 = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
|
|
345
|
+
const base58 = base(ALPHABET$1);
|
|
346
|
+
const base58Hex = base(ALPHABET_HEX$1);
|
|
347
|
+
const encode$4 = base58.encode;
|
|
348
|
+
const decode$5 = base58.decode;
|
|
349
|
+
const encodeHex$2 = base58Hex.encode;
|
|
350
|
+
const decodeHex$2 = base58Hex.decode;
|
|
383
351
|
const isBase58 = (string) => {
|
|
384
352
|
try {
|
|
385
|
-
decode$
|
|
353
|
+
decode$5(string);
|
|
386
354
|
return true;
|
|
387
355
|
}
|
|
388
356
|
catch (e) {
|
|
@@ -391,7 +359,7 @@ const isBase58 = (string) => {
|
|
|
391
359
|
};
|
|
392
360
|
const isBase58Hex = (string) => {
|
|
393
361
|
try {
|
|
394
|
-
decodeHex$
|
|
362
|
+
decodeHex$2(string);
|
|
395
363
|
return true;
|
|
396
364
|
}
|
|
397
365
|
catch (e) {
|
|
@@ -400,12 +368,12 @@ const isBase58Hex = (string) => {
|
|
|
400
368
|
};
|
|
401
369
|
const whatType = (string) => {
|
|
402
370
|
try {
|
|
403
|
-
decode$
|
|
371
|
+
decode$5(string);
|
|
404
372
|
return "base58";
|
|
405
373
|
}
|
|
406
374
|
catch (e) {
|
|
407
375
|
try {
|
|
408
|
-
decodeHex$
|
|
376
|
+
decodeHex$2(string);
|
|
409
377
|
return "base58Hex";
|
|
410
378
|
}
|
|
411
379
|
catch {
|
|
@@ -414,15 +382,143 @@ const whatType = (string) => {
|
|
|
414
382
|
}
|
|
415
383
|
};
|
|
416
384
|
var base58$1 = {
|
|
417
|
-
encode: encode$
|
|
418
|
-
decode: decode$
|
|
385
|
+
encode: encode$4,
|
|
386
|
+
decode: decode$5,
|
|
419
387
|
isBase58,
|
|
420
388
|
isBase58Hex,
|
|
421
|
-
encodeHex: encodeHex$
|
|
422
|
-
decodeHex: decodeHex$
|
|
389
|
+
encodeHex: encodeHex$2,
|
|
390
|
+
decodeHex: decodeHex$2,
|
|
423
391
|
whatType,
|
|
424
392
|
};
|
|
425
393
|
|
|
394
|
+
const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
|
|
395
|
+
|
|
396
|
+
const { subtle: subtle$1 } = crypto;
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* ```js
|
|
400
|
+
* const {createHash} = await import('@leofcoin/crypto')
|
|
401
|
+
* createHash(data, algorithm)
|
|
402
|
+
* ```
|
|
403
|
+
* @param {Uint8Array} data
|
|
404
|
+
* @param {string} algorithm
|
|
405
|
+
* @returns Uint8Array
|
|
406
|
+
*/
|
|
407
|
+
const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Hashes the created hash again
|
|
411
|
+
* ```js
|
|
412
|
+
* const {createDoubleHash} = await import('@leofcoin/crypto')
|
|
413
|
+
* createDoubleHash(data, algorithm)
|
|
414
|
+
* ```
|
|
415
|
+
* @param {Uint8Array} data
|
|
416
|
+
* @param {string} algorithm
|
|
417
|
+
* @returns Uint8Array
|
|
418
|
+
*/
|
|
419
|
+
const createDoubleHash = async (data, algorithm = 'SHA-512') =>
|
|
420
|
+
subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
|
|
421
|
+
|
|
422
|
+
const generatePbkdf2 = async (password) => {
|
|
423
|
+
return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
|
|
427
|
+
const key = await generatePbkdf2(password);
|
|
428
|
+
return subtle$1.deriveBits(
|
|
429
|
+
{
|
|
430
|
+
name: 'PBKDF2',
|
|
431
|
+
hash,
|
|
432
|
+
salt,
|
|
433
|
+
iterations
|
|
434
|
+
},
|
|
435
|
+
key,
|
|
436
|
+
length
|
|
437
|
+
)
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
|
|
441
|
+
if (!options) options = {};
|
|
442
|
+
|
|
443
|
+
if (typeof options.seperator === 'string')
|
|
444
|
+
options.seperator = new TextEncoder().encode(options.seperator);
|
|
445
|
+
|
|
446
|
+
const length = options.length || input.reduce((total, current, i) => {
|
|
447
|
+
total += current.length;
|
|
448
|
+
if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
|
|
449
|
+
return total
|
|
450
|
+
}, 0);
|
|
451
|
+
|
|
452
|
+
const typedArray = new Uint8Array(length);
|
|
453
|
+
|
|
454
|
+
let currentIndex = 0;
|
|
455
|
+
let index = 0;
|
|
456
|
+
for (const source of input) {
|
|
457
|
+
typedArray.set(source, currentIndex);
|
|
458
|
+
if (options.seperator && input.length - 1 > index) {
|
|
459
|
+
typedArray.set(options.seperator, currentIndex + source.length);
|
|
460
|
+
currentIndex+= options.seperator.length;
|
|
461
|
+
}
|
|
462
|
+
currentIndex += source.length;
|
|
463
|
+
index += 1;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return typedArray
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
const concatAndDoubleHash = async (input) => {
|
|
470
|
+
return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
const encode$3 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
474
|
+
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
475
|
+
throw new TypeError('Expected Uint8Array');
|
|
476
|
+
}
|
|
477
|
+
const hash = await concatAndDoubleHash([
|
|
478
|
+
prefix,
|
|
479
|
+
source
|
|
480
|
+
]);
|
|
481
|
+
const uint8Array = typedArrayConcat([
|
|
482
|
+
prefix,
|
|
483
|
+
source,
|
|
484
|
+
hash.subarray(0, 4)
|
|
485
|
+
]);
|
|
486
|
+
if (hex)
|
|
487
|
+
return base58$1.encodeHex(uint8Array);
|
|
488
|
+
return base58$1.encode(uint8Array);
|
|
489
|
+
};
|
|
490
|
+
const decode$4 = async (string, hex) => {
|
|
491
|
+
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
492
|
+
const prefix = uint8Array.subarray(0, 2);
|
|
493
|
+
const source = uint8Array.subarray(2, -4);
|
|
494
|
+
const hash = await concatAndDoubleHash([
|
|
495
|
+
prefix,
|
|
496
|
+
source
|
|
497
|
+
]);
|
|
498
|
+
let index = 0;
|
|
499
|
+
const slice = uint8Array.subarray(-4);
|
|
500
|
+
for (const check of slice) {
|
|
501
|
+
if (check !== hash[index]) {
|
|
502
|
+
throw new Error('Invalid checksum');
|
|
503
|
+
}
|
|
504
|
+
index++;
|
|
505
|
+
}
|
|
506
|
+
return { prefix, data: source };
|
|
507
|
+
};
|
|
508
|
+
const isBase58check = (string, hex) => {
|
|
509
|
+
try {
|
|
510
|
+
hex ? decode$4(string, true) : decode$4(string);
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
catch (e) {
|
|
514
|
+
return false;
|
|
515
|
+
}
|
|
516
|
+
};
|
|
517
|
+
const encodeHex$1 = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$3(uint8Array, prefix, true);
|
|
518
|
+
const decodeHex$1 = (string) => decode$4(string, true);
|
|
519
|
+
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
520
|
+
var base58check = { encode: encode$3, decode: decode$4, encodeHex: encodeHex$1, decodeHex: decodeHex$1, isBase58check, isBase58checkHex };
|
|
521
|
+
|
|
426
522
|
const MSB$1 = 0x80;
|
|
427
523
|
const MSBALL = -128;
|
|
428
524
|
const INT = Math.pow(2, 31);
|
|
@@ -491,16 +587,16 @@ var encodingLength = (value) => (value < N1 ? 1
|
|
|
491
587
|
: value < N9 ? 9
|
|
492
588
|
: 10);
|
|
493
589
|
|
|
494
|
-
var index$
|
|
590
|
+
var index$4 = {
|
|
495
591
|
encode: encode$2,
|
|
496
592
|
decode: decode$3,
|
|
497
593
|
encodingLength
|
|
498
594
|
};
|
|
499
595
|
|
|
500
|
-
var index$
|
|
596
|
+
var index$3 = (input, prefix) => {
|
|
501
597
|
const encodedArray = [];
|
|
502
598
|
const length = input.reduce((total, current) => {
|
|
503
|
-
const encoded = index$
|
|
599
|
+
const encoded = index$4.encode(current.length);
|
|
504
600
|
encodedArray.push(encoded);
|
|
505
601
|
total += current.length + encoded.length;
|
|
506
602
|
return total;
|
|
@@ -518,12 +614,12 @@ var index$2 = (input, prefix) => {
|
|
|
518
614
|
return typedArray;
|
|
519
615
|
};
|
|
520
616
|
|
|
521
|
-
var index$
|
|
617
|
+
var index$2 = (typedArray, prefix) => {
|
|
522
618
|
const set = [];
|
|
523
619
|
const varintAndSub = (typedArray) => {
|
|
524
|
-
const length = index$
|
|
620
|
+
const length = index$4.decode(typedArray);
|
|
525
621
|
// remove length
|
|
526
|
-
typedArray = typedArray.subarray(index$
|
|
622
|
+
typedArray = typedArray.subarray(index$4.decode.bytes);
|
|
527
623
|
// push value
|
|
528
624
|
set.push(typedArray.subarray(0, length));
|
|
529
625
|
// remove value
|
|
@@ -535,1814 +631,1686 @@ var index$1 = (typedArray, prefix) => {
|
|
|
535
631
|
return varintAndSub(typedArray);
|
|
536
632
|
};
|
|
537
633
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
634
|
+
const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
|
|
635
|
+
const decoded = base58$1.decode(multiWif);
|
|
636
|
+
let [version, codec, privateKey] = index$2(decoded);
|
|
637
|
+
version = Number(new TextDecoder().decode(version));
|
|
638
|
+
codec = Number(new TextDecoder().decode(codec));
|
|
639
|
+
if (expectedVersion && version !== expectedVersion)
|
|
640
|
+
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
641
|
+
if (expectedCodec && codec !== expectedCodec)
|
|
642
|
+
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
643
|
+
return { version, codec, privateKey };
|
|
644
|
+
};
|
|
645
|
+
var index$1 = {
|
|
646
|
+
encode: (version, codec, privateKey) => {
|
|
647
|
+
return base58$1.encode(index$3([
|
|
648
|
+
new TextEncoder().encode(version.toString()),
|
|
649
|
+
new TextEncoder().encode(codec.toString()),
|
|
650
|
+
privateKey
|
|
651
|
+
]));
|
|
652
|
+
},
|
|
653
|
+
decode: decode$2,
|
|
654
|
+
isMultiWif: (multiWif) => {
|
|
655
|
+
try {
|
|
656
|
+
const { version, codec, privateKey } = decode$2(multiWif);
|
|
657
|
+
if (version === undefined)
|
|
658
|
+
return false;
|
|
659
|
+
if (codec === undefined)
|
|
660
|
+
return false;
|
|
661
|
+
if (privateKey === undefined)
|
|
662
|
+
return false;
|
|
663
|
+
if (privateKey && privateKey.length !== 32)
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
catch {
|
|
667
|
+
return false;
|
|
668
|
+
}
|
|
669
|
+
return true;
|
|
670
|
+
}
|
|
575
671
|
};
|
|
576
672
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
:
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
const
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
673
|
+
/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
674
|
+
/**
|
|
675
|
+
* 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
|
|
676
|
+
* Compliant with RFC6979 & BIP340.
|
|
677
|
+
* @module
|
|
678
|
+
*/
|
|
679
|
+
/**
|
|
680
|
+
* Curve params from SEC 2 v2 §2.4.1.
|
|
681
|
+
* secp256k1 is a short Weierstrass / Koblitz curve with equation
|
|
682
|
+
* `y² == x³ + ax + b`.
|
|
683
|
+
* * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
|
|
684
|
+
* * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
|
|
685
|
+
* * h = `1n` // cofactor
|
|
686
|
+
* * a = `0n` // equation param
|
|
687
|
+
* * b = `7n` // equation param
|
|
688
|
+
* * Gx, Gy are coordinates of Generator / base point
|
|
689
|
+
*/
|
|
690
|
+
// Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
|
|
691
|
+
// callers cannot mutate them out from under the arithmetic constants captured below.
|
|
692
|
+
const secp256k1_CURVE = Object.freeze({
|
|
693
|
+
p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
|
|
694
|
+
n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
|
|
695
|
+
h: 1n,
|
|
696
|
+
a: 0n,
|
|
697
|
+
b: 7n,
|
|
698
|
+
Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
|
|
699
|
+
Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
|
|
700
|
+
});
|
|
701
|
+
const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
|
|
702
|
+
// 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
|
|
703
|
+
// by the RFC6979 paths here.
|
|
704
|
+
const L = 32;
|
|
705
|
+
const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
|
|
706
|
+
const lengths = {
|
|
707
|
+
publicKey: L + 1,
|
|
708
|
+
publicKeyUncompressed: L2 + 1,
|
|
709
|
+
// 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
|
|
710
|
+
// 352-bit recommendation for 256-bit prime curves.
|
|
711
|
+
seed: L + L / 2,
|
|
712
|
+
};
|
|
713
|
+
// Helpers and Precomputes sections are reused between libraries
|
|
714
|
+
// ## Helpers
|
|
715
|
+
// ----------
|
|
716
|
+
const err = (message = '', E = Error) => {
|
|
717
|
+
const e = new E(message);
|
|
718
|
+
const { captureStackTrace } = Error;
|
|
719
|
+
if (typeof captureStackTrace === 'function')
|
|
720
|
+
captureStackTrace(e, err);
|
|
721
|
+
throw e;
|
|
722
|
+
};
|
|
723
|
+
// Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
|
|
724
|
+
// fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
|
|
725
|
+
// spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
|
|
726
|
+
const isBytes = (a) => a instanceof Uint8Array ||
|
|
727
|
+
(ArrayBuffer.isView(a) &&
|
|
728
|
+
a.constructor.name === 'Uint8Array' &&
|
|
729
|
+
a.BYTES_PER_ELEMENT === 1);
|
|
730
|
+
/** Asserts something is Bytes. */
|
|
731
|
+
const abytes = (value, length, title = '') => {
|
|
732
|
+
const bytes = isBytes(value);
|
|
733
|
+
const len = value?.length;
|
|
734
|
+
const needsLen = length !== undefined;
|
|
735
|
+
if (!bytes || (needsLen && len !== length)) {
|
|
736
|
+
const prefix = title && `"${title}" `;
|
|
737
|
+
const ofLen = needsLen ? ` of length ${length}` : '';
|
|
738
|
+
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
739
|
+
const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
|
|
740
|
+
return bytes ? err(msg, RangeError) : err(msg, TypeError);
|
|
630
741
|
}
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
742
|
+
return value;
|
|
743
|
+
};
|
|
744
|
+
/** create Uint8Array */
|
|
745
|
+
const u8n = (len) => new Uint8Array(len);
|
|
746
|
+
// Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
|
|
747
|
+
const padh = (n, pad) => n.toString(16).padStart(pad, '0');
|
|
748
|
+
/** Render bytes as lowercase hex. */
|
|
749
|
+
const bytesToHex = (b) => {
|
|
750
|
+
let hex = '';
|
|
751
|
+
for (const e of abytes(b))
|
|
752
|
+
hex += padh(e, 2);
|
|
753
|
+
return hex;
|
|
754
|
+
};
|
|
755
|
+
const C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
|
|
756
|
+
// Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
|
|
757
|
+
// prettier-ignore
|
|
758
|
+
const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
|
|
759
|
+
: ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
|
|
760
|
+
: ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
|
|
761
|
+
: undefined;
|
|
762
|
+
const hexToBytes = (hex) => {
|
|
763
|
+
const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
|
|
764
|
+
if (typeof hex !== 'string')
|
|
765
|
+
return err(e);
|
|
766
|
+
const hl = hex.length;
|
|
767
|
+
const al = hl / 2;
|
|
768
|
+
if (hl % 2)
|
|
769
|
+
return err(e);
|
|
770
|
+
const array = u8n(al);
|
|
771
|
+
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
772
|
+
// treat each char as ASCII
|
|
773
|
+
const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
|
|
774
|
+
const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
|
|
775
|
+
if (n1 === undefined || n2 === undefined)
|
|
776
|
+
return err(e);
|
|
777
|
+
array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
|
|
637
778
|
}
|
|
638
|
-
return
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
779
|
+
return array;
|
|
780
|
+
};
|
|
781
|
+
// WebCrypto is available in all modern environments
|
|
782
|
+
const subtle = () => globalThis?.crypto?.subtle ?? err('crypto.subtle must be defined, consider polyfill');
|
|
783
|
+
// prettier-ignore
|
|
784
|
+
const concatBytes = (...arrs) => {
|
|
785
|
+
let len = 0;
|
|
786
|
+
for (const a of arrs)
|
|
787
|
+
len += abytes(a).length; // validate every input and sum lengths before copying
|
|
788
|
+
const r = u8n(len);
|
|
789
|
+
let pad = 0; // walk through each array,
|
|
790
|
+
for (const a of arrs)
|
|
791
|
+
r.set(a, pad), pad += a.length; // ensure they have proper type
|
|
792
|
+
return r;
|
|
793
|
+
};
|
|
794
|
+
/**
|
|
795
|
+
* WebCrypto OS-level CSPRNG (random number generator).
|
|
796
|
+
* Will throw when not available; large-request ceilings are delegated to getRandomValues().
|
|
797
|
+
*/
|
|
798
|
+
const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
|
|
799
|
+
const big = BigInt;
|
|
800
|
+
const arange = (n, min, max, msg = 'bad number: out of range') => {
|
|
801
|
+
if (typeof n !== 'bigint')
|
|
802
|
+
return err(msg, TypeError);
|
|
803
|
+
if (min <= n && n < max)
|
|
804
|
+
return n;
|
|
805
|
+
return err(msg, RangeError);
|
|
806
|
+
};
|
|
807
|
+
/** Canonical modular reduction. Callers must provide a positive modulus. */
|
|
808
|
+
const M = (a, b = P) => {
|
|
809
|
+
const r = a % b;
|
|
810
|
+
return r >= 0n ? r : b + r;
|
|
811
|
+
};
|
|
812
|
+
const modN = (a) => M(a, N);
|
|
813
|
+
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
814
|
+
// prettier-ignore
|
|
815
|
+
const invert = (num, md) => {
|
|
816
|
+
if (num === 0n || md <= 0n)
|
|
817
|
+
err('no inverse n=' + num + ' mod=' + md);
|
|
818
|
+
let a = M(num, md), b = md, x = 0n, u = 1n;
|
|
819
|
+
while (a !== 0n) {
|
|
820
|
+
const q = b / a, r = b % a;
|
|
821
|
+
const m = x - u * q;
|
|
822
|
+
b = a, a = r, x = u, u = m;
|
|
649
823
|
}
|
|
650
|
-
return
|
|
651
|
-
}
|
|
652
|
-
const
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
824
|
+
return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point
|
|
825
|
+
};
|
|
826
|
+
const callHash = (name) => {
|
|
827
|
+
// @ts-ignore
|
|
828
|
+
const fn = hashes[name];
|
|
829
|
+
if (typeof fn !== 'function')
|
|
830
|
+
err('hashes.' + name + ' not set');
|
|
831
|
+
return fn;
|
|
832
|
+
};
|
|
833
|
+
// All exported provider slots are caller-configurable and may be unset or return arbitrary values,
|
|
834
|
+
// so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
|
|
835
|
+
const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
|
|
836
|
+
const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
|
|
837
|
+
// also rejects structurally similar Point values from other realms / bundled copies
|
|
838
|
+
const apoint = (p) => (p instanceof Point ? p : err('Point expected'));
|
|
839
|
+
// ## End of Helpers
|
|
840
|
+
// -----------------
|
|
841
|
+
/**
|
|
842
|
+
* secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
|
|
843
|
+
* making it x³+b; callers validate x first.
|
|
844
|
+
*/
|
|
845
|
+
const koblitz = (x) => M(M(x * x) * x + _b);
|
|
846
|
+
/** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
|
|
847
|
+
const FpIsValid = (n) => arange(n, 0n, P);
|
|
848
|
+
/** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
|
|
849
|
+
const FpIsValidNot0 = (n) => arange(n, 1n, P);
|
|
850
|
+
/** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
|
|
851
|
+
const FnIsValidNot0 = (n) => arange(n, 1n, N);
|
|
852
|
+
// Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
|
|
853
|
+
const isEven = (y) => !(y & 1n);
|
|
854
|
+
/** create Uint8Array of byte n */
|
|
855
|
+
const u8of = (n) => Uint8Array.of(n);
|
|
856
|
+
/** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
|
|
857
|
+
const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
|
|
858
|
+
/** lift_x from BIP340 returns the unique even square root for x³+7.
|
|
859
|
+
* SEC 1 callers still flip it for the odd-prefix branch. */
|
|
860
|
+
const lift_x = (x) => {
|
|
861
|
+
// Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
|
|
862
|
+
const c = koblitz(FpIsValidNot0(x));
|
|
863
|
+
// r = √c candidate
|
|
864
|
+
// r = c^((p+1)/4) mod p
|
|
865
|
+
// This formula works for fields p = 3 mod 4 -- a special, fast case.
|
|
866
|
+
// Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
|
|
867
|
+
let r = 1n;
|
|
868
|
+
for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
|
|
869
|
+
// powMod: modular exponentiation.
|
|
870
|
+
if (e & 1n)
|
|
871
|
+
r = (r * num) % P; // Uses exponentiation by squaring.
|
|
872
|
+
num = (num * num) % P; // Not constant-time.
|
|
665
873
|
}
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
874
|
+
if (M(r * r) !== c)
|
|
875
|
+
err('sqrt invalid'); // check if result is valid
|
|
876
|
+
return isEven(r) ? r : M(-r);
|
|
877
|
+
};
|
|
878
|
+
/**
|
|
879
|
+
* Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
|
|
880
|
+
* @param X - X coordinate.
|
|
881
|
+
* @param Y - Y coordinate.
|
|
882
|
+
* @param Z - projective Z coordinate.
|
|
883
|
+
* @example
|
|
884
|
+
* Do point arithmetic with the base point and encode the result as hex.
|
|
885
|
+
* ```ts
|
|
886
|
+
* import { Point } from '@noble/secp256k1';
|
|
887
|
+
* const hex = Point.BASE.double().toHex();
|
|
888
|
+
* ```
|
|
889
|
+
*/
|
|
890
|
+
class Point {
|
|
891
|
+
static BASE;
|
|
892
|
+
static ZERO;
|
|
893
|
+
X;
|
|
894
|
+
Y;
|
|
895
|
+
Z;
|
|
896
|
+
constructor(X, Y, Z) {
|
|
897
|
+
this.X = FpIsValid(X);
|
|
898
|
+
this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
|
|
899
|
+
this.Z = FpIsValid(Z);
|
|
900
|
+
Object.freeze(this);
|
|
901
|
+
}
|
|
902
|
+
/** Returns the shared curve metadata object by reference.
|
|
903
|
+
* It is readonly only at type level, and mutating it won't retarget arithmetic,
|
|
904
|
+
* which already uses module-load snapshots. */
|
|
905
|
+
static CURVE() {
|
|
906
|
+
return secp256k1_CURVE;
|
|
907
|
+
}
|
|
908
|
+
/** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
|
|
909
|
+
static fromAffine(ap) {
|
|
910
|
+
const { x, y } = ap;
|
|
911
|
+
return x === 0n && y === 0n ? I : new Point(x, y, 1n);
|
|
912
|
+
}
|
|
913
|
+
/** Convert Uint8Array or hex string to Point. */
|
|
914
|
+
static fromBytes(bytes) {
|
|
915
|
+
abytes(bytes);
|
|
916
|
+
const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
|
|
917
|
+
let p = undefined;
|
|
918
|
+
const length = bytes.length;
|
|
919
|
+
const head = bytes[0];
|
|
920
|
+
const tail = bytes.subarray(1);
|
|
921
|
+
const x = sliceBytesNumBE(tail, 0, L);
|
|
922
|
+
// SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
|
|
923
|
+
// infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
|
|
924
|
+
// and public-key validation helpers, so strict handling applies to all callers by default.
|
|
925
|
+
// Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
|
|
926
|
+
// Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
|
|
927
|
+
if (length === comp && (head === 0x02 || head === 0x03)) {
|
|
928
|
+
// Equation is y² == x³ + ax + b. We calculate y from x.
|
|
929
|
+
// lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
|
|
930
|
+
let y = lift_x(x);
|
|
931
|
+
if (head === 0x03)
|
|
932
|
+
y = M(-y);
|
|
933
|
+
p = new Point(x, y, 1n);
|
|
687
934
|
}
|
|
935
|
+
// Uncompressed 65-byte point, 0x04 prefix
|
|
936
|
+
if (length === uncomp && head === 0x04)
|
|
937
|
+
p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
|
|
938
|
+
// Validate point
|
|
939
|
+
return p ? p.assertValidity() : err('bad point: not on curve');
|
|
688
940
|
}
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
function decodeBase64(data) {
|
|
692
|
-
const bufferLength = getDecodeBase64Length(data);
|
|
693
|
-
const len = data.length;
|
|
694
|
-
const bytes = new Uint8Array(bufferLength);
|
|
695
|
-
let p = 0;
|
|
696
|
-
for (let i = 0; i < len; i += 4) {
|
|
697
|
-
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
698
|
-
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
699
|
-
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
700
|
-
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
701
|
-
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
702
|
-
p += 1;
|
|
703
|
-
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
704
|
-
p += 1;
|
|
705
|
-
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
706
|
-
p += 1;
|
|
941
|
+
static fromHex(hex) {
|
|
942
|
+
return Point.fromBytes(hexToBytes(hex));
|
|
707
943
|
}
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
944
|
+
get x() {
|
|
945
|
+
return this.toAffine().x;
|
|
946
|
+
}
|
|
947
|
+
get y() {
|
|
948
|
+
return this.toAffine().y;
|
|
949
|
+
}
|
|
950
|
+
/** Equality check: compare points P&Q. */
|
|
951
|
+
equals(other) {
|
|
952
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
953
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
|
|
954
|
+
const X1Z2 = M(X1 * Z2);
|
|
955
|
+
const X2Z1 = M(X2 * Z1);
|
|
956
|
+
const Y1Z2 = M(Y1 * Z2);
|
|
957
|
+
const Y2Z1 = M(Y2 * Z1);
|
|
958
|
+
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
959
|
+
}
|
|
960
|
+
is0() {
|
|
961
|
+
return this.equals(I);
|
|
962
|
+
}
|
|
963
|
+
/** Flip point over y coordinate. */
|
|
964
|
+
negate() {
|
|
965
|
+
return new Point(this.X, M(-this.Y), this.Z);
|
|
966
|
+
}
|
|
967
|
+
/** Point doubling: P+P, complete formula. */
|
|
968
|
+
double() {
|
|
969
|
+
return this.add(this);
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Point addition: P+Q, complete, exception-free formula
|
|
973
|
+
* (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
|
|
974
|
+
* Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
|
|
975
|
+
*/
|
|
976
|
+
// prettier-ignore
|
|
977
|
+
add(other) {
|
|
978
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
979
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
|
|
980
|
+
const a = 0n;
|
|
981
|
+
const b = _b;
|
|
982
|
+
let X3 = 0n, Y3 = 0n, Z3 = 0n;
|
|
983
|
+
const b3 = M(b * 3n);
|
|
984
|
+
let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
|
|
985
|
+
let t4 = M(X2 + Y2); // step 5
|
|
986
|
+
t3 = M(t3 * t4);
|
|
987
|
+
t4 = M(t0 + t1);
|
|
988
|
+
t3 = M(t3 - t4);
|
|
989
|
+
t4 = M(X1 + Z1);
|
|
990
|
+
let t5 = M(X2 + Z2); // step 10
|
|
991
|
+
t4 = M(t4 * t5);
|
|
992
|
+
t5 = M(t0 + t2);
|
|
993
|
+
t4 = M(t4 - t5);
|
|
994
|
+
t5 = M(Y1 + Z1);
|
|
995
|
+
X3 = M(Y2 + Z2); // step 15
|
|
996
|
+
t5 = M(t5 * X3);
|
|
997
|
+
X3 = M(t1 + t2);
|
|
998
|
+
t5 = M(t5 - X3);
|
|
999
|
+
Z3 = M(a * t4);
|
|
1000
|
+
X3 = M(b3 * t2); // step 20
|
|
1001
|
+
Z3 = M(X3 + Z3);
|
|
1002
|
+
X3 = M(t1 - Z3);
|
|
1003
|
+
Z3 = M(t1 + Z3);
|
|
1004
|
+
Y3 = M(X3 * Z3);
|
|
1005
|
+
t1 = M(t0 + t0); // step 25
|
|
1006
|
+
t1 = M(t1 + t0);
|
|
1007
|
+
t2 = M(a * t2);
|
|
1008
|
+
t4 = M(b3 * t4);
|
|
1009
|
+
t1 = M(t1 + t2);
|
|
1010
|
+
t2 = M(t0 - t2); // step 30
|
|
1011
|
+
t2 = M(a * t2);
|
|
1012
|
+
t4 = M(t4 + t2);
|
|
1013
|
+
t0 = M(t1 * t4);
|
|
1014
|
+
Y3 = M(Y3 + t0);
|
|
1015
|
+
t0 = M(t5 * t4); // step 35
|
|
1016
|
+
X3 = M(t3 * X3);
|
|
1017
|
+
X3 = M(X3 - t0);
|
|
1018
|
+
t0 = M(t3 * t1);
|
|
1019
|
+
Z3 = M(t5 * Z3);
|
|
1020
|
+
Z3 = M(Z3 + t0); // step 40
|
|
1021
|
+
return new Point(X3, Y3, Z3);
|
|
1022
|
+
}
|
|
1023
|
+
subtract(other) {
|
|
1024
|
+
return this.add(apoint(other).negate());
|
|
1025
|
+
}
|
|
1026
|
+
/**
|
|
1027
|
+
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
1028
|
+
* Uses {@link wNAF} for base point.
|
|
1029
|
+
* Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
|
|
1030
|
+
* @param n scalar by which point is multiplied
|
|
1031
|
+
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
1032
|
+
*/
|
|
1033
|
+
multiply(n, safe = true) {
|
|
1034
|
+
// Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
|
|
1035
|
+
if (!safe && n === 0n)
|
|
1036
|
+
return I;
|
|
1037
|
+
FnIsValidNot0(n);
|
|
1038
|
+
if (n === 1n)
|
|
1039
|
+
return this;
|
|
1040
|
+
if (this.equals(G))
|
|
1041
|
+
return wNAF(n).p;
|
|
1042
|
+
// init result point & fake point
|
|
1043
|
+
let p = I;
|
|
1044
|
+
let f = G;
|
|
1045
|
+
for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
|
|
1046
|
+
// if bit is present, add to point
|
|
1047
|
+
// if not present, add to fake, for timing safety
|
|
1048
|
+
if (n & 1n)
|
|
1049
|
+
p = p.add(d);
|
|
1050
|
+
else if (safe)
|
|
1051
|
+
f = f.add(d);
|
|
722
1052
|
}
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
yield loadWASMPromise;
|
|
765
|
-
}
|
|
766
|
-
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
767
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
768
|
-
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
769
|
-
});
|
|
770
|
-
const init = (bits = null) => {
|
|
771
|
-
initialized = true;
|
|
772
|
-
wasmInstance.exports.Hash_Init(bits);
|
|
773
|
-
};
|
|
774
|
-
const updateUInt8Array = (data) => {
|
|
775
|
-
let read = 0;
|
|
776
|
-
while (read < data.length) {
|
|
777
|
-
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
778
|
-
read += chunk.length;
|
|
779
|
-
memoryView.set(chunk);
|
|
780
|
-
wasmInstance.exports.Hash_Update(chunk.length);
|
|
781
|
-
}
|
|
782
|
-
};
|
|
783
|
-
const update = (data) => {
|
|
784
|
-
if (!initialized) {
|
|
785
|
-
throw new Error("update() called before init()");
|
|
786
|
-
}
|
|
787
|
-
const Uint8Buffer = getUInt8Buffer(data);
|
|
788
|
-
updateUInt8Array(Uint8Buffer);
|
|
789
|
-
};
|
|
790
|
-
const digestChars = new Uint8Array(hashLength * 2);
|
|
791
|
-
const digest = (outputType, padding = null) => {
|
|
792
|
-
if (!initialized) {
|
|
793
|
-
throw new Error("digest() called before init()");
|
|
794
|
-
}
|
|
795
|
-
initialized = false;
|
|
796
|
-
wasmInstance.exports.Hash_Final(padding);
|
|
797
|
-
if (outputType === "binary") {
|
|
798
|
-
// the data is copied to allow GC of the original memory object
|
|
799
|
-
return memoryView.slice(0, hashLength);
|
|
800
|
-
}
|
|
801
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
802
|
-
};
|
|
803
|
-
const save = () => {
|
|
804
|
-
if (!initialized) {
|
|
805
|
-
throw new Error("save() can only be called after init() and before digest()");
|
|
806
|
-
}
|
|
807
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
808
|
-
const stateLength = getStateSize();
|
|
809
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
810
|
-
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
811
|
-
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
812
|
-
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
813
|
-
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
814
|
-
writeHexToUInt8(prefixedState, binary.hash);
|
|
815
|
-
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
816
|
-
return prefixedState;
|
|
817
|
-
};
|
|
818
|
-
const load = (state) => {
|
|
819
|
-
if (!(state instanceof Uint8Array)) {
|
|
820
|
-
throw new Error("load() expects an Uint8Array generated by save()");
|
|
821
|
-
}
|
|
822
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
823
|
-
const stateLength = getStateSize();
|
|
824
|
-
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
825
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
826
|
-
if (state.length !== overallLength) {
|
|
827
|
-
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
828
|
-
}
|
|
829
|
-
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
830
|
-
throw new Error("This state was written by an incompatible hash implementation");
|
|
831
|
-
}
|
|
832
|
-
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
833
|
-
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
834
|
-
initialized = true;
|
|
835
|
-
};
|
|
836
|
-
const isDataShort = (data) => {
|
|
837
|
-
if (typeof data === "string") {
|
|
838
|
-
// worst case is 4 bytes / char
|
|
839
|
-
return data.length < MAX_HEAP / 4;
|
|
840
|
-
}
|
|
841
|
-
return data.byteLength < MAX_HEAP;
|
|
842
|
-
};
|
|
843
|
-
let canSimplify = isDataShort;
|
|
844
|
-
switch (binary.name) {
|
|
845
|
-
case "argon2":
|
|
846
|
-
case "scrypt":
|
|
847
|
-
canSimplify = () => true;
|
|
848
|
-
break;
|
|
849
|
-
case "blake2b":
|
|
850
|
-
case "blake2s":
|
|
851
|
-
// if there is a key at blake2 then cannot simplify
|
|
852
|
-
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
853
|
-
break;
|
|
854
|
-
case "blake3":
|
|
855
|
-
// if there is a key at blake3 then cannot simplify
|
|
856
|
-
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
857
|
-
break;
|
|
858
|
-
case "xxhash64": // cannot simplify
|
|
859
|
-
case "xxhash3":
|
|
860
|
-
case "xxhash128":
|
|
861
|
-
case "crc64":
|
|
862
|
-
canSimplify = () => false;
|
|
863
|
-
break;
|
|
864
|
-
}
|
|
865
|
-
// shorthand for (init + update + digest) for better performance
|
|
866
|
-
const calculate = (data, initParam = null, digestParam = null) => {
|
|
867
|
-
if (!canSimplify(data, initParam)) {
|
|
868
|
-
init(initParam);
|
|
869
|
-
update(data);
|
|
870
|
-
return digest("hex", digestParam);
|
|
871
|
-
}
|
|
872
|
-
const buffer = getUInt8Buffer(data);
|
|
873
|
-
memoryView.set(buffer);
|
|
874
|
-
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
875
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
876
|
-
};
|
|
877
|
-
yield setupInterface();
|
|
878
|
-
return {
|
|
879
|
-
getMemory,
|
|
880
|
-
writeMemory,
|
|
881
|
-
getExports,
|
|
882
|
-
setMemorySize,
|
|
883
|
-
init,
|
|
884
|
-
update,
|
|
885
|
-
digest,
|
|
886
|
-
save,
|
|
887
|
-
load,
|
|
888
|
-
calculate,
|
|
889
|
-
hashLength,
|
|
890
|
-
};
|
|
891
|
-
});
|
|
1053
|
+
return p;
|
|
1054
|
+
}
|
|
1055
|
+
multiplyUnsafe(scalar) {
|
|
1056
|
+
return this.multiply(scalar, false);
|
|
1057
|
+
}
|
|
1058
|
+
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
1059
|
+
toAffine() {
|
|
1060
|
+
const { X: x, Y: y, Z: z } = this;
|
|
1061
|
+
// fast-paths for ZERO point OR Z=1
|
|
1062
|
+
if (this.equals(I))
|
|
1063
|
+
return { x: 0n, y: 0n };
|
|
1064
|
+
if (z === 1n)
|
|
1065
|
+
return { x, y };
|
|
1066
|
+
const iz = invert(z, P);
|
|
1067
|
+
// (Z * Z^-1) must be 1, otherwise bad math
|
|
1068
|
+
if (M(z * iz) !== 1n)
|
|
1069
|
+
err('inverse invalid');
|
|
1070
|
+
// x = X*Z^-1; y = Y*Z^-1
|
|
1071
|
+
return { x: M(x * iz), y: M(y * iz) };
|
|
1072
|
+
}
|
|
1073
|
+
/** Checks if the point is valid and on-curve. */
|
|
1074
|
+
assertValidity() {
|
|
1075
|
+
const { x, y } = this.toAffine(); // convert to 2d xy affine point.
|
|
1076
|
+
FpIsValidNot0(x); // must be in range 1 <= x,y < P
|
|
1077
|
+
FpIsValidNot0(y);
|
|
1078
|
+
// y² == x³ + ax + b, equation sides must be equal
|
|
1079
|
+
return M(y * y) === koblitz(x) ? this : err('bad point: not on curve');
|
|
1080
|
+
}
|
|
1081
|
+
/** Converts point to 33/65-byte Uint8Array. */
|
|
1082
|
+
toBytes(isCompressed = true) {
|
|
1083
|
+
// Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
|
|
1084
|
+
// out of this byte surface because callers treat these encodings as public keys by default.
|
|
1085
|
+
const { x, y } = this.assertValidity().toAffine();
|
|
1086
|
+
const x32b = numTo32b(x);
|
|
1087
|
+
if (isCompressed)
|
|
1088
|
+
return concatBytes(getPrefix(y), x32b);
|
|
1089
|
+
return concatBytes(u8of(0x04), x32b, numTo32b(y));
|
|
1090
|
+
}
|
|
1091
|
+
toHex(isCompressed) {
|
|
1092
|
+
return bytesToHex(this.toBytes(isCompressed));
|
|
1093
|
+
}
|
|
892
1094
|
}
|
|
893
|
-
|
|
894
|
-
new
|
|
895
|
-
|
|
896
|
-
new
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
1095
|
+
/** Generator / base point */
|
|
1096
|
+
const G = new Point(Gx, Gy, 1n);
|
|
1097
|
+
/** Identity / zero point */
|
|
1098
|
+
const I = new Point(0n, 1n, 0n);
|
|
1099
|
+
// Static aliases
|
|
1100
|
+
Point.BASE = G;
|
|
1101
|
+
Point.ZERO = I;
|
|
1102
|
+
/** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
|
|
1103
|
+
const doubleScalarMulUns = (R, u1, u2) => {
|
|
1104
|
+
return G.multiply(u1, false)
|
|
1105
|
+
.add(R.multiply(u2, false))
|
|
1106
|
+
.assertValidity();
|
|
1107
|
+
};
|
|
1108
|
+
// Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
|
|
1109
|
+
const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
|
|
1110
|
+
// Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
|
|
1111
|
+
const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
|
|
1112
|
+
const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
|
|
1113
|
+
/** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
|
|
1114
|
+
const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
|
|
1115
|
+
/** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
|
|
1116
|
+
const secretKeyToScalar = (secretKey) => {
|
|
1117
|
+
const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
|
|
1118
|
+
return arange(num, 1n, N, 'invalid secret key: outside of range');
|
|
917
1119
|
};
|
|
918
|
-
|
|
919
|
-
new Mutex();
|
|
920
1120
|
/**
|
|
921
|
-
* Creates a
|
|
1121
|
+
* Creates a SEC 1 public key from a 32-byte private key.
|
|
1122
|
+
* @param privKey - 32-byte secret key.
|
|
1123
|
+
* @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
|
|
1124
|
+
* @returns serialized secp256k1 public key in SEC 1 encoding.
|
|
1125
|
+
* @example
|
|
1126
|
+
* Derive the serialized public key for a secp256k1 secret key.
|
|
1127
|
+
* ```ts
|
|
1128
|
+
* import * as secp from '@noble/secp256k1';
|
|
1129
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1130
|
+
* const publicKey = secp.getPublicKey(secretKey);
|
|
1131
|
+
* ```
|
|
922
1132
|
*/
|
|
923
|
-
|
|
924
|
-
return
|
|
925
|
-
wasm.init();
|
|
926
|
-
const obj = {
|
|
927
|
-
init: () => {
|
|
928
|
-
wasm.init();
|
|
929
|
-
return obj;
|
|
930
|
-
},
|
|
931
|
-
update: (data) => {
|
|
932
|
-
wasm.update(data);
|
|
933
|
-
return obj;
|
|
934
|
-
},
|
|
935
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
936
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
937
|
-
save: () => wasm.save(),
|
|
938
|
-
load: (data) => {
|
|
939
|
-
wasm.load(data);
|
|
940
|
-
return obj;
|
|
941
|
-
},
|
|
942
|
-
blockSize: 64,
|
|
943
|
-
digestSize: 20,
|
|
944
|
-
};
|
|
945
|
-
return obj;
|
|
946
|
-
});
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
var name$b = "sha3";
|
|
950
|
-
var data$b = "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";
|
|
951
|
-
var hash$b = "fb24e536";
|
|
952
|
-
var wasmJson$b = {
|
|
953
|
-
name: name$b,
|
|
954
|
-
data: data$b,
|
|
955
|
-
hash: hash$b
|
|
1133
|
+
const getPublicKey = (privKey, isCompressed = true) => {
|
|
1134
|
+
return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
|
|
956
1135
|
};
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
new Mutex();
|
|
961
|
-
function validateBits(bits) {
|
|
962
|
-
if (![224, 256, 384, 512].includes(bits)) {
|
|
963
|
-
return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
|
|
1136
|
+
const isValidSecretKey = (secretKey) => {
|
|
1137
|
+
try {
|
|
1138
|
+
return !!secretKeyToScalar(secretKey);
|
|
964
1139
|
}
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
/**
|
|
968
|
-
* Creates a new Keccak hash instance
|
|
969
|
-
* @param bits Number of output bits. Valid values: 224, 256, 384, 512
|
|
970
|
-
*/
|
|
971
|
-
function createKeccak(bits = 512) {
|
|
972
|
-
if (validateBits(bits)) {
|
|
973
|
-
return Promise.reject(validateBits(bits));
|
|
1140
|
+
catch (error) {
|
|
1141
|
+
return false;
|
|
974
1142
|
}
|
|
975
|
-
const outputSize = bits / 8;
|
|
976
|
-
return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
|
|
977
|
-
wasm.init(bits);
|
|
978
|
-
const obj = {
|
|
979
|
-
init: () => {
|
|
980
|
-
wasm.init(bits);
|
|
981
|
-
return obj;
|
|
982
|
-
},
|
|
983
|
-
update: (data) => {
|
|
984
|
-
wasm.update(data);
|
|
985
|
-
return obj;
|
|
986
|
-
},
|
|
987
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
988
|
-
digest: (outputType) => wasm.digest(outputType, 0x01),
|
|
989
|
-
save: () => wasm.save(),
|
|
990
|
-
load: (data) => {
|
|
991
|
-
wasm.load(data);
|
|
992
|
-
return obj;
|
|
993
|
-
},
|
|
994
|
-
blockSize: 200 - 2 * outputSize,
|
|
995
|
-
digestSize: outputSize,
|
|
996
|
-
};
|
|
997
|
-
return obj;
|
|
998
|
-
});
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
var name$a = "sha256";
|
|
1002
|
-
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=";
|
|
1003
|
-
var hash$a = "8c18dd94";
|
|
1004
|
-
var wasmJson$a = {
|
|
1005
|
-
name: name$a,
|
|
1006
|
-
data: data$a,
|
|
1007
|
-
hash: hash$a
|
|
1008
1143
|
};
|
|
1009
|
-
|
|
1010
|
-
|
|
1144
|
+
const isValidPublicKey = (publicKey, isCompressed) => {
|
|
1145
|
+
const { publicKey: comp, publicKeyUncompressed } = lengths;
|
|
1146
|
+
try {
|
|
1147
|
+
const l = publicKey.length;
|
|
1148
|
+
if (isCompressed === true && l !== comp)
|
|
1149
|
+
return false;
|
|
1150
|
+
if (isCompressed === false && l !== publicKeyUncompressed)
|
|
1151
|
+
return false;
|
|
1152
|
+
return !!Point.fromBytes(publicKey);
|
|
1153
|
+
}
|
|
1154
|
+
catch (error) {
|
|
1155
|
+
return false;
|
|
1156
|
+
}
|
|
1157
|
+
};
|
|
1158
|
+
const _sha = 'SHA-256';
|
|
1011
1159
|
/**
|
|
1012
|
-
*
|
|
1160
|
+
* Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
|
|
1161
|
+
* All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
|
|
1162
|
+
* providers still return exact 32-byte Uint8Array digests.
|
|
1163
|
+
* @example
|
|
1164
|
+
* Provide sync hash helpers before calling the synchronous signing API.
|
|
1165
|
+
* ```ts
|
|
1166
|
+
* import * as secp from '@noble/secp256k1';
|
|
1167
|
+
* import { hmac } from '@noble/hashes/hmac.js';
|
|
1168
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1169
|
+
* secp.hashes.sha256 = sha256;
|
|
1170
|
+
* secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
|
|
1171
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1172
|
+
* const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
|
|
1173
|
+
* ```
|
|
1013
1174
|
*/
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
const
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
},
|
|
1026
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1027
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
1028
|
-
save: () => wasm.save(),
|
|
1029
|
-
load: (data) => {
|
|
1030
|
-
wasm.load(data);
|
|
1031
|
-
return obj;
|
|
1032
|
-
},
|
|
1033
|
-
blockSize: 64,
|
|
1034
|
-
digestSize: 28,
|
|
1035
|
-
};
|
|
1036
|
-
return obj;
|
|
1037
|
-
});
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
new Mutex();
|
|
1175
|
+
const hashes = {
|
|
1176
|
+
hmacSha256Async: async (key, message) => {
|
|
1177
|
+
const s = subtle();
|
|
1178
|
+
const name = 'HMAC';
|
|
1179
|
+
const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
|
|
1180
|
+
return u8n(await s.sign(name, k, message));
|
|
1181
|
+
},
|
|
1182
|
+
hmacSha256: undefined,
|
|
1183
|
+
sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
|
|
1184
|
+
sha256: undefined,
|
|
1185
|
+
};
|
|
1041
1186
|
/**
|
|
1042
|
-
*
|
|
1187
|
+
* Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
|
|
1188
|
+
* Result is **NOT hashed** and returns the serialized shared point (compressed by default),
|
|
1189
|
+
* not the SEC 1 x-only primitive `z = x_P`.
|
|
1190
|
+
* secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
|
|
1191
|
+
* @param secretKeyA - local 32-byte secret key.
|
|
1192
|
+
* @param publicKeyB - peer public key.
|
|
1193
|
+
* @param isCompressed - return 33-byte compressed output when `true`.
|
|
1194
|
+
* @returns shared secret point bytes.
|
|
1195
|
+
* @example
|
|
1196
|
+
* Derive a shared secp256k1 secret with ECDH.
|
|
1197
|
+
* ```ts
|
|
1198
|
+
* import * as secp from '@noble/secp256k1';
|
|
1199
|
+
* const alice = secp.utils.randomSecretKey();
|
|
1200
|
+
* const bob = secp.utils.randomSecretKey();
|
|
1201
|
+
* const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
|
|
1202
|
+
* ```
|
|
1043
1203
|
*/
|
|
1044
|
-
|
|
1045
|
-
return
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
digestSize: 32,
|
|
1065
|
-
};
|
|
1066
|
-
return obj;
|
|
1067
|
-
});
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
var name$9 = "sha512";
|
|
1071
|
-
var data$9 = "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";
|
|
1072
|
-
var hash$9 = "f2e40eb1";
|
|
1073
|
-
var wasmJson$9 = {
|
|
1074
|
-
name: name$9,
|
|
1075
|
-
data: data$9,
|
|
1076
|
-
hash: hash$9
|
|
1204
|
+
const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
|
|
1205
|
+
return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
|
|
1206
|
+
};
|
|
1207
|
+
// FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
|
|
1208
|
+
// The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
|
|
1209
|
+
const randomSecretKey = (seed) => {
|
|
1210
|
+
seed = seed === undefined ? randomBytes(lengths.seed) : seed;
|
|
1211
|
+
abytes(seed);
|
|
1212
|
+
// Keep the public range text aligned with the enforced 48-byte FIPS floor.
|
|
1213
|
+
if (seed.length < lengths.seed || seed.length > 1024)
|
|
1214
|
+
return err('expected 48-1024b', RangeError);
|
|
1215
|
+
const num = M(bytesToNumBE(seed), N - 1n);
|
|
1216
|
+
return numTo32b(num + 1n);
|
|
1217
|
+
};
|
|
1218
|
+
const createKeygen = (getPublicKey) => (seed) => {
|
|
1219
|
+
const secretKey = randomSecretKey(seed);
|
|
1220
|
+
return {
|
|
1221
|
+
secretKey,
|
|
1222
|
+
publicKey: getPublicKey(secretKey),
|
|
1223
|
+
};
|
|
1077
1224
|
};
|
|
1078
|
-
|
|
1079
|
-
new Mutex();
|
|
1080
1225
|
/**
|
|
1081
|
-
*
|
|
1226
|
+
* Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
|
|
1227
|
+
* @example
|
|
1228
|
+
* Convert bytes to a hex string with the low-level helper namespace.
|
|
1229
|
+
* ```ts
|
|
1230
|
+
* import { etc } from '@noble/secp256k1';
|
|
1231
|
+
* const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
|
|
1232
|
+
* ```
|
|
1082
1233
|
*/
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
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: 128,
|
|
1103
|
-
digestSize: 48,
|
|
1104
|
-
};
|
|
1105
|
-
return obj;
|
|
1106
|
-
});
|
|
1107
|
-
}
|
|
1108
|
-
|
|
1109
|
-
new Mutex();
|
|
1234
|
+
const etc = /* @__PURE__ */ Object.freeze({
|
|
1235
|
+
hexToBytes,
|
|
1236
|
+
bytesToHex,
|
|
1237
|
+
concatBytes,
|
|
1238
|
+
bytesToNumberBE: bytesToNumBE,
|
|
1239
|
+
numberToBytesBE: numTo32b,
|
|
1240
|
+
mod: M,
|
|
1241
|
+
invert: invert, // math utilities; keep public alias type aligned with runtime
|
|
1242
|
+
randomBytes,
|
|
1243
|
+
secretKeyToScalar: secretKeyToScalar,
|
|
1244
|
+
abytes: abytes,
|
|
1245
|
+
});
|
|
1110
1246
|
/**
|
|
1111
|
-
*
|
|
1247
|
+
* Curve-specific key utilities.
|
|
1248
|
+
* @example
|
|
1249
|
+
* Generate a fresh secret key and derive its public key.
|
|
1250
|
+
* ```ts
|
|
1251
|
+
* import * as secp from '@noble/secp256k1';
|
|
1252
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1253
|
+
* const publicKey = secp.getPublicKey(secretKey);
|
|
1254
|
+
* ```
|
|
1112
1255
|
*/
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
return obj;
|
|
1131
|
-
},
|
|
1132
|
-
blockSize: 128,
|
|
1133
|
-
digestSize: 64,
|
|
1134
|
-
};
|
|
1135
|
-
return obj;
|
|
1136
|
-
});
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
new Mutex();
|
|
1140
|
-
|
|
1141
|
-
new Mutex();
|
|
1142
|
-
|
|
1143
|
-
new Mutex();
|
|
1144
|
-
|
|
1145
|
-
new Mutex();
|
|
1146
|
-
|
|
1147
|
-
var name$4 = "ripemd160";
|
|
1148
|
-
var data$4 = "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";
|
|
1149
|
-
var hash$4 = "6abbce74";
|
|
1150
|
-
var wasmJson$4 = {
|
|
1151
|
-
name: name$4,
|
|
1152
|
-
data: data$4,
|
|
1153
|
-
hash: hash$4
|
|
1256
|
+
const utils$2 = /* @__PURE__ */ Object.freeze({
|
|
1257
|
+
isValidSecretKey: isValidSecretKey,
|
|
1258
|
+
isValidPublicKey: isValidPublicKey,
|
|
1259
|
+
randomSecretKey: randomSecretKey, // preserve the optional seeded call
|
|
1260
|
+
});
|
|
1261
|
+
// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
|
|
1262
|
+
// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
1263
|
+
// Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
|
|
1264
|
+
const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
|
|
1265
|
+
const T_AUX = 'aux';
|
|
1266
|
+
const T_NONCE = 'nonce';
|
|
1267
|
+
const T_CHALLENGE = 'challenge';
|
|
1268
|
+
// Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
|
|
1269
|
+
// wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
|
|
1270
|
+
const taggedHash = (tag, ...messages) => {
|
|
1271
|
+
const tagH = gh('sha256', getTag(tag));
|
|
1272
|
+
return gh('sha256', concatBytes(tagH, tagH, ...messages));
|
|
1154
1273
|
};
|
|
1155
|
-
|
|
1156
|
-
|
|
1274
|
+
// Async twin of taggedHash with the same checked provider boundary.
|
|
1275
|
+
const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
|
|
1276
|
+
// BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
|
|
1277
|
+
// d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
|
|
1278
|
+
const extpubSchnorr = (priv) => {
|
|
1279
|
+
const d_ = secretKeyToScalar(priv);
|
|
1280
|
+
const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
|
|
1281
|
+
const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
|
|
1282
|
+
const d = isEven(y) ? d_ : modN(-d_);
|
|
1283
|
+
const px = numTo32b(x);
|
|
1284
|
+
return { d, px };
|
|
1285
|
+
};
|
|
1286
|
+
const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
|
|
1287
|
+
const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
|
|
1288
|
+
const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
|
|
1289
|
+
/** Schnorr public key is just `x` coordinate of Point as per BIP340. */
|
|
1290
|
+
const pubSchnorr = (secretKey) => {
|
|
1291
|
+
return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
|
|
1292
|
+
};
|
|
1293
|
+
const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
|
|
1294
|
+
// Common preparation fn for both sync and async signing
|
|
1295
|
+
const prepSigSchnorr = (message, secretKey, auxRand) => {
|
|
1296
|
+
const { px, d } = extpubSchnorr(secretKey);
|
|
1297
|
+
return { m: abytes(message), px, d, a: abytes(auxRand, L) };
|
|
1298
|
+
};
|
|
1299
|
+
const extractK = (rand) => {
|
|
1300
|
+
const k_ = bytesModN(rand); // Let k' = int(rand) mod n
|
|
1301
|
+
if (k_ === 0n)
|
|
1302
|
+
err('sign failed: k is zero'); // Fail if k' = 0.
|
|
1303
|
+
const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
|
|
1304
|
+
return { rx: px, k: d };
|
|
1305
|
+
};
|
|
1306
|
+
// Common signature creation helper
|
|
1307
|
+
const createSigSchnorr = (k, px, e, d) => {
|
|
1308
|
+
return concatBytes(px, numTo32b(modN(k + e * d)));
|
|
1309
|
+
};
|
|
1310
|
+
const E_INVSIG = 'invalid signature produced';
|
|
1157
1311
|
/**
|
|
1158
|
-
* Creates
|
|
1312
|
+
* Creates Schnorr signature as per BIP340. Verifies itself before returning anything.
|
|
1313
|
+
* auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
|
|
1314
|
+
* k generation, so bad CSPRNG won't be the only entropy source.
|
|
1159
1315
|
*/
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
});
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1316
|
+
const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
|
|
1317
|
+
const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
|
|
1318
|
+
const aux = taggedHash(T_AUX, a);
|
|
1319
|
+
// Let t be the byte-wise xor of bytes(d) and hash/aux(a)
|
|
1320
|
+
const t = numTo32b(d ^ bytesToNumBE(aux));
|
|
1321
|
+
// Let rand = hash/nonce(t || bytes(P) || m)
|
|
1322
|
+
const rand = taggedHash(T_NONCE, t, px, m);
|
|
1323
|
+
const { rx, k } = extractK(rand);
|
|
1324
|
+
// Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
|
|
1325
|
+
const e = challenge(rx, px, m);
|
|
1326
|
+
const sig = createSigSchnorr(k, rx, e, d);
|
|
1327
|
+
// If Verify(bytes(P), m, sig) (see below) returns failure, abort
|
|
1328
|
+
if (!verifySchnorr(sig, m, px))
|
|
1329
|
+
err(E_INVSIG);
|
|
1330
|
+
return sig;
|
|
1331
|
+
};
|
|
1332
|
+
const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
|
|
1333
|
+
const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
|
|
1334
|
+
const aux = await taggedHashAsync(T_AUX, a);
|
|
1335
|
+
// Let t be the byte-wise xor of bytes(d) and hash/aux(a)
|
|
1336
|
+
const t = numTo32b(d ^ bytesToNumBE(aux));
|
|
1337
|
+
// Let rand = hash/nonce(t || bytes(P) || m)
|
|
1338
|
+
const rand = await taggedHashAsync(T_NONCE, t, px, m);
|
|
1339
|
+
const { rx, k } = extractK(rand);
|
|
1340
|
+
// Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
|
|
1341
|
+
const e = await challengeAsync(rx, px, m);
|
|
1342
|
+
const sig = createSigSchnorr(k, rx, e, d);
|
|
1343
|
+
// If Verify(bytes(P), m, sig) (see below) returns failure, abort
|
|
1344
|
+
if (!(await verifySchnorrAsync(sig, m, px)))
|
|
1345
|
+
err(E_INVSIG);
|
|
1346
|
+
return sig;
|
|
1347
|
+
};
|
|
1348
|
+
const callSyncAsyncFn = (res, later) => {
|
|
1349
|
+
return res instanceof Promise ? res.then(later) : later(res);
|
|
1350
|
+
};
|
|
1351
|
+
const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
|
|
1352
|
+
const sig = abytes(signature, L2, 'signature');
|
|
1353
|
+
const msg = abytes(message, undefined, 'message');
|
|
1354
|
+
const pub = abytes(publicKey, L, 'publicKey');
|
|
1355
|
+
try {
|
|
1356
|
+
// lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
|
|
1357
|
+
// Fail if x ≥ p. Let c = x³ + 7 mod p.
|
|
1358
|
+
const x = bytesToNumBE(pub);
|
|
1359
|
+
const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
|
|
1360
|
+
const P_ = new Point(x, y, 1n).assertValidity();
|
|
1361
|
+
const px = numTo32b(P_.toAffine().x);
|
|
1362
|
+
// P = lift_x(int(pk)); fail if that fails
|
|
1363
|
+
const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
|
|
1364
|
+
arange(r, 1n, P);
|
|
1365
|
+
const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
|
|
1366
|
+
// Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
|
|
1367
|
+
// s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
|
|
1368
|
+
// crafted edge cases and fail closed instead of carrying that extra verification surface.
|
|
1369
|
+
arange(s, 1n, N);
|
|
1370
|
+
const i = concatBytes(numTo32b(r), px, msg);
|
|
1371
|
+
// int(challenge(bytes(r)||bytes(P)||m))%n
|
|
1372
|
+
return callSyncAsyncFn(challengeFn(i), (e) => {
|
|
1373
|
+
const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
|
|
1374
|
+
if (!isEven(y) || x !== r)
|
|
1375
|
+
return false; // -eP == (n-e)P
|
|
1376
|
+
return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
|
|
1377
|
+
});
|
|
1194
1378
|
}
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
function calculateHmac(hasher, key) {
|
|
1198
|
-
hasher.init();
|
|
1199
|
-
const { blockSize } = hasher;
|
|
1200
|
-
const keyBuf = calculateKeyBuffer(hasher, key);
|
|
1201
|
-
const keyBuffer = new Uint8Array(blockSize);
|
|
1202
|
-
keyBuffer.set(keyBuf);
|
|
1203
|
-
const opad = new Uint8Array(blockSize);
|
|
1204
|
-
for (let i = 0; i < blockSize; i++) {
|
|
1205
|
-
const v = keyBuffer[i];
|
|
1206
|
-
opad[i] = v ^ 0x5c;
|
|
1207
|
-
keyBuffer[i] = v ^ 0x36;
|
|
1379
|
+
catch (error) {
|
|
1380
|
+
return false;
|
|
1208
1381
|
}
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
return obj;
|
|
1219
|
-
},
|
|
1220
|
-
digest: ((outputType) => {
|
|
1221
|
-
const uintArr = hasher.digest("binary");
|
|
1222
|
-
hasher.init();
|
|
1223
|
-
hasher.update(opad);
|
|
1224
|
-
hasher.update(uintArr);
|
|
1225
|
-
return hasher.digest(outputType);
|
|
1226
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1227
|
-
}),
|
|
1228
|
-
save: () => {
|
|
1229
|
-
throw new Error("save() not supported");
|
|
1230
|
-
},
|
|
1231
|
-
load: () => {
|
|
1232
|
-
throw new Error("load() not supported");
|
|
1233
|
-
},
|
|
1234
|
-
blockSize: hasher.blockSize,
|
|
1235
|
-
digestSize: hasher.digestSize,
|
|
1236
|
-
};
|
|
1237
|
-
return obj;
|
|
1238
|
-
}
|
|
1239
|
-
/**
|
|
1240
|
-
* Calculates HMAC hash
|
|
1241
|
-
* @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
|
|
1242
|
-
* @param key Key (string, Buffer or TypedArray)
|
|
1243
|
-
*/
|
|
1244
|
-
function createHMAC(hash, key) {
|
|
1245
|
-
if (!hash || !hash.then) {
|
|
1246
|
-
throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
|
|
1247
|
-
}
|
|
1248
|
-
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
1249
|
-
}
|
|
1250
|
-
|
|
1251
|
-
new Mutex();
|
|
1252
|
-
|
|
1253
|
-
new Mutex();
|
|
1254
|
-
|
|
1255
|
-
const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
|
|
1256
|
-
|
|
1257
|
-
const { subtle: subtle$1 } = crypto;
|
|
1258
|
-
|
|
1382
|
+
};
|
|
1383
|
+
/** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
|
|
1384
|
+
* after the initial byte checks. */
|
|
1385
|
+
const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
|
|
1386
|
+
/** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
|
|
1387
|
+
* become false, but async backend failures reject the promise. Missing crypto.subtle is a
|
|
1388
|
+
* runtime/backend error, not an "invalid signature" result, so we surface it instead of
|
|
1389
|
+
* turning it into false. */
|
|
1390
|
+
const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
|
|
1259
1391
|
/**
|
|
1260
|
-
*
|
|
1261
|
-
*
|
|
1262
|
-
*
|
|
1392
|
+
* BIP340 Schnorr helpers over secp256k1.
|
|
1393
|
+
* @example
|
|
1394
|
+
* Sign and verify a BIP340 Schnorr signature.
|
|
1395
|
+
* ```ts
|
|
1396
|
+
* import * as secp from '@noble/secp256k1';
|
|
1397
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1398
|
+
* secp.hashes.sha256 = sha256;
|
|
1399
|
+
* const secretKey = secp.utils.randomSecretKey();
|
|
1400
|
+
* const message = new Uint8Array([1, 2, 3]);
|
|
1401
|
+
* const sig = secp.schnorr.sign(message, secretKey);
|
|
1402
|
+
* const publicKey = secp.schnorr.getPublicKey(secretKey);
|
|
1403
|
+
* const isValid = secp.schnorr.verify(sig, message, publicKey);
|
|
1263
1404
|
* ```
|
|
1264
|
-
* @param {Uint8Array} data
|
|
1265
|
-
* @param {string} algorithm
|
|
1266
|
-
* @returns Uint8Array
|
|
1267
1405
|
*/
|
|
1268
|
-
const
|
|
1269
|
-
|
|
1406
|
+
const schnorr = /* @__PURE__ */ Object.freeze({
|
|
1407
|
+
keygen: keygenSchnorr,
|
|
1408
|
+
getPublicKey: pubSchnorr,
|
|
1409
|
+
sign: signSchnorr,
|
|
1410
|
+
verify: verifySchnorr,
|
|
1411
|
+
signAsync: signSchnorrAsync,
|
|
1412
|
+
verifyAsync: verifySchnorrAsync,
|
|
1413
|
+
});
|
|
1414
|
+
// ## Precomputes
|
|
1415
|
+
// --------------
|
|
1416
|
+
const W = 8; // W is window size
|
|
1417
|
+
const scalarBits = 256;
|
|
1418
|
+
const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
|
|
1419
|
+
const pwindowSize = 2 ** (W - 1); // 128 for W=8
|
|
1420
|
+
const precompute = () => {
|
|
1421
|
+
const points = [];
|
|
1422
|
+
let p = G;
|
|
1423
|
+
let b = p;
|
|
1424
|
+
for (let w = 0; w < pwindows; w++) {
|
|
1425
|
+
b = p;
|
|
1426
|
+
points.push(b);
|
|
1427
|
+
for (let i = 1; i < pwindowSize; i++) {
|
|
1428
|
+
b = b.add(p);
|
|
1429
|
+
points.push(b);
|
|
1430
|
+
} // i=1, bc we skip 0
|
|
1431
|
+
p = b.double();
|
|
1432
|
+
}
|
|
1433
|
+
return points;
|
|
1434
|
+
};
|
|
1435
|
+
let Gpows = undefined; // precomputes for base point G
|
|
1436
|
+
// Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
|
|
1437
|
+
const ctneg = (cnd, p) => {
|
|
1438
|
+
const n = p.negate();
|
|
1439
|
+
return cnd ? n : p;
|
|
1440
|
+
};
|
|
1270
1441
|
/**
|
|
1271
|
-
*
|
|
1272
|
-
*
|
|
1273
|
-
*
|
|
1274
|
-
*
|
|
1275
|
-
*
|
|
1276
|
-
*
|
|
1277
|
-
*
|
|
1278
|
-
*
|
|
1442
|
+
* Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
|
|
1443
|
+
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
1444
|
+
* Any time `G.multiply` is done, precomputes are used.
|
|
1445
|
+
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
1446
|
+
*
|
|
1447
|
+
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
1448
|
+
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
1449
|
+
*
|
|
1450
|
+
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
1279
1451
|
*/
|
|
1280
|
-
const
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1452
|
+
const wNAF = (n) => {
|
|
1453
|
+
const comp = Gpows || (Gpows = precompute());
|
|
1454
|
+
let p = I;
|
|
1455
|
+
let f = G; // f must be G, or could become I in the end
|
|
1456
|
+
const pow_2_w = 2 ** W; // 256 for W=8
|
|
1457
|
+
const maxNum = pow_2_w; // 256 for W=8
|
|
1458
|
+
const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
|
|
1459
|
+
const shiftBy = big(W); // 8 for W=8
|
|
1460
|
+
for (let w = 0; w < pwindows; w++) {
|
|
1461
|
+
let wbits = Number(n & mask); // extract W bits.
|
|
1462
|
+
n >>= shiftBy; // shift number by W bits.
|
|
1463
|
+
// We use negative indexes to reduce size of precomputed table by 2x.
|
|
1464
|
+
// Instead of needing precomputes 0..256, we only calculate them for 0..128.
|
|
1465
|
+
// If an index > 128 is found, we do (256-index) - where 256 is next window.
|
|
1466
|
+
// Naive: index +127 => 127, +224 => 224
|
|
1467
|
+
// Optimized: index +127 => 127, +224 => 256-32
|
|
1468
|
+
if (wbits > pwindowSize) {
|
|
1469
|
+
wbits -= maxNum;
|
|
1470
|
+
n += 1n;
|
|
1471
|
+
}
|
|
1472
|
+
const off = w * pwindowSize;
|
|
1473
|
+
const offF = off; // offsets, evaluate both
|
|
1474
|
+
const offP = off + Math.abs(wbits) - 1;
|
|
1475
|
+
const isEven = w % 2 !== 0; // conditions, evaluate both
|
|
1476
|
+
const isNeg = wbits < 0;
|
|
1477
|
+
if (wbits === 0) {
|
|
1478
|
+
// off == I: can't add it. Adding random offF instead.
|
|
1479
|
+
f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
|
|
1480
|
+
}
|
|
1481
|
+
else {
|
|
1482
|
+
p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
if (n !== 0n)
|
|
1486
|
+
err('invalid wnaf');
|
|
1487
|
+
return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
|
|
1285
1488
|
};
|
|
1286
1489
|
|
|
1287
|
-
const
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1490
|
+
const leofcoinOlivia = {
|
|
1491
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
1492
|
+
version: 1,
|
|
1493
|
+
pubKeyHash: 0x73, // o
|
|
1494
|
+
scriptHash: 0x76, // p
|
|
1495
|
+
multiTxHash: 0x8b4125, // omtx
|
|
1496
|
+
payments: {
|
|
1497
|
+
version: 0,
|
|
1498
|
+
unspent: 0x1fa443d7 // ounsp
|
|
1295
1499
|
},
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1500
|
+
wif: 0x7D, // s
|
|
1501
|
+
multiCodec: 0x7c4,
|
|
1502
|
+
bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
|
|
1299
1503
|
};
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
let index = 0;
|
|
1317
|
-
for (const source of input) {
|
|
1318
|
-
typedArray.set(source, currentIndex);
|
|
1319
|
-
if (options.seperator && input.length - 1 > index) {
|
|
1320
|
-
typedArray.set(options.seperator, currentIndex + source.length);
|
|
1321
|
-
currentIndex+= options.seperator.length;
|
|
1322
|
-
}
|
|
1323
|
-
currentIndex += source.length;
|
|
1324
|
-
index += 1;
|
|
1325
|
-
}
|
|
1326
|
-
|
|
1327
|
-
return typedArray
|
|
1504
|
+
const bitcoinTestnet = {
|
|
1505
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
1506
|
+
version: 1,
|
|
1507
|
+
bech32: 'tb',
|
|
1508
|
+
pubKeyHash: 0x6f,
|
|
1509
|
+
scriptHash: 0xc4,
|
|
1510
|
+
wif: 0xef,
|
|
1511
|
+
bip32: {
|
|
1512
|
+
public: 0x043587cf,
|
|
1513
|
+
private: 0x04358394
|
|
1514
|
+
},
|
|
1515
|
+
multiCodec: 0
|
|
1516
|
+
};
|
|
1517
|
+
var testnets = {
|
|
1518
|
+
'leofcoin:olivia': leofcoinOlivia,
|
|
1519
|
+
'bitcoin:testnet': bitcoinTestnet
|
|
1328
1520
|
};
|
|
1329
1521
|
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
const encode$1 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
1335
|
-
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
1336
|
-
throw new TypeError('Expected Uint8Array');
|
|
1337
|
-
}
|
|
1338
|
-
const hash = await concatAndDoubleHash([
|
|
1339
|
-
prefix,
|
|
1340
|
-
source
|
|
1341
|
-
]);
|
|
1342
|
-
const uint8Array = typedArrayConcat([
|
|
1343
|
-
prefix,
|
|
1344
|
-
source,
|
|
1345
|
-
hash.subarray(0, 4)
|
|
1346
|
-
]);
|
|
1347
|
-
if (hex)
|
|
1348
|
-
return base58$1.encodeHex(uint8Array);
|
|
1349
|
-
return base58$1.encode(uint8Array);
|
|
1350
|
-
};
|
|
1351
|
-
const decode$2 = async (string, hex) => {
|
|
1352
|
-
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
1353
|
-
const prefix = uint8Array.subarray(0, 2);
|
|
1354
|
-
const source = uint8Array.subarray(2, -4);
|
|
1355
|
-
const hash = await concatAndDoubleHash([
|
|
1356
|
-
prefix,
|
|
1357
|
-
source
|
|
1358
|
-
]);
|
|
1359
|
-
let index = 0;
|
|
1360
|
-
const slice = uint8Array.subarray(-4);
|
|
1361
|
-
for (const check of slice) {
|
|
1362
|
-
if (check !== hash[index]) {
|
|
1363
|
-
throw new Error('Invalid checksum');
|
|
1364
|
-
}
|
|
1365
|
-
index++;
|
|
1366
|
-
}
|
|
1367
|
-
return { prefix, data: source };
|
|
1368
|
-
};
|
|
1369
|
-
const isBase58check = (string, hex) => {
|
|
1370
|
-
try {
|
|
1371
|
-
hex ? decode$2(string, true) : decode$2(string);
|
|
1372
|
-
return true;
|
|
1373
|
-
}
|
|
1374
|
-
catch (e) {
|
|
1375
|
-
return false;
|
|
1376
|
-
}
|
|
1377
|
-
};
|
|
1378
|
-
const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$1(uint8Array, prefix, true);
|
|
1379
|
-
const decodeHex = (string) => decode$2(string, true);
|
|
1380
|
-
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
1381
|
-
var base58check = { encode: encode$1, decode: decode$2, encodeHex, decodeHex, isBase58check, isBase58checkHex };
|
|
1382
|
-
|
|
1383
|
-
const decode$1 = (multiWif, expectedVersion, expectedCodec) => {
|
|
1384
|
-
const decoded = base58$1.decode(multiWif);
|
|
1385
|
-
let [version, codec, privateKey] = index$1(decoded);
|
|
1386
|
-
version = Number(new TextDecoder().decode(version));
|
|
1387
|
-
codec = Number(new TextDecoder().decode(codec));
|
|
1388
|
-
if (expectedVersion && version !== expectedVersion)
|
|
1389
|
-
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
1390
|
-
if (expectedCodec && codec !== expectedCodec)
|
|
1391
|
-
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
1392
|
-
return { version, codec, privateKey };
|
|
1393
|
-
};
|
|
1394
|
-
var index = {
|
|
1395
|
-
encode: (version, codec, privateKey) => {
|
|
1396
|
-
return base58$1.encode(index$2([
|
|
1397
|
-
new TextEncoder().encode(version.toString()),
|
|
1398
|
-
new TextEncoder().encode(codec.toString()),
|
|
1399
|
-
privateKey
|
|
1400
|
-
]));
|
|
1401
|
-
},
|
|
1402
|
-
decode: decode$1,
|
|
1403
|
-
isMultiWif: (multiWif) => {
|
|
1404
|
-
try {
|
|
1405
|
-
const { version, codec, privateKey } = decode$1(multiWif);
|
|
1406
|
-
if (version === undefined)
|
|
1407
|
-
return false;
|
|
1408
|
-
if (codec === undefined)
|
|
1409
|
-
return false;
|
|
1410
|
-
if (privateKey === undefined)
|
|
1411
|
-
return false;
|
|
1412
|
-
if (privateKey && privateKey.length !== 32)
|
|
1413
|
-
return false;
|
|
1414
|
-
}
|
|
1415
|
-
catch {
|
|
1416
|
-
return false;
|
|
1417
|
-
}
|
|
1418
|
-
return true;
|
|
1419
|
-
}
|
|
1420
|
-
};
|
|
1421
|
-
|
|
1422
|
-
/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
|
|
1423
|
-
/**
|
|
1424
|
-
* 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
|
|
1425
|
-
* Compliant with RFC6979 & BIP340.
|
|
1426
|
-
* @module
|
|
1427
|
-
*/
|
|
1522
|
+
// https://en.bitcoin.it/wiki/List_of_address_prefixes
|
|
1523
|
+
// usage:
|
|
1524
|
+
// networks['bitcoin']['testnet']
|
|
1525
|
+
// networks.bitcoin.testnet
|
|
1428
1526
|
/**
|
|
1429
|
-
*
|
|
1430
|
-
*
|
|
1431
|
-
* `y² == x³ + ax + b`.
|
|
1432
|
-
* * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
|
|
1433
|
-
* * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
|
|
1434
|
-
* * h = `1n` // cofactor
|
|
1435
|
-
* * a = `0n` // equation param
|
|
1436
|
-
* * b = `7n` // equation param
|
|
1437
|
-
* * Gx, Gy are coordinates of Generator / base point
|
|
1527
|
+
* Main network
|
|
1528
|
+
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
1438
1529
|
*/
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
|
|
1455
|
-
const lengths = {
|
|
1456
|
-
publicKey: L + 1,
|
|
1457
|
-
publicKeyUncompressed: L2 + 1,
|
|
1458
|
-
// 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
|
|
1459
|
-
// 352-bit recommendation for 256-bit prime curves.
|
|
1460
|
-
seed: L + L / 2,
|
|
1461
|
-
};
|
|
1462
|
-
// Helpers and Precomputes sections are reused between libraries
|
|
1463
|
-
// ## Helpers
|
|
1464
|
-
// ----------
|
|
1465
|
-
const err = (message = '', E = Error) => {
|
|
1466
|
-
const e = new E(message);
|
|
1467
|
-
const { captureStackTrace } = Error;
|
|
1468
|
-
if (typeof captureStackTrace === 'function')
|
|
1469
|
-
captureStackTrace(e, err);
|
|
1470
|
-
throw e;
|
|
1471
|
-
};
|
|
1472
|
-
// Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
|
|
1473
|
-
// fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
|
|
1474
|
-
// spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
|
|
1475
|
-
const isBytes = (a) => a instanceof Uint8Array ||
|
|
1476
|
-
(ArrayBuffer.isView(a) &&
|
|
1477
|
-
a.constructor.name === 'Uint8Array' &&
|
|
1478
|
-
a.BYTES_PER_ELEMENT === 1);
|
|
1479
|
-
/** Asserts something is Bytes. */
|
|
1480
|
-
const abytes = (value, length, title = '') => {
|
|
1481
|
-
const bytes = isBytes(value);
|
|
1482
|
-
const len = value?.length;
|
|
1483
|
-
const needsLen = length !== undefined;
|
|
1484
|
-
if (!bytes || (needsLen && len !== length)) {
|
|
1485
|
-
const prefix = title && `"${title}" `;
|
|
1486
|
-
const ofLen = needsLen ? ` of length ${length}` : '';
|
|
1487
|
-
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
1488
|
-
const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
|
|
1489
|
-
return bytes ? err(msg, RangeError) : err(msg, TypeError);
|
|
1490
|
-
}
|
|
1491
|
-
return value;
|
|
1530
|
+
const leofcoin = {
|
|
1531
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
1532
|
+
version: 1,
|
|
1533
|
+
pubKeyHash: 0x30, // L
|
|
1534
|
+
scriptHash: 0x37, // P
|
|
1535
|
+
multiTxHash: 0x3adeed, // Lmtx
|
|
1536
|
+
payments: {
|
|
1537
|
+
version: 0,
|
|
1538
|
+
unspent: 0x0d6e0327 // Lunsp
|
|
1539
|
+
},
|
|
1540
|
+
coin_type: 640,
|
|
1541
|
+
wif: 0x3F, // S
|
|
1542
|
+
multiCodec: 0x3c4,
|
|
1543
|
+
bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
|
|
1544
|
+
testnet: testnets['leofcoin:olivia']
|
|
1492
1545
|
};
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1546
|
+
const bitcoin = {
|
|
1547
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
1548
|
+
version: 1,
|
|
1549
|
+
bech32: 'bc',
|
|
1550
|
+
pubKeyHash: 0x00,
|
|
1551
|
+
multiCodec: 0x00,
|
|
1552
|
+
scriptHash: 0x05,
|
|
1553
|
+
wif: 0x80,
|
|
1554
|
+
coin_type: 0,
|
|
1555
|
+
bip32: {
|
|
1556
|
+
public: 0x0488b21e, private: 0x0488ade4
|
|
1557
|
+
},
|
|
1558
|
+
testnet: testnets['bitcoin:testnet']
|
|
1503
1559
|
};
|
|
1504
|
-
const
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
:
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
const al = hl / 2;
|
|
1517
|
-
if (hl % 2)
|
|
1518
|
-
return err(e);
|
|
1519
|
-
const array = u8n(al);
|
|
1520
|
-
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
1521
|
-
// treat each char as ASCII
|
|
1522
|
-
const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
|
|
1523
|
-
const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
|
|
1524
|
-
if (n1 === undefined || n2 === undefined)
|
|
1525
|
-
return err(e);
|
|
1526
|
-
array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
|
|
1527
|
-
}
|
|
1528
|
-
return array;
|
|
1560
|
+
const litecoin = {
|
|
1561
|
+
messagePrefix: '\x19Litecoin Signed Message:\n',
|
|
1562
|
+
version: 1,
|
|
1563
|
+
pubKeyHash: 0x30,
|
|
1564
|
+
scriptHash: 0x32,
|
|
1565
|
+
wif: 0xb0,
|
|
1566
|
+
bip32: {
|
|
1567
|
+
public: 0x019da462,
|
|
1568
|
+
private: 0x019d9cfe
|
|
1569
|
+
},
|
|
1570
|
+
bech32: '',
|
|
1571
|
+
multiCodec: 0
|
|
1529
1572
|
};
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
return r;
|
|
1573
|
+
const ethereum = {
|
|
1574
|
+
messagePrefix: '\x19Ethereum Signed Message:\n',
|
|
1575
|
+
version: 1,
|
|
1576
|
+
pubKeyHash: 0x30,
|
|
1577
|
+
scriptHash: 0x32,
|
|
1578
|
+
bip32: {
|
|
1579
|
+
private: 0x0488ADE4, public: 0x0488B21E
|
|
1580
|
+
},
|
|
1581
|
+
coin_type: 60,
|
|
1582
|
+
wif: 0x45, //E
|
|
1583
|
+
multiCodec: 0x3c5
|
|
1542
1584
|
};
|
|
1543
1585
|
/**
|
|
1544
|
-
*
|
|
1545
|
-
*
|
|
1586
|
+
* Our & supported networks
|
|
1587
|
+
* @return {leofcoin, olivia}
|
|
1546
1588
|
*/
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
if (min <= n && n < max)
|
|
1553
|
-
return n;
|
|
1554
|
-
return err(msg, RangeError);
|
|
1555
|
-
};
|
|
1556
|
-
/** Canonical modular reduction. Callers must provide a positive modulus. */
|
|
1557
|
-
const M = (a, b = P) => {
|
|
1558
|
-
const r = a % b;
|
|
1559
|
-
return r >= 0n ? r : b + r;
|
|
1560
|
-
};
|
|
1561
|
-
const modN = (a) => M(a, N);
|
|
1562
|
-
/** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
|
|
1563
|
-
// prettier-ignore
|
|
1564
|
-
const invert = (num, md) => {
|
|
1565
|
-
if (num === 0n || md <= 0n)
|
|
1566
|
-
err('no inverse n=' + num + ' mod=' + md);
|
|
1567
|
-
let a = M(num, md), b = md, x = 0n, u = 1n;
|
|
1568
|
-
while (a !== 0n) {
|
|
1569
|
-
const q = b / a, r = b % a;
|
|
1570
|
-
const m = x - u * q;
|
|
1571
|
-
b = a, a = r, x = u, u = m;
|
|
1572
|
-
}
|
|
1573
|
-
return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point
|
|
1574
|
-
};
|
|
1575
|
-
const callHash = (name) => {
|
|
1576
|
-
// @ts-ignore
|
|
1577
|
-
const fn = hashes[name];
|
|
1578
|
-
if (typeof fn !== 'function')
|
|
1579
|
-
err('hashes.' + name + ' not set');
|
|
1580
|
-
return fn;
|
|
1589
|
+
var networks = {
|
|
1590
|
+
leofcoin,
|
|
1591
|
+
bitcoin,
|
|
1592
|
+
litecoin,
|
|
1593
|
+
ethereum
|
|
1581
1594
|
};
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
const apoint = (p) => (p instanceof Point ? p : err('Point expected'));
|
|
1588
|
-
// ## End of Helpers
|
|
1589
|
-
// -----------------
|
|
1590
|
-
/**
|
|
1591
|
-
* secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
|
|
1592
|
-
* making it x³+b; callers validate x first.
|
|
1593
|
-
*/
|
|
1594
|
-
const koblitz = (x) => M(M(x * x) * x + _b);
|
|
1595
|
-
/** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
|
|
1596
|
-
const FpIsValid = (n) => arange(n, 0n, P);
|
|
1597
|
-
/** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
|
|
1598
|
-
const FpIsValidNot0 = (n) => arange(n, 1n, P);
|
|
1599
|
-
/** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
|
|
1600
|
-
const FnIsValidNot0 = (n) => arange(n, 1n, N);
|
|
1601
|
-
// Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
|
|
1602
|
-
const isEven = (y) => !(y & 1n);
|
|
1603
|
-
/** create Uint8Array of byte n */
|
|
1604
|
-
const u8of = (n) => Uint8Array.of(n);
|
|
1605
|
-
/** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
|
|
1606
|
-
const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
|
|
1607
|
-
/** lift_x from BIP340 returns the unique even square root for x³+7.
|
|
1608
|
-
* SEC 1 callers still flip it for the odd-prefix branch. */
|
|
1609
|
-
const lift_x = (x) => {
|
|
1610
|
-
// Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
|
|
1611
|
-
const c = koblitz(FpIsValidNot0(x));
|
|
1612
|
-
// r = √c candidate
|
|
1613
|
-
// r = c^((p+1)/4) mod p
|
|
1614
|
-
// This formula works for fields p = 3 mod 4 -- a special, fast case.
|
|
1615
|
-
// Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
|
|
1616
|
-
let r = 1n;
|
|
1617
|
-
for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
|
|
1618
|
-
// powMod: modular exponentiation.
|
|
1619
|
-
if (e & 1n)
|
|
1620
|
-
r = (r * num) % P; // Uses exponentiation by squaring.
|
|
1621
|
-
num = (num * num) % P; // Not constant-time.
|
|
1622
|
-
}
|
|
1623
|
-
if (M(r * r) !== c)
|
|
1624
|
-
err('sqrt invalid'); // check if result is valid
|
|
1625
|
-
return isEven(r) ? r : M(-r);
|
|
1626
|
-
};
|
|
1627
|
-
/**
|
|
1628
|
-
* Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
|
|
1629
|
-
* @param X - X coordinate.
|
|
1630
|
-
* @param Y - Y coordinate.
|
|
1631
|
-
* @param Z - projective Z coordinate.
|
|
1632
|
-
* @example
|
|
1633
|
-
* Do point arithmetic with the base point and encode the result as hex.
|
|
1634
|
-
* ```ts
|
|
1635
|
-
* import { Point } from '@noble/secp256k1';
|
|
1636
|
-
* const hex = Point.BASE.double().toHex();
|
|
1637
|
-
* ```
|
|
1595
|
+
|
|
1596
|
+
/*!
|
|
1597
|
+
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
|
|
1598
|
+
* (c) Dani Biro
|
|
1599
|
+
* @license MIT
|
|
1638
1600
|
*/
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1601
|
+
|
|
1602
|
+
|
|
1603
|
+
/******************************************************************************
|
|
1604
|
+
Copyright (c) Microsoft Corporation.
|
|
1605
|
+
|
|
1606
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
1607
|
+
purpose with or without fee is hereby granted.
|
|
1608
|
+
|
|
1609
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
1610
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
1611
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
1612
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
1613
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
1614
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
1615
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
1616
|
+
***************************************************************************** */
|
|
1617
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
1621
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
1622
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
1623
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
1624
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
1625
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
1626
|
+
step((generator = generator.apply(thisArg, [])).next());
|
|
1627
|
+
});
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
1631
|
+
var e = new Error(message);
|
|
1632
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
1633
|
+
};
|
|
1634
|
+
|
|
1635
|
+
class Mutex {
|
|
1636
|
+
constructor() {
|
|
1637
|
+
this.mutex = Promise.resolve();
|
|
1661
1638
|
}
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
const head = bytes[0];
|
|
1669
|
-
const tail = bytes.subarray(1);
|
|
1670
|
-
const x = sliceBytesNumBE(tail, 0, L);
|
|
1671
|
-
// SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
|
|
1672
|
-
// infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
|
|
1673
|
-
// and public-key validation helpers, so strict handling applies to all callers by default.
|
|
1674
|
-
// Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
|
|
1675
|
-
// Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
|
|
1676
|
-
if (length === comp && (head === 0x02 || head === 0x03)) {
|
|
1677
|
-
// Equation is y² == x³ + ax + b. We calculate y from x.
|
|
1678
|
-
// lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
|
|
1679
|
-
let y = lift_x(x);
|
|
1680
|
-
if (head === 0x03)
|
|
1681
|
-
y = M(-y);
|
|
1682
|
-
p = new Point(x, y, 1n);
|
|
1683
|
-
}
|
|
1684
|
-
// Uncompressed 65-byte point, 0x04 prefix
|
|
1685
|
-
if (length === uncomp && head === 0x04)
|
|
1686
|
-
p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
|
|
1687
|
-
// Validate point
|
|
1688
|
-
return p ? p.assertValidity() : err('bad point: not on curve');
|
|
1639
|
+
lock() {
|
|
1640
|
+
let begin = () => { };
|
|
1641
|
+
this.mutex = this.mutex.then(() => new Promise(begin));
|
|
1642
|
+
return new Promise((res) => {
|
|
1643
|
+
begin = res;
|
|
1644
|
+
});
|
|
1689
1645
|
}
|
|
1690
|
-
|
|
1691
|
-
return
|
|
1646
|
+
dispatch(fn) {
|
|
1647
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1648
|
+
const unlock = yield this.lock();
|
|
1649
|
+
try {
|
|
1650
|
+
return yield Promise.resolve(fn());
|
|
1651
|
+
}
|
|
1652
|
+
finally {
|
|
1653
|
+
unlock();
|
|
1654
|
+
}
|
|
1655
|
+
});
|
|
1692
1656
|
}
|
|
1693
|
-
|
|
1694
|
-
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
var _a;
|
|
1660
|
+
function getGlobal() {
|
|
1661
|
+
if (typeof globalThis !== "undefined")
|
|
1662
|
+
return globalThis;
|
|
1663
|
+
if (typeof self !== "undefined")
|
|
1664
|
+
return self;
|
|
1665
|
+
if (typeof window !== "undefined")
|
|
1666
|
+
return window;
|
|
1667
|
+
return global;
|
|
1668
|
+
}
|
|
1669
|
+
const globalObject = getGlobal();
|
|
1670
|
+
const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
|
|
1671
|
+
const textEncoder = globalObject.TextEncoder
|
|
1672
|
+
? new globalObject.TextEncoder()
|
|
1673
|
+
: null;
|
|
1674
|
+
function hexCharCodesToInt(a, b) {
|
|
1675
|
+
return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
|
|
1676
|
+
((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
|
|
1677
|
+
}
|
|
1678
|
+
function writeHexToUInt8(buf, str) {
|
|
1679
|
+
const size = str.length >> 1;
|
|
1680
|
+
for (let i = 0; i < size; i++) {
|
|
1681
|
+
const index = i << 1;
|
|
1682
|
+
buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
|
|
1695
1683
|
}
|
|
1696
|
-
|
|
1697
|
-
|
|
1684
|
+
}
|
|
1685
|
+
function hexStringEqualsUInt8(str, buf) {
|
|
1686
|
+
if (str.length !== buf.length * 2) {
|
|
1687
|
+
return false;
|
|
1698
1688
|
}
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
const Y1Z2 = M(Y1 * Z2);
|
|
1706
|
-
const Y2Z1 = M(Y2 * Z1);
|
|
1707
|
-
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
1689
|
+
for (let i = 0; i < buf.length; i++) {
|
|
1690
|
+
const strIndex = i << 1;
|
|
1691
|
+
if (buf[i] !==
|
|
1692
|
+
hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
|
|
1693
|
+
return false;
|
|
1694
|
+
}
|
|
1708
1695
|
}
|
|
1709
|
-
|
|
1710
|
-
|
|
1696
|
+
return true;
|
|
1697
|
+
}
|
|
1698
|
+
const alpha = "a".charCodeAt(0) - 10;
|
|
1699
|
+
const digit = "0".charCodeAt(0);
|
|
1700
|
+
function getDigestHex(tmpBuffer, input, hashLength) {
|
|
1701
|
+
let p = 0;
|
|
1702
|
+
for (let i = 0; i < hashLength; i++) {
|
|
1703
|
+
let nibble = input[i] >>> 4;
|
|
1704
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
1705
|
+
nibble = input[i] & 0xf;
|
|
1706
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
1711
1707
|
}
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1708
|
+
return String.fromCharCode.apply(null, tmpBuffer);
|
|
1709
|
+
}
|
|
1710
|
+
const getUInt8Buffer = nodeBuffer !== null
|
|
1711
|
+
? (data) => {
|
|
1712
|
+
if (typeof data === "string") {
|
|
1713
|
+
const buf = nodeBuffer.from(data, "utf8");
|
|
1714
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
1715
|
+
}
|
|
1716
|
+
if (nodeBuffer.isBuffer(data)) {
|
|
1717
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.length);
|
|
1718
|
+
}
|
|
1719
|
+
if (ArrayBuffer.isView(data)) {
|
|
1720
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
1721
|
+
}
|
|
1722
|
+
throw new Error("Invalid data type!");
|
|
1715
1723
|
}
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
t4 = M(X1 + Z1);
|
|
1739
|
-
let t5 = M(X2 + Z2); // step 10
|
|
1740
|
-
t4 = M(t4 * t5);
|
|
1741
|
-
t5 = M(t0 + t2);
|
|
1742
|
-
t4 = M(t4 - t5);
|
|
1743
|
-
t5 = M(Y1 + Z1);
|
|
1744
|
-
X3 = M(Y2 + Z2); // step 15
|
|
1745
|
-
t5 = M(t5 * X3);
|
|
1746
|
-
X3 = M(t1 + t2);
|
|
1747
|
-
t5 = M(t5 - X3);
|
|
1748
|
-
Z3 = M(a * t4);
|
|
1749
|
-
X3 = M(b3 * t2); // step 20
|
|
1750
|
-
Z3 = M(X3 + Z3);
|
|
1751
|
-
X3 = M(t1 - Z3);
|
|
1752
|
-
Z3 = M(t1 + Z3);
|
|
1753
|
-
Y3 = M(X3 * Z3);
|
|
1754
|
-
t1 = M(t0 + t0); // step 25
|
|
1755
|
-
t1 = M(t1 + t0);
|
|
1756
|
-
t2 = M(a * t2);
|
|
1757
|
-
t4 = M(b3 * t4);
|
|
1758
|
-
t1 = M(t1 + t2);
|
|
1759
|
-
t2 = M(t0 - t2); // step 30
|
|
1760
|
-
t2 = M(a * t2);
|
|
1761
|
-
t4 = M(t4 + t2);
|
|
1762
|
-
t0 = M(t1 * t4);
|
|
1763
|
-
Y3 = M(Y3 + t0);
|
|
1764
|
-
t0 = M(t5 * t4); // step 35
|
|
1765
|
-
X3 = M(t3 * X3);
|
|
1766
|
-
X3 = M(X3 - t0);
|
|
1767
|
-
t0 = M(t3 * t1);
|
|
1768
|
-
Z3 = M(t5 * Z3);
|
|
1769
|
-
Z3 = M(Z3 + t0); // step 40
|
|
1770
|
-
return new Point(X3, Y3, Z3);
|
|
1771
|
-
}
|
|
1772
|
-
subtract(other) {
|
|
1773
|
-
return this.add(apoint(other).negate());
|
|
1774
|
-
}
|
|
1775
|
-
/**
|
|
1776
|
-
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
1777
|
-
* Uses {@link wNAF} for base point.
|
|
1778
|
-
* Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
|
|
1779
|
-
* @param n scalar by which point is multiplied
|
|
1780
|
-
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
1781
|
-
*/
|
|
1782
|
-
multiply(n, safe = true) {
|
|
1783
|
-
// Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
|
|
1784
|
-
if (!safe && n === 0n)
|
|
1785
|
-
return I;
|
|
1786
|
-
FnIsValidNot0(n);
|
|
1787
|
-
if (n === 1n)
|
|
1788
|
-
return this;
|
|
1789
|
-
if (this.equals(G))
|
|
1790
|
-
return wNAF(n).p;
|
|
1791
|
-
// init result point & fake point
|
|
1792
|
-
let p = I;
|
|
1793
|
-
let f = G;
|
|
1794
|
-
for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
|
|
1795
|
-
// if bit is present, add to point
|
|
1796
|
-
// if not present, add to fake, for timing safety
|
|
1797
|
-
if (n & 1n)
|
|
1798
|
-
p = p.add(d);
|
|
1799
|
-
else if (safe)
|
|
1800
|
-
f = f.add(d);
|
|
1801
|
-
}
|
|
1802
|
-
return p;
|
|
1803
|
-
}
|
|
1804
|
-
multiplyUnsafe(scalar) {
|
|
1805
|
-
return this.multiply(scalar, false);
|
|
1806
|
-
}
|
|
1807
|
-
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
1808
|
-
toAffine() {
|
|
1809
|
-
const { X: x, Y: y, Z: z } = this;
|
|
1810
|
-
// fast-paths for ZERO point OR Z=1
|
|
1811
|
-
if (this.equals(I))
|
|
1812
|
-
return { x: 0n, y: 0n };
|
|
1813
|
-
if (z === 1n)
|
|
1814
|
-
return { x, y };
|
|
1815
|
-
const iz = invert(z, P);
|
|
1816
|
-
// (Z * Z^-1) must be 1, otherwise bad math
|
|
1817
|
-
if (M(z * iz) !== 1n)
|
|
1818
|
-
err('inverse invalid');
|
|
1819
|
-
// x = X*Z^-1; y = Y*Z^-1
|
|
1820
|
-
return { x: M(x * iz), y: M(y * iz) };
|
|
1821
|
-
}
|
|
1822
|
-
/** Checks if the point is valid and on-curve. */
|
|
1823
|
-
assertValidity() {
|
|
1824
|
-
const { x, y } = this.toAffine(); // convert to 2d xy affine point.
|
|
1825
|
-
FpIsValidNot0(x); // must be in range 1 <= x,y < P
|
|
1826
|
-
FpIsValidNot0(y);
|
|
1827
|
-
// y² == x³ + ax + b, equation sides must be equal
|
|
1828
|
-
return M(y * y) === koblitz(x) ? this : err('bad point: not on curve');
|
|
1829
|
-
}
|
|
1830
|
-
/** Converts point to 33/65-byte Uint8Array. */
|
|
1831
|
-
toBytes(isCompressed = true) {
|
|
1832
|
-
// Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
|
|
1833
|
-
// out of this byte surface because callers treat these encodings as public keys by default.
|
|
1834
|
-
const { x, y } = this.assertValidity().toAffine();
|
|
1835
|
-
const x32b = numTo32b(x);
|
|
1836
|
-
if (isCompressed)
|
|
1837
|
-
return concatBytes(getPrefix(y), x32b);
|
|
1838
|
-
return concatBytes(u8of(0x04), x32b, numTo32b(y));
|
|
1839
|
-
}
|
|
1840
|
-
toHex(isCompressed) {
|
|
1841
|
-
return bytesToHex(this.toBytes(isCompressed));
|
|
1724
|
+
: (data) => {
|
|
1725
|
+
if (typeof data === "string") {
|
|
1726
|
+
return textEncoder.encode(data);
|
|
1727
|
+
}
|
|
1728
|
+
if (ArrayBuffer.isView(data)) {
|
|
1729
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
1730
|
+
}
|
|
1731
|
+
throw new Error("Invalid data type!");
|
|
1732
|
+
};
|
|
1733
|
+
const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
1734
|
+
const base64Lookup = new Uint8Array(256);
|
|
1735
|
+
for (let i = 0; i < base64Chars.length; i++) {
|
|
1736
|
+
base64Lookup[base64Chars.charCodeAt(i)] = i;
|
|
1737
|
+
}
|
|
1738
|
+
function getDecodeBase64Length(data) {
|
|
1739
|
+
let bufferLength = Math.floor(data.length * 0.75);
|
|
1740
|
+
const len = data.length;
|
|
1741
|
+
if (data[len - 1] === "=") {
|
|
1742
|
+
bufferLength -= 1;
|
|
1743
|
+
if (data[len - 2] === "=") {
|
|
1744
|
+
bufferLength -= 1;
|
|
1745
|
+
}
|
|
1842
1746
|
}
|
|
1747
|
+
return bufferLength;
|
|
1843
1748
|
}
|
|
1844
|
-
|
|
1845
|
-
const
|
|
1846
|
-
|
|
1847
|
-
const
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
const
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
|
|
1861
|
-
const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
|
|
1862
|
-
/** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
|
|
1863
|
-
const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
|
|
1864
|
-
/** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
|
|
1865
|
-
const secretKeyToScalar = (secretKey) => {
|
|
1866
|
-
const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
|
|
1867
|
-
return arange(num, 1n, N, 'invalid secret key: outside of range');
|
|
1868
|
-
};
|
|
1869
|
-
/**
|
|
1870
|
-
* Creates a SEC 1 public key from a 32-byte private key.
|
|
1871
|
-
* @param privKey - 32-byte secret key.
|
|
1872
|
-
* @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
|
|
1873
|
-
* @returns serialized secp256k1 public key in SEC 1 encoding.
|
|
1874
|
-
* @example
|
|
1875
|
-
* Derive the serialized public key for a secp256k1 secret key.
|
|
1876
|
-
* ```ts
|
|
1877
|
-
* import * as secp from '@noble/secp256k1';
|
|
1878
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
1879
|
-
* const publicKey = secp.getPublicKey(secretKey);
|
|
1880
|
-
* ```
|
|
1881
|
-
*/
|
|
1882
|
-
const getPublicKey = (privKey, isCompressed = true) => {
|
|
1883
|
-
return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
|
|
1884
|
-
};
|
|
1885
|
-
const isValidSecretKey = (secretKey) => {
|
|
1886
|
-
try {
|
|
1887
|
-
return !!secretKeyToScalar(secretKey);
|
|
1888
|
-
}
|
|
1889
|
-
catch (error) {
|
|
1890
|
-
return false;
|
|
1891
|
-
}
|
|
1892
|
-
};
|
|
1893
|
-
const isValidPublicKey = (publicKey, isCompressed) => {
|
|
1894
|
-
const { publicKey: comp, publicKeyUncompressed } = lengths;
|
|
1895
|
-
try {
|
|
1896
|
-
const l = publicKey.length;
|
|
1897
|
-
if (isCompressed === true && l !== comp)
|
|
1898
|
-
return false;
|
|
1899
|
-
if (isCompressed === false && l !== publicKeyUncompressed)
|
|
1900
|
-
return false;
|
|
1901
|
-
return !!Point.fromBytes(publicKey);
|
|
1902
|
-
}
|
|
1903
|
-
catch (error) {
|
|
1904
|
-
return false;
|
|
1749
|
+
function decodeBase64(data) {
|
|
1750
|
+
const bufferLength = getDecodeBase64Length(data);
|
|
1751
|
+
const len = data.length;
|
|
1752
|
+
const bytes = new Uint8Array(bufferLength);
|
|
1753
|
+
let p = 0;
|
|
1754
|
+
for (let i = 0; i < len; i += 4) {
|
|
1755
|
+
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
1756
|
+
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
1757
|
+
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
1758
|
+
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
1759
|
+
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
1760
|
+
p += 1;
|
|
1761
|
+
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
1762
|
+
p += 1;
|
|
1763
|
+
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
1764
|
+
p += 1;
|
|
1905
1765
|
}
|
|
1766
|
+
return bytes;
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
const MAX_HEAP = 16 * 1024;
|
|
1770
|
+
const WASM_FUNC_HASH_LENGTH = 4;
|
|
1771
|
+
const wasmMutex = new Mutex();
|
|
1772
|
+
const wasmModuleCache = new Map();
|
|
1773
|
+
function WASMInterface(binary, hashLength) {
|
|
1774
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1775
|
+
let wasmInstance = null;
|
|
1776
|
+
let memoryView = null;
|
|
1777
|
+
let initialized = false;
|
|
1778
|
+
if (typeof WebAssembly === "undefined") {
|
|
1779
|
+
throw new Error("WebAssembly is not supported in this environment!");
|
|
1780
|
+
}
|
|
1781
|
+
const writeMemory = (data, offset = 0) => {
|
|
1782
|
+
memoryView.set(data, offset);
|
|
1783
|
+
};
|
|
1784
|
+
const getMemory = () => memoryView;
|
|
1785
|
+
const getExports = () => wasmInstance.exports;
|
|
1786
|
+
const setMemorySize = (totalSize) => {
|
|
1787
|
+
wasmInstance.exports.Hash_SetMemorySize(totalSize);
|
|
1788
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
1789
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1790
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
|
|
1791
|
+
};
|
|
1792
|
+
const getStateSize = () => {
|
|
1793
|
+
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
1794
|
+
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
1795
|
+
return stateSize;
|
|
1796
|
+
};
|
|
1797
|
+
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
1798
|
+
if (!wasmModuleCache.has(binary.name)) {
|
|
1799
|
+
const asm = decodeBase64(binary.data);
|
|
1800
|
+
const promise = WebAssembly.compile(asm);
|
|
1801
|
+
wasmModuleCache.set(binary.name, promise);
|
|
1802
|
+
}
|
|
1803
|
+
const module = yield wasmModuleCache.get(binary.name);
|
|
1804
|
+
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
1805
|
+
// env: {
|
|
1806
|
+
// emscripten_memcpy_big: (dest, src, num) => {
|
|
1807
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1808
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
1809
|
+
// memView.set(memView.subarray(src, src + num), dest);
|
|
1810
|
+
// },
|
|
1811
|
+
// print_memory: (offset, len) => {
|
|
1812
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1813
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
1814
|
+
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
1815
|
+
// },
|
|
1816
|
+
// },
|
|
1817
|
+
});
|
|
1818
|
+
// wasmInstance.exports._start();
|
|
1819
|
+
}));
|
|
1820
|
+
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
1821
|
+
if (!wasmInstance) {
|
|
1822
|
+
yield loadWASMPromise;
|
|
1823
|
+
}
|
|
1824
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
1825
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1826
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
1827
|
+
});
|
|
1828
|
+
const init = (bits = null) => {
|
|
1829
|
+
initialized = true;
|
|
1830
|
+
wasmInstance.exports.Hash_Init(bits);
|
|
1831
|
+
};
|
|
1832
|
+
const updateUInt8Array = (data) => {
|
|
1833
|
+
let read = 0;
|
|
1834
|
+
while (read < data.length) {
|
|
1835
|
+
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
1836
|
+
read += chunk.length;
|
|
1837
|
+
memoryView.set(chunk);
|
|
1838
|
+
wasmInstance.exports.Hash_Update(chunk.length);
|
|
1839
|
+
}
|
|
1840
|
+
};
|
|
1841
|
+
const update = (data) => {
|
|
1842
|
+
if (!initialized) {
|
|
1843
|
+
throw new Error("update() called before init()");
|
|
1844
|
+
}
|
|
1845
|
+
const Uint8Buffer = getUInt8Buffer(data);
|
|
1846
|
+
updateUInt8Array(Uint8Buffer);
|
|
1847
|
+
};
|
|
1848
|
+
const digestChars = new Uint8Array(hashLength * 2);
|
|
1849
|
+
const digest = (outputType, padding = null) => {
|
|
1850
|
+
if (!initialized) {
|
|
1851
|
+
throw new Error("digest() called before init()");
|
|
1852
|
+
}
|
|
1853
|
+
initialized = false;
|
|
1854
|
+
wasmInstance.exports.Hash_Final(padding);
|
|
1855
|
+
if (outputType === "binary") {
|
|
1856
|
+
// the data is copied to allow GC of the original memory object
|
|
1857
|
+
return memoryView.slice(0, hashLength);
|
|
1858
|
+
}
|
|
1859
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
1860
|
+
};
|
|
1861
|
+
const save = () => {
|
|
1862
|
+
if (!initialized) {
|
|
1863
|
+
throw new Error("save() can only be called after init() and before digest()");
|
|
1864
|
+
}
|
|
1865
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
1866
|
+
const stateLength = getStateSize();
|
|
1867
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1868
|
+
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
1869
|
+
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
1870
|
+
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
1871
|
+
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
1872
|
+
writeHexToUInt8(prefixedState, binary.hash);
|
|
1873
|
+
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
1874
|
+
return prefixedState;
|
|
1875
|
+
};
|
|
1876
|
+
const load = (state) => {
|
|
1877
|
+
if (!(state instanceof Uint8Array)) {
|
|
1878
|
+
throw new Error("load() expects an Uint8Array generated by save()");
|
|
1879
|
+
}
|
|
1880
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
1881
|
+
const stateLength = getStateSize();
|
|
1882
|
+
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
1883
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
1884
|
+
if (state.length !== overallLength) {
|
|
1885
|
+
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
1886
|
+
}
|
|
1887
|
+
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
1888
|
+
throw new Error("This state was written by an incompatible hash implementation");
|
|
1889
|
+
}
|
|
1890
|
+
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
1891
|
+
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
1892
|
+
initialized = true;
|
|
1893
|
+
};
|
|
1894
|
+
const isDataShort = (data) => {
|
|
1895
|
+
if (typeof data === "string") {
|
|
1896
|
+
// worst case is 4 bytes / char
|
|
1897
|
+
return data.length < MAX_HEAP / 4;
|
|
1898
|
+
}
|
|
1899
|
+
return data.byteLength < MAX_HEAP;
|
|
1900
|
+
};
|
|
1901
|
+
let canSimplify = isDataShort;
|
|
1902
|
+
switch (binary.name) {
|
|
1903
|
+
case "argon2":
|
|
1904
|
+
case "scrypt":
|
|
1905
|
+
canSimplify = () => true;
|
|
1906
|
+
break;
|
|
1907
|
+
case "blake2b":
|
|
1908
|
+
case "blake2s":
|
|
1909
|
+
// if there is a key at blake2 then cannot simplify
|
|
1910
|
+
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
1911
|
+
break;
|
|
1912
|
+
case "blake3":
|
|
1913
|
+
// if there is a key at blake3 then cannot simplify
|
|
1914
|
+
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
1915
|
+
break;
|
|
1916
|
+
case "xxhash64": // cannot simplify
|
|
1917
|
+
case "xxhash3":
|
|
1918
|
+
case "xxhash128":
|
|
1919
|
+
case "crc64":
|
|
1920
|
+
canSimplify = () => false;
|
|
1921
|
+
break;
|
|
1922
|
+
}
|
|
1923
|
+
// shorthand for (init + update + digest) for better performance
|
|
1924
|
+
const calculate = (data, initParam = null, digestParam = null) => {
|
|
1925
|
+
if (!canSimplify(data, initParam)) {
|
|
1926
|
+
init(initParam);
|
|
1927
|
+
update(data);
|
|
1928
|
+
return digest("hex", digestParam);
|
|
1929
|
+
}
|
|
1930
|
+
const buffer = getUInt8Buffer(data);
|
|
1931
|
+
memoryView.set(buffer);
|
|
1932
|
+
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
1933
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
1934
|
+
};
|
|
1935
|
+
yield setupInterface();
|
|
1936
|
+
return {
|
|
1937
|
+
getMemory,
|
|
1938
|
+
writeMemory,
|
|
1939
|
+
getExports,
|
|
1940
|
+
setMemorySize,
|
|
1941
|
+
init,
|
|
1942
|
+
update,
|
|
1943
|
+
digest,
|
|
1944
|
+
save,
|
|
1945
|
+
load,
|
|
1946
|
+
calculate,
|
|
1947
|
+
hashLength,
|
|
1948
|
+
};
|
|
1949
|
+
});
|
|
1950
|
+
}
|
|
1951
|
+
|
|
1952
|
+
new Mutex();
|
|
1953
|
+
|
|
1954
|
+
new Mutex();
|
|
1955
|
+
|
|
1956
|
+
new Mutex();
|
|
1957
|
+
|
|
1958
|
+
new Mutex();
|
|
1959
|
+
|
|
1960
|
+
new Mutex();
|
|
1961
|
+
|
|
1962
|
+
new Mutex();
|
|
1963
|
+
|
|
1964
|
+
new Mutex();
|
|
1965
|
+
|
|
1966
|
+
new Mutex();
|
|
1967
|
+
|
|
1968
|
+
var name$c = "sha1";
|
|
1969
|
+
var data$c = "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";
|
|
1970
|
+
var hash$c = "6b530c24";
|
|
1971
|
+
var wasmJson$c = {
|
|
1972
|
+
name: name$c,
|
|
1973
|
+
data: data$c,
|
|
1974
|
+
hash: hash$c
|
|
1906
1975
|
};
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
* Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
|
|
1910
|
-
* All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
|
|
1911
|
-
* providers still return exact 32-byte Uint8Array digests.
|
|
1912
|
-
* @example
|
|
1913
|
-
* Provide sync hash helpers before calling the synchronous signing API.
|
|
1914
|
-
* ```ts
|
|
1915
|
-
* import * as secp from '@noble/secp256k1';
|
|
1916
|
-
* import { hmac } from '@noble/hashes/hmac.js';
|
|
1917
|
-
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
1918
|
-
* secp.hashes.sha256 = sha256;
|
|
1919
|
-
* secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
|
|
1920
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
1921
|
-
* const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
|
|
1922
|
-
* ```
|
|
1923
|
-
*/
|
|
1924
|
-
const hashes = {
|
|
1925
|
-
hmacSha256Async: async (key, message) => {
|
|
1926
|
-
const s = subtle();
|
|
1927
|
-
const name = 'HMAC';
|
|
1928
|
-
const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
|
|
1929
|
-
return u8n(await s.sign(name, k, message));
|
|
1930
|
-
},
|
|
1931
|
-
hmacSha256: undefined,
|
|
1932
|
-
sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
|
|
1933
|
-
sha256: undefined,
|
|
1934
|
-
};
|
|
1935
|
-
/**
|
|
1936
|
-
* Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
|
|
1937
|
-
* Result is **NOT hashed** and returns the serialized shared point (compressed by default),
|
|
1938
|
-
* not the SEC 1 x-only primitive `z = x_P`.
|
|
1939
|
-
* secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
|
|
1940
|
-
* @param secretKeyA - local 32-byte secret key.
|
|
1941
|
-
* @param publicKeyB - peer public key.
|
|
1942
|
-
* @param isCompressed - return 33-byte compressed output when `true`.
|
|
1943
|
-
* @returns shared secret point bytes.
|
|
1944
|
-
* @example
|
|
1945
|
-
* Derive a shared secp256k1 secret with ECDH.
|
|
1946
|
-
* ```ts
|
|
1947
|
-
* import * as secp from '@noble/secp256k1';
|
|
1948
|
-
* const alice = secp.utils.randomSecretKey();
|
|
1949
|
-
* const bob = secp.utils.randomSecretKey();
|
|
1950
|
-
* const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
|
|
1951
|
-
* ```
|
|
1952
|
-
*/
|
|
1953
|
-
const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
|
|
1954
|
-
return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
|
|
1955
|
-
};
|
|
1956
|
-
// FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
|
|
1957
|
-
// The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
|
|
1958
|
-
const randomSecretKey = (seed) => {
|
|
1959
|
-
seed = seed === undefined ? randomBytes(lengths.seed) : seed;
|
|
1960
|
-
abytes(seed);
|
|
1961
|
-
// Keep the public range text aligned with the enforced 48-byte FIPS floor.
|
|
1962
|
-
if (seed.length < lengths.seed || seed.length > 1024)
|
|
1963
|
-
return err('expected 48-1024b', RangeError);
|
|
1964
|
-
const num = M(bytesToNumBE(seed), N - 1n);
|
|
1965
|
-
return numTo32b(num + 1n);
|
|
1966
|
-
};
|
|
1967
|
-
const createKeygen = (getPublicKey) => (seed) => {
|
|
1968
|
-
const secretKey = randomSecretKey(seed);
|
|
1969
|
-
return {
|
|
1970
|
-
secretKey,
|
|
1971
|
-
publicKey: getPublicKey(secretKey),
|
|
1972
|
-
};
|
|
1973
|
-
};
|
|
1974
|
-
/**
|
|
1975
|
-
* Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
|
|
1976
|
-
* @example
|
|
1977
|
-
* Convert bytes to a hex string with the low-level helper namespace.
|
|
1978
|
-
* ```ts
|
|
1979
|
-
* import { etc } from '@noble/secp256k1';
|
|
1980
|
-
* const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
|
|
1981
|
-
* ```
|
|
1982
|
-
*/
|
|
1983
|
-
const etc = /* @__PURE__ */ Object.freeze({
|
|
1984
|
-
hexToBytes,
|
|
1985
|
-
bytesToHex,
|
|
1986
|
-
concatBytes,
|
|
1987
|
-
bytesToNumberBE: bytesToNumBE,
|
|
1988
|
-
numberToBytesBE: numTo32b,
|
|
1989
|
-
mod: M,
|
|
1990
|
-
invert: invert, // math utilities; keep public alias type aligned with runtime
|
|
1991
|
-
randomBytes,
|
|
1992
|
-
secretKeyToScalar: secretKeyToScalar,
|
|
1993
|
-
abytes: abytes,
|
|
1994
|
-
});
|
|
1995
|
-
/**
|
|
1996
|
-
* Curve-specific key utilities.
|
|
1997
|
-
* @example
|
|
1998
|
-
* Generate a fresh secret key and derive its public key.
|
|
1999
|
-
* ```ts
|
|
2000
|
-
* import * as secp from '@noble/secp256k1';
|
|
2001
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
2002
|
-
* const publicKey = secp.getPublicKey(secretKey);
|
|
2003
|
-
* ```
|
|
2004
|
-
*/
|
|
2005
|
-
const utils$2 = /* @__PURE__ */ Object.freeze({
|
|
2006
|
-
isValidSecretKey: isValidSecretKey,
|
|
2007
|
-
isValidPublicKey: isValidPublicKey,
|
|
2008
|
-
randomSecretKey: randomSecretKey, // preserve the optional seeded call
|
|
2009
|
-
});
|
|
2010
|
-
// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
|
|
2011
|
-
// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
2012
|
-
// Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
|
|
2013
|
-
const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
|
|
2014
|
-
const T_AUX = 'aux';
|
|
2015
|
-
const T_NONCE = 'nonce';
|
|
2016
|
-
const T_CHALLENGE = 'challenge';
|
|
2017
|
-
// Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
|
|
2018
|
-
// wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
|
|
2019
|
-
const taggedHash = (tag, ...messages) => {
|
|
2020
|
-
const tagH = gh('sha256', getTag(tag));
|
|
2021
|
-
return gh('sha256', concatBytes(tagH, tagH, ...messages));
|
|
2022
|
-
};
|
|
2023
|
-
// Async twin of taggedHash with the same checked provider boundary.
|
|
2024
|
-
const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
|
|
2025
|
-
// BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
|
|
2026
|
-
// d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
|
|
2027
|
-
const extpubSchnorr = (priv) => {
|
|
2028
|
-
const d_ = secretKeyToScalar(priv);
|
|
2029
|
-
const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
|
|
2030
|
-
const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
|
|
2031
|
-
const d = isEven(y) ? d_ : modN(-d_);
|
|
2032
|
-
const px = numTo32b(x);
|
|
2033
|
-
return { d, px };
|
|
2034
|
-
};
|
|
2035
|
-
const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
|
|
2036
|
-
const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
|
|
2037
|
-
const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
|
|
2038
|
-
/** Schnorr public key is just `x` coordinate of Point as per BIP340. */
|
|
2039
|
-
const pubSchnorr = (secretKey) => {
|
|
2040
|
-
return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
|
|
2041
|
-
};
|
|
2042
|
-
const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
|
|
2043
|
-
// Common preparation fn for both sync and async signing
|
|
2044
|
-
const prepSigSchnorr = (message, secretKey, auxRand) => {
|
|
2045
|
-
const { px, d } = extpubSchnorr(secretKey);
|
|
2046
|
-
return { m: abytes(message), px, d, a: abytes(auxRand, L) };
|
|
2047
|
-
};
|
|
2048
|
-
const extractK = (rand) => {
|
|
2049
|
-
const k_ = bytesModN(rand); // Let k' = int(rand) mod n
|
|
2050
|
-
if (k_ === 0n)
|
|
2051
|
-
err('sign failed: k is zero'); // Fail if k' = 0.
|
|
2052
|
-
const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
|
|
2053
|
-
return { rx: px, k: d };
|
|
2054
|
-
};
|
|
2055
|
-
// Common signature creation helper
|
|
2056
|
-
const createSigSchnorr = (k, px, e, d) => {
|
|
2057
|
-
return concatBytes(px, numTo32b(modN(k + e * d)));
|
|
2058
|
-
};
|
|
2059
|
-
const E_INVSIG = 'invalid signature produced';
|
|
1976
|
+
|
|
1977
|
+
new Mutex();
|
|
2060
1978
|
/**
|
|
2061
|
-
* Creates
|
|
2062
|
-
* auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
|
|
2063
|
-
* k generation, so bad CSPRNG won't be the only entropy source.
|
|
1979
|
+
* Creates a new SHA-1 hash instance
|
|
2064
1980
|
*/
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
return res instanceof Promise ? res.then(later) : later(res);
|
|
2099
|
-
};
|
|
2100
|
-
const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
|
|
2101
|
-
const sig = abytes(signature, L2, 'signature');
|
|
2102
|
-
const msg = abytes(message, undefined, 'message');
|
|
2103
|
-
const pub = abytes(publicKey, L, 'publicKey');
|
|
2104
|
-
try {
|
|
2105
|
-
// lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
|
|
2106
|
-
// Fail if x ≥ p. Let c = x³ + 7 mod p.
|
|
2107
|
-
const x = bytesToNumBE(pub);
|
|
2108
|
-
const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
|
|
2109
|
-
const P_ = new Point(x, y, 1n).assertValidity();
|
|
2110
|
-
const px = numTo32b(P_.toAffine().x);
|
|
2111
|
-
// P = lift_x(int(pk)); fail if that fails
|
|
2112
|
-
const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
|
|
2113
|
-
arange(r, 1n, P);
|
|
2114
|
-
const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
|
|
2115
|
-
// Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
|
|
2116
|
-
// s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
|
|
2117
|
-
// crafted edge cases and fail closed instead of carrying that extra verification surface.
|
|
2118
|
-
arange(s, 1n, N);
|
|
2119
|
-
const i = concatBytes(numTo32b(r), px, msg);
|
|
2120
|
-
// int(challenge(bytes(r)||bytes(P)||m))%n
|
|
2121
|
-
return callSyncAsyncFn(challengeFn(i), (e) => {
|
|
2122
|
-
const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
|
|
2123
|
-
if (!isEven(y) || x !== r)
|
|
2124
|
-
return false; // -eP == (n-e)P
|
|
2125
|
-
return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
|
|
2126
|
-
});
|
|
2127
|
-
}
|
|
2128
|
-
catch (error) {
|
|
2129
|
-
return false;
|
|
2130
|
-
}
|
|
1981
|
+
function createSHA1() {
|
|
1982
|
+
return WASMInterface(wasmJson$c, 20).then((wasm) => {
|
|
1983
|
+
wasm.init();
|
|
1984
|
+
const obj = {
|
|
1985
|
+
init: () => {
|
|
1986
|
+
wasm.init();
|
|
1987
|
+
return obj;
|
|
1988
|
+
},
|
|
1989
|
+
update: (data) => {
|
|
1990
|
+
wasm.update(data);
|
|
1991
|
+
return obj;
|
|
1992
|
+
},
|
|
1993
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
1994
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
1995
|
+
save: () => wasm.save(),
|
|
1996
|
+
load: (data) => {
|
|
1997
|
+
wasm.load(data);
|
|
1998
|
+
return obj;
|
|
1999
|
+
},
|
|
2000
|
+
blockSize: 64,
|
|
2001
|
+
digestSize: 20,
|
|
2002
|
+
};
|
|
2003
|
+
return obj;
|
|
2004
|
+
});
|
|
2005
|
+
}
|
|
2006
|
+
|
|
2007
|
+
var name$b = "sha3";
|
|
2008
|
+
var data$b = "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";
|
|
2009
|
+
var hash$b = "fb24e536";
|
|
2010
|
+
var wasmJson$b = {
|
|
2011
|
+
name: name$b,
|
|
2012
|
+
data: data$b,
|
|
2013
|
+
hash: hash$b
|
|
2131
2014
|
};
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2015
|
+
|
|
2016
|
+
new Mutex();
|
|
2017
|
+
|
|
2018
|
+
new Mutex();
|
|
2019
|
+
function validateBits(bits) {
|
|
2020
|
+
if (![224, 256, 384, 512].includes(bits)) {
|
|
2021
|
+
return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
|
|
2022
|
+
}
|
|
2023
|
+
return null;
|
|
2024
|
+
}
|
|
2140
2025
|
/**
|
|
2141
|
-
*
|
|
2142
|
-
* @
|
|
2143
|
-
* Sign and verify a BIP340 Schnorr signature.
|
|
2144
|
-
* ```ts
|
|
2145
|
-
* import * as secp from '@noble/secp256k1';
|
|
2146
|
-
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
2147
|
-
* secp.hashes.sha256 = sha256;
|
|
2148
|
-
* const secretKey = secp.utils.randomSecretKey();
|
|
2149
|
-
* const message = new Uint8Array([1, 2, 3]);
|
|
2150
|
-
* const sig = secp.schnorr.sign(message, secretKey);
|
|
2151
|
-
* const publicKey = secp.schnorr.getPublicKey(secretKey);
|
|
2152
|
-
* const isValid = secp.schnorr.verify(sig, message, publicKey);
|
|
2153
|
-
* ```
|
|
2026
|
+
* Creates a new Keccak hash instance
|
|
2027
|
+
* @param bits Number of output bits. Valid values: 224, 256, 384, 512
|
|
2154
2028
|
*/
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
sign: signSchnorr,
|
|
2159
|
-
verify: verifySchnorr,
|
|
2160
|
-
signAsync: signSchnorrAsync,
|
|
2161
|
-
verifyAsync: verifySchnorrAsync,
|
|
2162
|
-
});
|
|
2163
|
-
// ## Precomputes
|
|
2164
|
-
// --------------
|
|
2165
|
-
const W = 8; // W is window size
|
|
2166
|
-
const scalarBits = 256;
|
|
2167
|
-
const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
|
|
2168
|
-
const pwindowSize = 2 ** (W - 1); // 128 for W=8
|
|
2169
|
-
const precompute = () => {
|
|
2170
|
-
const points = [];
|
|
2171
|
-
let p = G;
|
|
2172
|
-
let b = p;
|
|
2173
|
-
for (let w = 0; w < pwindows; w++) {
|
|
2174
|
-
b = p;
|
|
2175
|
-
points.push(b);
|
|
2176
|
-
for (let i = 1; i < pwindowSize; i++) {
|
|
2177
|
-
b = b.add(p);
|
|
2178
|
-
points.push(b);
|
|
2179
|
-
} // i=1, bc we skip 0
|
|
2180
|
-
p = b.double();
|
|
2029
|
+
function createKeccak(bits = 512) {
|
|
2030
|
+
if (validateBits(bits)) {
|
|
2031
|
+
return Promise.reject(validateBits(bits));
|
|
2181
2032
|
}
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2033
|
+
const outputSize = bits / 8;
|
|
2034
|
+
return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
|
|
2035
|
+
wasm.init(bits);
|
|
2036
|
+
const obj = {
|
|
2037
|
+
init: () => {
|
|
2038
|
+
wasm.init(bits);
|
|
2039
|
+
return obj;
|
|
2040
|
+
},
|
|
2041
|
+
update: (data) => {
|
|
2042
|
+
wasm.update(data);
|
|
2043
|
+
return obj;
|
|
2044
|
+
},
|
|
2045
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2046
|
+
digest: (outputType) => wasm.digest(outputType, 0x01),
|
|
2047
|
+
save: () => wasm.save(),
|
|
2048
|
+
load: (data) => {
|
|
2049
|
+
wasm.load(data);
|
|
2050
|
+
return obj;
|
|
2051
|
+
},
|
|
2052
|
+
blockSize: 200 - 2 * outputSize,
|
|
2053
|
+
digestSize: outputSize,
|
|
2054
|
+
};
|
|
2055
|
+
return obj;
|
|
2056
|
+
});
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
var name$a = "sha256";
|
|
2060
|
+
var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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";
|
|
2061
|
+
var hash$a = "8c18dd94";
|
|
2062
|
+
var wasmJson$a = {
|
|
2063
|
+
name: name$a,
|
|
2064
|
+
data: data$a,
|
|
2065
|
+
hash: hash$a
|
|
2189
2066
|
};
|
|
2067
|
+
|
|
2068
|
+
new Mutex();
|
|
2190
2069
|
/**
|
|
2191
|
-
*
|
|
2192
|
-
* caching multiples of G (base point). Cache is stored in 32MB of RAM.
|
|
2193
|
-
* Any time `G.multiply` is done, precomputes are used.
|
|
2194
|
-
* Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
|
|
2195
|
-
*
|
|
2196
|
-
* w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
|
|
2197
|
-
* but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
|
|
2198
|
-
*
|
|
2199
|
-
* !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
|
|
2070
|
+
* Creates a new SHA-2 (SHA-224) hash instance
|
|
2200
2071
|
*/
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2072
|
+
function createSHA224() {
|
|
2073
|
+
return WASMInterface(wasmJson$a, 28).then((wasm) => {
|
|
2074
|
+
wasm.init(224);
|
|
2075
|
+
const obj = {
|
|
2076
|
+
init: () => {
|
|
2077
|
+
wasm.init(224);
|
|
2078
|
+
return obj;
|
|
2079
|
+
},
|
|
2080
|
+
update: (data) => {
|
|
2081
|
+
wasm.update(data);
|
|
2082
|
+
return obj;
|
|
2083
|
+
},
|
|
2084
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2085
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2086
|
+
save: () => wasm.save(),
|
|
2087
|
+
load: (data) => {
|
|
2088
|
+
wasm.load(data);
|
|
2089
|
+
return obj;
|
|
2090
|
+
},
|
|
2091
|
+
blockSize: 64,
|
|
2092
|
+
digestSize: 28,
|
|
2093
|
+
};
|
|
2094
|
+
return obj;
|
|
2095
|
+
});
|
|
2096
|
+
}
|
|
2097
|
+
|
|
2098
|
+
new Mutex();
|
|
2099
|
+
/**
|
|
2100
|
+
* Creates a new SHA-2 (SHA-256) hash instance
|
|
2101
|
+
*/
|
|
2102
|
+
function createSHA256() {
|
|
2103
|
+
return WASMInterface(wasmJson$a, 32).then((wasm) => {
|
|
2104
|
+
wasm.init(256);
|
|
2105
|
+
const obj = {
|
|
2106
|
+
init: () => {
|
|
2107
|
+
wasm.init(256);
|
|
2108
|
+
return obj;
|
|
2109
|
+
},
|
|
2110
|
+
update: (data) => {
|
|
2111
|
+
wasm.update(data);
|
|
2112
|
+
return obj;
|
|
2113
|
+
},
|
|
2114
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2115
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2116
|
+
save: () => wasm.save(),
|
|
2117
|
+
load: (data) => {
|
|
2118
|
+
wasm.load(data);
|
|
2119
|
+
return obj;
|
|
2120
|
+
},
|
|
2121
|
+
blockSize: 64,
|
|
2122
|
+
digestSize: 32,
|
|
2123
|
+
};
|
|
2124
|
+
return obj;
|
|
2125
|
+
});
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
var name$9 = "sha512";
|
|
2129
|
+
var data$9 = "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";
|
|
2130
|
+
var hash$9 = "f2e40eb1";
|
|
2131
|
+
var wasmJson$9 = {
|
|
2132
|
+
name: name$9,
|
|
2133
|
+
data: data$9,
|
|
2134
|
+
hash: hash$9
|
|
2237
2135
|
};
|
|
2238
2136
|
|
|
2239
|
-
|
|
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
|
-
|
|
2137
|
+
new Mutex();
|
|
2138
|
+
/**
|
|
2139
|
+
* Creates a new SHA-2 (SHA-384) hash instance
|
|
2140
|
+
*/
|
|
2141
|
+
function createSHA384() {
|
|
2142
|
+
return WASMInterface(wasmJson$9, 48).then((wasm) => {
|
|
2143
|
+
wasm.init(384);
|
|
2144
|
+
const obj = {
|
|
2145
|
+
init: () => {
|
|
2146
|
+
wasm.init(384);
|
|
2147
|
+
return obj;
|
|
2148
|
+
},
|
|
2149
|
+
update: (data) => {
|
|
2150
|
+
wasm.update(data);
|
|
2151
|
+
return obj;
|
|
2152
|
+
},
|
|
2153
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2154
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2155
|
+
save: () => wasm.save(),
|
|
2156
|
+
load: (data) => {
|
|
2157
|
+
wasm.load(data);
|
|
2158
|
+
return obj;
|
|
2159
|
+
},
|
|
2160
|
+
blockSize: 128,
|
|
2161
|
+
digestSize: 48,
|
|
2162
|
+
};
|
|
2163
|
+
return obj;
|
|
2164
|
+
});
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
new Mutex();
|
|
2168
|
+
/**
|
|
2169
|
+
* Creates a new SHA-2 (SHA-512) hash instance
|
|
2170
|
+
*/
|
|
2171
|
+
function createSHA512() {
|
|
2172
|
+
return WASMInterface(wasmJson$9, 64).then((wasm) => {
|
|
2173
|
+
wasm.init(512);
|
|
2174
|
+
const obj = {
|
|
2175
|
+
init: () => {
|
|
2176
|
+
wasm.init(512);
|
|
2177
|
+
return obj;
|
|
2178
|
+
},
|
|
2179
|
+
update: (data) => {
|
|
2180
|
+
wasm.update(data);
|
|
2181
|
+
return obj;
|
|
2182
|
+
},
|
|
2183
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2184
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2185
|
+
save: () => wasm.save(),
|
|
2186
|
+
load: (data) => {
|
|
2187
|
+
wasm.load(data);
|
|
2188
|
+
return obj;
|
|
2189
|
+
},
|
|
2190
|
+
blockSize: 128,
|
|
2191
|
+
digestSize: 64,
|
|
2192
|
+
};
|
|
2193
|
+
return obj;
|
|
2194
|
+
});
|
|
2195
|
+
}
|
|
2196
|
+
|
|
2197
|
+
new Mutex();
|
|
2198
|
+
|
|
2199
|
+
new Mutex();
|
|
2200
|
+
|
|
2201
|
+
new Mutex();
|
|
2202
|
+
|
|
2203
|
+
new Mutex();
|
|
2204
|
+
|
|
2205
|
+
var name$4 = "ripemd160";
|
|
2206
|
+
var data$4 = "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";
|
|
2207
|
+
var hash$4 = "6abbce74";
|
|
2208
|
+
var wasmJson$4 = {
|
|
2209
|
+
name: name$4,
|
|
2210
|
+
data: data$4,
|
|
2211
|
+
hash: hash$4
|
|
2269
2212
|
};
|
|
2270
2213
|
|
|
2271
|
-
|
|
2272
|
-
// usage:
|
|
2273
|
-
// networks['bitcoin']['testnet']
|
|
2274
|
-
// networks.bitcoin.testnet
|
|
2214
|
+
new Mutex();
|
|
2275
2215
|
/**
|
|
2276
|
-
*
|
|
2277
|
-
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
2216
|
+
* Creates a new RIPEMD-160 hash instance
|
|
2278
2217
|
*/
|
|
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
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
}
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
const
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2218
|
+
function createRIPEMD160() {
|
|
2219
|
+
return WASMInterface(wasmJson$4, 20).then((wasm) => {
|
|
2220
|
+
wasm.init();
|
|
2221
|
+
const obj = {
|
|
2222
|
+
init: () => {
|
|
2223
|
+
wasm.init();
|
|
2224
|
+
return obj;
|
|
2225
|
+
},
|
|
2226
|
+
update: (data) => {
|
|
2227
|
+
wasm.update(data);
|
|
2228
|
+
return obj;
|
|
2229
|
+
},
|
|
2230
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2231
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
2232
|
+
save: () => wasm.save(),
|
|
2233
|
+
load: (data) => {
|
|
2234
|
+
wasm.load(data);
|
|
2235
|
+
return obj;
|
|
2236
|
+
},
|
|
2237
|
+
blockSize: 64,
|
|
2238
|
+
digestSize: 20,
|
|
2239
|
+
};
|
|
2240
|
+
return obj;
|
|
2241
|
+
});
|
|
2242
|
+
}
|
|
2243
|
+
|
|
2244
|
+
function calculateKeyBuffer(hasher, key) {
|
|
2245
|
+
const { blockSize } = hasher;
|
|
2246
|
+
const buf = getUInt8Buffer(key);
|
|
2247
|
+
if (buf.length > blockSize) {
|
|
2248
|
+
hasher.update(buf);
|
|
2249
|
+
const uintArr = hasher.digest("binary");
|
|
2250
|
+
hasher.init();
|
|
2251
|
+
return uintArr;
|
|
2252
|
+
}
|
|
2253
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
2254
|
+
}
|
|
2255
|
+
function calculateHmac(hasher, key) {
|
|
2256
|
+
hasher.init();
|
|
2257
|
+
const { blockSize } = hasher;
|
|
2258
|
+
const keyBuf = calculateKeyBuffer(hasher, key);
|
|
2259
|
+
const keyBuffer = new Uint8Array(blockSize);
|
|
2260
|
+
keyBuffer.set(keyBuf);
|
|
2261
|
+
const opad = new Uint8Array(blockSize);
|
|
2262
|
+
for (let i = 0; i < blockSize; i++) {
|
|
2263
|
+
const v = keyBuffer[i];
|
|
2264
|
+
opad[i] = v ^ 0x5c;
|
|
2265
|
+
keyBuffer[i] = v ^ 0x36;
|
|
2266
|
+
}
|
|
2267
|
+
hasher.update(keyBuffer);
|
|
2268
|
+
const obj = {
|
|
2269
|
+
init: () => {
|
|
2270
|
+
hasher.init();
|
|
2271
|
+
hasher.update(keyBuffer);
|
|
2272
|
+
return obj;
|
|
2273
|
+
},
|
|
2274
|
+
update: (data) => {
|
|
2275
|
+
hasher.update(data);
|
|
2276
|
+
return obj;
|
|
2277
|
+
},
|
|
2278
|
+
digest: ((outputType) => {
|
|
2279
|
+
const uintArr = hasher.digest("binary");
|
|
2280
|
+
hasher.init();
|
|
2281
|
+
hasher.update(opad);
|
|
2282
|
+
hasher.update(uintArr);
|
|
2283
|
+
return hasher.digest(outputType);
|
|
2284
|
+
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
2285
|
+
}),
|
|
2286
|
+
save: () => {
|
|
2287
|
+
throw new Error("save() not supported");
|
|
2288
|
+
},
|
|
2289
|
+
load: () => {
|
|
2290
|
+
throw new Error("load() not supported");
|
|
2291
|
+
},
|
|
2292
|
+
blockSize: hasher.blockSize,
|
|
2293
|
+
digestSize: hasher.digestSize,
|
|
2294
|
+
};
|
|
2295
|
+
return obj;
|
|
2296
|
+
}
|
|
2334
2297
|
/**
|
|
2335
|
-
*
|
|
2336
|
-
* @return
|
|
2298
|
+
* Calculates HMAC hash
|
|
2299
|
+
* @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
|
|
2300
|
+
* @param key Key (string, Buffer or TypedArray)
|
|
2337
2301
|
*/
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
}
|
|
2302
|
+
function createHMAC(hash, key) {
|
|
2303
|
+
if (!hash || !hash.then) {
|
|
2304
|
+
throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
|
|
2305
|
+
}
|
|
2306
|
+
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
2307
|
+
}
|
|
2344
2308
|
|
|
2345
|
-
|
|
2309
|
+
new Mutex();
|
|
2310
|
+
|
|
2311
|
+
new Mutex();
|
|
2312
|
+
|
|
2313
|
+
const encode$1 = (version, privateKey, compressed) => {
|
|
2346
2314
|
if (privateKey.length !== 32)
|
|
2347
2315
|
throw new TypeError(`Invalid privateKey length: expected 32 got ${privateKey.length}`);
|
|
2348
2316
|
const uint8Array = new Uint8Array(compressed ? 34 : 33);
|
|
@@ -2353,7 +2321,7 @@ const encode = (version, privateKey, compressed) => {
|
|
|
2353
2321
|
}
|
|
2354
2322
|
return base58check.encode(uint8Array);
|
|
2355
2323
|
};
|
|
2356
|
-
const decode = async (wif, version) => {
|
|
2324
|
+
const decode$1 = async (wif, version) => {
|
|
2357
2325
|
wif = (await base58check.decode(wif)).data;
|
|
2358
2326
|
if (version && wif[0] !== version)
|
|
2359
2327
|
throw new Error('Invalid network version');
|
|
@@ -2368,7 +2336,7 @@ const decode = async (wif, version) => {
|
|
|
2368
2336
|
compressed: wif.length === 33 ? false : true
|
|
2369
2337
|
};
|
|
2370
2338
|
};
|
|
2371
|
-
var wif = { encode, decode };
|
|
2339
|
+
var wif = { encode: encode$1, decode: decode$1 };
|
|
2372
2340
|
|
|
2373
2341
|
const HIGHEST_BIT = 0x80000000;
|
|
2374
2342
|
const privateKeyVerify = (privateKey) => utils$2.isValidSecretKey(privateKey);
|
|
@@ -2489,7 +2457,7 @@ class HdNode {
|
|
|
2489
2457
|
else {
|
|
2490
2458
|
set.push(new Uint8Array(this.publicKey));
|
|
2491
2459
|
}
|
|
2492
|
-
return base58check.encode(index$
|
|
2460
|
+
return base58check.encode(index$3(set));
|
|
2493
2461
|
}
|
|
2494
2462
|
toWIF() {
|
|
2495
2463
|
if (!this.#privateKey)
|
|
@@ -2505,14 +2473,14 @@ class HdNode {
|
|
|
2505
2473
|
if (this.isNeutered)
|
|
2506
2474
|
throw new TypeError('Missing private key for hardened child key');
|
|
2507
2475
|
// data = 0x00 || ser256(kpar) || ser32(index)
|
|
2508
|
-
data = index$
|
|
2476
|
+
data = index$3([
|
|
2509
2477
|
new TextEncoder().encode('0'),
|
|
2510
2478
|
this.privateKey,
|
|
2511
2479
|
new TextEncoder().encode(index.toString()),
|
|
2512
2480
|
]);
|
|
2513
2481
|
}
|
|
2514
2482
|
else {
|
|
2515
|
-
data = index$
|
|
2483
|
+
data = index$3([
|
|
2516
2484
|
this.publicKey,
|
|
2517
2485
|
new TextEncoder().encode(index.toString()),
|
|
2518
2486
|
]);
|
|
@@ -2572,7 +2540,7 @@ class HdNode {
|
|
|
2572
2540
|
let buffer = (await base58check.decode(string)).data;
|
|
2573
2541
|
// @ts-ignore
|
|
2574
2542
|
network = network || networks.leofcoin;
|
|
2575
|
-
const result = index$
|
|
2543
|
+
const result = index$2(buffer);
|
|
2576
2544
|
const version = Number(new TextDecoder().decode(result[0]));
|
|
2577
2545
|
const depth = Number(new TextDecoder().decode(result[1]));
|
|
2578
2546
|
const parentFingerprint = Number(new TextDecoder().decode(result[2]));
|
|
@@ -4842,6 +4810,38 @@ class HDWallet {
|
|
|
4842
4810
|
}
|
|
4843
4811
|
}
|
|
4844
4812
|
|
|
4813
|
+
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
4814
|
+
const ALPHABET_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
|
|
4815
|
+
const base32 = base(ALPHABET);
|
|
4816
|
+
const base32Hex = base(ALPHABET_HEX);
|
|
4817
|
+
const decode = base32.decode;
|
|
4818
|
+
const decodeHex = base32Hex.decode;
|
|
4819
|
+
const encode = base32.encode;
|
|
4820
|
+
const encodeHex = base32Hex.encode;
|
|
4821
|
+
const isBase32 = (string, hex = false) => {
|
|
4822
|
+
try {
|
|
4823
|
+
if (hex)
|
|
4824
|
+
decodeHex(string);
|
|
4825
|
+
else
|
|
4826
|
+
decode(string);
|
|
4827
|
+
return true;
|
|
4828
|
+
}
|
|
4829
|
+
catch (e) {
|
|
4830
|
+
return false;
|
|
4831
|
+
}
|
|
4832
|
+
};
|
|
4833
|
+
const isBase32Hex = (string) => {
|
|
4834
|
+
return isBase32(string, true);
|
|
4835
|
+
};
|
|
4836
|
+
var index = {
|
|
4837
|
+
encode,
|
|
4838
|
+
decode,
|
|
4839
|
+
encodeHex,
|
|
4840
|
+
decodeHex,
|
|
4841
|
+
isBase32,
|
|
4842
|
+
isBase32Hex,
|
|
4843
|
+
};
|
|
4844
|
+
|
|
4845
4845
|
hashes.sha256 = (message) => {
|
|
4846
4846
|
message = Buffer.isBuffer(message) ? new Uint8Array(message) : message;
|
|
4847
4847
|
return new Uint8Array(createHash$1("sha256").update(message).digest());
|
|
@@ -4911,8 +4911,8 @@ class MultiSignature {
|
|
|
4911
4911
|
if (!signature)
|
|
4912
4912
|
throw ReferenceError("signature undefined");
|
|
4913
4913
|
this.#multiSignature = typedArrayConcat([
|
|
4914
|
-
index$
|
|
4915
|
-
index$
|
|
4914
|
+
index$4.encode(this.version),
|
|
4915
|
+
index$4.encode(this.multiCodec),
|
|
4916
4916
|
signature,
|
|
4917
4917
|
]);
|
|
4918
4918
|
return this.multiSignature;
|
|
@@ -4928,10 +4928,10 @@ class MultiSignature {
|
|
|
4928
4928
|
if (!this.multiSignature)
|
|
4929
4929
|
throw ReferenceError("multiSignature undefined");
|
|
4930
4930
|
let buffer = this.multiSignature;
|
|
4931
|
-
const version = index$
|
|
4932
|
-
buffer = buffer.subarray(index$
|
|
4933
|
-
const codec = index$
|
|
4934
|
-
buffer = buffer.subarray(index$
|
|
4931
|
+
const version = index$4.decode(buffer);
|
|
4932
|
+
buffer = buffer.subarray(index$4.decode.bytes);
|
|
4933
|
+
const codec = index$4.decode(buffer);
|
|
4934
|
+
buffer = buffer.subarray(index$4.decode.bytes);
|
|
4935
4935
|
const signature = buffer.subarray(0, buffer.length);
|
|
4936
4936
|
console.log("[decode] extracted signature length:", signature.length);
|
|
4937
4937
|
console.log("[decode] extracted signature (hex):", Buffer.from(signature).toString("hex"));
|
|
@@ -4959,16 +4959,16 @@ class MultiSignature {
|
|
|
4959
4959
|
return this.decode(base58$1.decode(string));
|
|
4960
4960
|
}
|
|
4961
4961
|
toBs32() {
|
|
4962
|
-
return index
|
|
4962
|
+
return index.encode(this.multiSignature);
|
|
4963
4963
|
}
|
|
4964
4964
|
fromBs32(string) {
|
|
4965
|
-
return this.decode(index
|
|
4965
|
+
return this.decode(index.decode(string));
|
|
4966
4966
|
}
|
|
4967
4967
|
toBs32Hex() {
|
|
4968
|
-
return index
|
|
4968
|
+
return index.encodeHex(this.multiSignature);
|
|
4969
4969
|
}
|
|
4970
4970
|
fromBs32Hex(string) {
|
|
4971
|
-
return this.decode(index
|
|
4971
|
+
return this.decode(index.decodeHex(string));
|
|
4972
4972
|
}
|
|
4973
4973
|
toBs58Hex() {
|
|
4974
4974
|
return base58$1.encodeHex(this.multiSignature);
|
|
@@ -4999,11 +4999,11 @@ var encrypt = async (password, data, version = new TextEncoder().encode('1')) =>
|
|
|
4999
4999
|
name: 'AES-GCM',
|
|
5000
5000
|
iv
|
|
5001
5001
|
}, key, new TextEncoder().encode(data));
|
|
5002
|
-
return index$
|
|
5002
|
+
return index$3([version, salt, iv, new Uint8Array(encrypted)]);
|
|
5003
5003
|
};
|
|
5004
5004
|
|
|
5005
5005
|
var decrypt = async (password, concatecated) => {
|
|
5006
|
-
const [version, salt, iv, cipher] = index$
|
|
5006
|
+
const [version, salt, iv, cipher] = index$2(concatecated);
|
|
5007
5007
|
let iterations;
|
|
5008
5008
|
if (new TextDecoder().decode(version) === '1') {
|
|
5009
5009
|
iterations = 250000;
|
|
@@ -5023,7 +5023,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5023
5023
|
super(network, hdnode);
|
|
5024
5024
|
}
|
|
5025
5025
|
get id() {
|
|
5026
|
-
return base58check.encode(index$
|
|
5026
|
+
return base58check.encode(index$3([
|
|
5027
5027
|
new TextEncoder().encode(this.version.toString()),
|
|
5028
5028
|
this.account(0).hdnode.neutered.publicKey
|
|
5029
5029
|
]));
|
|
@@ -5033,8 +5033,8 @@ class MultiHDNode extends HDWallet {
|
|
|
5033
5033
|
}
|
|
5034
5034
|
async fromId(id) {
|
|
5035
5035
|
let buffer = (await base58check.decode(id)).data;
|
|
5036
|
-
index$
|
|
5037
|
-
buffer = buffer.slice(index$
|
|
5036
|
+
index$4.decode(buffer);
|
|
5037
|
+
buffer = buffer.slice(index$4.decode.bytes);
|
|
5038
5038
|
this.fromPublicKey(buffer, null, this.networkName);
|
|
5039
5039
|
}
|
|
5040
5040
|
async import(password, encrypted) {
|
|
@@ -5056,7 +5056,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5056
5056
|
this.locked = false;
|
|
5057
5057
|
}
|
|
5058
5058
|
fromMultiWif(string) {
|
|
5059
|
-
const { version, codec, privateKey } = index.decode(string);
|
|
5059
|
+
const { version, codec, privateKey } = index$1.decode(string);
|
|
5060
5060
|
this.network = Object.values(networks).reduce((p, c) => {
|
|
5061
5061
|
if (c.multiCodec === codec)
|
|
5062
5062
|
return c;
|
|
@@ -5070,7 +5070,7 @@ class MultiHDNode extends HDWallet {
|
|
|
5070
5070
|
return this.fromPrivateKey(privateKey, undefined, this.network);
|
|
5071
5071
|
}
|
|
5072
5072
|
toMultiWif() {
|
|
5073
|
-
return index.encode(this.network.version, this.network.multiCodec, this.privateKey);
|
|
5073
|
+
return index$1.encode(this.network.version, this.network.multiCodec, this.privateKey);
|
|
5074
5074
|
}
|
|
5075
5075
|
sign(hash) {
|
|
5076
5076
|
return new MultiSignature(this.version, this.network.multiCodec)
|
|
@@ -5117,7 +5117,7 @@ class MultiWallet extends MultiHDNode {
|
|
|
5117
5117
|
super(network, hdnode);
|
|
5118
5118
|
}
|
|
5119
5119
|
get id() {
|
|
5120
|
-
return base58check.encode(index$
|
|
5120
|
+
return base58check.encode(index$3([
|
|
5121
5121
|
new TextEncoder().encode(this.version.toString()),
|
|
5122
5122
|
this.account(0).hdnode.neutered.publicKey,
|
|
5123
5123
|
]));
|
|
@@ -8261,6 +8261,7 @@ var qrcode = /*@__PURE__*/getDefaultExportFromCjs(browserExports);
|
|
|
8261
8261
|
|
|
8262
8262
|
class Identity {
|
|
8263
8263
|
#wallet;
|
|
8264
|
+
#accountWallets = new Map();
|
|
8264
8265
|
network;
|
|
8265
8266
|
id;
|
|
8266
8267
|
selectedAccount;
|
|
@@ -8298,7 +8299,7 @@ class Identity {
|
|
|
8298
8299
|
this.selectedAccount = new TextDecoder().decode(selected);
|
|
8299
8300
|
}
|
|
8300
8301
|
else {
|
|
8301
|
-
const importee = await import(/* webpackChunkName: "generate-account" */ './index-
|
|
8302
|
+
const importee = await import(/* webpackChunkName: "generate-account" */ './index-B91mcwxm.js');
|
|
8302
8303
|
const { identity, accounts } = await importee.default(password, this.network);
|
|
8303
8304
|
await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
|
|
8304
8305
|
await globalThis.walletStore.put('version', String(1));
|
|
@@ -8312,13 +8313,36 @@ class Identity {
|
|
|
8312
8313
|
this.#wallet = new MultiWallet(this.network);
|
|
8313
8314
|
const multiWIF = await decrypt(password, base58$1.decode(identity.multiWIF));
|
|
8314
8315
|
await this.#wallet.fromMultiWif(multiWIF);
|
|
8316
|
+
await this.#loadAccountWallets();
|
|
8317
|
+
}
|
|
8318
|
+
async #loadAccountWallets() {
|
|
8319
|
+
this.#accountWallets.clear();
|
|
8320
|
+
const accounts = await this.getAccounts();
|
|
8321
|
+
for (const [index, [, externalAddress, internalAddress]] of accounts.entries()) {
|
|
8322
|
+
const account = this.#wallet.account(index + 1);
|
|
8323
|
+
const external = (await account.external(1));
|
|
8324
|
+
const internal = (await account.internal(1));
|
|
8325
|
+
if ((await external.address) !== externalAddress || (await internal.address) !== internalAddress) {
|
|
8326
|
+
throw new Error(`stored account ${index + 1} does not match this identity`);
|
|
8327
|
+
}
|
|
8328
|
+
this.#accountWallets.set(externalAddress, external);
|
|
8329
|
+
this.#accountWallets.set(internalAddress, internal);
|
|
8330
|
+
}
|
|
8331
|
+
if (!this.#accountWallets.has(this.selectedAccount)) {
|
|
8332
|
+
throw new Error(`selected account ${this.selectedAccount} is not part of this identity`);
|
|
8333
|
+
}
|
|
8315
8334
|
}
|
|
8316
8335
|
selectAccount(account) {
|
|
8336
|
+
if (!this.#accountWallets.has(account))
|
|
8337
|
+
throw new Error(`unknown identity account ${account}`);
|
|
8317
8338
|
this.selectedAccount = account;
|
|
8318
8339
|
return walletStore.put('selected-account', account);
|
|
8319
8340
|
}
|
|
8320
8341
|
sign(hash) {
|
|
8321
|
-
|
|
8342
|
+
const wallet = this.#accountWallets.get(this.selectedAccount);
|
|
8343
|
+
if (!wallet)
|
|
8344
|
+
throw new Error(`no signer available for selected account ${this.selectedAccount}`);
|
|
8345
|
+
return wallet.sign(hash.subarray(0, 32));
|
|
8322
8346
|
}
|
|
8323
8347
|
lock(password) {
|
|
8324
8348
|
this.#wallet.lock(password);
|
|
@@ -8344,4 +8368,4 @@ class Identity {
|
|
|
8344
8368
|
}
|
|
8345
8369
|
}
|
|
8346
8370
|
|
|
8347
|
-
export { Identity as I, MultiWallet as M, base58$1 as a, base as b,
|
|
8371
|
+
export { Identity as I, MultiWallet as M, base58$1 as a, base as b, index as c, index$2 as d, index$4 as e, createSHA512 as f, createSHA384 as g, createSHA256 as h, index$3 as i, createSHA224 as j, createSHA1 as k, encrypt as l, getDefaultExportFromCjs as m };
|