@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.
@@ -340,49 +340,17 @@ const base = (ALPHABET, options = {}) => {
340
340
  };
341
341
  };
342
342
 
343
- const ALPHABET$1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
344
- const ALPHABET_HEX$1 = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
345
- const base32 = base(ALPHABET$1);
346
- const base32Hex = base(ALPHABET_HEX$1);
347
- const decode$5 = base32.decode;
348
- const decodeHex$2 = base32Hex.decode;
349
- const encode$4 = base32.encode;
350
- const encodeHex$2 = base32Hex.encode;
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$4(string);
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$1(string);
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$4(string);
371
+ decode$5(string);
404
372
  return "base58";
405
373
  }
406
374
  catch (e) {
407
375
  try {
408
- decodeHex$1(string);
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$3,
418
- decode: decode$4,
385
+ encode: encode$4,
386
+ decode: decode$5,
419
387
  isBase58,
420
388
  isBase58Hex,
421
- encodeHex: encodeHex$1,
422
- decodeHex: decodeHex$1,
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$3 = {
590
+ var index$4 = {
495
591
  encode: encode$2,
496
592
  decode: decode$3,
497
593
  encodingLength
498
594
  };
499
595
 
500
- var index$2 = (input, prefix) => {
596
+ var index$3 = (input, prefix) => {
501
597
  const encodedArray = [];
502
598
  const length = input.reduce((total, current) => {
503
- const encoded = index$3.encode(current.length);
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$1 = (typedArray, prefix) => {
617
+ var index$2 = (typedArray, prefix) => {
522
618
  const set = [];
523
619
  const varintAndSub = (typedArray) => {
524
- const length = index$3.decode(typedArray);
620
+ const length = index$4.decode(typedArray);
525
621
  // remove length
526
- typedArray = typedArray.subarray(index$3.decode.bytes);
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
- * hash-wasm (https://www.npmjs.com/package/hash-wasm)
540
- * (c) Dani Biro
541
- * @license MIT
542
- */
543
-
544
-
545
- /******************************************************************************
546
- Copyright (c) Microsoft Corporation.
547
-
548
- Permission to use, copy, modify, and/or distribute this software for any
549
- purpose with or without fee is hereby granted.
550
-
551
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
552
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
553
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
554
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
555
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
556
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
557
- PERFORMANCE OF THIS SOFTWARE.
558
- ***************************************************************************** */
559
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
560
-
561
-
562
- function __awaiter(thisArg, _arguments, P, generator) {
563
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
564
- return new (P || (P = Promise))(function (resolve, reject) {
565
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
566
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
567
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
568
- step((generator = generator.apply(thisArg, [])).next());
569
- });
570
- }
571
-
572
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
573
- var e = new Error(message);
574
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
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
- class Mutex {
578
- constructor() {
579
- this.mutex = Promise.resolve();
580
- }
581
- lock() {
582
- let begin = () => { };
583
- this.mutex = this.mutex.then(() => new Promise(begin));
584
- return new Promise((res) => {
585
- begin = res;
586
- });
587
- }
588
- dispatch(fn) {
589
- return __awaiter(this, void 0, void 0, function* () {
590
- const unlock = yield this.lock();
591
- try {
592
- return yield Promise.resolve(fn());
593
- }
594
- finally {
595
- unlock();
596
- }
597
- });
598
- }
599
- }
600
-
601
- var _a;
602
- function getGlobal() {
603
- if (typeof globalThis !== "undefined")
604
- return globalThis;
605
- if (typeof self !== "undefined")
606
- return self;
607
- if (typeof window !== "undefined")
608
- return window;
609
- return global;
610
- }
611
- const globalObject = getGlobal();
612
- const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
613
- const textEncoder = globalObject.TextEncoder
614
- ? new globalObject.TextEncoder()
615
- : null;
616
- function hexCharCodesToInt(a, b) {
617
- return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
618
- ((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
619
- }
620
- function writeHexToUInt8(buf, str) {
621
- const size = str.length >> 1;
622
- for (let i = 0; i < size; i++) {
623
- const index = i << 1;
624
- buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
625
- }
626
- }
627
- function hexStringEqualsUInt8(str, buf) {
628
- if (str.length !== buf.length * 2) {
629
- return false;
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
- for (let i = 0; i < buf.length; i++) {
632
- const strIndex = i << 1;
633
- if (buf[i] !==
634
- hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
635
- return false;
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 true;
639
- }
640
- const alpha = "a".charCodeAt(0) - 10;
641
- const digit = "0".charCodeAt(0);
642
- function getDigestHex(tmpBuffer, input, hashLength) {
643
- let p = 0;
644
- for (let i = 0; i < hashLength; i++) {
645
- let nibble = input[i] >>> 4;
646
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
647
- nibble = input[i] & 0xf;
648
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
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 String.fromCharCode.apply(null, tmpBuffer);
651
- }
652
- const getUInt8Buffer = nodeBuffer !== null
653
- ? (data) => {
654
- if (typeof data === "string") {
655
- const buf = nodeBuffer.from(data, "utf8");
656
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
657
- }
658
- if (nodeBuffer.isBuffer(data)) {
659
- return new Uint8Array(data.buffer, data.byteOffset, data.length);
660
- }
661
- if (ArrayBuffer.isView(data)) {
662
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
663
- }
664
- throw new Error("Invalid data type!");
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
- : (data) => {
667
- if (typeof data === "string") {
668
- return textEncoder.encode(data);
669
- }
670
- if (ArrayBuffer.isView(data)) {
671
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
672
- }
673
- throw new Error("Invalid data type!");
674
- };
675
- const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
676
- const base64Lookup = new Uint8Array(256);
677
- for (let i = 0; i < base64Chars.length; i++) {
678
- base64Lookup[base64Chars.charCodeAt(i)] = i;
679
- }
680
- function getDecodeBase64Length(data) {
681
- let bufferLength = Math.floor(data.length * 0.75);
682
- const len = data.length;
683
- if (data[len - 1] === "=") {
684
- bufferLength -= 1;
685
- if (data[len - 2] === "=") {
686
- bufferLength -= 1;
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
- return bufferLength;
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
- return bytes;
709
- }
710
-
711
- const MAX_HEAP = 16 * 1024;
712
- const WASM_FUNC_HASH_LENGTH = 4;
713
- const wasmMutex = new Mutex();
714
- const wasmModuleCache = new Map();
715
- function WASMInterface(binary, hashLength) {
716
- return __awaiter(this, void 0, void 0, function* () {
717
- let wasmInstance = null;
718
- let memoryView = null;
719
- let initialized = false;
720
- if (typeof WebAssembly === "undefined") {
721
- throw new Error("WebAssembly is not supported in this environment!");
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
- const writeMemory = (data, offset = 0) => {
724
- memoryView.set(data, offset);
725
- };
726
- const getMemory = () => memoryView;
727
- const getExports = () => wasmInstance.exports;
728
- const setMemorySize = (totalSize) => {
729
- wasmInstance.exports.Hash_SetMemorySize(totalSize);
730
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
731
- const memoryBuffer = wasmInstance.exports.memory.buffer;
732
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
733
- };
734
- const getStateSize = () => {
735
- const view = new DataView(wasmInstance.exports.memory.buffer);
736
- const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
737
- return stateSize;
738
- };
739
- const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
740
- if (!wasmModuleCache.has(binary.name)) {
741
- const asm = decodeBase64(binary.data);
742
- const promise = WebAssembly.compile(asm);
743
- wasmModuleCache.set(binary.name, promise);
744
- }
745
- const module = yield wasmModuleCache.get(binary.name);
746
- wasmInstance = yield WebAssembly.instantiate(module, {
747
- // env: {
748
- // emscripten_memcpy_big: (dest, src, num) => {
749
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
750
- // const memView = new Uint8Array(memoryBuffer, 0);
751
- // memView.set(memView.subarray(src, src + num), dest);
752
- // },
753
- // print_memory: (offset, len) => {
754
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
755
- // const memView = new Uint8Array(memoryBuffer, 0);
756
- // console.log('print_int32', memView.subarray(offset, offset + len));
757
- // },
758
- // },
759
- });
760
- // wasmInstance.exports._start();
761
- }));
762
- const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
763
- if (!wasmInstance) {
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
+ // == 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 Mutex();
895
-
896
- new Mutex();
897
-
898
- new Mutex();
899
-
900
- new Mutex();
901
-
902
- new Mutex();
903
-
904
- new Mutex();
905
-
906
- new Mutex();
907
-
908
- new Mutex();
909
-
910
- var name$c = "sha1";
911
- var data$c = "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";
912
- var hash$c = "6b530c24";
913
- var wasmJson$c = {
914
- name: name$c,
915
- data: data$c,
916
- hash: hash$c
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 new SHA-1 hash instance
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
- function createSHA1() {
924
- return WASMInterface(wasmJson$c, 20).then((wasm) => {
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
- new Mutex();
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
- return null;
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+VemoiGiADIAJz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";
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
- new Mutex();
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
- * Creates a new SHA-2 (SHA-224) hash instance
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
- function createSHA224() {
1015
- return WASMInterface(wasmJson$a, 28).then((wasm) => {
1016
- wasm.init(224);
1017
- const obj = {
1018
- init: () => {
1019
- wasm.init(224);
1020
- return obj;
1021
- },
1022
- update: (data) => {
1023
- wasm.update(data);
1024
- return obj;
1025
- },
1026
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1027
- digest: (outputType) => wasm.digest(outputType),
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
- * Creates a new SHA-2 (SHA-256) hash instance
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
- function createSHA256() {
1045
- return WASMInterface(wasmJson$a, 32).then((wasm) => {
1046
- wasm.init(256);
1047
- const obj = {
1048
- init: () => {
1049
- wasm.init(256);
1050
- return obj;
1051
- },
1052
- update: (data) => {
1053
- wasm.update(data);
1054
- return obj;
1055
- },
1056
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1057
- digest: (outputType) => wasm.digest(outputType),
1058
- save: () => wasm.save(),
1059
- load: (data) => {
1060
- wasm.load(data);
1061
- return obj;
1062
- },
1063
- blockSize: 64,
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
- * Creates a new SHA-2 (SHA-384) hash instance
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
- function createSHA384() {
1084
- return WASMInterface(wasmJson$9, 48).then((wasm) => {
1085
- wasm.init(384);
1086
- const obj = {
1087
- init: () => {
1088
- wasm.init(384);
1089
- return obj;
1090
- },
1091
- update: (data) => {
1092
- wasm.update(data);
1093
- return obj;
1094
- },
1095
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1096
- digest: (outputType) => wasm.digest(outputType),
1097
- save: () => wasm.save(),
1098
- load: (data) => {
1099
- wasm.load(data);
1100
- return obj;
1101
- },
1102
- blockSize: 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
- * Creates a new SHA-2 (SHA-512) hash instance
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
- function createSHA512() {
1114
- return WASMInterface(wasmJson$9, 64).then((wasm) => {
1115
- wasm.init(512);
1116
- const obj = {
1117
- init: () => {
1118
- wasm.init(512);
1119
- return obj;
1120
- },
1121
- update: (data) => {
1122
- wasm.update(data);
1123
- return obj;
1124
- },
1125
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1126
- digest: (outputType) => wasm.digest(outputType),
1127
- save: () => wasm.save(),
1128
- load: (data) => {
1129
- wasm.load(data);
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
- new Mutex();
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 a new RIPEMD-160 hash instance
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
- function createRIPEMD160() {
1161
- return WASMInterface(wasmJson$4, 20).then((wasm) => {
1162
- wasm.init();
1163
- const obj = {
1164
- init: () => {
1165
- wasm.init();
1166
- return obj;
1167
- },
1168
- update: (data) => {
1169
- wasm.update(data);
1170
- return obj;
1171
- },
1172
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1173
- digest: (outputType) => wasm.digest(outputType),
1174
- save: () => wasm.save(),
1175
- load: (data) => {
1176
- wasm.load(data);
1177
- return obj;
1178
- },
1179
- blockSize: 64,
1180
- digestSize: 20,
1181
- };
1182
- return obj;
1183
- });
1184
- }
1185
-
1186
- function calculateKeyBuffer(hasher, key) {
1187
- const { blockSize } = hasher;
1188
- const buf = getUInt8Buffer(key);
1189
- if (buf.length > blockSize) {
1190
- hasher.update(buf);
1191
- const uintArr = hasher.digest("binary");
1192
- hasher.init();
1193
- return uintArr;
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
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
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
- hasher.update(keyBuffer);
1210
- const obj = {
1211
- init: () => {
1212
- hasher.init();
1213
- hasher.update(keyBuffer);
1214
- return obj;
1215
- },
1216
- update: (data) => {
1217
- hasher.update(data);
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
- * ```js
1261
- * const {createHash} = await import('@leofcoin/crypto')
1262
- * createHash(data, algorithm)
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 createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
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
- * Hashes the created hash again
1272
- * ```js
1273
- * const {createDoubleHash} = await import('@leofcoin/crypto')
1274
- * createDoubleHash(data, algorithm)
1275
- * ```
1276
- * @param {Uint8Array} data
1277
- * @param {string} algorithm
1278
- * @returns Uint8Array
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 createDoubleHash = async (data, algorithm = 'SHA-512') =>
1281
- subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
1282
-
1283
- const generatePbkdf2 = async (password) => {
1284
- return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
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 pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
1288
- const key = await generatePbkdf2(password);
1289
- return subtle$1.deriveBits(
1290
- {
1291
- name: 'PBKDF2',
1292
- hash,
1293
- salt,
1294
- iterations
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
- key,
1297
- length
1298
- )
1500
+ wif: 0x7D, // s
1501
+ multiCodec: 0x7c4,
1502
+ bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
1299
1503
  };
1300
-
1301
- var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
1302
- if (!options) options = {};
1303
-
1304
- if (typeof options.seperator === 'string')
1305
- options.seperator = new TextEncoder().encode(options.seperator);
1306
-
1307
- const length = options.length || input.reduce((total, current, i) => {
1308
- total += current.length;
1309
- if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
1310
- return total
1311
- }, 0);
1312
-
1313
- const typedArray = new Uint8Array(length);
1314
-
1315
- let currentIndex = 0;
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
- const concatAndDoubleHash = async (input) => {
1331
- return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
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
- * Curve params from SEC 2 v2 §2.4.1.
1430
- * secp256k1 is a short Weierstrass / Koblitz curve with equation
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
- // Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
1440
- // callers cannot mutate them out from under the arithmetic constants captured below.
1441
- const secp256k1_CURVE = Object.freeze({
1442
- p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
1443
- n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
1444
- h: 1n,
1445
- a: 0n,
1446
- b: 7n,
1447
- Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
1448
- Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
1449
- });
1450
- const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
1451
- // 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
1452
- // by the RFC6979 paths here.
1453
- const L = 32;
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
- /** create Uint8Array */
1494
- const u8n = (len) => new Uint8Array(len);
1495
- // Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
1496
- const padh = (n, pad) => n.toString(16).padStart(pad, '0');
1497
- /** Render bytes as lowercase hex. */
1498
- const bytesToHex = (b) => {
1499
- let hex = '';
1500
- for (const e of abytes(b))
1501
- hex += padh(e, 2);
1502
- return hex;
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 C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
1505
- // Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
1506
- // prettier-ignore
1507
- const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
1508
- : ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
1509
- : ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
1510
- : undefined;
1511
- const hexToBytes = (hex) => {
1512
- const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
1513
- if (typeof hex !== 'string')
1514
- return err(e);
1515
- const hl = hex.length;
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
- // WebCrypto is available in all modern environments
1531
- const subtle = () => globalThis?.crypto?.subtle ?? err('crypto.subtle must be defined, consider polyfill');
1532
- // prettier-ignore
1533
- const concatBytes = (...arrs) => {
1534
- let len = 0;
1535
- for (const a of arrs)
1536
- len += abytes(a).length; // validate every input and sum lengths before copying
1537
- const r = u8n(len);
1538
- let pad = 0; // walk through each array,
1539
- for (const a of arrs)
1540
- r.set(a, pad), pad += a.length; // ensure they have proper type
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
- * WebCrypto OS-level CSPRNG (random number generator).
1545
- * Will throw when not available; large-request ceilings are delegated to getRandomValues().
1586
+ * Our & supported networks
1587
+ * @return {leofcoin, olivia}
1546
1588
  */
1547
- const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
1548
- const big = BigInt;
1549
- const arange = (n, min, max, msg = 'bad number: out of range') => {
1550
- if (typeof n !== 'bigint')
1551
- return err(msg, TypeError);
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
- // All exported provider slots are caller-configurable and may be unset or return arbitrary values,
1583
- // so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
1584
- const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
1585
- const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
1586
- // also rejects structurally similar Point values from other realms / bundled copies
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
- class Point {
1640
- static BASE;
1641
- static ZERO;
1642
- X;
1643
- Y;
1644
- Z;
1645
- constructor(X, Y, Z) {
1646
- this.X = FpIsValid(X);
1647
- this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
1648
- this.Z = FpIsValid(Z);
1649
- Object.freeze(this);
1650
- }
1651
- /** Returns the shared curve metadata object by reference.
1652
- * It is readonly only at type level, and mutating it won't retarget arithmetic,
1653
- * which already uses module-load snapshots. */
1654
- static CURVE() {
1655
- return secp256k1_CURVE;
1656
- }
1657
- /** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
1658
- static fromAffine(ap) {
1659
- const { x, y } = ap;
1660
- return x === 0n && y === 0n ? I : new Point(x, y, 1n);
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
- /** Convert Uint8Array or hex string to Point. */
1663
- static fromBytes(bytes) {
1664
- abytes(bytes);
1665
- const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
1666
- let p = undefined;
1667
- const length = bytes.length;
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
- static fromHex(hex) {
1691
- return Point.fromBytes(hexToBytes(hex));
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
- get x() {
1694
- return this.toAffine().x;
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
- get y() {
1697
- return this.toAffine().y;
1684
+ }
1685
+ function hexStringEqualsUInt8(str, buf) {
1686
+ if (str.length !== buf.length * 2) {
1687
+ return false;
1698
1688
  }
1699
- /** Equality check: compare points P&Q. */
1700
- equals(other) {
1701
- const { X: X1, Y: Y1, Z: Z1 } = this;
1702
- const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
1703
- const X1Z2 = M(X1 * Z2);
1704
- const X2Z1 = M(X2 * Z1);
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
- is0() {
1710
- return this.equals(I);
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
- /** Flip point over y coordinate. */
1713
- negate() {
1714
- return new Point(this.X, M(-this.Y), this.Z);
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
- /** Point doubling: P+P, complete formula. */
1717
- double() {
1718
- return this.add(this);
1719
- }
1720
- /**
1721
- * Point addition: P+Q, complete, exception-free formula
1722
- * (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
1723
- * Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
1724
- */
1725
- // prettier-ignore
1726
- add(other) {
1727
- const { X: X1, Y: Y1, Z: Z1 } = this;
1728
- const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
1729
- const a = 0n;
1730
- const b = _b;
1731
- let X3 = 0n, Y3 = 0n, Z3 = 0n;
1732
- const b3 = M(b * 3n);
1733
- let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
1734
- let t4 = M(X2 + Y2); // step 5
1735
- t3 = M(t3 * t4);
1736
- t4 = M(t0 + t1);
1737
- t3 = M(t3 - t4);
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
- /** Generator / base point */
1845
- const G = new Point(Gx, Gy, 1n);
1846
- /** Identity / zero point */
1847
- const I = new Point(0n, 1n, 0n);
1848
- // Static aliases
1849
- Point.BASE = G;
1850
- Point.ZERO = I;
1851
- /** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
1852
- const doubleScalarMulUns = (R, u1, u2) => {
1853
- return G.multiply(u1, false)
1854
- .add(R.multiply(u2, false))
1855
- .assertValidity();
1856
- };
1857
- // Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
1858
- const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
1859
- // Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
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
- const _sha = 'SHA-256';
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 Schnorr signature as per BIP340. Verifies itself before returning anything.
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
- const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
2066
- const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
2067
- const aux = taggedHash(T_AUX, a);
2068
- // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
2069
- const t = numTo32b(d ^ bytesToNumBE(aux));
2070
- // Let rand = hash/nonce(t || bytes(P) || m)
2071
- const rand = taggedHash(T_NONCE, t, px, m);
2072
- const { rx, k } = extractK(rand);
2073
- // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
2074
- const e = challenge(rx, px, m);
2075
- const sig = createSigSchnorr(k, rx, e, d);
2076
- // If Verify(bytes(P), m, sig) (see below) returns failure, abort
2077
- if (!verifySchnorr(sig, m, px))
2078
- err(E_INVSIG);
2079
- return sig;
2080
- };
2081
- const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
2082
- const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
2083
- const aux = await taggedHashAsync(T_AUX, a);
2084
- // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
2085
- const t = numTo32b(d ^ bytesToNumBE(aux));
2086
- // Let rand = hash/nonce(t || bytes(P) || m)
2087
- const rand = await taggedHashAsync(T_NONCE, t, px, m);
2088
- const { rx, k } = extractK(rand);
2089
- // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
2090
- const e = await challengeAsync(rx, px, m);
2091
- const sig = createSigSchnorr(k, rx, e, d);
2092
- // If Verify(bytes(P), m, sig) (see below) returns failure, abort
2093
- if (!(await verifySchnorrAsync(sig, m, px)))
2094
- err(E_INVSIG);
2095
- return sig;
2096
- };
2097
- const callSyncAsyncFn = (res, later) => {
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
- /** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
2133
- * after the initial byte checks. */
2134
- const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
2135
- /** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
2136
- * become false, but async backend failures reject the promise. Missing crypto.subtle is a
2137
- * runtime/backend error, not an "invalid signature" result, so we surface it instead of
2138
- * turning it into false. */
2139
- const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
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
- * BIP340 Schnorr helpers over secp256k1.
2142
- * @example
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
- const schnorr = /* @__PURE__ */ Object.freeze({
2156
- keygen: keygenSchnorr,
2157
- getPublicKey: pubSchnorr,
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
- return points;
2183
- };
2184
- let Gpows = undefined; // precomputes for base point G
2185
- // Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
2186
- const ctneg = (cnd, p) => {
2187
- const n = p.negate();
2188
- return cnd ? n : p;
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
- * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
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
- const wNAF = (n) => {
2202
- const comp = Gpows || (Gpows = precompute());
2203
- let p = I;
2204
- let f = G; // f must be G, or could become I in the end
2205
- const pow_2_w = 2 ** W; // 256 for W=8
2206
- const maxNum = pow_2_w; // 256 for W=8
2207
- const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
2208
- const shiftBy = big(W); // 8 for W=8
2209
- for (let w = 0; w < pwindows; w++) {
2210
- let wbits = Number(n & mask); // extract W bits.
2211
- n >>= shiftBy; // shift number by W bits.
2212
- // We use negative indexes to reduce size of precomputed table by 2x.
2213
- // Instead of needing precomputes 0..256, we only calculate them for 0..128.
2214
- // If an index > 128 is found, we do (256-index) - where 256 is next window.
2215
- // Naive: index +127 => 127, +224 => 224
2216
- // Optimized: index +127 => 127, +224 => 256-32
2217
- if (wbits > pwindowSize) {
2218
- wbits -= maxNum;
2219
- n += 1n;
2220
- }
2221
- const off = w * pwindowSize;
2222
- const offF = off; // offsets, evaluate both
2223
- const offP = off + Math.abs(wbits) - 1;
2224
- const isEven = w % 2 !== 0; // conditions, evaluate both
2225
- const isNeg = wbits < 0;
2226
- if (wbits === 0) {
2227
- // off == I: can't add it. Adding random offF instead.
2228
- f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
2229
- }
2230
- else {
2231
- p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
2232
- }
2233
- }
2234
- if (n !== 0n)
2235
- err('invalid wnaf');
2236
- return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
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
- const leofcoinOlivia = {
2240
- messagePrefix: '\u0019Leofcoin Signed Message:',
2241
- version: 1,
2242
- pubKeyHash: 0x73, // o
2243
- scriptHash: 0x76, // p
2244
- multiTxHash: 0x8b4125, // omtx
2245
- payments: {
2246
- version: 0,
2247
- unspent: 0x1fa443d7 // ounsp
2248
- },
2249
- wif: 0x7D, // s
2250
- multiCodec: 0x7c4,
2251
- bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
2252
- };
2253
- const bitcoinTestnet = {
2254
- messagePrefix: '\x18Bitcoin Signed Message:\n',
2255
- version: 1,
2256
- bech32: 'tb',
2257
- pubKeyHash: 0x6f,
2258
- scriptHash: 0xc4,
2259
- wif: 0xef,
2260
- bip32: {
2261
- public: 0x043587cf,
2262
- private: 0x04358394
2263
- },
2264
- multiCodec: 0
2265
- };
2266
- var testnets = {
2267
- 'leofcoin:olivia': leofcoinOlivia,
2268
- 'bitcoin:testnet': bitcoinTestnet
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
- // https://en.bitcoin.it/wiki/List_of_address_prefixes
2272
- // usage:
2273
- // networks['bitcoin']['testnet']
2274
- // networks.bitcoin.testnet
2214
+ new Mutex();
2275
2215
  /**
2276
- * Main network
2277
- * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
2216
+ * Creates a new RIPEMD-160 hash instance
2278
2217
  */
2279
- const leofcoin = {
2280
- messagePrefix: '\u0019Leofcoin Signed Message:',
2281
- version: 1,
2282
- pubKeyHash: 0x30, // L
2283
- scriptHash: 0x37, // P
2284
- multiTxHash: 0x3adeed, // Lmtx
2285
- payments: {
2286
- version: 0,
2287
- unspent: 0x0d6e0327 // Lunsp
2288
- },
2289
- coin_type: 640,
2290
- wif: 0x3F, // S
2291
- multiCodec: 0x3c4,
2292
- bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
2293
- testnet: testnets['leofcoin:olivia']
2294
- };
2295
- const bitcoin = {
2296
- messagePrefix: '\x18Bitcoin Signed Message:\n',
2297
- version: 1,
2298
- bech32: 'bc',
2299
- pubKeyHash: 0x00,
2300
- multiCodec: 0x00,
2301
- scriptHash: 0x05,
2302
- wif: 0x80,
2303
- coin_type: 0,
2304
- bip32: {
2305
- public: 0x0488b21e, private: 0x0488ade4
2306
- },
2307
- testnet: testnets['bitcoin:testnet']
2308
- };
2309
- const litecoin = {
2310
- messagePrefix: '\x19Litecoin Signed Message:\n',
2311
- version: 1,
2312
- pubKeyHash: 0x30,
2313
- scriptHash: 0x32,
2314
- wif: 0xb0,
2315
- bip32: {
2316
- public: 0x019da462,
2317
- private: 0x019d9cfe
2318
- },
2319
- bech32: '',
2320
- multiCodec: 0
2321
- };
2322
- const ethereum = {
2323
- messagePrefix: '\x19Ethereum Signed Message:\n',
2324
- version: 1,
2325
- pubKeyHash: 0x30,
2326
- scriptHash: 0x32,
2327
- bip32: {
2328
- private: 0x0488ADE4, public: 0x0488B21E
2329
- },
2330
- coin_type: 60,
2331
- wif: 0x45, //E
2332
- multiCodec: 0x3c5
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
- * Our & supported networks
2336
- * @return {leofcoin, olivia}
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
- var networks = {
2339
- leofcoin,
2340
- bitcoin,
2341
- litecoin,
2342
- ethereum
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
- const encode = (version, privateKey, compressed) => {
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$2(set));
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$2([
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$2([
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$1(buffer);
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$3.encode(this.version),
4915
- index$3.encode(this.multiCodec),
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$3.decode(buffer);
4932
- buffer = buffer.subarray(index$3.decode.bytes);
4933
- const codec = index$3.decode(buffer);
4934
- buffer = buffer.subarray(index$3.decode.bytes);
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$4.encode(this.multiSignature);
4962
+ return index.encode(this.multiSignature);
4963
4963
  }
4964
4964
  fromBs32(string) {
4965
- return this.decode(index$4.decode(string));
4965
+ return this.decode(index.decode(string));
4966
4966
  }
4967
4967
  toBs32Hex() {
4968
- return index$4.encodeHex(this.multiSignature);
4968
+ return index.encodeHex(this.multiSignature);
4969
4969
  }
4970
4970
  fromBs32Hex(string) {
4971
- return this.decode(index$4.decodeHex(string));
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$2([version, salt, iv, new Uint8Array(encrypted)]);
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$1(concatecated);
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$2([
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$3.decode(buffer);
5037
- buffer = buffer.slice(index$3.decode.bytes);
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$2([
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-D6qd-AUn.js');
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
- return this.#wallet.sign(hash.subarray(0, 32));
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, createSHA1 as c, createSHA224 as d, createSHA256 as e, createSHA384 as f, createSHA512 as g, encrypt as h, getDefaultExportFromCjs as i, index$2 as j, index$4 as k, index$1 as l, index$3 as m };
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 };