nostr-tools 2.23.2 → 2.23.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/lib/cjs/abstract-pool.js +6 -2
  2. package/lib/cjs/abstract-pool.js.map +2 -2
  3. package/lib/cjs/abstract-relay.js +6 -2
  4. package/lib/cjs/abstract-relay.js.map +2 -2
  5. package/lib/cjs/index.js +181 -17
  6. package/lib/cjs/index.js.map +4 -4
  7. package/lib/cjs/nip17.js +31 -9
  8. package/lib/cjs/nip17.js.map +2 -2
  9. package/lib/cjs/nip22.js +154 -0
  10. package/lib/cjs/nip22.js.map +7 -0
  11. package/lib/cjs/nip44.js +34 -10
  12. package/lib/cjs/nip44.js.map +2 -2
  13. package/lib/cjs/nip46.js +40 -12
  14. package/lib/cjs/nip46.js.map +2 -2
  15. package/lib/cjs/nip47.js +3 -3
  16. package/lib/cjs/nip47.js.map +2 -2
  17. package/lib/cjs/nip59.js +31 -9
  18. package/lib/cjs/nip59.js.map +2 -2
  19. package/lib/cjs/pool.js +6 -2
  20. package/lib/cjs/pool.js.map +2 -2
  21. package/lib/cjs/relay.js +6 -2
  22. package/lib/cjs/relay.js.map +2 -2
  23. package/lib/esm/abstract-pool.js +6 -2
  24. package/lib/esm/abstract-pool.js.map +2 -2
  25. package/lib/esm/abstract-relay.js +6 -2
  26. package/lib/esm/abstract-relay.js.map +2 -2
  27. package/lib/esm/index.js +181 -17
  28. package/lib/esm/index.js.map +4 -4
  29. package/lib/esm/nip17.js +31 -9
  30. package/lib/esm/nip17.js.map +2 -2
  31. package/lib/esm/nip22.js +133 -0
  32. package/lib/esm/nip22.js.map +7 -0
  33. package/lib/esm/nip44.js +34 -10
  34. package/lib/esm/nip44.js.map +2 -2
  35. package/lib/esm/nip46.js +40 -12
  36. package/lib/esm/nip46.js.map +2 -2
  37. package/lib/esm/nip47.js +3 -3
  38. package/lib/esm/nip47.js.map +2 -2
  39. package/lib/esm/nip59.js +31 -9
  40. package/lib/esm/nip59.js.map +2 -2
  41. package/lib/esm/pool.js +6 -2
  42. package/lib/esm/pool.js.map +2 -2
  43. package/lib/esm/relay.js +6 -2
  44. package/lib/esm/relay.js.map +2 -2
  45. package/lib/nostr.bundle.js +189 -25
  46. package/lib/nostr.bundle.js.map +4 -4
  47. package/package.json +8 -2
  48. package/lib/types/abstract-pool.d.ts +0 -60
  49. package/lib/types/abstract-relay.d.ts +0 -110
  50. package/lib/types/benchmarks.d.ts +0 -1
  51. package/lib/types/core.d.ts +0 -32
  52. package/lib/types/core.test.d.ts +0 -1
  53. package/lib/types/fakejson.d.ts +0 -6
  54. package/lib/types/fakejson.test.d.ts +0 -1
  55. package/lib/types/filter.d.ts +0 -19
  56. package/lib/types/filter.test.d.ts +0 -1
  57. package/lib/types/helpers.d.ts +0 -2
  58. package/lib/types/index.d.ts +0 -30
  59. package/lib/types/kinds.d.ts +0 -200
  60. package/lib/types/kinds.test.d.ts +0 -1
  61. package/lib/types/nip04.d.ts +0 -2
  62. package/lib/types/nip04.test.d.ts +0 -1
  63. package/lib/types/nip05.d.ts +0 -17
  64. package/lib/types/nip05.test.d.ts +0 -1
  65. package/lib/types/nip06.d.ts +0 -15
  66. package/lib/types/nip06.test.d.ts +0 -1
  67. package/lib/types/nip07.d.ts +0 -13
  68. package/lib/types/nip10.d.ts +0 -24
  69. package/lib/types/nip10.test.d.ts +0 -1
  70. package/lib/types/nip11.d.ts +0 -266
  71. package/lib/types/nip11.test.d.ts +0 -1
  72. package/lib/types/nip13.d.ts +0 -8
  73. package/lib/types/nip13.test.d.ts +0 -1
  74. package/lib/types/nip17.d.ts +0 -15
  75. package/lib/types/nip17.test.d.ts +0 -1
  76. package/lib/types/nip18.d.ts +0 -22
  77. package/lib/types/nip18.test.d.ts +0 -1
  78. package/lib/types/nip19.d.ts +0 -81
  79. package/lib/types/nip19.test.d.ts +0 -1
  80. package/lib/types/nip21.d.ts +0 -34
  81. package/lib/types/nip21.test.d.ts +0 -1
  82. package/lib/types/nip25.d.ts +0 -15
  83. package/lib/types/nip25.test.d.ts +0 -1
  84. package/lib/types/nip27.d.ts +0 -32
  85. package/lib/types/nip27.test.d.ts +0 -1
  86. package/lib/types/nip28.d.ts +0 -46
  87. package/lib/types/nip28.test.d.ts +0 -1
  88. package/lib/types/nip29.d.ts +0 -265
  89. package/lib/types/nip30.d.ts +0 -22
  90. package/lib/types/nip30.test.d.ts +0 -1
  91. package/lib/types/nip39.d.ts +0 -2
  92. package/lib/types/nip39.test.d.ts +0 -1
  93. package/lib/types/nip40.d.ts +0 -10
  94. package/lib/types/nip40.test.d.ts +0 -1
  95. package/lib/types/nip42.d.ts +0 -5
  96. package/lib/types/nip42.test.d.ts +0 -1
  97. package/lib/types/nip44.d.ts +0 -13
  98. package/lib/types/nip44.test.d.ts +0 -1
  99. package/lib/types/nip46.d.ts +0 -117
  100. package/lib/types/nip47.d.ts +0 -9
  101. package/lib/types/nip47.test.d.ts +0 -1
  102. package/lib/types/nip49.d.ts +0 -3
  103. package/lib/types/nip49.test.d.ts +0 -1
  104. package/lib/types/nip54.d.ts +0 -1
  105. package/lib/types/nip54.test.d.ts +0 -1
  106. package/lib/types/nip55.d.ts +0 -30
  107. package/lib/types/nip55.test.d.ts +0 -1
  108. package/lib/types/nip57.d.ts +0 -25
  109. package/lib/types/nip57.test.d.ts +0 -1
  110. package/lib/types/nip58.d.ts +0 -134
  111. package/lib/types/nip58.test.d.ts +0 -1
  112. package/lib/types/nip59.d.ts +0 -12
  113. package/lib/types/nip59.test.d.ts +0 -1
  114. package/lib/types/nip75.d.ts +0 -61
  115. package/lib/types/nip75.test.d.ts +0 -1
  116. package/lib/types/nip77.d.ts +0 -102
  117. package/lib/types/nip77.test.d.ts +0 -1
  118. package/lib/types/nip94.d.ts +0 -87
  119. package/lib/types/nip94.test.d.ts +0 -1
  120. package/lib/types/nip98.d.ts +0 -74
  121. package/lib/types/nip98.test.d.ts +0 -1
  122. package/lib/types/nip99.d.ts +0 -92
  123. package/lib/types/nip99.test.d.ts +0 -1
  124. package/lib/types/nipb7.d.ts +0 -23
  125. package/lib/types/nipb7.test.d.ts +0 -1
  126. package/lib/types/pool.d.ts +0 -6
  127. package/lib/types/pool.test.d.ts +0 -1
  128. package/lib/types/pure.d.ts +0 -8
  129. package/lib/types/pure.test.d.ts +0 -1
  130. package/lib/types/references.d.ts +0 -10
  131. package/lib/types/references.test.d.ts +0 -1
  132. package/lib/types/relay.d.ts +0 -11
  133. package/lib/types/relay.test.d.ts +0 -1
  134. package/lib/types/signer.d.ts +0 -11
  135. package/lib/types/test-helpers.d.ts +0 -14
  136. package/lib/types/utils.d.ts +0 -9
  137. package/lib/types/utils.test.d.ts +0 -1
  138. package/lib/types/wasm.d.ts +0 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../index.ts", "../node_modules/@noble/hashes/src/utils.ts", "../node_modules/@noble/hashes/src/_md.ts", "../node_modules/@noble/hashes/src/sha2.ts", "../node_modules/@noble/curves/src/utils.ts", "../node_modules/@noble/curves/src/abstract/modular.ts", "../node_modules/@noble/curves/src/abstract/curve.ts", "../node_modules/@noble/hashes/src/hmac.ts", "../node_modules/@noble/curves/src/abstract/weierstrass.ts", "../node_modules/@noble/curves/src/secp256k1.ts", "../core.ts", "../utils.ts", "../pure.ts", "../kinds.ts", "../filter.ts", "../fakejson.ts", "../nip42.ts", "../abstract-relay.ts", "../relay.ts", "../helpers.ts", "../abstract-pool.ts", "../pool.ts", "../nip19.ts", "../node_modules/@scure/base/index.ts", "../references.ts", "../nip04.ts", "../node_modules/@noble/ciphers/src/utils.ts", "../node_modules/@noble/ciphers/src/aes.ts", "../nip05.ts", "../nip10.ts", "../nip11.ts", "../nip13.ts", "../nip17.ts", "../nip59.ts", "../nip44.ts", "../node_modules/@noble/ciphers/src/_arx.ts", "../node_modules/@noble/ciphers/src/_poly1305.ts", "../node_modules/@noble/ciphers/src/chacha.ts", "../node_modules/@noble/hashes/src/hkdf.ts", "../nip18.ts", "../nip21.ts", "../nip25.ts", "../nip27.ts", "../nip28.ts", "../nip30.ts", "../nip39.ts", "../nip47.ts", "../nip54.ts", "../nip57.ts", "../nip77.ts", "../nip98.ts"],
4
- "sourcesContent": ["export * from './pure.ts'\nexport { Relay } from './relay.ts'\nexport * from './filter.ts'\nexport { SimplePool } from './pool.ts'\nexport * from './references.ts'\n\nexport * as nip04 from './nip04.ts'\nexport * as nip05 from './nip05.ts'\nexport * as nip10 from './nip10.ts'\nexport * as nip11 from './nip11.ts'\nexport * as nip13 from './nip13.ts'\nexport * as nip17 from './nip17.ts'\nexport * as nip18 from './nip18.ts'\nexport * as nip19 from './nip19.ts'\nexport * as nip21 from './nip21.ts'\nexport * as nip25 from './nip25.ts'\nexport * as nip27 from './nip27.ts'\nexport * as nip28 from './nip28.ts'\nexport * as nip30 from './nip30.ts'\nexport * as nip39 from './nip39.ts'\nexport * as nip42 from './nip42.ts'\nexport * as nip44 from './nip44.ts'\nexport * as nip47 from './nip47.ts'\nexport * as nip54 from './nip54.ts'\nexport * as nip57 from './nip57.ts'\nexport * as nip59 from './nip59.ts'\nexport * as nip77 from './nip77.ts'\nexport * as nip98 from './nip98.ts'\n\nexport * as kinds from './kinds.ts'\nexport * as fj from './fakejson.ts'\nexport * as utils from './utils.ts'\n", "/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number, title: string = ''): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts something is hash */\nexport function ahash(h: CHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput, errorTitle = ''): Uint8Array {\n if (typeof data === 'string') return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\n/** Merges default options and passed options. */\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Common interface for all hashes. */\nexport interface Hash<T> {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: Uint8Array): this;\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n destroy(): void;\n _cloneInto(to?: T): T;\n clone(): T;\n}\n\n/** PseudoRandom (number) Generator */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash constructor */\nexport type HasherCons<T, Opts = undefined> = Opts extends undefined ? () => T : (opts?: Opts) => T;\n/** Optional hash params. */\nexport type HashInfo = {\n oid?: Uint8Array; // DER encoded OID in bytes\n};\n/** Hash function */\nexport type CHash<T extends Hash<T> = Hash<any>, Opts = undefined> = {\n outputLen: number;\n blockLen: number;\n} & HashInfo &\n (Opts extends undefined\n ? {\n (msg: Uint8Array): Uint8Array;\n create(): T;\n }\n : {\n (msg: Uint8Array, opts?: Opts): Uint8Array;\n create(opts?: Opts): T;\n });\n/** XOF with output */\nexport type CHashXOF<T extends HashXOF<T> = HashXOF<any>, Opts = undefined> = CHash<T, Opts>;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher<T extends Hash<T>, Opts = undefined>(\n hashCons: HasherCons<T, Opts>,\n info: HashInfo = {}\n): CHash<T, Opts> {\n const hashC: any = (msg: Uint8Array, opts?: Opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: Opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix: number): Required<HashInfo> => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n", "/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, type Hash } from './utils.ts';\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> implements Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to as unknown as any;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n", "/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n", "/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n anumber,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type CHash = {\n (message: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array) => Uint8Array;\nexport function abool(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// Used in weierstrass, der\nfunction abignumber(n: number | bigint) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n)) throw new Error('positive bigint expected, got ' + n);\n } else anumber(n);\n return n;\n}\n\nexport function asafenumber(value: number, title: string = ''): void {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\n\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len) throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, message: Uint8Array) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n const u8n = (len: number): Uint8Array => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs: Uint8Array[]) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed: Uint8Array = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters) throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\nexport function validateObject(\n object: Record<string, any>,\n fields: Record<string, string> = {},\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f: typeof fields, isOpt: boolean) =>\n Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n\nexport interface CryptoKeys {\n lengths: { seed?: number; public?: number; secret?: number };\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n}\n\n/** Generic interface for signatures. Has keygen, sign and verify. */\nexport interface Signer extends CryptoKeys {\n // Interfaces are fun. We cannot just add new fields without copying old ones.\n lengths: {\n seed?: number;\n public?: number;\n secret?: number;\n signRand?: number;\n signature?: number;\n };\n sign: (msg: Uint8Array, secretKey: Uint8Array) => Uint8Array;\n verify: (sig: Uint8Array, msg: Uint8Array, publicKey: Uint8Array) => boolean;\n}\n", "/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes,\n anumber,\n bytesToNumberBE,\n bytesToNumberLE,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from '../utils.ts';\n\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) \u2261 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P \u2261 3 (mod 4)\n * 2. P \u2261 5 (mod 8)\n * 3. P \u2261 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P \u2261 3 (mod 4) => \u221An = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P \u2261 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P \u2261 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n BYTES: number;\n BITS: number;\n isLE: boolean;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) \u2261 1 if a is a square (mod p), quadratic residue\n * * (a | p) \u2261 -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) \u2261 0 if a \u2261 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n isLE: boolean;\n BITS: number;\n sqrt: SqrtFn;\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n}>;\nclass _Field implements IField<bigint> {\n readonly ORDER: bigint;\n readonly BITS: number;\n readonly BYTES: number;\n readonly isLE: boolean;\n readonly ZERO = _0n;\n readonly ONE = _1n;\n readonly _lengths?: number[];\n private _sqrt: ReturnType<typeof FpSqrt> | undefined; // cached sqrt\n private readonly _mod?: boolean;\n constructor(ORDER: bigint, opts: FieldOpts = {}) {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number') _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function') this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean') this.isLE = opts.isLE;\n if (opts.allowedLengths) this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean') this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n\n create(num: bigint) {\n return mod(num, this.ORDER);\n }\n isValid(num: bigint) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num: bigint) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num: bigint) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num: bigint) {\n return (num & _1n) === _1n;\n }\n neg(num: bigint) {\n return mod(-num, this.ORDER);\n }\n eql(lhs: bigint, rhs: bigint) {\n return lhs === rhs;\n }\n\n sqr(num: bigint) {\n return mod(num * num, this.ORDER);\n }\n add(lhs: bigint, rhs: bigint) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs: bigint, rhs: bigint) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs: bigint, rhs: bigint) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num: bigint, power: bigint): bigint {\n return FpPow(this, num, power);\n }\n div(lhs: bigint, rhs: bigint) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n\n // Same as above, but doesn't normalize\n sqrN(num: bigint) {\n return num * num;\n }\n addN(lhs: bigint, rhs: bigint) {\n return lhs + rhs;\n }\n subN(lhs: bigint, rhs: bigint) {\n return lhs - rhs;\n }\n mulN(lhs: bigint, rhs: bigint) {\n return lhs * rhs;\n }\n\n inv(num: bigint) {\n return invert(num, this.ORDER);\n }\n sqrt(num: bigint): bigint {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt) this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num: bigint) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes: Uint8Array, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst: bigint[]): bigint[] {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a: bigint, b: bigint, condition: boolean) {\n return condition ? b : a;\n }\n}\n\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER: bigint, opts: FieldOpts = {}): Readonly<FpField> {\n return new _Field(ORDER, opts);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n", "/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, type Signer } from '../utils.ts';\nimport { Field, FpInvertBatch, validateField, type IField } from './modular.ts';\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\n\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\ntype WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / \uD835\uDC4A) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(\uD835\uDC4A\u22121) * (Math.ceil(\uD835\uDC5B / \uD835\uDC4A) + 1), where:\n * - \uD835\uDC4A is the window size\n * - \uD835\uDC5B is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar \u00D7 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 \u00D7 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 \u00D7 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n\ntype KeygenFn = (\n seed?: Uint8Array,\n isCompressed?: boolean\n) => { secretKey: Uint8Array; publicKey: Uint8Array };\nexport function createKeygen(\n randomSecretKey: Function,\n getPublicKey: Signer['getPublicKey']\n): KeygenFn {\n return function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n", "/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC<T extends Hash<T>> implements Hash<_HMAC<T>> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC<T>): _HMAC<T> {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC<T> {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC<any>;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC<any>(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC<any>(hash, key);\n", "/**\n * Short Weierstrass curve methods. The formula is: y\u00B2 = x\u00B3 + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils.js';\nimport {\n abool,\n abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n hexToBytes,\n isBytes,\n memoized,\n numberToHexUnpadded,\n validateObject,\n randomBytes as wcRandomBytes,\n type CHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n validateField,\n type IField,\n} from './modular.ts';\n\nexport type { AffinePoint };\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism \u03C8**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism \u03C8 transforms a point: `P = (x, y) \u21A6 \u03C8(P) = (\u03B2\u00B7x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k \u2261 k\u2081 + k\u2082\u00B7\u03BB (mod n)`\n * 3. Then these are combined: `k\u00B7P = k\u2081\u00B7P + k\u2082\u00B7\u03C8(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: \u03B2 \u2208 F\u209A with \u03B2\u00B3 = 1, \u03B2 \u2260 1\n * * lambda: \u03BB \u2208 F\u2099 with \u03BB\u00B3 = 1, \u03BB \u2260 1\n * * splitScalar decomposes k \u21A6 k\u2081, k\u2082, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-\u03BB, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\n/**\n * Option to enable hedged signatures with improved security.\n *\n * * Randomly generated k is bad, because broken CSPRNG would leak private keys.\n * * Deterministic k (RFC6979) is better; but is suspectible to fault attacks.\n *\n * We allow using technique described in RFC6979 3.6: additional k', a.k.a. adding randomness\n * to deterministic sig. If CSPRNG is broken & randomness is weak, it would STILL be as secure\n * as ordinary sig without ExtraEntropy.\n *\n * * `true` means \"fetch data, from CSPRNG, incorporate it into k generation\"\n * * `false` means \"disable extra entropy, use purely deterministic k\"\n * * `Uint8Array` passed means \"incorporate following data into k generation\"\n *\n * https://paulmillr.com/posts/deterministic-signatures/\n */\nexport type ECDSAExtraEntropy = boolean | Uint8Array;\n/**\n * - `compact` is the default format\n * - `recovered` is the same as compact, but with an extra byte indicating recovery byte\n * - `der` is ASN.1 DER encoding\n */\nexport type ECDSASignatureFormat = 'compact' | 'recovered' | 'der';\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n */\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n */\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n * - `extraEntropy`: (default: false) creates sigs with increased security, see {@link ECDSAExtraEntropy}\n */\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n extraEntropy?: ECDSAExtraEntropy;\n};\n\nfunction validateSigFormat(format: string): ECDSASignatureFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASignatureFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n opts: T,\n def: D\n): Required<ECDSASignOpts> {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n CURVE(): WeierstrassOpts<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\nexport type WeierstrassExtraOpts<T> = Partial<{\n Fp: IField<T>;\n Fn: IField<bigint>;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: (key: Uint8Array, message: Uint8Array) => Uint8Array;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed?: boolean\n ) => Uint8Array;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Uint8Array, secretKey: Uint8Array, opts?: ECDSASignOpts) => Uint8Array;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(bytes: Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = abytes(bytes, undefined, 'signature');\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * See {@link WeierstrassOpts}.\n *\n * @example\n```js\nconst opts = {\n p: 0xfffffffffffffffffffffffffffffffeffffac73n,\n n: 0x100000000000000000001b8fa16dfab9aca16b6b3n,\n h: 1n,\n a: 0n,\n b: 7n,\n Gx: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\n Gy: 0x938cf935318fdced6bc28286531733c3f03c4feen,\n};\nconst secp160k1_Point = weierstrass(opts);\n```\n */\nexport function weierstrass<T>(\n params: WeierstrassOpts<T>,\n extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n const validated = createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts<T>;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y\u00B2 = x\u00B3 + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y\u00B2 ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const evenY = Fp.isOdd!(y);\n const evenH = (head & 1) === 1; // ECDSA-specific\n if (evenH !== evenY) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x\u00B2 * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x\u00B3 + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y\u00B2 == x\u00B3 + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y\u00B2\n const right = weierstrassEquation(x); // x\u00B3 + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y\u00B2 = x\u00B3 + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant \u0394 part should be non-zero: 4a\u00B3 + 27b\u00B2 != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('Weierstrass Point expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) \u220B (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) \u220B (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint<T> {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts<T> {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint<T>): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n\n static fromHex(hex: string): Point {\n return Point.fromBytes(hexToBytes(hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO; // 0\n if (sc === _1n) return p; // 1\n if (wnaf.hasCache(this)) return this.multiply(sc); // precomputes\n // We don't have method for double scalar multiplication (aP + bQ):\n // Even with using Strauss-Shamir trick, it's 35% slower than na\u00EFve mul+add.\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint<T> {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASignature & { readonly recovery: number };\n hasHighS(): boolean;\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint<bigint>;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n}\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASignatureFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASignatureFormat): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n Fp: IField<T>,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n Fp: IField<T>,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons<bigint>,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || wcRandomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: Uint8Array) {\n try {\n const num = Fn.fromBytes(secretKey);\n return Fn.isValidNot0(num);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: Uint8Array, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: Uint8Array): boolean | undefined {\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (!isBytes(item)) return undefined;\n if (('_lengths' in Fn && Fn._lengths) || secretKey === publicKey) return undefined;\n const l = abytes(item, undefined, 'key').length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed = true\n ): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = Fn.fromBytes(secretKeyA);\n const b = Point.fromBytes(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n };\n const keygen = createKeygen(randomSecretKey, getPublicKey);\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n *\n * @param Point created using {@link weierstrass} function\n * @param hash used for 1) message prehash-ing 2) k generation in `sign`, using hmac_drbg(hash)\n * @param ecdsaOpts rarely needed, see {@link ECDSAOpts}\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons<bigint>,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n ecdsaOpts = Object.assign({}, ecdsaOpts);\n const randomBytes = ecdsaOpts.randomBytes || wcRandomBytes;\n const hmac = ecdsaOpts.hmac || ((key, msg) => nobleHmac(hash, key, msg));\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required<ECDSASignOpts> = {\n prehash: true,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : true,\n format: 'compact' as ECDSASignatureFormat,\n extraEntropy: false,\n };\n const hasLargeCofactor = CURVE_ORDER * _2n < Fp.ORDER; // Won't CURVE().h > 2n be more effective?\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function assertSmallCofactor(): void {\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n if (hasLargeCofactor)\n throw new Error('\"recovered\" sig type is not supported for cofactor >2 curves');\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASignatureFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) {\n assertSmallCofactor();\n if (![0, 1, 2, 3].includes(recovery)) throw new Error('invalid recovery id');\n this.recovery = recovery;\n }\n Object.freeze(this);\n }\n\n static fromBytes(\n bytes: Uint8Array,\n format: ECDSASignatureFormat = defaultSigOpts.format\n ): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = lengths.signature! / 2;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASignatureFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n private assertRecovery(): number {\n const { recovery } = this;\n if (recovery == null) throw new Error('invalid recovery id: must be present');\n return recovery;\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint<bigint> {\n const { r, s } = this;\n const recovery = this.assertRecovery();\n const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('invalid recovery id: sig.r+curve.n != R.x');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(abytes(messageHash, undefined, 'msgHash')); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('invalid recovery: point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASignatureFormat = defaultSigOpts.format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const { r, s } = this;\n const rb = Fn.toBytes(r);\n const sb = Fn.toBytes(s);\n if (format === 'recovered') {\n assertSmallCofactor();\n return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb);\n }\n return concatBytes(rb, sb);\n }\n\n toHex(format?: ECDSASignatureFormat) {\n return bytesToHex(this.toBytes(format));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts) {\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = Fn.fromBytes(secretKey); // validate secret key, convert to bigint\n if (!Fn.isValidNot0(d)) throw new Error('invalid private key');\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(abytes(e, undefined, 'extraEntropy')); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k\u22C5G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b \u2208 [1,q\u22121] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): Signature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k\u22C5G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // s = k^-1(m + rd) mod n\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3 when q.x>n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always in the bottom half of N\n recovery ^= 1;\n }\n return new Signature(r, normS, hasLargeCofactor ? undefined : recovery);\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G \u00D7 k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts = {}): Uint8Array {\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg<Signature>(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig.toBytes(opts.format);\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1\u22C5G + u2\u22C5P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = abytes(publicKey, undefined, 'publicKey');\n message = validateMsgAndHash(message, prehash);\n if (!isBytes(signature as any)) {\n const end = signature instanceof Signature ? ', use sig.toBytes()' : '';\n throw new Error('verify expects Uint8Array signature' + end);\n }\n validateSigLength(signature, format); // execute this twice because we want loud error\n try {\n const sig = Signature.fromBytes(signature, format);\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1\u22C5G + u2\u22C5P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n }) satisfies Signer;\n}\n", "/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism \u03C8,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createKeygen, type CurveLengths } from './abstract/curve.ts';\nimport { createHasher, type H2CHasher, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, pow2 } from './abstract/modular.ts';\nimport {\n type ECDSA,\n ecdsa,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n weierstrass,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport { abytes, asciiToBytes, bytesToNumberBE, concatBytes } from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Pointk1.BASE.multiply(Pointk1.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * \u221An = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\nconst Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {\n Fp: Fpk1,\n endo: secp256k1_ENDO,\n});\n\n/**\n * secp256k1 curve: ECDSA and ECDH methods.\n *\n * Uses sha256 to hash messages. To use a different hash,\n * pass `{ prehash: false }` to sign / verify.\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * // const publicKey = secp256k1.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey);\n * // const sigKeccak = secp256k1.sign(keccak256(msg), secretKey, { prehash: false });\n * ```\n */\nexport const secp256k1: ECDSA = /* @__PURE__ */ ecdsa(Pointk1, sha256);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(asciiToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: Uint8Array) {\n const { Fn, BASE } = Pointk1;\n const d_ = Fn.fromBytes(priv);\n const p = BASE.multiply(d_); // P = d'\u22C5G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x \u2265 p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x\u00B3 + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Uint8Array): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'\u2265n. Ret bytes(d'\u22C5G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Uint8Array,\n secretKey: Uint8Array,\n auxRand: Uint8Array = randomBytes(32)\n): Uint8Array {\n const { Fn } = Pointk1;\n const m = abytes(message, undefined, 'message');\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = abytes(auxRand, 32, 'auxRand'); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'\u22C5G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean {\n const { Fp, Fn, BASE } = Pointk1;\n const sig = abytes(signature, 64, 'signature');\n const m = abytes(message, undefined, 'message');\n const pub = abytes(publicKey, 32, 'publicKey');\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r \u2265 p.\n if (!Fp.isValidNot0(r)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s \u2265 n.\n if (!Fn.isValidNot0(s)) return false;\n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n // R = s\u22C5G - e\u22C5P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) \u2260 r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType<bigint>) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n return {\n keygen: createKeygen(randomSecretKey, schnorrGetPublicKey),\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey,\n taggedHash,\n lift_x,\n pointToBytes,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<WeierstrassPointCons<bigint>> = /* @__PURE__ */ (() =>\n createHasher(\n Pointk1,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n }\n ))();\n", "export interface Nostr {\n generateSecretKey(): Uint8Array\n getPublicKey(secretKey: Uint8Array): string\n finalizeEvent(event: EventTemplate, secretKey: Uint8Array): VerifiedEvent\n verifyEvent(event: Event): event is VerifiedEvent\n}\n\n/** Designates a verified event signature. */\nexport const verifiedSymbol = Symbol('verified')\n\nexport type NostrEvent = {\n kind: number\n tags: string[][]\n content: string\n created_at: number\n pubkey: string\n id: string\n sig: string\n [verifiedSymbol]?: boolean\n}\n\nexport type Event = NostrEvent\nexport type EventTemplate = Pick<Event, 'kind' | 'tags' | 'content' | 'created_at'>\nexport type UnsignedEvent = Pick<Event, 'kind' | 'tags' | 'content' | 'created_at' | 'pubkey'>\n\n/** An event whose signature has been verified. */\nexport interface VerifiedEvent extends Event {\n [verifiedSymbol]: true\n}\n\nconst isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\n\nexport function validateEvent<T>(event: T): event is T & UnsignedEvent {\n if (!isRecord(event)) return false\n if (typeof event.kind !== 'number') return false\n if (typeof event.content !== 'string') return false\n if (typeof event.created_at !== 'number') return false\n if (typeof event.pubkey !== 'string') return false\n if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false\n\n if (!Array.isArray(event.tags)) return false\n for (let i = 0; i < event.tags.length; i++) {\n let tag = event.tags[i]\n if (!Array.isArray(tag)) return false\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] !== 'string') return false\n }\n }\n\n return true\n}\n\n/**\n * Sort events in reverse-chronological order by the `created_at` timestamp,\n * and then by the event `id` (lexicographically) in case of ties.\n * This mutates the array.\n */\nexport function sortEvents(events: Event[]): Event[] {\n return events.sort((a: NostrEvent, b: NostrEvent): number => {\n if (a.created_at !== b.created_at) {\n return b.created_at - a.created_at\n }\n return a.id.localeCompare(b.id)\n })\n}\n", "import type { NostrEvent } from './core.ts'\n\nexport const utf8Decoder: TextDecoder = new TextDecoder('utf-8')\nexport const utf8Encoder: TextEncoder = new TextEncoder()\n\nexport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport function normalizeURL(url: string): string {\n try {\n if (url.indexOf('://') === -1) url = 'wss://' + url\n let p = new URL(url)\n if (p.protocol === 'http:') p.protocol = 'ws:'\n else if (p.protocol === 'https:') p.protocol = 'wss:'\n p.pathname = p.pathname.replace(/\\/+/g, '/')\n if (p.pathname.endsWith('/')) p.pathname = p.pathname.slice(0, -1)\n if ((p.port === '80' && p.protocol === 'ws:') || (p.port === '443' && p.protocol === 'wss:')) p.port = ''\n p.searchParams.sort()\n p.hash = ''\n return p.toString()\n } catch (e) {\n throw new Error(`Invalid URL: ${url}`)\n }\n}\n\nexport function insertEventIntoDescendingList(sortedArray: NostrEvent[], event: NostrEvent): NostrEvent[] {\n const [idx, found] = binarySearch(sortedArray, b => {\n if (event.id === b.id) return 0\n if (event.created_at === b.created_at) return -1\n return b.created_at - event.created_at\n })\n if (!found) {\n sortedArray.splice(idx, 0, event)\n }\n return sortedArray\n}\n\nexport function insertEventIntoAscendingList(sortedArray: NostrEvent[], event: NostrEvent): NostrEvent[] {\n const [idx, found] = binarySearch(sortedArray, b => {\n if (event.id === b.id) return 0\n if (event.created_at === b.created_at) return -1\n return event.created_at - b.created_at\n })\n if (!found) {\n sortedArray.splice(idx, 0, event)\n }\n return sortedArray\n}\n\nexport function binarySearch<T>(arr: T[], compare: (b: T) => number): [number, boolean] {\n let start = 0\n let end = arr.length - 1\n\n while (start <= end) {\n const mid = Math.floor((start + end) / 2)\n const cmp = compare(arr[mid])\n\n if (cmp === 0) {\n return [mid, true]\n }\n\n if (cmp < 0) {\n end = mid - 1\n } else {\n start = mid + 1\n }\n }\n\n return [start, false]\n}\n\nexport function mergeReverseSortedLists(list1: NostrEvent[], list2: NostrEvent[]): NostrEvent[] {\n const result: NostrEvent[] = new Array(list1.length + list2.length)\n result.length = 0\n let i1 = 0\n let i2 = 0\n let sameTimestampIds: string[] = []\n\n while (i1 < list1.length && i2 < list2.length) {\n let next: NostrEvent\n if (list1[i1]?.created_at > list2[i2]?.created_at) {\n next = list1[i1]\n i1++\n } else {\n next = list2[i2]\n i2++\n }\n\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id)) continue\n } else {\n sameTimestampIds.length = 0\n }\n\n result.push(next)\n sameTimestampIds.push(next.id)\n }\n\n while (i1 < list1.length) {\n const next = list1[i1]\n i1++\n\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id)) continue\n } else {\n sameTimestampIds.length = 0\n }\n result.push(next)\n sameTimestampIds.push(next.id)\n }\n\n while (i2 < list2.length) {\n const next = list2[i2]\n i2++\n\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id)) continue\n } else {\n sameTimestampIds.length = 0\n }\n result.push(next)\n sameTimestampIds.push(next.id)\n }\n\n return result\n}\n", "import { schnorr } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { Nostr, Event, EventTemplate, UnsignedEvent, VerifiedEvent, verifiedSymbol, validateEvent } from './core.ts'\nimport { sha256 } from '@noble/hashes/sha2.js'\n\nimport { utf8Encoder } from './utils.ts'\n\nclass JS implements Nostr {\n generateSecretKey(): Uint8Array {\n return schnorr.utils.randomSecretKey()\n }\n getPublicKey(secretKey: Uint8Array): string {\n return bytesToHex(schnorr.getPublicKey(secretKey))\n }\n finalizeEvent(t: EventTemplate, secretKey: Uint8Array): VerifiedEvent {\n const event = t as VerifiedEvent\n event.pubkey = bytesToHex(schnorr.getPublicKey(secretKey))\n event.id = getEventHash(event)\n event.sig = bytesToHex(schnorr.sign(hexToBytes(getEventHash(event)), secretKey))\n event[verifiedSymbol] = true\n return event\n }\n verifyEvent(event: Event): event is VerifiedEvent {\n if (typeof event[verifiedSymbol] === 'boolean') return event[verifiedSymbol]\n\n try {\n const hash = getEventHash(event)\n if (hash !== event.id) {\n event[verifiedSymbol] = false\n return false\n }\n\n const valid = schnorr.verify(hexToBytes(event.sig), hexToBytes(hash), hexToBytes(event.pubkey))\n event[verifiedSymbol] = valid\n return valid\n } catch (err) {\n event[verifiedSymbol] = false\n return false\n }\n }\n}\n\nexport function serializeEvent(evt: UnsignedEvent): string {\n if (!validateEvent(evt)) throw new Error(\"can't serialize event with wrong or missing properties\")\n return JSON.stringify([0, evt.pubkey, evt.created_at, evt.kind, evt.tags, evt.content])\n}\n\nexport function getEventHash(event: UnsignedEvent): string {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))\n return bytesToHex(eventHash)\n}\n\nconst i: JS = new JS()\n\nexport const generateSecretKey = i.generateSecretKey\nexport const getPublicKey = i.getPublicKey\nexport const finalizeEvent = i.finalizeEvent\nexport const verifyEvent = i.verifyEvent\nexport * from './core.ts'\n", "import { NostrEvent, validateEvent } from './pure.ts'\n\n/** Events are **regular**, which means they're all expected to be stored by relays. */\nexport function isRegularKind(kind: number): boolean {\n return kind < 10000 && kind !== 0 && kind !== 3\n}\n\n/** Events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. */\nexport function isReplaceableKind(kind: number): boolean {\n return kind === 0 || kind === 3 || (10000 <= kind && kind < 20000)\n}\n\n/** Events are **ephemeral**, which means they are not expected to be stored by relays. */\nexport function isEphemeralKind(kind: number): boolean {\n return 20000 <= kind && kind < 30000\n}\n\n/** Events are **addressable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag, only the latest event is expected to be stored by relays, older versions are expected to be discarded. */\nexport function isAddressableKind(kind: number): boolean {\n return 30000 <= kind && kind < 40000\n}\n\n/** Classification of the event kind. */\nexport type KindClassification = 'regular' | 'replaceable' | 'ephemeral' | 'parameterized' | 'unknown'\n\n/** Determine the classification of this kind of event if known, or `unknown`. */\nexport function classifyKind(kind: number): KindClassification {\n if (isRegularKind(kind)) return 'regular'\n if (isReplaceableKind(kind)) return 'replaceable'\n if (isEphemeralKind(kind)) return 'ephemeral'\n if (isAddressableKind(kind)) return 'parameterized'\n return 'unknown'\n}\n\nexport function isKind<T extends number>(event: unknown, kind: T | Array<T>): event is NostrEvent & { kind: T } {\n const kindAsArray: number[] = kind instanceof Array ? kind : [kind]\n return (validateEvent(event) && kindAsArray.includes(event.kind)) || false\n}\n\nexport const Metadata = 0\nexport type Metadata = typeof Metadata\nexport const ShortTextNote = 1\nexport type ShortTextNote = typeof ShortTextNote\nexport const RecommendRelay = 2\nexport type RecommendRelay = typeof RecommendRelay\nexport const Contacts = 3\nexport type Contacts = typeof Contacts\nexport const EncryptedDirectMessage = 4\nexport type EncryptedDirectMessage = typeof EncryptedDirectMessage\nexport const EventDeletion = 5\nexport type EventDeletion = typeof EventDeletion\nexport const Repost = 6\nexport type Repost = typeof Repost\nexport const Reaction = 7\nexport type Reaction = typeof Reaction\nexport const BadgeAward = 8\nexport type BadgeAward = typeof BadgeAward\nexport const ChatMessage = 9\nexport type ChatMessage = typeof ChatMessage\nexport const ForumThread = 11\nexport type ForumThread = typeof ForumThread\nexport const Seal = 13\nexport type Seal = typeof Seal\nexport const PrivateDirectMessage = 14\nexport type PrivateDirectMessage = typeof PrivateDirectMessage\nexport const FileMessage = 15\nexport type FileMessage = typeof FileMessage\nexport const GenericRepost = 16\nexport type GenericRepost = typeof GenericRepost\nexport const Photo = 20\nexport type Photo = typeof Photo\nexport const NormalVideo = 21\nexport type NormalVideo = typeof NormalVideo\nexport const ShortVideo = 22\nexport type ShortVideo = typeof ShortVideo\nexport const ChannelCreation = 40\nexport type ChannelCreation = typeof ChannelCreation\nexport const ChannelMetadata = 41\nexport type ChannelMetadata = typeof ChannelMetadata\nexport const ChannelMessage = 42\nexport type ChannelMessage = typeof ChannelMessage\nexport const ChannelHideMessage = 43\nexport type ChannelHideMessage = typeof ChannelHideMessage\nexport const ChannelMuteUser = 44\nexport type ChannelMuteUser = typeof ChannelMuteUser\nexport const OpenTimestamps = 1040\nexport type OpenTimestamps = typeof OpenTimestamps\nexport const GiftWrap = 1059\nexport type GiftWrap = typeof GiftWrap\nexport const Poll = 1068\nexport type Poll = typeof Poll\nexport const FileMetadata = 1063\nexport type FileMetadata = typeof FileMetadata\nexport const Comment = 1111\nexport type Comment = typeof Comment\nexport const LiveChatMessage = 1311\nexport type LiveChatMessage = typeof LiveChatMessage\nexport const Voice = 1222\nexport type Voice = typeof Voice\nexport const VoiceComment = 1244\nexport type VoiceComment = typeof VoiceComment\nexport const ProblemTracker = 1971\nexport type ProblemTracker = typeof ProblemTracker\nexport const Report = 1984\nexport type Report = typeof Report\nexport const Reporting = 1984\nexport type Reporting = typeof Reporting\nexport const Label = 1985\nexport type Label = typeof Label\nexport const CommunityPostApproval = 4550\nexport type CommunityPostApproval = typeof CommunityPostApproval\nexport const JobRequest = 5999\nexport type JobRequest = typeof JobRequest\nexport const JobResult = 6999\nexport type JobResult = typeof JobResult\nexport const JobFeedback = 7000\nexport type JobFeedback = typeof JobFeedback\nexport const ZapGoal = 9041\nexport type ZapGoal = typeof ZapGoal\nexport const ZapRequest = 9734\nexport type ZapRequest = typeof ZapRequest\nexport const Zap = 9735\nexport type Zap = typeof Zap\nexport const Highlights = 9802\nexport type Highlights = typeof Highlights\nexport const PollResponse = 1018\nexport type PollResponse = typeof PollResponse\nexport const Mutelist = 10000\nexport type Mutelist = typeof Mutelist\nexport const Pinlist = 10001\nexport type Pinlist = typeof Pinlist\nexport const RelayList = 10002\nexport type RelayList = typeof RelayList\nexport const BookmarkList = 10003\nexport type BookmarkList = typeof BookmarkList\nexport const CommunitiesList = 10004\nexport type CommunitiesList = typeof CommunitiesList\nexport const PublicChatsList = 10005\nexport type PublicChatsList = typeof PublicChatsList\nexport const BlockedRelaysList = 10006\nexport type BlockedRelaysList = typeof BlockedRelaysList\nexport const SearchRelaysList = 10007\nexport type SearchRelaysList = typeof SearchRelaysList\nexport const FavoriteRelays = 10012\nexport type FavoriteRelays = typeof FavoriteRelays\nexport const InterestsList = 10015\nexport type InterestsList = typeof InterestsList\nexport const UserEmojiList = 10030\nexport type UserEmojiList = typeof UserEmojiList\nexport const DirectMessageRelaysList = 10050\nexport type DirectMessageRelaysList = typeof DirectMessageRelaysList\nexport const FileServerPreference = 10096\nexport type FileServerPreference = typeof FileServerPreference\nexport const BlossomServerList = 10063\nexport type BlossomServerList = typeof BlossomServerList\nexport const NWCWalletInfo = 13194\nexport type NWCWalletInfo = typeof NWCWalletInfo\nexport const LightningPubRPC = 21000\nexport type LightningPubRPC = typeof LightningPubRPC\nexport const ClientAuth = 22242\nexport type ClientAuth = typeof ClientAuth\nexport const NWCWalletRequest = 23194\nexport type NWCWalletRequest = typeof NWCWalletRequest\nexport const NWCWalletResponse = 23195\nexport type NWCWalletResponse = typeof NWCWalletResponse\nexport const NostrConnect = 24133\nexport type NostrConnect = typeof NostrConnect\nexport const HTTPAuth = 27235\nexport type HTTPAuth = typeof HTTPAuth\nexport const Followsets = 30000\nexport type Followsets = typeof Followsets\nexport const Genericlists = 30001\nexport type Genericlists = typeof Genericlists\nexport const Relaysets = 30002\nexport type Relaysets = typeof Relaysets\nexport const Bookmarksets = 30003\nexport type Bookmarksets = typeof Bookmarksets\nexport const Curationsets = 30004\nexport type Curationsets = typeof Curationsets\nexport const ProfileBadges = 30008\nexport type ProfileBadges = typeof ProfileBadges\nexport const BadgeDefinition = 30009\nexport type BadgeDefinition = typeof BadgeDefinition\nexport const Interestsets = 30015\nexport type Interestsets = typeof Interestsets\nexport const CreateOrUpdateStall = 30017\nexport type CreateOrUpdateStall = typeof CreateOrUpdateStall\nexport const CreateOrUpdateProduct = 30018\nexport type CreateOrUpdateProduct = typeof CreateOrUpdateProduct\nexport const LongFormArticle = 30023\nexport type LongFormArticle = typeof LongFormArticle\nexport const DraftLong = 30024\nexport type DraftLong = typeof DraftLong\nexport const Emojisets = 30030\nexport type Emojisets = typeof Emojisets\nexport const Application = 30078\nexport type Application = typeof Application\nexport const LiveEvent = 30311\nexport type LiveEvent = typeof LiveEvent\nexport const UserStatuses = 30315\nexport type UserStatuses = typeof UserStatuses\nexport const ClassifiedListing = 30402\nexport type ClassifiedListing = typeof ClassifiedListing\nexport const DraftClassifiedListing = 30403\nexport type DraftClassifiedListing = typeof DraftClassifiedListing\nexport const Date = 31922\nexport type Date = typeof Date\nexport const Time = 31923\nexport type Time = typeof Time\nexport const Calendar = 31924\nexport type Calendar = typeof Calendar\nexport const CalendarEventRSVP = 31925\nexport type CalendarEventRSVP = typeof CalendarEventRSVP\nexport const RelayReview = 31987\nexport type RelayReview = typeof RelayReview\nexport const Handlerrecommendation = 31989\nexport type Handlerrecommendation = typeof Handlerrecommendation\nexport const Handlerinformation = 31990\nexport type Handlerinformation = typeof Handlerinformation\nexport const CommunityDefinition = 34550\nexport type CommunityDefinition = typeof CommunityDefinition\nexport const GroupMetadata = 39000\nexport type GroupMetadata = typeof GroupMetadata\n", "import { Event } from './core.ts'\nimport { isAddressableKind, isReplaceableKind } from './kinds.ts'\n\nexport type Filter = {\n ids?: string[]\n kinds?: number[]\n authors?: string[]\n since?: number\n until?: number\n limit?: number\n search?: string\n [key: `#${string}`]: string[] | undefined\n}\n\nexport function matchFilter(filter: Filter, event: Event): boolean {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n return false\n }\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) {\n return false\n }\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n return false\n }\n\n for (let f in filter) {\n if (f[0] === '#') {\n let tagName = f.slice(1)\n let values = filter[`#${tagName}`]\n if (values && !event.tags.find(([t, v]) => t === f.slice(1) && values!.indexOf(v) !== -1)) return false\n }\n }\n\n if (filter.since && event.created_at < filter.since) return false\n if (filter.until && event.created_at > filter.until) return false\n\n return true\n}\n\nexport function matchFilters(filters: Filter[], event: Event): boolean {\n for (let i = 0; i < filters.length; i++) {\n if (matchFilter(filters[i], event)) {\n return true\n }\n }\n return false\n}\n\nexport function mergeFilters(...filters: Filter[]): Filter {\n let result: Filter = {}\n for (let i = 0; i < filters.length; i++) {\n let filter = filters[i]\n Object.entries(filter).forEach(([property, values]) => {\n if (property === 'kinds' || property === 'ids' || property === 'authors' || property[0] === '#') {\n // @ts-ignore\n result[property] = result[property] || []\n // @ts-ignore\n for (let v = 0; v < values.length; v++) {\n // @ts-ignore\n let value = values[v]\n // @ts-ignore\n if (!result[property].includes(value)) result[property].push(value)\n }\n }\n })\n\n if (filter.limit && (!result.limit || filter.limit > result.limit)) result.limit = filter.limit\n if (filter.until && (!result.until || filter.until > result.until)) result.until = filter.until\n if (filter.since && (!result.since || filter.since < result.since)) result.since = filter.since\n }\n\n return result\n}\n\n/**\n * Calculate the intrinsic limit of a filter.\n * This function returns a positive integer, or `Infinity` if there is no intrinsic limit.\n */\nexport function getFilterLimit(filter: Filter): number {\n if (filter.ids && !filter.ids.length) return 0\n if (filter.kinds && !filter.kinds.length) return 0\n if (filter.authors && !filter.authors.length) return 0\n\n for (const [key, value] of Object.entries(filter)) {\n if (key[0] === '#' && Array.isArray(value) && !value.length) return 0\n }\n\n return Math.min(\n // The `limit` property creates an artificial limit.\n Math.max(0, filter.limit ?? Infinity),\n\n // There can only be one event per `id`.\n filter.ids?.length ?? Infinity,\n\n // Replaceable events are limited by the number of authors and kinds.\n filter.authors?.length && filter.kinds?.every(kind => isReplaceableKind(kind))\n ? filter.authors.length * filter.kinds.length\n : Infinity,\n\n // Parameterized replaceable events are limited by the number of authors, kinds, and \"d\" tags.\n filter.authors?.length && filter.kinds?.every(kind => isAddressableKind(kind)) && filter['#d']?.length\n ? filter.authors.length * filter.kinds.length * filter['#d'].length\n : Infinity,\n )\n}\n", "export function getHex64(json: string, field: string): string {\n let len = field.length + 3\n let idx = json.indexOf(`\"${field}\":`) + len\n let s = json.slice(idx).indexOf(`\"`) + idx + 1\n return json.slice(s, s + 64)\n}\n\nexport function getInt(json: string, field: string): number {\n let len = field.length\n let idx = json.indexOf(`\"${field}\":`) + len + 3\n let sliced = json.slice(idx)\n let end = Math.min(sliced.indexOf(','), sliced.indexOf('}'))\n return parseInt(sliced.slice(0, end), 10)\n}\n\nexport function getSubscriptionId(json: string): string | null {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`)\n if (idx === -1) return null\n\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`)\n if (pstart === -1) return null\n let start = idx + 7 + 1 + pstart\n\n let pend = json.slice(start + 1, 80).indexOf(`\"`)\n if (pend === -1) return null\n let end = start + 1 + pend\n\n return json.slice(start + 1, end)\n}\n\nexport function matchEventId(json: string, id: string): boolean {\n return id === getHex64(json, 'id')\n}\n\nexport function matchEventPubkey(json: string, pubkey: string): boolean {\n return pubkey === getHex64(json, 'pubkey')\n}\n\nexport function matchEventKind(json: string, kind: number): boolean {\n return kind === getInt(json, 'kind')\n}\n", "import { EventTemplate } from './core.ts'\nimport { ClientAuth } from './kinds.ts'\n\n/**\n * creates an EventTemplate for an AUTH event to be signed.\n */\nexport function makeAuthEvent(relayURL: string, challenge: string): EventTemplate {\n return {\n kind: ClientAuth,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['relay', relayURL],\n ['challenge', challenge],\n ],\n content: '',\n }\n}\n", "/* global WebSocket */\n\nimport type { Event, EventTemplate, VerifiedEvent, Nostr, NostrEvent } from './core.ts'\nimport { matchFilters, type Filter } from './filter.ts'\nimport { getHex64, getSubscriptionId } from './fakejson.ts'\nimport { normalizeURL } from './utils.ts'\nimport { makeAuthEvent } from './nip42.ts'\n\ntype RelayWebSocket = WebSocket & {\n ping?(): void\n on?(event: 'pong', listener: () => void): any\n}\n\nexport type AbstractRelayConstructorOptions = {\n verifyEvent: Nostr['verifyEvent']\n websocketImplementation?: typeof WebSocket\n enablePing?: boolean\n enableReconnect?: boolean\n}\n\nexport class SendingOnClosedConnection extends Error {\n constructor(message: string, relay: string) {\n super(`Tried to send message '${message} on a closed connection to ${relay}.`)\n this.name = 'SendingOnClosedConnection'\n }\n}\n\nexport class AbstractRelay {\n public readonly url: string\n private _connected: boolean = false\n\n public onclose: (() => void) | null = null\n public onnotice: (msg: string) => void = msg => console.debug(`NOTICE from ${this.url}: ${msg}`)\n public onauth: undefined | ((evt: EventTemplate) => Promise<VerifiedEvent>)\n\n public baseEoseTimeout: number = 4400\n public publishTimeout: number = 4400\n public pingFrequency: number = 29000\n public pingTimeout: number = 20000\n public resubscribeBackoff: number[] = [10000, 10000, 10000, 20000, 20000, 30000, 60000]\n public openSubs: Map<string, Subscription> = new Map()\n public enablePing: boolean | undefined\n public enableReconnect: boolean\n public idleSince: number | undefined = Date.now() // when undefined that means it isn't idle\n public ongoingOperations: number = 0 // used to compute idleness\n private reconnectTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n private pingIntervalHandle: ReturnType<typeof setInterval> | undefined\n private reconnectAttempts: number = 0\n private skipReconnection: boolean = false\n\n private connectionPromise: Promise<void> | undefined\n private openCountRequests = new Map<string, CountResolver>()\n private openEventPublishes = new Map<string, EventPublishResolver>()\n private ws: RelayWebSocket | undefined\n private challenge: string | undefined\n private authPromise: Promise<string> | undefined\n private serial: number = 0\n private verifyEvent: Nostr['verifyEvent']\n\n private _WebSocket: typeof WebSocket\n\n constructor(url: string, opts: AbstractRelayConstructorOptions) {\n this.url = normalizeURL(url)\n this.verifyEvent = opts.verifyEvent\n this._WebSocket = opts.websocketImplementation || WebSocket\n this.enablePing = opts.enablePing\n this.enableReconnect = opts.enableReconnect || false\n }\n\n static async connect(\n url: string,\n opts: AbstractRelayConstructorOptions & Parameters<AbstractRelay['connect']>[0],\n ): Promise<AbstractRelay> {\n const relay = new AbstractRelay(url, opts)\n await relay.connect(opts)\n return relay\n }\n\n private closeAllSubscriptions(reason: string) {\n for (let [_, sub] of this.openSubs) {\n sub.close(reason)\n }\n this.openSubs.clear()\n\n for (let [_, ep] of this.openEventPublishes) {\n ep.reject(new Error(reason))\n }\n this.openEventPublishes.clear()\n\n for (let [_, cr] of this.openCountRequests) {\n cr.reject(new Error(reason))\n }\n this.openCountRequests.clear()\n }\n\n public get connected(): boolean {\n return this._connected\n }\n\n private async reconnect(): Promise<void> {\n const backoff = this.resubscribeBackoff[Math.min(this.reconnectAttempts, this.resubscribeBackoff.length - 1)]\n this.reconnectAttempts++\n\n this.reconnectTimeoutHandle = setTimeout(async () => {\n try {\n await this.connect()\n } catch (err) {\n // this will be called again through onclose/onerror\n }\n }, backoff)\n }\n\n private handleHardClose(reason: string) {\n if (this.pingIntervalHandle) {\n clearInterval(this.pingIntervalHandle)\n this.pingIntervalHandle = undefined\n }\n\n this._connected = false\n this.connectionPromise = undefined\n this.idleSince = undefined\n\n if (this.enableReconnect && !this.skipReconnection) {\n this.reconnect()\n } else {\n this.onclose?.()\n this.closeAllSubscriptions(reason)\n }\n }\n\n public async connect(opts?: { timeout?: number; abort?: AbortSignal }): Promise<void> {\n let connectionTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n\n if (this.connectionPromise) return this.connectionPromise\n\n this.challenge = undefined\n this.authPromise = undefined\n this.skipReconnection = false\n this.connectionPromise = new Promise((resolve, reject) => {\n if (opts?.timeout) {\n connectionTimeoutHandle = setTimeout(() => {\n reject('connection timed out')\n this.connectionPromise = undefined\n this.skipReconnection = true\n this.onclose?.()\n this.handleHardClose('relay connection timed out')\n }, opts.timeout)\n }\n\n if (opts?.abort) {\n opts.abort.onabort = reject\n }\n\n try {\n this.ws = new this._WebSocket(this.url)\n } catch (err) {\n clearTimeout(connectionTimeoutHandle)\n reject(err)\n return\n }\n\n this.ws.onopen = () => {\n if (this.reconnectTimeoutHandle) {\n clearTimeout(this.reconnectTimeoutHandle)\n this.reconnectTimeoutHandle = undefined\n }\n clearTimeout(connectionTimeoutHandle)\n this._connected = true\n\n const isReconnection = this.reconnectAttempts > 0\n this.reconnectAttempts = 0\n\n // resubscribe to all open subscriptions\n for (const sub of this.openSubs.values()) {\n sub.eosed = false\n if (isReconnection) {\n for (let f = 0; f < sub.filters.length; f++) {\n if (sub.lastEmitted) {\n sub.filters[f].since = sub.lastEmitted + 1\n }\n }\n }\n sub.fire()\n }\n\n if (this.enablePing) {\n this.pingIntervalHandle = setInterval(() => this.pingpong(), this.pingFrequency)\n }\n resolve()\n }\n\n this.ws.onerror = () => {\n clearTimeout(connectionTimeoutHandle)\n reject('connection failed')\n this.connectionPromise = undefined\n this.skipReconnection = true\n this.onclose?.()\n this.handleHardClose('relay connection failed')\n }\n\n this.ws.onclose = ev => {\n clearTimeout(connectionTimeoutHandle)\n reject((ev as any).message || 'websocket closed')\n this.handleHardClose('relay connection closed')\n }\n\n this.ws.onmessage = this._onmessage.bind(this)\n })\n\n return this.connectionPromise\n }\n\n private waitForPingPong() {\n return new Promise(resolve => {\n // listen for pong\n ;(this.ws as any).once('pong', () => resolve(true))\n // send a ping\n this.ws!.ping!()\n })\n }\n\n private waitForDummyReq() {\n return new Promise((resolve, reject) => {\n if (!this.connectionPromise) return reject(new Error(`no connection to ${this.url}, can't ping`))\n\n // make a dummy request with expected empty eose reply\n // [\"REQ\", \"_\", {\"ids\":[\"aaaa...aaaa\"], \"limit\": 0}]\n try {\n const sub = this.subscribe(\n [{ ids: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], limit: 0 }],\n {\n label: '<forced-ping>',\n oneose: () => {\n resolve(true)\n sub.close()\n },\n onclose() {\n // if we get a CLOSED it's because the relay is alive\n resolve(true)\n },\n eoseTimeout: this.pingTimeout + 1000,\n },\n )\n } catch (err) {\n reject(err)\n }\n })\n }\n\n // nodejs requires this magic here to ensure connections are closed when internet goes off and stuff\n // in browsers it's done automatically. see https://github.com/nbd-wtf/nostr-tools/issues/491\n private async pingpong() {\n // if the websocket is connected\n if (this.ws?.readyState === 1) {\n // wait for either a ping-pong reply or a timeout\n const result = await Promise.any([\n // browsers don't have ping so use a dummy req\n this.ws && this.ws.ping && (this.ws as any).once ? this.waitForPingPong() : this.waitForDummyReq(),\n new Promise(res => setTimeout(() => res(false), this.pingTimeout)),\n ])\n\n if (!result) {\n // pingpong closing socket\n if (this.ws?.readyState === this._WebSocket.OPEN) {\n this.ws?.close()\n }\n }\n }\n }\n\n public async send(message: string) {\n if (!this.connectionPromise) throw new SendingOnClosedConnection(message, this.url)\n\n this.connectionPromise.then(() => {\n this.ws?.send(message)\n })\n }\n\n public async auth(signAuthEvent: (evt: EventTemplate) => Promise<VerifiedEvent>): Promise<string> {\n const challenge = this.challenge\n if (!challenge) throw new Error(\"can't perform auth, no challenge was received\")\n if (this.authPromise) return this.authPromise\n\n this.authPromise = new Promise<string>(async (resolve, reject) => {\n try {\n let evt = await signAuthEvent(makeAuthEvent(this.url, challenge))\n let timeout = setTimeout(() => {\n let ep = this.openEventPublishes.get(evt.id) as EventPublishResolver\n if (ep) {\n ep.reject(new Error('auth timed out'))\n this.openEventPublishes.delete(evt.id)\n }\n }, this.publishTimeout)\n this.openEventPublishes.set(evt.id, { resolve, reject, timeout })\n this.send('[\"AUTH\",' + JSON.stringify(evt) + ']')\n } catch (err) {\n console.warn('subscribe auth function failed:', err)\n }\n })\n return this.authPromise\n }\n\n public async publish(event: Event): Promise<string> {\n this.idleSince = undefined\n this.ongoingOperations++\n\n const ret = new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(() => {\n const ep = this.openEventPublishes.get(event.id) as EventPublishResolver\n if (ep) {\n ep.reject(new Error('publish timed out'))\n this.openEventPublishes.delete(event.id)\n }\n }, this.publishTimeout)\n this.openEventPublishes.set(event.id, { resolve, reject, timeout })\n })\n this.send('[\"EVENT\",' + JSON.stringify(event) + ']')\n\n // compute idleness state\n this.ongoingOperations--\n if (this.ongoingOperations === 0) this.idleSince = Date.now()\n\n return ret\n }\n\n public async count(filters: Filter[], params: { id?: string | null }): Promise<number> {\n this.serial++\n const id = params?.id || 'count:' + this.serial\n const ret = new Promise<number>((resolve, reject) => {\n this.openCountRequests.set(id, { resolve, reject })\n })\n this.send('[\"COUNT\",\"' + id + '\",' + JSON.stringify(filters).substring(1))\n return ret\n }\n\n public subscribe(\n filters: Filter[],\n params: Partial<SubscriptionParams> & { label?: string; id?: string },\n ): Subscription {\n if (params.label !== '<forced-ping>') {\n this.idleSince = undefined\n this.ongoingOperations++\n }\n\n const sub = this.prepareSubscription(filters, params)\n sub.fire()\n\n if (params.abort) {\n params.abort.onabort = () => sub.close(String(params.abort!.reason || '<aborted>'))\n }\n\n return sub\n }\n\n public prepareSubscription(\n filters: Filter[],\n params: Partial<SubscriptionParams> & { label?: string; id?: string },\n ): Subscription {\n this.serial++\n const id = params.id || (params.label ? params.label + ':' : 'sub:') + this.serial\n const sub = new Subscription(this, id, filters, params)\n this.openSubs.set(id, sub)\n return sub\n }\n\n public close() {\n this.skipReconnection = true\n if (this.reconnectTimeoutHandle) {\n clearTimeout(this.reconnectTimeoutHandle)\n this.reconnectTimeoutHandle = undefined\n }\n if (this.pingIntervalHandle) {\n clearInterval(this.pingIntervalHandle)\n this.pingIntervalHandle = undefined\n }\n this.closeAllSubscriptions('relay connection closed by us')\n this._connected = false\n this.idleSince = undefined\n this.onclose?.()\n if (this.ws?.readyState === this._WebSocket.OPEN) {\n this.ws?.close()\n }\n }\n\n // this is the function assigned to this.ws.onmessage\n // it's exposed for testing and debugging purposes\n public _onmessage(ev: MessageEvent<any>): void {\n const json = ev.data\n if (!json) {\n return\n }\n\n // shortcut EVENT sub\n const subid = getSubscriptionId(json)\n if (subid) {\n const so = this.openSubs.get(subid as string)\n if (!so) {\n // this is an EVENT message, but for a subscription we don't have, so just stop here\n return\n }\n\n // this will be called only when this message is a EVENT message for a subscription we have\n // we do this before parsing the JSON to not have to do that for duplicate events\n // since JSON parsing is slow\n const id = getHex64(json, 'id')\n const alreadyHave = so.alreadyHaveEvent?.(id)\n\n // notify any interested client that the relay has this event\n // (do this after alreadyHaveEvent() because the client may rely on this to answer that)\n so.receivedEvent?.(this, id)\n\n if (alreadyHave) {\n // if we had already seen this event we can just stop here\n return\n }\n }\n\n try {\n let data = JSON.parse(json)\n // we won't do any checks against the data since all failures (i.e. invalid messages from relays)\n // will naturally be caught by the encompassing try..catch block\n\n switch (data[0]) {\n case 'EVENT': {\n const so = this.openSubs.get(data[1] as string) as Subscription\n const event = data[2] as NostrEvent\n if (this.verifyEvent(event) && matchFilters(so.filters, event)) {\n so.onevent(event)\n } else {\n so.oninvalidevent?.(event)\n }\n if (!so.lastEmitted || so.lastEmitted < event.created_at) so.lastEmitted = event.created_at\n return\n }\n case 'COUNT': {\n const id: string = data[1]\n const payload = data[2] as { count: number }\n const cr = this.openCountRequests.get(id) as CountResolver\n if (cr) {\n cr.resolve(payload.count)\n this.openCountRequests.delete(id)\n }\n return\n }\n case 'EOSE': {\n const so = this.openSubs.get(data[1] as string)\n if (!so) return\n so.receivedEose()\n return\n }\n case 'OK': {\n const id: string = data[1]\n const ok: boolean = data[2]\n const reason: string = data[3]\n const ep = this.openEventPublishes.get(id) as EventPublishResolver\n if (ep) {\n clearTimeout(ep.timeout)\n if (ok) ep.resolve(reason)\n else ep.reject(new Error(reason))\n this.openEventPublishes.delete(id)\n }\n return\n }\n case 'CLOSED': {\n const id: string = data[1]\n const so = this.openSubs.get(id)\n if (!so) return\n so.closed = true\n so.close(data[2] as string)\n return\n }\n case 'NOTICE': {\n this.onnotice(data[1] as string)\n return\n }\n case 'AUTH': {\n this.challenge = data[1] as string\n if (this.onauth) {\n this.auth(this.onauth)\n }\n return\n }\n default: {\n const so = this.openSubs.get(data[1])\n so?.oncustom?.(data)\n return\n }\n }\n } catch (err) {\n const [_, __, event] = JSON.parse(json)\n ;(window as any).printer.maybe(event.pubkey, ':: caught err', event, this.url, err)\n return\n }\n }\n}\n\nexport class Subscription {\n public readonly relay: AbstractRelay\n public readonly id: string\n\n public lastEmitted: number | undefined\n public closed: boolean = false\n public eosed: boolean = false\n public filters: Filter[]\n public alreadyHaveEvent: ((id: string) => boolean) | undefined\n public receivedEvent: ((relay: AbstractRelay, id: string) => void) | undefined\n\n public onevent: (evt: Event) => void\n public oninvalidevent: ((evt: unknown) => void) | undefined\n public oneose: (() => void) | undefined\n public onclose: ((reason: string) => void) | undefined\n\n // will get any messages that have this subscription id as their second item and are not default standard\n public oncustom: ((msg: string[]) => void) | undefined\n\n public eoseTimeout: number\n private eoseTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n\n constructor(relay: AbstractRelay, id: string, filters: Filter[], params: SubscriptionParams) {\n if (filters.length === 0) throw new Error(\"subscription can't be created with zero filters\")\n\n this.relay = relay\n this.filters = filters\n this.id = id\n this.alreadyHaveEvent = params.alreadyHaveEvent\n this.receivedEvent = params.receivedEvent\n this.eoseTimeout = params.eoseTimeout || relay.baseEoseTimeout\n\n this.oneose = params.oneose\n this.onclose = params.onclose\n this.oninvalidevent = params.oninvalidevent\n this.onevent =\n params.onevent ||\n (event => {\n console.warn(\n `onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,\n event,\n )\n })\n }\n\n public fire() {\n this.relay.send('[\"REQ\",\"' + this.id + '\",' + JSON.stringify(this.filters).substring(1))\n\n // only now we start counting the eoseTimeout\n this.eoseTimeoutHandle = setTimeout(this.receivedEose.bind(this), this.eoseTimeout)\n }\n\n public receivedEose() {\n if (this.eosed) return\n clearTimeout(this.eoseTimeoutHandle)\n this.eosed = true\n this.oneose?.()\n }\n\n public close(reason: string = 'closed by caller') {\n if (!this.closed && this.relay.connected) {\n // if the connection was closed by the user calling .close() we will send a CLOSE message\n // otherwise this._open will be already set to false so we will skip this\n try {\n this.relay.send('[\"CLOSE\",' + JSON.stringify(this.id) + ']')\n } catch (err) {\n if (err instanceof SendingOnClosedConnection) {\n /* doesn't matter, it's ok */\n } else {\n throw err\n }\n }\n this.closed = true\n }\n this.relay.openSubs.delete(this.id)\n\n // compute idleness state\n this.relay.ongoingOperations--\n if (this.relay.ongoingOperations === 0) this.relay.idleSince = Date.now()\n\n this.onclose?.(reason)\n }\n}\n\nexport type SubscriptionParams = {\n onevent?: (evt: Event) => void\n oninvalidevent?: (evt: unknown) => void\n oneose?: () => void\n onclose?: (reason: string) => void\n alreadyHaveEvent?: (id: string) => boolean\n receivedEvent?: (relay: AbstractRelay, id: string) => void\n eoseTimeout?: number\n abort?: AbortSignal\n}\n\nexport type CountResolver = {\n resolve: (count: number) => void\n reject: (err: Error) => void\n}\n\nexport type EventPublishResolver = {\n resolve: (reason: string) => void\n reject: (err: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n", "/* global WebSocket */\n\nimport { verifyEvent } from './pure.ts'\nimport { AbstractRelay, type AbstractRelayConstructorOptions } from './abstract-relay.ts'\n\nvar _WebSocket: typeof WebSocket\n\ntry {\n _WebSocket = WebSocket\n} catch {}\n\nexport function useWebSocketImplementation(websocketImplementation: any) {\n _WebSocket = websocketImplementation\n}\n\nexport class Relay extends AbstractRelay {\n constructor(url: string, options?: Pick<AbstractRelayConstructorOptions, 'enablePing' | 'enableReconnect'>) {\n super(url, { verifyEvent, websocketImplementation: _WebSocket, ...options })\n }\n\n static async connect(\n url: string,\n options?: Pick<AbstractRelayConstructorOptions, 'enablePing' | 'enableReconnect'>,\n ): Promise<Relay> {\n const relay = new Relay(url, options)\n await relay.connect()\n return relay\n }\n}\n\nexport type RelayRecord = Record<string, { read: boolean; write: boolean }>\n\nexport * from './abstract-relay.ts'\n", "import { verifiedSymbol, type Event, type Nostr, VerifiedEvent } from './core.ts'\n\nexport const alwaysTrue: Nostr['verifyEvent'] = (t: Event): t is VerifiedEvent => {\n t[verifiedSymbol] = true\n return true\n}\n", "/* global WebSocket */\n\nimport {\n AbstractRelay as AbstractRelay,\n SubscriptionParams,\n Subscription,\n type AbstractRelayConstructorOptions,\n} from './abstract-relay.ts'\nimport { normalizeURL } from './utils.ts'\n\nimport type { Event, EventTemplate, Nostr, VerifiedEvent } from './core.ts'\nimport { type Filter } from './filter.ts'\nimport { alwaysTrue } from './helpers.ts'\nimport { Relay } from './relay.ts'\n\nexport type SubCloser = { close: (reason?: string) => void }\n\nexport type AbstractPoolConstructorOptions = AbstractRelayConstructorOptions & {\n // automaticallyAuth takes a relay URL and should return null in case that relay shouldn't be authenticated against\n // or a function to sign the AUTH event template otherwise (that function may still throw in case of failure)\n automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise<VerifiedEvent>)\n // onRelayConnectionFailure is called with the URL of a relay that failed the initial connection\n onRelayConnectionFailure?: (url: string) => void\n // onRelayConnectionSuccess is called with the URL of a relay that succeeds the initial connection\n onRelayConnectionSuccess?: (url: string) => void\n // allowConnectingToRelay takes a relay URL and the operation being performed\n // return false to skip connecting to that relay\n allowConnectingToRelay?: (url: string, operation: ['read', Filter[]] | ['write', Event]) => boolean\n // maxWaitForConnection takes a number in milliseconds that will be given to ensureRelay such that we\n // don't get stuck forever when attempting to connect to a relay, it is 3000 (3 seconds) by default\n maxWaitForConnection: number\n}\n\nexport type SubscribeManyParams = Omit<SubscriptionParams, 'onclose'> & {\n maxWait?: number\n abort?: AbortSignal\n onclose?: (reasons: string[]) => void\n onauth?: (event: EventTemplate) => Promise<VerifiedEvent>\n id?: string\n label?: string\n}\n\nexport class AbstractSimplePool {\n protected relays: Map<string, AbstractRelay> = new Map()\n public seenOn: Map<string, Set<AbstractRelay>> = new Map()\n public trackRelays: boolean = false\n\n public verifyEvent: Nostr['verifyEvent']\n public enablePing: boolean | undefined\n public enableReconnect: boolean\n public automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise<VerifiedEvent>)\n public trustedRelayURLs: Set<string> = new Set()\n public onRelayConnectionFailure?: (url: string) => void\n public onRelayConnectionSuccess?: (url: string) => void\n public allowConnectingToRelay?: (url: string, operation: ['read', Filter[]] | ['write', Event]) => boolean\n public maxWaitForConnection: number\n\n private _WebSocket?: typeof WebSocket\n\n constructor(opts: AbstractPoolConstructorOptions) {\n this.verifyEvent = opts.verifyEvent\n this._WebSocket = opts.websocketImplementation\n this.enablePing = opts.enablePing\n this.enableReconnect = opts.enableReconnect || false\n this.automaticallyAuth = opts.automaticallyAuth\n this.onRelayConnectionFailure = opts.onRelayConnectionFailure\n this.onRelayConnectionSuccess = opts.onRelayConnectionSuccess\n this.allowConnectingToRelay = opts.allowConnectingToRelay\n this.maxWaitForConnection = opts.maxWaitForConnection || 3000\n }\n\n async ensureRelay(\n url: string,\n params?: {\n connectionTimeout?: number\n abort?: AbortSignal\n },\n ): Promise<AbstractRelay> {\n url = normalizeURL(url)\n\n let relay = this.relays.get(url)\n if (!relay) {\n relay = new AbstractRelay(url, {\n verifyEvent: this.trustedRelayURLs.has(url) ? alwaysTrue : this.verifyEvent,\n websocketImplementation: this._WebSocket,\n enablePing: this.enablePing,\n enableReconnect: this.enableReconnect,\n })\n relay.onclose = () => {\n this.relays.delete(url)\n }\n this.relays.set(url, relay)\n }\n\n if (this.automaticallyAuth) {\n const authSignerFn = this.automaticallyAuth(url)\n if (authSignerFn) {\n relay.onauth = authSignerFn\n }\n }\n\n try {\n await relay.connect({\n timeout: params?.connectionTimeout,\n abort: params?.abort,\n })\n } catch (err) {\n this.relays.delete(url)\n throw err\n }\n\n return relay\n }\n\n close(relays: string[]) {\n relays.map(normalizeURL).forEach(url => {\n this.relays.get(url)?.close()\n this.relays.delete(url)\n })\n }\n\n subscribe(relays: string[], filter: Filter, params: SubscribeManyParams): SubCloser {\n const request: { url: string; filter: Filter }[] = []\n const uniqUrls: string[] = []\n for (let i = 0; i < relays.length; i++) {\n const url = normalizeURL(relays[i])\n if (!request.find(r => r.url === url)) {\n if (uniqUrls.indexOf(url) === -1) {\n uniqUrls.push(url)\n request.push({ url, filter: filter })\n }\n }\n }\n\n return this.subscribeMap(request, params)\n }\n\n subscribeMany(relays: string[], filter: Filter, params: SubscribeManyParams): SubCloser {\n return this.subscribe(relays, filter, params)\n }\n\n subscribeMap(requests: { url: string; filter: Filter }[], params: SubscribeManyParams): SubCloser {\n const grouped = new Map<string, Filter[]>()\n for (const req of requests) {\n const { url, filter } = req\n if (!grouped.has(url)) grouped.set(url, [])\n grouped.get(url)!.push(filter)\n }\n const groupedRequests = Array.from(grouped.entries()).map(([url, filters]) => ({ url, filters }))\n\n if (this.trackRelays) {\n params.receivedEvent = (relay: AbstractRelay, id: string) => {\n let set = this.seenOn.get(id)\n if (!set) {\n set = new Set()\n this.seenOn.set(id, set)\n }\n set.add(relay)\n }\n }\n\n const _knownIds = new Set<string>()\n const subs: Subscription[] = []\n\n // batch all EOSEs into a single\n const eosesReceived: boolean[] = []\n let handleEose = (i: number) => {\n if (eosesReceived[i]) return // do not act twice for the same relay\n eosesReceived[i] = true\n if (eosesReceived.filter(a => a).length === groupedRequests.length) {\n params.oneose?.()\n handleEose = () => {}\n }\n }\n // batch all closes into a single\n const closesReceived: string[] = []\n let handleClose = (i: number, reason: string) => {\n if (closesReceived[i]) return // do not act twice for the same relay\n handleEose(i)\n closesReceived[i] = reason\n if (closesReceived.filter(a => a).length === groupedRequests.length) {\n params.onclose?.(closesReceived)\n handleClose = () => {}\n }\n }\n\n const localAlreadyHaveEventHandler = (id: string) => {\n if (params.alreadyHaveEvent?.(id)) {\n return true\n }\n const have = _knownIds.has(id)\n _knownIds.add(id)\n return have\n }\n\n // open a subscription in all given relays\n const allOpened = Promise.all(\n groupedRequests.map(async ({ url, filters }, i) => {\n if (this.allowConnectingToRelay?.(url, ['read', filters]) === false) {\n handleClose(i, 'connection skipped by allowConnectingToRelay')\n return\n }\n\n let relay: AbstractRelay\n try {\n relay = await this.ensureRelay(url, {\n connectionTimeout:\n this.maxWaitForConnection < (params.maxWait || 0)\n ? Math.max(params.maxWait! * 0.8, params.maxWait! - 1000)\n : this.maxWaitForConnection,\n abort: params.abort,\n })\n } catch (err) {\n this.onRelayConnectionFailure?.(url)\n handleClose(i, (err as any)?.message || String(err))\n return\n }\n\n this.onRelayConnectionSuccess?.(url)\n\n let subscription = relay.subscribe(filters, {\n ...params,\n oneose: () => handleEose(i),\n onclose: reason => {\n if (reason.startsWith('auth-required: ') && params.onauth) {\n relay\n .auth(params.onauth)\n .then(() => {\n relay.subscribe(filters, {\n ...params,\n oneose: () => handleEose(i),\n onclose: reason => {\n handleClose(i, reason) // the second time we won't try to auth anymore\n },\n alreadyHaveEvent: localAlreadyHaveEventHandler,\n eoseTimeout: params.maxWait,\n abort: params.abort,\n })\n })\n .catch(err => {\n handleClose(i, `auth was required and attempted, but failed with: ${err}`)\n })\n } else {\n handleClose(i, reason)\n }\n },\n alreadyHaveEvent: localAlreadyHaveEventHandler,\n eoseTimeout: params.maxWait,\n abort: params.abort,\n })\n\n subs.push(subscription)\n }),\n )\n\n return {\n async close(reason?: string) {\n await allOpened\n subs.forEach(sub => {\n sub.close(reason)\n })\n },\n }\n }\n\n subscribeEose(\n relays: string[],\n filter: Filter,\n params: Pick<SubscribeManyParams, 'label' | 'id' | 'onevent' | 'oninvalidevent' | 'onclose' | 'maxWait' | 'onauth'>,\n ): SubCloser {\n let subcloser: SubCloser\n subcloser = this.subscribe(relays, filter, {\n ...params,\n oneose() {\n const reason = 'closed automatically on eose'\n if (subcloser) subcloser.close(reason)\n else params.onclose?.(relays.map(_ => reason))\n },\n })\n return subcloser\n }\n\n subscribeManyEose(\n relays: string[],\n filter: Filter,\n params: Pick<SubscribeManyParams, 'label' | 'id' | 'onevent' | 'oninvalidevent' | 'onclose' | 'maxWait' | 'onauth'>,\n ): SubCloser {\n return this.subscribeEose(relays, filter, params)\n }\n\n async querySync(\n relays: string[],\n filter: Filter,\n params?: Pick<SubscribeManyParams, 'label' | 'id' | 'maxWait'>,\n ): Promise<Event[]> {\n return new Promise(async resolve => {\n const events: Event[] = []\n this.subscribeEose(relays, filter, {\n ...params,\n onevent(event: Event) {\n events.push(event)\n },\n onclose(_: string[]) {\n resolve(events)\n },\n })\n })\n }\n\n async get(\n relays: string[],\n filter: Filter,\n params?: Pick<SubscribeManyParams, 'label' | 'id' | 'maxWait'>,\n ): Promise<Event | null> {\n filter.limit = 1\n const events = await this.querySync(relays, filter, params)\n events.sort((a, b) => b.created_at - a.created_at)\n return events[0] || null\n }\n\n publish(\n relays: string[],\n event: Event,\n params?: {\n onauth?: (evt: EventTemplate) => Promise<VerifiedEvent>\n maxWait?: number\n abort?: AbortSignal\n },\n ): Promise<string>[] {\n return relays.map(normalizeURL).map(async (url, i, arr) => {\n if (arr.indexOf(url) !== i) {\n // duplicate\n return Promise.reject('duplicate url')\n }\n\n if (this.allowConnectingToRelay?.(url, ['write', event]) === false) {\n return Promise.reject('connection skipped by allowConnectingToRelay')\n }\n\n let r: Relay\n try {\n r = await this.ensureRelay(url, {\n connectionTimeout:\n this.maxWaitForConnection < (params?.maxWait || 0)\n ? Math.max(params!.maxWait! * 0.8, params!.maxWait! - 1000)\n : this.maxWaitForConnection,\n abort: params?.abort,\n })\n } catch (err) {\n this.onRelayConnectionFailure?.(url)\n return String('connection failure: ' + String(err))\n }\n\n return r\n .publish(event)\n .catch(async err => {\n if (err instanceof Error && err.message.startsWith('auth-required: ') && params?.onauth) {\n await r.auth(params.onauth)\n return r.publish(event) // retry\n }\n throw err\n })\n .then(reason => {\n if (this.trackRelays) {\n let set = this.seenOn.get(event.id)\n if (!set) {\n set = new Set()\n this.seenOn.set(event.id, set)\n }\n set.add(r)\n }\n return reason\n })\n })\n }\n\n listConnectionStatus(): Map<string, boolean> {\n const map = new Map<string, boolean>()\n this.relays.forEach((relay, url) => map.set(url, relay.connected))\n\n return map\n }\n\n destroy(): void {\n this.relays.forEach(conn => conn.close())\n this.relays = new Map()\n }\n\n pruneIdleRelays(idleThresholdMs: number = 10000): string[] {\n const prunedUrls: string[] = []\n\n // check each relay's idle status and prune if over threshold\n for (const [url, relay] of this.relays) {\n if (relay.idleSince && Date.now() - relay.idleSince >= idleThresholdMs) {\n this.relays.delete(url)\n prunedUrls.push(url)\n relay.close()\n }\n }\n\n return prunedUrls\n }\n}\n", "/* global WebSocket */\n\nimport { verifyEvent } from './pure.ts'\nimport { AbstractSimplePool, type AbstractPoolConstructorOptions } from './abstract-pool.ts'\n\nvar _WebSocket: typeof WebSocket\n\ntry {\n _WebSocket = WebSocket\n} catch {}\n\nexport function useWebSocketImplementation(websocketImplementation: any) {\n _WebSocket = websocketImplementation\n}\n\nexport class SimplePool extends AbstractSimplePool {\n constructor(options?: Pick<AbstractPoolConstructorOptions, 'enablePing' | 'enableReconnect'>) {\n super({ verifyEvent, websocketImplementation: _WebSocket, maxWaitForConnection: 3000, ...options })\n }\n}\n\nexport * from './abstract-pool.ts'\n", "import { bytesToHex, concatBytes, hexToBytes } from '@noble/hashes/utils.js'\nimport { bech32 } from '@scure/base'\n\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nexport type NProfile = `nprofile1${string}`\nexport type NEvent = `nevent1${string}`\nexport type NAddr = `naddr1${string}`\nexport type NSec = `nsec1${string}`\nexport type NPub = `npub1${string}`\nexport type Note = `note1${string}`\nexport type Ncryptsec = `ncryptsec1${string}`\n\nexport const NostrTypeGuard = {\n isNProfile: (value?: string | null): value is NProfile => /^nprofile1[a-z\\d]+$/.test(value || ''),\n isNEvent: (value?: string | null): value is NEvent => /^nevent1[a-z\\d]+$/.test(value || ''),\n isNAddr: (value?: string | null): value is NAddr => /^naddr1[a-z\\d]+$/.test(value || ''),\n isNSec: (value?: string | null): value is NSec => /^nsec1[a-z\\d]{58}$/.test(value || ''),\n isNPub: (value?: string | null): value is NPub => /^npub1[a-z\\d]{58}$/.test(value || ''),\n isNote: (value?: string | null): value is Note => /^note1[a-z\\d]+$/.test(value || ''),\n isNcryptsec: (value?: string | null): value is Ncryptsec => /^ncryptsec1[a-z\\d]+$/.test(value || ''),\n}\n\nexport const Bech32MaxSize = 5000\n\n/**\n * Bech32 regex.\n * @see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32\n */\nexport const BECH32_REGEX = /[\\x21-\\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/\n\nfunction integerToUint8Array(number: number) {\n // Create a Uint8Array with enough space to hold a 32-bit integer (4 bytes).\n const uint8Array = new Uint8Array(4)\n\n // Use bitwise operations to extract the bytes.\n uint8Array[0] = (number >> 24) & 0xff // Most significant byte (MSB)\n uint8Array[1] = (number >> 16) & 0xff\n uint8Array[2] = (number >> 8) & 0xff\n uint8Array[3] = number & 0xff // Least significant byte (LSB)\n\n return uint8Array\n}\n\nexport type ProfilePointer = {\n pubkey: string // hex\n relays?: string[]\n}\n\nexport type EventPointer = {\n id: string // hex\n relays?: string[]\n author?: string\n kind?: number\n}\n\nexport type AddressPointer = {\n identifier: string\n pubkey: string\n kind: number\n relays?: string[]\n}\n\nexport function decodeNostrURI(nip19code: string): ReturnType<typeof decode> | { type: 'invalid'; data: null } {\n try {\n if (nip19code.startsWith('nostr:')) nip19code = nip19code.substring(6)\n return decode(nip19code)\n } catch (_err) {\n return { type: 'invalid', data: null }\n }\n}\n\nexport type DecodedNevent = {\n type: 'nevent'\n data: EventPointer\n}\n\nexport type DecodedNprofile = {\n type: 'nprofile'\n data: ProfilePointer\n}\n\nexport type DecodedNaddr = {\n type: 'naddr'\n data: AddressPointer\n}\n\nexport type DecodedNsec = {\n type: 'nsec'\n data: Uint8Array\n}\n\nexport type DecodedNpub = {\n type: 'npub'\n data: string\n}\n\nexport type DecodedNote = {\n type: 'note'\n data: string\n}\n\nexport type DecodedResult = DecodedNevent | DecodedNprofile | DecodedNaddr | DecodedNpub | DecodedNsec | DecodedNote\n\nexport function decode(nip19: NEvent): DecodedNevent\nexport function decode(nip19: NProfile): DecodedNprofile\nexport function decode(nip19: NAddr): DecodedNaddr\nexport function decode(nip19: NSec): DecodedNsec\nexport function decode(nip19: NPub): DecodedNpub\nexport function decode(nip19: Note): DecodedNote\nexport function decode(code: string): DecodedResult\nexport function decode(code: string): DecodedResult {\n let { prefix, words } = bech32.decode(code as `${string}1${string}`, Bech32MaxSize)\n let data = new Uint8Array(bech32.fromWords(words))\n\n switch (prefix) {\n case 'nprofile': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nprofile')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nprofile',\n data: {\n pubkey: bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n },\n }\n }\n case 'nevent': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n if (tlv[2] && tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (tlv[3] && tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'nevent',\n data: {\n id: bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n author: tlv[2]?.[0] ? bytesToHex(tlv[2][0]) : undefined,\n kind: tlv[3]?.[0] ? parseInt(bytesToHex(tlv[3][0]), 16) : undefined,\n },\n }\n }\n\n case 'naddr': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for naddr')\n if (!tlv[2]?.[0]) throw new Error('missing TLV 2 for naddr')\n if (tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (!tlv[3]?.[0]) throw new Error('missing TLV 3 for naddr')\n if (tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'naddr',\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: bytesToHex(tlv[2][0]),\n kind: parseInt(bytesToHex(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n },\n }\n }\n\n case 'nsec':\n return { type: prefix, data }\n\n case 'npub':\n case 'note':\n return { type: prefix, data: bytesToHex(data) }\n\n default:\n throw new Error(`unknown prefix ${prefix}`)\n }\n}\n\ntype TLV = { [t: number]: Uint8Array[] }\n\nfunction parseTLV(data: Uint8Array): TLV {\n let result: TLV = {}\n let rest = data\n while (rest.length > 0) {\n let t = rest[0]\n let l = rest[1]\n let v = rest.slice(2, 2 + l)\n rest = rest.slice(2 + l)\n if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`)\n result[t] = result[t] || []\n result[t].push(v)\n }\n return result\n}\n\nexport function nsecEncode(key: Uint8Array): NSec {\n return encodeBytes('nsec', key)\n}\n\nexport function npubEncode(hex: string): NPub {\n return encodeBytes('npub', hexToBytes(hex))\n}\n\nexport function noteEncode(hex: string): Note {\n return encodeBytes('note', hexToBytes(hex))\n}\n\nfunction encodeBech32<Prefix extends string>(prefix: Prefix, data: Uint8Array): `${Prefix}1${string}` {\n let words = bech32.toWords(data)\n return bech32.encode(prefix, words, Bech32MaxSize) as `${Prefix}1${string}`\n}\n\nexport function encodeBytes<Prefix extends string>(prefix: Prefix, bytes: Uint8Array): `${Prefix}1${string}` {\n return encodeBech32(prefix, bytes)\n}\n\nexport function nprofileEncode(profile: ProfilePointer): NProfile {\n let data = encodeTLV({\n 0: [hexToBytes(profile.pubkey)],\n 1: (profile.relays || []).map(url => utf8Encoder.encode(url)),\n })\n return encodeBech32('nprofile', data)\n}\n\nexport function neventEncode(event: EventPointer): NEvent {\n let kindArray\n if (event.kind !== undefined) {\n kindArray = integerToUint8Array(event.kind)\n }\n\n let data = encodeTLV({\n 0: [hexToBytes(event.id)],\n 1: (event.relays || []).map(url => utf8Encoder.encode(url)),\n 2: event.author ? [hexToBytes(event.author)] : [],\n 3: kindArray ? [new Uint8Array(kindArray)] : [],\n })\n\n return encodeBech32('nevent', data)\n}\n\nexport function naddrEncode(addr: AddressPointer): NAddr {\n let kind = new ArrayBuffer(4)\n new DataView(kind).setUint32(0, addr.kind, false)\n\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n 2: [hexToBytes(addr.pubkey)],\n 3: [new Uint8Array(kind)],\n })\n return encodeBech32('naddr', data)\n}\n\nfunction encodeTLV(tlv: TLV): Uint8Array {\n let entries: Uint8Array[] = []\n\n Object.entries(tlv)\n .reverse()\n .forEach(([t, vs]) => {\n vs.forEach(v => {\n let entry = new Uint8Array(v.length + 2)\n entry.set([parseInt(t)], 0)\n entry.set([v.length], 1)\n entry.set(v, 2)\n entries.push(entry)\n })\n })\n\n return concatBytes(...entries)\n}\n", "/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n", "import { decode, type AddressPointer, type ProfilePointer, type EventPointer } from './nip19.ts'\n\nimport type { Event } from './core.ts'\n\ntype Reference = {\n text: string\n profile?: ProfilePointer\n event?: EventPointer\n address?: AddressPointer\n}\n\nconst mentionRegex = /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g\n\nexport function parseReferences(evt: Event): Reference[] {\n let references: Reference[] = []\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n // it's a NIP-27 mention\n try {\n let { type, data } = decode(ref[1])\n switch (type) {\n case 'npub': {\n references.push({\n text: ref[0],\n profile: { pubkey: data as string, relays: [] },\n })\n break\n }\n case 'nprofile': {\n references.push({\n text: ref[0],\n profile: data as ProfilePointer,\n })\n break\n }\n case 'note': {\n references.push({\n text: ref[0],\n event: { id: data as string, relays: [] },\n })\n break\n }\n case 'nevent': {\n references.push({\n text: ref[0],\n event: data as EventPointer,\n })\n break\n }\n case 'naddr': {\n references.push({\n text: ref[0],\n address: data as AddressPointer,\n })\n break\n }\n }\n } catch (err) {\n /***/\n }\n } else if (ref[3]) {\n // it's a NIP-10 mention\n let idx = parseInt(ref[3], 10)\n let tag = evt.tags[idx]\n if (!tag) continue\n\n switch (tag[0]) {\n case 'p': {\n references.push({\n text: ref[0],\n profile: { pubkey: tag[1], relays: tag[2] ? [tag[2]] : [] },\n })\n break\n }\n case 'e': {\n references.push({\n text: ref[0],\n event: { id: tag[1], relays: tag[2] ? [tag[2]] : [] },\n })\n break\n }\n case 'a': {\n try {\n let [kind, pubkey, identifier] = tag[1].split(':')\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : [],\n },\n })\n } catch (err) {\n /***/\n }\n break\n }\n }\n }\n }\n\n return references\n}\n", "import { hexToBytes, randomBytes } from '@noble/hashes/utils.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { cbc } from '@noble/ciphers/aes.js'\nimport { base64 } from '@scure/base'\n\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nexport function encrypt(secretKey: string | Uint8Array, pubkey: string, text: string): string {\n const privkey: Uint8Array = secretKey instanceof Uint8Array ? secretKey : hexToBytes(secretKey)\n const key = secp256k1.getSharedSecret(privkey, hexToBytes('02' + pubkey))\n const normalizedKey = getNormalizedX(key)\n\n let iv = Uint8Array.from(randomBytes(16))\n let plaintext = utf8Encoder.encode(text)\n\n let ciphertext = cbc(normalizedKey, iv).encrypt(plaintext)\n\n let ctb64 = base64.encode(new Uint8Array(ciphertext))\n let ivb64 = base64.encode(new Uint8Array(iv.buffer))\n\n return `${ctb64}?iv=${ivb64}`\n}\n\nexport function decrypt(secretKey: string | Uint8Array, pubkey: string, data: string): string {\n const privkey: Uint8Array = secretKey instanceof Uint8Array ? secretKey : hexToBytes(secretKey)\n let [ctb64, ivb64] = data.split('?iv=')\n let key = secp256k1.getSharedSecret(privkey, hexToBytes('02' + pubkey))\n let normalizedKey = getNormalizedX(key)\n\n let iv = base64.decode(ivb64)\n let ciphertext = base64.decode(ctb64)\n\n let plaintext = cbc(normalizedKey, iv).decrypt(ciphertext)\n\n return utf8Decoder.decode(plaintext)\n}\n\nfunction getNormalizedX(key: Uint8Array): Uint8Array {\n return key.slice(1, 33)\n}\n", "/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is boolean. */\nexport function abool(b: boolean): void {\n if (typeof b !== 'boolean') throw new Error(`boolean expected, not ${b}`);\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\nexport type IHash = {\n (data: string | Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n// Used in micro\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return BigInt(hex === '' ? '0' : '0x' + hex); // Big Endian\n}\n\n// Used in ff1\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\n\n// Used in micro, ff1\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(new Uint8Array([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Checks if two U8A use same underlying buffer and overlaps.\n * This is invalid and can corrupt data.\n */\nexport function overlapBytes(a: Uint8Array, b: Uint8Array): boolean {\n return (\n a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy\n a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end\n b.byteOffset < a.byteOffset + a.byteLength // b starts before a end\n );\n}\n\n/**\n * If input and output overlap and input starts before output, we will overwrite end of input before\n * we start processing it, so this is not supported for most ciphers (except chacha/salse, which designed with this)\n */\nexport function complexOverlapBytes(input: Uint8Array, output: Uint8Array): void {\n // This is very cursed. It works somehow, but I'm completely unsure,\n // reasoning about overlapping aligned windows is very hard.\n if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)\n throw new Error('complex overlap of input and output is not supported');\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\n// Used in ARX only\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts: T2\n): T1 & T2 {\n if (opts == null || typeof opts !== 'object') throw new Error('options must be defined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Compares 2 uint8array-s in kinda constant time. */\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// TODO: remove\nexport interface IHash2 {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: string | Uint8Array): this;\n // Writes digest into buf\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n destroy(): void;\n}\n\n// This will allow to re-use with composable things like packed & base encoders\n// Also, we probably can make tags composable\n\n/** Sync cipher: takes byte array and returns byte array. */\nexport type Cipher = {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array): Uint8Array;\n};\n\n/** Async cipher e.g. from built-in WebCrypto. */\nexport type AsyncCipher = {\n encrypt(plaintext: Uint8Array): Promise<Uint8Array>;\n decrypt(ciphertext: Uint8Array): Promise<Uint8Array>;\n};\n\n/** Cipher with `output` argument which can optimize by doing 1 less allocation. */\nexport type CipherWithOutput = Cipher & {\n encrypt(plaintext: Uint8Array, output?: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array, output?: Uint8Array): Uint8Array;\n};\n\n/**\n * Params are outside of return type, so it is accessible before calling constructor.\n * If function support multiple nonceLength's, we return the best one.\n */\nexport type CipherParams = {\n blockSize: number;\n nonceLength?: number;\n tagLength?: number;\n varSizeNonce?: boolean;\n};\n/** ARX cipher, like salsa or chacha. */\nexport type ARXCipher = ((\n key: Uint8Array,\n nonce: Uint8Array,\n AAD?: Uint8Array\n) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n};\nexport type CipherCons<T extends any[]> = (key: Uint8Array, ...args: T) => Cipher;\n/**\n * Wraps a cipher: validates args, ensures encrypt() can only be called once.\n * @__NO_SIDE_EFFECTS__\n */\nexport const wrapCipher = <C extends CipherCons<any>, P extends CipherParams>(\n params: P,\n constructor: C\n): C & P => {\n function wrappedCipher(key: Uint8Array, ...args: any[]): CipherWithOutput {\n // Validate key\n abytes(key, undefined, 'key');\n\n // Big-Endian hardware is rare. Just in case someone still decides to run ciphers:\n if (!isLE) throw new Error('Non little-endian hardware is not yet supported');\n\n // Validate nonce if nonceLength is present\n if (params.nonceLength !== undefined) {\n const nonce = args[0];\n abytes(nonce, params.varSizeNonce ? undefined : params.nonceLength, 'nonce');\n }\n\n // Validate AAD if tagLength present\n const tagl = params.tagLength;\n if (tagl && args[1] !== undefined) abytes(args[1], undefined, 'AAD');\n\n const cipher = constructor(key, ...args);\n const checkOutput = (fnLength: number, output?: Uint8Array) => {\n if (output !== undefined) {\n if (fnLength !== 2) throw new Error('cipher output not supported');\n abytes(output, undefined, 'output');\n }\n };\n // Create wrapped cipher with validation and single-use encryption\n let called = false;\n const wrCipher = {\n encrypt(data: Uint8Array, output?: Uint8Array) {\n if (called) throw new Error('cannot encrypt() twice with same key + nonce');\n called = true;\n abytes(data);\n checkOutput(cipher.encrypt.length, output);\n return (cipher as CipherWithOutput).encrypt(data, output);\n },\n decrypt(data: Uint8Array, output?: Uint8Array) {\n abytes(data);\n if (tagl && data.length < tagl)\n throw new Error('\"ciphertext\" expected length bigger than tagLength=' + tagl);\n checkOutput(cipher.decrypt.length, output);\n return (cipher as CipherWithOutput).decrypt(data, output);\n },\n };\n\n return wrCipher;\n }\n\n Object.assign(wrappedCipher, params);\n return wrappedCipher as C & P;\n};\n\n/** Represents salsa / chacha stream. */\nexport type XorStream = (\n key: Uint8Array,\n nonce: Uint8Array,\n data: Uint8Array,\n output?: Uint8Array,\n counter?: number\n) => Uint8Array;\n\n/**\n * By default, returns u8a of length.\n * When out is available, it checks it for validity and uses it.\n */\nexport function getOutput(\n expectedLength: number,\n out?: Uint8Array,\n onlyAligned = true\n): Uint8Array {\n if (out === undefined) return new Uint8Array(expectedLength);\n if (out.length !== expectedLength)\n throw new Error(\n '\"output\" expected Uint8Array of length ' + expectedLength + ', got: ' + out.length\n );\n if (onlyAligned && !isAligned32(out)) throw new Error('invalid output, must be aligned');\n return out;\n}\n\nexport function u64Lengths(dataLength: number, aadLength: number, isLE: boolean): Uint8Array {\n abool(isLE);\n const num = new Uint8Array(16);\n const view = createView(num);\n view.setBigUint64(0, BigInt(aadLength), isLE);\n view.setBigUint64(8, BigInt(dataLength), isLE);\n return num;\n}\n\n// Is byte array aligned to 4 byte offset (u32)?\nexport function isAligned32(bytes: Uint8Array): boolean {\n return bytes.byteOffset % 4 === 0;\n}\n\n// copy bytes to new u8a (aligned). Because Buffer.slice is broken.\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/**\n * The pseudorandom number generator doesn't wipe current state:\n * instead, it generates new one based on previous state + entropy.\n * Not reseed/rekey, since AES CTR DRBG does rekey on each randomBytes,\n * which is in fact `reseed`, since it changes counter too.\n */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\ntype RemoveNonceInner<T extends any[], Ret> = ((...args: T) => Ret) extends (\n arg0: any,\n arg1: any,\n ...rest: infer R\n) => any\n ? (key: Uint8Array, ...args: R) => Ret\n : never;\n\nexport type RemoveNonce<T extends (...args: any) => any> = RemoveNonceInner<\n Parameters<T>,\n ReturnType<T>\n>;\nexport type CipherWithNonce = ((\n key: Uint8Array,\n nonce: Uint8Array,\n ...args: any[]\n) => Cipher | AsyncCipher) & {\n nonceLength: number;\n};\n\n/**\n * Uses CSPRG for nonce, nonce injected in ciphertext.\n * For `encrypt`, a `nonceBytes`-length buffer is fetched from CSPRNG and\n * prepended to encrypted ciphertext. For `decrypt`, first `nonceBytes` of ciphertext\n * are treated as nonce.\n *\n * NOTE: Under the same key, using random nonces (e.g. `managedNonce`) with AES-GCM and ChaCha\n * should be limited to `2**23` (8M) messages to get a collision chance of `2**-50`. Stretching to * `2**32` (4B) messages, chance would become `2**-33` - still negligible, but creeping up.\n * @example\n * const gcm = managedNonce(aes.gcm);\n * const ciphr = gcm(key).encrypt(data);\n * const plain = gcm(key).decrypt(ciph);\n */\nexport function managedNonce<T extends CipherWithNonce>(\n fn: T,\n randomBytes_: typeof randomBytes = randomBytes\n): RemoveNonce<T> {\n const { nonceLength } = fn;\n anumber(nonceLength);\n const addNonce = (nonce: Uint8Array, ciphertext: Uint8Array) => {\n const out = concatBytes(nonce, ciphertext);\n ciphertext.fill(0);\n return out;\n };\n // NOTE: we cannot support DST here, it would be mistake:\n // - we don't know how much dst length cipher requires\n // - nonce may unalign dst and break everything\n // - we create new u8a anyway (concatBytes)\n // - previously we passed all args to cipher, but that was mistake!\n return ((key: Uint8Array, ...args: any[]): any => ({\n encrypt(plaintext: Uint8Array) {\n abytes(plaintext);\n const nonce = randomBytes_(nonceLength);\n const encrypted = fn(key, nonce, ...args).encrypt(plaintext);\n // @ts-ignore\n if (encrypted instanceof Promise) return encrypted.then((ct) => addNonce(nonce, ct));\n return addNonce(nonce, encrypted);\n },\n decrypt(ciphertext: Uint8Array) {\n abytes(ciphertext);\n const nonce = ciphertext.subarray(0, nonceLength);\n const decrypted = ciphertext.subarray(nonceLength);\n return fn(key, nonce, ...args).decrypt(decrypted);\n },\n })) as RemoveNonce<T>;\n}\n\n// workaround for TS 5.9 language mess:\nexport type Uint8ArrayBuffer = ReturnType<typeof Uint8Array.of>;\n", "/**\n * [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)\n * a.k.a. Advanced Encryption Standard\n * is a variant of Rijndael block cipher, standardized by NIST in 2001.\n * We provide the fastest available pure JS implementation.\n *\n * `cipher = encrypt(block, key)`\n *\n * Data is split into 128-bit blocks. Encrypted in 10/12/14 rounds (128/192/256 bits). In every round:\n * 1. **S-box**, table substitution\n * 2. **Shift rows**, cyclic shift left of all rows of data array\n * 3. **Mix columns**, multiplying every column by fixed polynomial\n * 4. **Add round key**, round_key xor i-th column of array\n *\n * Check out [FIPS-197](https://csrc.nist.gov/files/pubs/fips/197/final/docs/fips-197.pdf),\n * [NIST 800-38G](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf)\n * and [original proposal](https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf)\n * @module\n */\nimport { ghash, polyval } from './_polyval.ts';\n// prettier-ignore\nimport {\n abytes, anumber, clean, complexOverlapBytes, concatBytes,\n copyBytes, createView, equalBytes, getOutput, isAligned32, overlapBytes,\n u32, u64Lengths, u8, wrapCipher,\n type Cipher, type CipherWithOutput, type PRG, type Uint8ArrayBuffer\n} from './utils.ts';\n\nconst BLOCK_SIZE = 16;\nconst BLOCK_SIZE32 = 4;\nconst EMPTY_BLOCK = /* @__PURE__ */ new Uint8Array(BLOCK_SIZE);\nconst ONE_BLOCK = /* @__PURE__ */ Uint8Array.from([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n]);\nconst POLY = 0x11b; // 1 + x + x**3 + x**4 + x**8\n\nfunction validateKeyLength(key: Uint8Array) {\n if (![16, 24, 32].includes(key.length))\n throw new Error('\"aes key\" expected Uint8Array of length 16/24/32, got length=' + key.length);\n}\n\n// TODO: remove multiplication, binary ops only\nfunction mul2(n: number) {\n return (n << 1) ^ (POLY & -(n >> 7));\n}\n\nfunction mul(a: number, b: number) {\n let res = 0;\n for (; b > 0; b >>= 1) {\n // Montgomery ladder\n res ^= a & -(b & 1); // if (b&1) res ^=a (but const-time).\n a = mul2(a); // a = 2*a\n }\n return res;\n}\n\n// Increments bigint with wrap around\n// NOTE: we cannot use u32 here since it may overflow on carry!\nconst incBytes = (data: Uint8Array, isLE: boolean, carry: number = 1) => {\n if (!Number.isSafeInteger(carry)) throw new Error('incBytes: wrong carry ' + carry);\n abytes(data);\n for (let i = 0; i < data.length; i++) {\n const pos = !isLE ? data.length - 1 - i : i;\n carry = (carry + (data[pos] & 0xff)) | 0;\n data[pos] = carry & 0xff;\n carry >>>= 8;\n }\n};\n\n// AES S-box is generated using finite field inversion,\n// an affine transform, and xor of a constant 0x63.\nconst sbox = /* @__PURE__ */ (() => {\n const t = new Uint8Array(256);\n for (let i = 0, x = 1; i < 256; i++, x ^= mul2(x)) t[i] = x;\n const box = new Uint8Array(256);\n box[0] = 0x63; // first elm\n for (let i = 0; i < 255; i++) {\n let x = t[255 - i];\n x |= x << 8;\n box[t[i]] = (x ^ (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7) ^ 0x63) & 0xff;\n }\n clean(t);\n return box;\n})();\n\n// Inverted S-box\nconst invSbox = /* @__PURE__ */ sbox.map((_, j) => sbox.indexOf(j));\n\n// Rotate u32 by 8\nconst rotr32_8 = (n: number) => (n << 24) | (n >>> 8);\nconst rotl32_8 = (n: number) => (n << 8) | (n >>> 24);\n// The byte swap operation for uint32 (LE<->BE)\nconst byteSwap = (word: number) =>\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff);\n\n// T-table is optimization suggested in 5.2 of original proposal (missed from FIPS-197). Changes:\n// - LE instead of BE\n// - bigger tables: T0 and T1 are merged into T01 table and T2 & T3 into T23;\n// so index is u16, instead of u8. This speeds up things, unexpectedly\nfunction genTtable(sbox: Uint8Array, fn: (n: number) => number) {\n if (sbox.length !== 256) throw new Error('Wrong sbox length');\n const T0 = new Uint32Array(256).map((_, j) => fn(sbox[j]));\n const T1 = T0.map(rotl32_8);\n const T2 = T1.map(rotl32_8);\n const T3 = T2.map(rotl32_8);\n const T01 = new Uint32Array(256 * 256);\n const T23 = new Uint32Array(256 * 256);\n const sbox2 = new Uint16Array(256 * 256);\n for (let i = 0; i < 256; i++) {\n for (let j = 0; j < 256; j++) {\n const idx = i * 256 + j;\n T01[idx] = T0[i] ^ T1[j];\n T23[idx] = T2[i] ^ T3[j];\n sbox2[idx] = (sbox[i] << 8) | sbox[j];\n }\n }\n return { sbox, sbox2, T0, T1, T2, T3, T01, T23 };\n}\n\nconst tableEncoding = /* @__PURE__ */ genTtable(\n sbox,\n (s: number) => (mul(s, 3) << 24) | (s << 16) | (s << 8) | mul(s, 2)\n);\nconst tableDecoding = /* @__PURE__ */ genTtable(\n invSbox,\n (s) => (mul(s, 11) << 24) | (mul(s, 13) << 16) | (mul(s, 9) << 8) | mul(s, 14)\n);\n\nconst xPowers = /* @__PURE__ */ (() => {\n const p = new Uint8Array(16);\n for (let i = 0, x = 1; i < 16; i++, x = mul2(x)) p[i] = x;\n return p;\n})();\n\n/** Key expansion used in CTR. */\nfunction expandKeyLE(key: Uint8Array): Uint32Array {\n abytes(key);\n const len = key.length;\n validateKeyLength(key);\n const { sbox2 } = tableEncoding;\n const toClean = [];\n if (!isAligned32(key)) toClean.push((key = copyBytes(key)));\n const k32 = u32(key);\n const Nk = k32.length;\n const subByte = (n: number) => applySbox(sbox2, n, n, n, n);\n const xk = new Uint32Array(len + 28); // expanded key\n xk.set(k32);\n // 4.3.1 Key expansion\n for (let i = Nk; i < xk.length; i++) {\n let t = xk[i - 1];\n if (i % Nk === 0) t = subByte(rotr32_8(t)) ^ xPowers[i / Nk - 1];\n else if (Nk > 6 && i % Nk === 4) t = subByte(t);\n xk[i] = xk[i - Nk] ^ t;\n }\n clean(...toClean);\n return xk;\n}\n\nfunction expandKeyDecLE(key: Uint8Array): Uint32Array {\n const encKey = expandKeyLE(key);\n const xk = encKey.slice();\n const Nk = encKey.length;\n const { sbox2 } = tableEncoding;\n const { T0, T1, T2, T3 } = tableDecoding;\n // Inverse key by chunks of 4 (rounds)\n for (let i = 0; i < Nk; i += 4) {\n for (let j = 0; j < 4; j++) xk[i + j] = encKey[Nk - i - 4 + j];\n }\n clean(encKey);\n // apply InvMixColumn except first & last round\n for (let i = 4; i < Nk - 4; i++) {\n const x = xk[i];\n const w = applySbox(sbox2, x, x, x, x);\n xk[i] = T0[w & 0xff] ^ T1[(w >>> 8) & 0xff] ^ T2[(w >>> 16) & 0xff] ^ T3[w >>> 24];\n }\n return xk;\n}\n\n// Apply tables\nfunction apply0123(\n T01: Uint32Array,\n T23: Uint32Array,\n s0: number,\n s1: number,\n s2: number,\n s3: number\n) {\n return (\n T01[((s0 << 8) & 0xff00) | ((s1 >>> 8) & 0xff)] ^\n T23[((s2 >>> 8) & 0xff00) | ((s3 >>> 24) & 0xff)]\n );\n}\n\nfunction applySbox(sbox2: Uint16Array, s0: number, s1: number, s2: number, s3: number) {\n return (\n sbox2[(s0 & 0xff) | (s1 & 0xff00)] |\n (sbox2[((s2 >>> 16) & 0xff) | ((s3 >>> 16) & 0xff00)] << 16)\n );\n}\n\nfunction encrypt(\n xk: Uint32Array,\n s0: number,\n s1: number,\n s2: number,\n s3: number\n): { s0: number; s1: number; s2: number; s3: number } {\n const { sbox2, T01, T23 } = tableEncoding;\n let k = 0;\n ((s0 ^= xk[k++]), (s1 ^= xk[k++]), (s2 ^= xk[k++]), (s3 ^= xk[k++]));\n const rounds = xk.length / 4 - 2;\n for (let i = 0; i < rounds; i++) {\n const t0 = xk[k++] ^ apply0123(T01, T23, s0, s1, s2, s3);\n const t1 = xk[k++] ^ apply0123(T01, T23, s1, s2, s3, s0);\n const t2 = xk[k++] ^ apply0123(T01, T23, s2, s3, s0, s1);\n const t3 = xk[k++] ^ apply0123(T01, T23, s3, s0, s1, s2);\n ((s0 = t0), (s1 = t1), (s2 = t2), (s3 = t3));\n }\n // last round (without mixcolumns, so using SBOX2 table)\n const t0 = xk[k++] ^ applySbox(sbox2, s0, s1, s2, s3);\n const t1 = xk[k++] ^ applySbox(sbox2, s1, s2, s3, s0);\n const t2 = xk[k++] ^ applySbox(sbox2, s2, s3, s0, s1);\n const t3 = xk[k++] ^ applySbox(sbox2, s3, s0, s1, s2);\n return { s0: t0, s1: t1, s2: t2, s3: t3 };\n}\n\n// Can't be merged with encrypt: arg positions for apply0123 / applySbox are different\nfunction decrypt(\n xk: Uint32Array,\n s0: number,\n s1: number,\n s2: number,\n s3: number\n): {\n s0: number;\n s1: number;\n s2: number;\n s3: number;\n} {\n const { sbox2, T01, T23 } = tableDecoding;\n let k = 0;\n ((s0 ^= xk[k++]), (s1 ^= xk[k++]), (s2 ^= xk[k++]), (s3 ^= xk[k++]));\n const rounds = xk.length / 4 - 2;\n for (let i = 0; i < rounds; i++) {\n const t0 = xk[k++] ^ apply0123(T01, T23, s0, s3, s2, s1);\n const t1 = xk[k++] ^ apply0123(T01, T23, s1, s0, s3, s2);\n const t2 = xk[k++] ^ apply0123(T01, T23, s2, s1, s0, s3);\n const t3 = xk[k++] ^ apply0123(T01, T23, s3, s2, s1, s0);\n ((s0 = t0), (s1 = t1), (s2 = t2), (s3 = t3));\n }\n // Last round\n const t0: number = xk[k++] ^ applySbox(sbox2, s0, s3, s2, s1);\n const t1: number = xk[k++] ^ applySbox(sbox2, s1, s0, s3, s2);\n const t2: number = xk[k++] ^ applySbox(sbox2, s2, s1, s0, s3);\n const t3: number = xk[k++] ^ applySbox(sbox2, s3, s2, s1, s0);\n return { s0: t0, s1: t1, s2: t2, s3: t3 };\n}\n\n// TODO: investigate merging with ctr32\nfunction ctrCounter(\n xk: Uint32Array,\n nonce: Uint8Array,\n src: Uint8Array,\n dst?: Uint8Array\n): Uint8Array {\n abytes(nonce, BLOCK_SIZE, 'nonce');\n abytes(src);\n const srcLen = src.length;\n dst = getOutput(srcLen, dst);\n complexOverlapBytes(src, dst);\n const ctr = nonce;\n const c32 = u32(ctr);\n // Fill block (empty, ctr=0)\n let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);\n const src32 = u32(src);\n const dst32 = u32(dst);\n // process blocks\n for (let i = 0; i + 4 <= src32.length; i += 4) {\n dst32[i + 0] = src32[i + 0] ^ s0;\n dst32[i + 1] = src32[i + 1] ^ s1;\n dst32[i + 2] = src32[i + 2] ^ s2;\n dst32[i + 3] = src32[i + 3] ^ s3;\n incBytes(ctr, false, 1); // Full 128 bit counter with wrap around\n ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));\n }\n // leftovers (less than block)\n // It's possible to handle > u32 fast, but is it worth it?\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n const b32 = new Uint32Array([s0, s1, s2, s3]);\n const buf = u8(b32);\n for (let i = start, pos = 0; i < srcLen; i++, pos++) dst[i] = src[i] ^ buf[pos];\n clean(b32);\n }\n return dst;\n}\n\n// AES CTR with overflowing 32 bit counter\n// It's possible to do 32le significantly simpler (and probably faster) by using u32.\n// But, we need both, and perf bottleneck is in ghash anyway.\nfunction ctr32(\n xk: Uint32Array,\n isLE: boolean,\n nonce: Uint8Array,\n src: Uint8Array,\n dst?: Uint8Array\n): Uint8Array {\n abytes(nonce, BLOCK_SIZE, 'nonce');\n abytes(src);\n dst = getOutput(src.length, dst);\n const ctr = nonce; // write new value to nonce, so it can be re-used\n const c32 = u32(ctr);\n const view = createView(ctr);\n const src32 = u32(src);\n const dst32 = u32(dst);\n const ctrPos = isLE ? 0 : 12;\n const srcLen = src.length;\n // Fill block (empty, ctr=0)\n let ctrNum = view.getUint32(ctrPos, isLE); // read current counter value\n let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);\n // process blocks\n for (let i = 0; i + 4 <= src32.length; i += 4) {\n dst32[i + 0] = src32[i + 0] ^ s0;\n dst32[i + 1] = src32[i + 1] ^ s1;\n dst32[i + 2] = src32[i + 2] ^ s2;\n dst32[i + 3] = src32[i + 3] ^ s3;\n ctrNum = (ctrNum + 1) >>> 0; // u32 wrap\n view.setUint32(ctrPos, ctrNum, isLE);\n ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));\n }\n // leftovers (less than a block)\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n const b32 = new Uint32Array([s0, s1, s2, s3]);\n const buf = u8(b32);\n for (let i = start, pos = 0; i < srcLen; i++, pos++) dst[i] = src[i] ^ buf[pos];\n clean(b32);\n }\n return dst;\n}\n\n/**\n * **CTR** (Counter Mode): Turns a block cipher into a stream cipher using a counter and IV (nonce).\n * Efficient and parallelizable. Requires a unique nonce per encryption. Unauthenticated: needs MAC.\n */\nexport const ctr: ((key: Uint8Array, nonce: Uint8Array) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 16 },\n function aesctr(key: Uint8Array, nonce: Uint8Array): CipherWithOutput {\n function processCtr(buf: Uint8Array, dst?: Uint8Array) {\n abytes(buf);\n if (dst !== undefined) {\n abytes(dst);\n if (!isAligned32(dst)) throw new Error('unaligned destination');\n }\n const xk = expandKeyLE(key);\n const n = copyBytes(nonce); // align + avoid changing\n const toClean = [xk, n];\n if (!isAligned32(buf)) toClean.push((buf = copyBytes(buf)));\n const out = ctrCounter(xk, n, buf, dst);\n clean(...toClean);\n return out;\n }\n return {\n encrypt: (plaintext: Uint8Array, dst?: Uint8Array) => processCtr(plaintext, dst),\n decrypt: (ciphertext: Uint8Array, dst?: Uint8Array) => processCtr(ciphertext, dst),\n };\n }\n);\n\nfunction validateBlockDecrypt(data: Uint8Array) {\n abytes(data);\n if (data.length % BLOCK_SIZE !== 0) {\n throw new Error(\n 'aes-(cbc/ecb).decrypt ciphertext should consist of blocks with size ' + BLOCK_SIZE\n );\n }\n}\n\nfunction validateBlockEncrypt(plaintext: Uint8Array, pcks5: boolean, dst?: Uint8Array) {\n abytes(plaintext);\n let outLen = plaintext.length;\n const remaining = outLen % BLOCK_SIZE;\n if (!pcks5 && remaining !== 0)\n throw new Error('aec/(cbc-ecb): unpadded plaintext with disabled padding');\n if (!isAligned32(plaintext)) plaintext = copyBytes(plaintext);\n const b = u32(plaintext);\n if (pcks5) {\n let left = BLOCK_SIZE - remaining;\n if (!left) left = BLOCK_SIZE; // if no bytes left, create empty padding block\n outLen = outLen + left;\n }\n dst = getOutput(outLen, dst);\n complexOverlapBytes(plaintext, dst);\n const o = u32(dst);\n return { b, o, out: dst };\n}\n\nfunction validatePCKS(data: Uint8Array, pcks5: boolean) {\n if (!pcks5) return data;\n const len = data.length;\n if (!len) throw new Error('aes/pcks5: empty ciphertext not allowed');\n const lastByte = data[len - 1];\n if (lastByte <= 0 || lastByte > 16) throw new Error('aes/pcks5: wrong padding');\n const out = data.subarray(0, -lastByte);\n for (let i = 0; i < lastByte; i++)\n if (data[len - i - 1] !== lastByte) throw new Error('aes/pcks5: wrong padding');\n return out;\n}\n\nfunction padPCKS(left: Uint8Array) {\n const tmp = new Uint8Array(16);\n const tmp32 = u32(tmp);\n tmp.set(left);\n const paddingByte = BLOCK_SIZE - left.length;\n for (let i = BLOCK_SIZE - paddingByte; i < BLOCK_SIZE; i++) tmp[i] = paddingByte;\n return tmp32;\n}\n\n/** Options for ECB and CBC. */\nexport type BlockOpts = { disablePadding?: boolean };\n\n/**\n * **ECB** (Electronic Codebook): Deterministic encryption; identical plaintext blocks yield\n * identical ciphertexts. Not secure due to pattern leakage.\n * See [AES Penguin](https://words.filippo.io/the-ecb-penguin/).\n */\nexport const ecb: ((key: Uint8Array, opts?: BlockOpts) => CipherWithOutput) & {\n blockSize: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16 },\n function aesecb(key: Uint8Array, opts: BlockOpts = {}): CipherWithOutput {\n const pcks5 = !opts.disablePadding;\n return {\n encrypt(plaintext: Uint8Array, dst?: Uint8Array) {\n const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);\n const xk = expandKeyLE(key);\n let i = 0;\n for (; i + 4 <= b.length; ) {\n const { s0, s1, s2, s3 } = encrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n if (pcks5) {\n const tmp32 = padPCKS(plaintext.subarray(i * 4));\n const { s0, s1, s2, s3 } = encrypt(xk, tmp32[0], tmp32[1], tmp32[2], tmp32[3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(xk);\n return _out;\n },\n decrypt(ciphertext: Uint8Array, dst?: Uint8Array) {\n validateBlockDecrypt(ciphertext);\n const xk = expandKeyDecLE(key);\n dst = getOutput(ciphertext.length, dst);\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n complexOverlapBytes(ciphertext, dst);\n const b = u32(ciphertext);\n const o = u32(dst);\n for (let i = 0; i + 4 <= b.length; ) {\n const { s0, s1, s2, s3 } = decrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(...toClean);\n return validatePCKS(dst, pcks5);\n },\n };\n }\n);\n\n/**\n * **CBC** (Cipher Block Chaining): Each plaintext block is XORed with the\n * previous block of ciphertext before encryption.\n * Hard to use: requires proper padding and an IV. Unauthenticated: needs MAC.\n */\nexport const cbc: ((key: Uint8Array, iv: Uint8Array, opts?: BlockOpts) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 16 },\n function aescbc(key: Uint8Array, iv: Uint8Array, opts: BlockOpts = {}): CipherWithOutput {\n const pcks5 = !opts.disablePadding;\n return {\n encrypt(plaintext: Uint8Array, dst?: Uint8Array) {\n const xk = expandKeyLE(key);\n const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);\n let _iv = iv;\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(_iv)) toClean.push((_iv = copyBytes(_iv)));\n const n32 = u32(_iv);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n let i = 0;\n for (; i + 4 <= b.length; ) {\n ((s0 ^= b[i + 0]), (s1 ^= b[i + 1]), (s2 ^= b[i + 2]), (s3 ^= b[i + 3]));\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n if (pcks5) {\n const tmp32 = padPCKS(plaintext.subarray(i * 4));\n ((s0 ^= tmp32[0]), (s1 ^= tmp32[1]), (s2 ^= tmp32[2]), (s3 ^= tmp32[3]));\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(...toClean);\n return _out;\n },\n decrypt(ciphertext: Uint8Array, dst?: Uint8Array) {\n validateBlockDecrypt(ciphertext);\n const xk = expandKeyDecLE(key);\n let _iv = iv;\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(_iv)) toClean.push((_iv = copyBytes(_iv)));\n const n32 = u32(_iv);\n dst = getOutput(ciphertext.length, dst);\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n complexOverlapBytes(ciphertext, dst);\n const b = u32(ciphertext);\n const o = u32(dst);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n for (let i = 0; i + 4 <= b.length; ) {\n // prettier-ignore\n const ps0 = s0, ps1 = s1, ps2 = s2, ps3 = s3;\n ((s0 = b[i + 0]), (s1 = b[i + 1]), (s2 = b[i + 2]), (s3 = b[i + 3]));\n const { s0: o0, s1: o1, s2: o2, s3: o3 } = decrypt(xk, s0, s1, s2, s3);\n ((o[i++] = o0 ^ ps0), (o[i++] = o1 ^ ps1), (o[i++] = o2 ^ ps2), (o[i++] = o3 ^ ps3));\n }\n clean(...toClean);\n return validatePCKS(dst, pcks5);\n },\n };\n }\n);\n\n/**\n * CFB: Cipher Feedback Mode. The input for the block cipher is the previous cipher output.\n * Unauthenticated: needs MAC.\n */\nexport const cfb: ((key: Uint8Array, iv: Uint8Array) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 16 },\n function aescfb(key: Uint8Array, iv: Uint8Array): CipherWithOutput {\n function processCfb(src: Uint8Array, isEncrypt: boolean, dst?: Uint8Array) {\n abytes(src);\n const srcLen = src.length;\n dst = getOutput(srcLen, dst);\n if (overlapBytes(src, dst)) throw new Error('overlapping src and dst not supported.');\n const xk = expandKeyLE(key);\n let _iv = iv;\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(_iv)) toClean.push((_iv = copyBytes(_iv)));\n if (!isAligned32(src)) toClean.push((src = copyBytes(src)));\n const src32 = u32(src);\n const dst32 = u32(dst);\n const next32 = isEncrypt ? dst32 : src32;\n const n32 = u32(_iv);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n for (let i = 0; i + 4 <= src32.length; ) {\n const { s0: e0, s1: e1, s2: e2, s3: e3 } = encrypt(xk, s0, s1, s2, s3);\n dst32[i + 0] = src32[i + 0] ^ e0;\n dst32[i + 1] = src32[i + 1] ^ e1;\n dst32[i + 2] = src32[i + 2] ^ e2;\n dst32[i + 3] = src32[i + 3] ^ e3;\n ((s0 = next32[i++]), (s1 = next32[i++]), (s2 = next32[i++]), (s3 = next32[i++]));\n }\n // leftovers (less than block)\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n const buf = u8(new Uint32Array([s0, s1, s2, s3]));\n for (let i = start, pos = 0; i < srcLen; i++, pos++) dst[i] = src[i] ^ buf[pos];\n clean(buf);\n }\n clean(...toClean);\n return dst;\n }\n return {\n encrypt: (plaintext: Uint8Array, dst?: Uint8Array) => processCfb(plaintext, true, dst),\n decrypt: (ciphertext: Uint8Array, dst?: Uint8Array) => processCfb(ciphertext, false, dst),\n };\n }\n);\n\n// TODO: merge with chacha, however gcm has bitLen while chacha has byteLen\nfunction computeTag(\n fn: typeof ghash,\n isLE: boolean,\n key: Uint8Array,\n data: Uint8Array,\n AAD?: Uint8Array\n) {\n const aadLength = AAD ? AAD.length : 0;\n const h = fn.create(key, data.length + aadLength);\n if (AAD) h.update(AAD);\n const num = u64Lengths(8 * data.length, 8 * aadLength, isLE);\n h.update(data);\n h.update(num);\n const res = h.digest();\n clean(num);\n return res;\n}\n\n/**\n * **GCM** (Galois/Counter Mode): Combines CTR mode with polynomial MAC. Efficient and widely used.\n * Not perfect:\n * a) conservative key wear-out is `2**32` (4B) msgs.\n * b) key wear-out under random nonces is even smaller: `2**23` (8M) messages for `2**-50` chance.\n * c) MAC can be forged: see Poly1305 documentation.\n */\nexport const gcm: ((key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array) => Cipher) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n varSizeNonce: true;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 12, tagLength: 16, varSizeNonce: true },\n function aesgcm(key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): Cipher {\n // NIST 800-38d doesn't enforce minimum nonce length.\n // We enforce 8 bytes for compat with openssl.\n // 12 bytes are recommended. More than 12 bytes would be converted into 12.\n if (nonce.length < 8) throw new Error('aes/gcm: invalid nonce length');\n const tagLength = 16;\n function _computeTag(authKey: Uint8Array, tagMask: Uint8Array, data: Uint8Array) {\n const tag = computeTag(ghash, false, authKey, data, AAD);\n for (let i = 0; i < tagMask.length; i++) tag[i] ^= tagMask[i];\n return tag;\n }\n function deriveKeys() {\n const xk = expandKeyLE(key);\n const authKey = EMPTY_BLOCK.slice();\n const counter = EMPTY_BLOCK.slice();\n ctr32(xk, false, counter, counter, authKey);\n // NIST 800-38d, page 15: different behavior for 96-bit and non-96-bit nonces\n if (nonce.length === 12) {\n counter.set(nonce);\n } else {\n const nonceLen = EMPTY_BLOCK.slice();\n const view = createView(nonceLen);\n view.setBigUint64(8, BigInt(nonce.length * 8), false);\n // ghash(nonce || u64be(0) || u64be(nonceLen*8))\n const g = ghash.create(authKey).update(nonce).update(nonceLen);\n g.digestInto(counter); // digestInto doesn't trigger '.destroy'\n g.destroy();\n }\n const tagMask = ctr32(xk, false, counter, EMPTY_BLOCK);\n return { xk, authKey, counter, tagMask };\n }\n return {\n encrypt(plaintext: Uint8Array) {\n const { xk, authKey, counter, tagMask } = deriveKeys();\n const out = new Uint8Array(plaintext.length + tagLength);\n const toClean: (Uint8Array | Uint32Array)[] = [xk, authKey, counter, tagMask];\n if (!isAligned32(plaintext)) toClean.push((plaintext = copyBytes(plaintext)));\n ctr32(xk, false, counter, plaintext, out.subarray(0, plaintext.length));\n const tag = _computeTag(authKey, tagMask, out.subarray(0, out.length - tagLength));\n toClean.push(tag);\n out.set(tag, plaintext.length);\n clean(...toClean);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n const { xk, authKey, counter, tagMask } = deriveKeys();\n const toClean: (Uint8Array | Uint32Array)[] = [xk, authKey, tagMask, counter];\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = _computeTag(authKey, tagMask, data);\n toClean.push(tag);\n if (!equalBytes(tag, passedTag)) throw new Error('aes/gcm: invalid ghash tag');\n const out = ctr32(xk, false, counter, data);\n clean(...toClean);\n return out;\n },\n };\n }\n);\n\nconst limit = (name: string, min: number, max: number) => (value: number) => {\n if (!Number.isSafeInteger(value) || min > value || value > max) {\n const minmax = '[' + min + '..' + max + ']';\n throw new Error('' + name + ': expected value in range ' + minmax + ', got ' + value);\n }\n};\n\n/**\n * **SIV** (Synthetic IV): GCM with nonce-misuse resistance.\n * Repeating nonces reveal only the fact plaintexts are identical.\n * Also suffers from GCM issues: key wear-out limits & MAC forging.\n * See [RFC 8452](https://www.rfc-editor.org/rfc/rfc8452).\n */\nexport const gcmsiv: ((key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array) => Cipher) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n varSizeNonce: true;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 12, tagLength: 16, varSizeNonce: true },\n function aessiv(key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): Cipher {\n const tagLength = 16;\n // From RFC 8452: Section 6\n const AAD_LIMIT = limit('AAD', 0, 2 ** 36);\n const PLAIN_LIMIT = limit('plaintext', 0, 2 ** 36);\n const NONCE_LIMIT = limit('nonce', 12, 12);\n const CIPHER_LIMIT = limit('ciphertext', 16, 2 ** 36 + 16);\n abytes(key);\n validateKeyLength(key);\n NONCE_LIMIT(nonce.length);\n if (AAD !== undefined) AAD_LIMIT(AAD.length);\n function deriveKeys() {\n const xk = expandKeyLE(key);\n const encKey = new Uint8Array(key.length);\n const authKey = new Uint8Array(16);\n const toClean: (Uint8Array | Uint32Array)[] = [xk, encKey];\n let _nonce = nonce;\n if (!isAligned32(_nonce)) toClean.push((_nonce = copyBytes(_nonce)));\n const n32 = u32(_nonce);\n // prettier-ignore\n let s0 = 0, s1 = n32[0], s2 = n32[1], s3 = n32[2];\n let counter = 0;\n for (const derivedKey of [authKey, encKey].map(u32)) {\n const d32 = u32(derivedKey);\n for (let i = 0; i < d32.length; i += 2) {\n // aes(u32le(0) || nonce)[:8] || aes(u32le(1) || nonce)[:8] ...\n const { s0: o0, s1: o1 } = encrypt(xk, s0, s1, s2, s3);\n d32[i + 0] = o0;\n d32[i + 1] = o1;\n s0 = ++counter; // increment counter inside state\n }\n }\n const res = { authKey, encKey: expandKeyLE(encKey) };\n // Cleanup\n clean(...toClean);\n return res;\n }\n function _computeTag(encKey: Uint32Array, authKey: Uint8Array, data: Uint8Array) {\n const tag = computeTag(polyval, true, authKey, data, AAD);\n // Compute the expected tag by XORing S_s and the nonce, clearing the\n // most significant bit of the last byte and encrypting with the\n // message-encryption key.\n for (let i = 0; i < 12; i++) tag[i] ^= nonce[i];\n tag[15] &= 0x7f; // Clear the highest bit\n // encrypt tag as block\n const t32 = u32(tag);\n // prettier-ignore\n let s0 = t32[0], s1 = t32[1], s2 = t32[2], s3 = t32[3];\n ({ s0, s1, s2, s3 } = encrypt(encKey, s0, s1, s2, s3));\n ((t32[0] = s0), (t32[1] = s1), (t32[2] = s2), (t32[3] = s3));\n return tag;\n }\n // actual decrypt/encrypt of message.\n function processSiv(encKey: Uint32Array, tag: Uint8Array, input: Uint8Array) {\n let block = copyBytes(tag);\n block[15] |= 0x80; // Force highest bit\n const res = ctr32(encKey, true, block, input);\n // Cleanup\n clean(block);\n return res;\n }\n return {\n encrypt(plaintext: Uint8Array) {\n PLAIN_LIMIT(plaintext.length);\n const { encKey, authKey } = deriveKeys();\n const tag = _computeTag(encKey, authKey, plaintext);\n const toClean: (Uint8Array | Uint32Array)[] = [encKey, authKey, tag];\n if (!isAligned32(plaintext)) toClean.push((plaintext = copyBytes(plaintext)));\n const out = new Uint8Array(plaintext.length + tagLength);\n out.set(tag, plaintext.length);\n out.set(processSiv(encKey, tag, plaintext));\n // Cleanup\n clean(...toClean);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n CIPHER_LIMIT(ciphertext.length);\n const tag = ciphertext.subarray(-tagLength);\n const { encKey, authKey } = deriveKeys();\n const toClean: (Uint8Array | Uint32Array)[] = [encKey, authKey];\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n const plaintext = processSiv(encKey, tag, ciphertext.subarray(0, -tagLength));\n const expectedTag = _computeTag(encKey, authKey, plaintext);\n toClean.push(expectedTag);\n if (!equalBytes(tag, expectedTag)) {\n clean(...toClean);\n throw new Error('invalid polyval tag');\n }\n // Cleanup\n clean(...toClean);\n return plaintext;\n },\n };\n }\n);\n\nfunction isBytes32(a: unknown): a is Uint32Array {\n return (\n a instanceof Uint32Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint32Array')\n );\n}\n\nfunction encryptBlock(xk: Uint32Array, block: Uint8Array): Uint8Array {\n abytes(block, 16, 'block');\n if (!isBytes32(xk)) throw new Error('_encryptBlock accepts result of expandKeyLE');\n const b32 = u32(block);\n let { s0, s1, s2, s3 } = encrypt(xk, b32[0], b32[1], b32[2], b32[3]);\n ((b32[0] = s0), (b32[1] = s1), (b32[2] = s2), (b32[3] = s3));\n return block;\n}\n\nfunction decryptBlock(xk: Uint32Array, block: Uint8Array): Uint8Array {\n abytes(block, 16, 'block');\n if (!isBytes32(xk)) throw new Error('_decryptBlock accepts result of expandKeyLE');\n const b32 = u32(block);\n let { s0, s1, s2, s3 } = decrypt(xk, b32[0], b32[1], b32[2], b32[3]);\n ((b32[0] = s0), (b32[1] = s1), (b32[2] = s2), (b32[3] = s3));\n return block;\n}\n\n/**\n * AES-W (base for AESKW/AESKWP).\n * Specs: [SP800-38F](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf),\n * [RFC 3394](https://www.rfc-editor.org/rfc/rfc3394),\n * [RFC 5649](https://www.rfc-editor.org/rfc/rfc5649).\n */\nconst AESW = {\n /*\n High-level pseudocode:\n ```\n A: u64 = IV\n out = []\n for (let i=0, ctr = 0; i<6; i++) {\n for (const chunk of chunks(plaintext, 8)) {\n A ^= swapEndianess(ctr++)\n [A, res] = chunks(encrypt(A || chunk), 8);\n out ||= res\n }\n }\n out = A || out\n ```\n Decrypt is the same, but reversed.\n */\n encrypt(kek: Uint8Array, out: Uint8Array) {\n // Size is limited to 4GB, otherwise ctr will overflow and we'll need to switch to bigints.\n // If you need it larger, open an issue.\n if (out.length >= 2 ** 32) throw new Error('plaintext should be less than 4gb');\n const xk = expandKeyLE(kek);\n if (out.length === 16) encryptBlock(xk, out);\n else {\n const o32 = u32(out);\n // prettier-ignore\n let a0 = o32[0], a1 = o32[1]; // A\n for (let j = 0, ctr = 1; j < 6; j++) {\n for (let pos = 2; pos < o32.length; pos += 2, ctr++) {\n const { s0, s1, s2, s3 } = encrypt(xk, a0, a1, o32[pos], o32[pos + 1]);\n // A = MSB(64, B) ^ t where t = (n*j)+i\n ((a0 = s0), (a1 = s1 ^ byteSwap(ctr)), (o32[pos] = s2), (o32[pos + 1] = s3));\n }\n }\n ((o32[0] = a0), (o32[1] = a1)); // out = A || out\n }\n xk.fill(0);\n },\n decrypt(kek: Uint8Array, out: Uint8Array) {\n if (out.length - 8 >= 2 ** 32) throw new Error('ciphertext should be less than 4gb');\n const xk = expandKeyDecLE(kek);\n const chunks = out.length / 8 - 1; // first chunk is IV\n if (chunks === 1) decryptBlock(xk, out);\n else {\n const o32 = u32(out);\n // prettier-ignore\n let a0 = o32[0], a1 = o32[1]; // A\n for (let j = 0, ctr = chunks * 6; j < 6; j++) {\n for (let pos = chunks * 2; pos >= 1; pos -= 2, ctr--) {\n a1 ^= byteSwap(ctr);\n const { s0, s1, s2, s3 } = decrypt(xk, a0, a1, o32[pos], o32[pos + 1]);\n ((a0 = s0), (a1 = s1), (o32[pos] = s2), (o32[pos + 1] = s3));\n }\n }\n ((o32[0] = a0), (o32[1] = a1));\n }\n xk.fill(0);\n },\n};\n\nconst AESKW_IV = /* @__PURE__ */ new Uint8Array(8).fill(0xa6); // A6A6A6A6A6A6A6A6\n\n/**\n * AES-KW (key-wrap). Injects static IV into plaintext, adds counter, encrypts 6 times.\n * Reduces block size from 16 to 8 bytes.\n * For padded version, use aeskwp.\n * [RFC 3394](https://www.rfc-editor.org/rfc/rfc3394/),\n * [NIST.SP.800-38F](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf).\n */\nexport const aeskw: ((kek: Uint8Array) => Cipher) & {\n blockSize: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 8 },\n (kek: Uint8Array): Cipher => ({\n encrypt(plaintext: Uint8Array) {\n if (!plaintext.length || plaintext.length % 8 !== 0)\n throw new Error('invalid plaintext length');\n if (plaintext.length === 8)\n throw new Error('8-byte keys not allowed in AESKW, use AESKWP instead');\n const out = concatBytes(AESKW_IV, plaintext);\n AESW.encrypt(kek, out);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n // ciphertext must be at least 24 bytes and a multiple of 8 bytes\n // 24 because should have at least two block (1 iv + 2).\n // Replace with 16 to enable '8-byte keys'\n if (ciphertext.length % 8 !== 0 || ciphertext.length < 3 * 8)\n throw new Error('invalid ciphertext length');\n const out = copyBytes(ciphertext);\n AESW.decrypt(kek, out);\n if (!equalBytes(out.subarray(0, 8), AESKW_IV)) throw new Error('integrity check failed');\n out.subarray(0, 8).fill(0); // ciphertext.subarray(0, 8) === IV, but we clean it anyway\n return out.subarray(8);\n },\n })\n);\n\n/*\nWe don't support 8-byte keys. The rabbit hole:\n\n- Wycheproof says: \"NIST SP 800-38F does not define the wrapping of 8 byte keys.\n RFC 3394 Section 2 on the other hand specifies that 8 byte keys are wrapped\n by directly encrypting one block with AES.\"\n - https://github.com/C2SP/wycheproof/blob/master/doc/key_wrap.md\n - \"RFC 3394 specifies in Section 2, that the input for the key wrap\n algorithm must be at least two blocks and otherwise the constant\n field and key are simply encrypted with ECB as a single block\"\n- What RFC 3394 actually says (in Section 2):\n - \"Before being wrapped, the key data is parsed into n blocks of 64 bits.\n The only restriction the key wrap algorithm places on n is that n be\n at least two\"\n - \"For key data with length less than or equal to 64 bits, the constant\n field used in this specification and the key data form a single\n 128-bit codebook input making this key wrap unnecessary.\"\n- Which means \"assert(n >= 2)\" and \"use something else for 8 byte keys\"\n- NIST SP800-38F actually prohibits 8-byte in \"5.3.1 Mandatory Limits\".\n It states that plaintext for KW should be \"2 to 2^54 -1 semiblocks\".\n- So, where does \"directly encrypt single block with AES\" come from?\n - Not RFC 3394. Pseudocode of key wrap in 2.2 explicitly uses\n loop of 6 for any code path\n - There is a weird W3C spec:\n https://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html#kw-aes128\n - This spec is outdated, as admitted by Wycheproof authors\n - There is RFC 5649 for padded key wrap, which is padding construction on\n top of AESKW. In '4.1.2' it says: \"If the padded plaintext contains exactly\n eight octets, then prepend the AIV as defined in Section 3 above to P[1] and\n encrypt the resulting 128-bit block using AES in ECB mode [Modes] with key\n K (the KEK). In this case, the output is two 64-bit blocks C[0] and C[1]:\"\n - Browser subtle crypto is actually crashes on wrapping keys less than 16 bytes:\n `Error: error:1C8000E6:Provider routines::invalid input length] { opensslErrorStack: [ 'error:030000BD:digital envelope routines::update error' ]`\n\nIn the end, seems like a bug in Wycheproof.\nThe 8-byte check can be easily disabled inside of AES_W.\n*/\n\nconst AESKWP_IV = 0xa65959a6; // single u32le value\n\n/**\n * AES-KW, but with padding and allows random keys.\n * Second u32 of IV is used as counter for length.\n * [RFC 5649](https://www.rfc-editor.org/rfc/rfc5649)\n */\nexport const aeskwp: ((kek: Uint8Array) => Cipher) & {\n blockSize: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 8 },\n (kek: Uint8Array): Cipher => ({\n encrypt(plaintext: Uint8Array) {\n if (!plaintext.length) throw new Error('invalid plaintext length');\n const padded = Math.ceil(plaintext.length / 8) * 8;\n const out = new Uint8Array(8 + padded);\n out.set(plaintext, 8);\n const out32 = u32(out);\n out32[0] = AESKWP_IV;\n out32[1] = byteSwap(plaintext.length);\n AESW.encrypt(kek, out);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n // 16 because should have at least one block\n if (ciphertext.length < 16) throw new Error('invalid ciphertext length');\n const out = copyBytes(ciphertext);\n const o32 = u32(out);\n AESW.decrypt(kek, out);\n const len = byteSwap(o32[1]) >>> 0;\n const padded = Math.ceil(len / 8) * 8;\n if (o32[0] !== AESKWP_IV || out.length - 8 !== padded)\n throw new Error('integrity check failed');\n for (let i = len; i < padded; i++)\n if (out[8 + i] !== 0) throw new Error('integrity check failed');\n out.subarray(0, 8).fill(0); // ciphertext.subarray(0, 8) === IV, but we clean it anyway\n return out.subarray(8, 8 + len);\n },\n })\n);\n\nclass _AesCtrDRBG implements PRG {\n readonly blockLen: number;\n private key: Uint8Array;\n private nonce: Uint8Array;\n private state: Uint8Array;\n private reseedCnt: number;\n constructor(keyLen: number, seed: Uint8Array, personalization?: Uint8Array) {\n this.blockLen = ctr.blockSize;\n const keyLenBytes = keyLen / 8;\n const nonceLen = 16;\n this.state = new Uint8Array(keyLenBytes + nonceLen);\n this.key = this.state.subarray(0, keyLenBytes);\n this.nonce = this.state.subarray(keyLenBytes, keyLenBytes + nonceLen);\n this.reseedCnt = 1;\n incBytes(this.nonce, false, 1);\n this.addEntropy(seed, personalization);\n }\n private update(data?: Uint8Array) {\n // cannot re-use state here, because we will wipe current key\n ctr(this.key, this.nonce).encrypt(new Uint8Array(this.state.length), this.state);\n if (data) {\n abytes(data);\n for (let i = 0; i < data.length; i++) this.state[i] ^= data[i];\n }\n incBytes(this.nonce, false, 1);\n }\n addEntropy(seed: Uint8Array, info?: Uint8Array): void {\n abytes(seed, this.state.length, 'seed');\n const _seed = seed.slice();\n if (info) {\n abytes(info);\n if (info.length > _seed.length) throw new Error('info length is too big');\n for (let i = 0; i < info.length; i++) _seed[i] ^= info[i];\n }\n this.update(_seed);\n _seed.fill(0);\n this.reseedCnt = 1;\n }\n randomBytes(len: number, info?: Uint8Array): Uint8Array {\n anumber(len);\n if (this.reseedCnt++ >= 2 ** 48) throw new Error('entropy exhausted');\n if (info) this.update(info);\n const res = new Uint8Array(len);\n ctr(this.key, this.nonce).encrypt(res, res);\n incBytes(this.nonce, false, Math.ceil(len / this.blockLen));\n this.update(info);\n return res;\n }\n clean(): void {\n this.state.fill(0);\n this.reseedCnt = 0;\n }\n}\n\nexport type AesCtrDrbg = (seed: Uint8Array, personalization?: Uint8Array) => _AesCtrDRBG;\n\nconst createAesDrbg: (keyLen: number) => AesCtrDrbg = (keyLen) => {\n return (seed, personalization = undefined) => new _AesCtrDRBG(keyLen, seed, personalization);\n};\n\n/**\n * AES-CTR DRBG 128-bit - CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n */\nexport const rngAesCtrDrbg128: AesCtrDrbg = /* @__PURE__ */ createAesDrbg(128);\n/**\n * AES-CTR DRBG 256-bit - CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n */\nexport const rngAesCtrDrbg256: AesCtrDrbg = /* @__PURE__ */ createAesDrbg(256);\n\n//#region CMAC\n\n/**\n * Left-shift by one bit and conditionally XOR with 0x87:\n * ```\n * if MSB(L) is equal to 0\n * then K1 := L << 1;\n * else K1 := (L << 1) XOR const_Rb;\n * ```\n *\n * Specs: [RFC 4493, Section 2.3](https://www.rfc-editor.org/rfc/rfc4493.html#section-2.3),\n * [RFC 5297 Section 2.3](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.3)\n *\n * @returns modified `block` (for chaining)\n */\nfunction dbl<T extends Uint8Array>(block: T): T {\n let carry = 0;\n\n // Left shift by 1 bit\n for (let i = BLOCK_SIZE - 1; i >= 0; i--) {\n const newCarry = (block[i] & 0x80) >>> 7;\n block[i] = (block[i] << 1) | carry;\n carry = newCarry;\n }\n\n // XOR with 0x87 if there was a carry from the most significant bit\n if (carry) {\n block[BLOCK_SIZE - 1] ^= 0x87;\n }\n\n return block;\n}\n\n/**\n * `a XOR b`, running in-site on `a`.\n * @param a left operand and output\n * @param b right operand\n * @returns `a` (for chaining)\n */\nfunction xorBlock<T extends Uint8Array>(a: T, b: Uint8Array): T {\n if (a.length !== b.length) throw new Error('xorBlock: blocks must have same length');\n for (let i = 0; i < a.length; i++) {\n a[i] = a[i] ^ b[i];\n }\n return a;\n}\n\n/**\n * xorend as defined in [RFC 5297 Section 2.1](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.1).\n *\n * ```\n * leftmost(A, len(A)-len(B)) || (rightmost(A, len(B)) xor B)\n * ```\n */\nfunction xorend<T extends Uint8Array>(a: T, b: Uint8Array): T {\n if (b.length > a.length) {\n throw new Error('xorend: len(B) must be less than or equal to len(A)');\n }\n // keep leftmost part of `a` unchanged\n // and xor only the rightmost part:\n const offset = a.length - b.length;\n for (let i = 0; i < b.length; i++) {\n a[offset + i] = a[offset + i] ^ b[i];\n }\n return a;\n}\n\n/**\n * Internal CMAC class.\n */\nclass _CMAC {\n private buffer: Uint8Array;\n private destroyed: boolean;\n private k1: Uint8Array;\n private k2: Uint8Array;\n private xk: Uint32Array;\n\n constructor(key: Uint8Array) {\n abytes(key);\n validateKeyLength(key);\n this.xk = expandKeyLE(key);\n this.buffer = new Uint8Array(0);\n this.destroyed = false;\n // L = AES_encrypt(K, const_Zero)\n const L = new Uint8Array(BLOCK_SIZE);\n encryptBlock(this.xk, L);\n // Generate subkeys K1 and K2 from the main key according to\n // [RFC 4493, Section 2.3](https://www.rfc-editor.org/rfc/rfc4493.html#section-2.3)\n // K1\n this.k1 = dbl(L);\n this.k2 = dbl(new Uint8Array(this.k1));\n }\n\n update(data: Uint8Array): _CMAC {\n const { destroyed, buffer } = this;\n if (destroyed) throw new Error('CMAC instance was destroyed');\n abytes(data);\n const newBuffer = new Uint8Array(buffer.length + data.length);\n newBuffer.set(buffer);\n newBuffer.set(data, buffer.length);\n this.buffer = newBuffer;\n return this;\n }\n\n // see https://www.rfc-editor.org/rfc/rfc4493.html#section-2.4\n digest(): Uint8ArrayBuffer {\n if (this.destroyed) throw new Error('CMAC instance was destroyed');\n const { buffer } = this;\n const msgLen = buffer.length;\n\n // Step 2:\n let n = Math.ceil(msgLen / BLOCK_SIZE); // n := ceil(len/const_Bsize);\n\n // Step 3:\n let flag: boolean; // denoting if last block is complete or not\n if (n === 0) {\n n = 1;\n flag = false;\n } else {\n flag = msgLen % BLOCK_SIZE === 0; // if len mod const_Bsize is 0\n }\n\n // Step 4:\n const lastBlockStart = (n - 1) * BLOCK_SIZE;\n const lastBlockData = buffer.subarray(lastBlockStart);\n let m_last: Uint8ArrayBuffer;\n if (flag) {\n // M_last := M_n XOR K1;\n m_last = xorBlock(new Uint8Array(lastBlockData), this.k1);\n } else {\n // M_last := padding(M_n) XOR K2;\n //\n // [...] padding(x) is the concatenation of x and a single '1',\n // followed by the minimum number of '0's, so that the total length is\n // equal to 128 bits.\n const padded = new Uint8Array(BLOCK_SIZE);\n padded.set(lastBlockData);\n padded[lastBlockData.length] = 0x80; // single '1' bit\n m_last = xorBlock(padded, this.k2);\n }\n\n // Step 5:\n let x = new Uint8Array(BLOCK_SIZE); // X := const_Zero;\n\n // Step 6:\n for (let i = 0; i < n - 1; i++) {\n const m_i = buffer.subarray(i * BLOCK_SIZE, (i + 1) * BLOCK_SIZE); // M_i\n xorBlock(x, m_i); // Y := X XOR M_i;\n encryptBlock(this.xk, x); // X := AES-128(K,Y);\n }\n\n // Step 7:\n xorBlock(x, m_last); // Y := M_last XOR X;\n encryptBlock(this.xk, x); // T := AES-128(K,Y);\n\n // cleanup:\n clean(m_last);\n\n return x; // T\n }\n\n destroy(): void {\n const { buffer, destroyed, xk, k1, k2 } = this;\n if (destroyed) return;\n this.destroyed = true;\n clean(buffer, xk, k1, k2);\n }\n}\n\n/**\n * AES-CMAC (Cipher-based Message Authentication Code).\n * Specs: [RFC 4493](https://www.rfc-editor.org/rfc/rfc4493.html).\n */\nexport const cmac: {\n (key: Uint8Array, message: Uint8Array): Uint8Array;\n create(key: Uint8Array): _CMAC;\n} = (key: Uint8Array, message: Uint8Array): Uint8Array => new _CMAC(key).update(message).digest();\ncmac.create = (key: Uint8Array): _CMAC => new _CMAC(key);\n\n/**\n * S2V (Synthetic Initialization Vector) function as described in [RFC 5297 Section 2.4](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.4).\n *\n * ```\n * S2V(K, S1, ..., Sn) {\n * if n = 0 then\n * return V = AES-CMAC(K, <one>)\n * fi\n * D = AES-CMAC(K, <zero>)\n * for i = 1 to n-1 do\n * D = dbl(D) xor AES-CMAC(K, Si)\n * done\n * if len(Sn) >= 128 then\n * T = Sn xorend D\n * else\n * T = dbl(D) xor pad(Sn)\n * fi\n * return V = AES-CMAC(K, T)\n * }\n * ```\n *\n * S2V takes a key and a vector of strings S1, S2, ..., Sn and returns a 128-bit string.\n * The S2V function is used to generate a synthetic IV for AES-SIV.\n *\n * @param key - AES key (128, 192, or 256 bits)\n * @param strings - Array of byte arrays to process\n * @returns 128-bit synthetic IV\n */\nfunction s2v(key: Uint8Array, strings: Uint8Array[]): Uint8Array {\n validateKeyLength(key);\n const len = strings.length;\n if (len > 127) {\n // see https://datatracker.ietf.org/doc/html/rfc5297.html#section-7\n throw new Error('s2v: number of input strings must be less than or equal to 127');\n }\n\n if (len === 0) return cmac(key, ONE_BLOCK);\n\n // D = AES-CMAC(K, <zero>)\n let d = cmac(key, EMPTY_BLOCK);\n\n // for i = 1 to n-1 do\n // D = dbl(D) xor AES-CMAC(K, Si)\n for (let i = 0; i < len - 1; i++) {\n dbl(d);\n const cmacResult = cmac(key, strings[i]);\n xorBlock(d, cmacResult);\n clean(cmacResult);\n }\n\n const s_n = strings[len - 1];\n let t: Uint8Array;\n\n // if len(Sn) >= 128 then\n if (s_n.byteLength >= BLOCK_SIZE) {\n // T = Sn xorend D\n t = xorend(Uint8Array.from(s_n), d);\n } else {\n // pad(Sn):\n const paddedSn = new Uint8Array(BLOCK_SIZE);\n paddedSn.set(s_n);\n paddedSn[s_n.length] = 0x80; // padding: 0x80 followed by zeros\n\n // T = dbl(D) xor pad(Sn)\n t = xorBlock(dbl(d), paddedSn);\n clean(paddedSn);\n }\n\n // V = AES-CMAC(K, T)\n const result = cmac(key, t);\n clean(d, t);\n return result;\n}\n\n/** Use `gcmsiv` or `aessiv`. */\nexport const siv: () => never = () => {\n throw new Error('\"siv\" from v1 is now \"gcmsiv\"');\n};\n\n/**\n * **SIV**: Synthetic Initialization Vector (SIV) Authenticated Encryption\n * Nonce is derived from the plaintext and AAD using the S2V function.\n * See [RFC 5297](https://datatracker.ietf.org/doc/html/rfc5297.html).\n */\nexport const aessiv: ((key: Uint8Array, ...AAD: Uint8Array[]) => Cipher) & {\n blockSize: number;\n tagLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, tagLength: 16 },\n function aessiv(key: Uint8Array, ...AAD: Uint8Array[]): Cipher {\n // From RFC 5297: Section 6.1, 6.2, 6.3:\n const PLAIN_LIMIT = limit('plaintext', 0, 2 ** 132);\n const CIPHER_LIMIT = limit('ciphertext', 16, 2 ** 132 + 16);\n if (AAD.length > 126) {\n // see https://datatracker.ietf.org/doc/html/rfc5297.html#section-7\n throw new Error('\"AAD\" number of elements must be less than or equal to 126');\n }\n AAD.forEach((aad) => abytes(aad));\n abytes(key);\n if (![32, 48, 64].includes(key.length))\n throw new Error('\"aes key\" expected Uint8Array of length 32/48/64, got length=' + key.length);\n\n // The key is split into equal halves, K1 = leftmost(K, len(K)/2) and\n // K2 = rightmost(K, len(K)/2). K1 is used for S2V and K2 is used for CTR.\n const k1 = key.subarray(0, key.length / 2);\n const k2 = key.subarray(key.length / 2);\n\n return {\n // https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.6\n encrypt(plaintext: Uint8Array) {\n PLAIN_LIMIT(plaintext.length);\n\n const v = s2v(k1, [...AAD, plaintext]);\n\n // clear out the 31st and 63rd (rightmost) bit:\n const q = Uint8Array.from(v);\n q[8] &= 0x7f;\n q[12] &= 0x7f;\n\n // encrypt:\n const c = ctr(k2, q).encrypt(plaintext);\n\n return concatBytes(v, c);\n },\n // https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.7\n decrypt(ciphertext: Uint8Array) {\n CIPHER_LIMIT(ciphertext.length);\n const v = ciphertext.subarray(0, BLOCK_SIZE);\n const c = ciphertext.subarray(BLOCK_SIZE);\n\n // clear out the 31st and 63rd (rightmost) bit:\n const q = Uint8Array.from(v);\n q[8] &= 0x7f;\n q[12] &= 0x7f;\n\n // decrypt:\n const p = ctr(k2, q).decrypt(c);\n\n // verify tag:\n const t = s2v(k1, [...AAD, p]);\n\n if (equalBytes(t, v)) {\n return p;\n } else {\n throw new Error('invalid siv tag');\n }\n },\n };\n }\n);\n//#endregion\n\n/** Unsafe low-level internal methods. May change at any time. */\nexport const unsafe: {\n expandKeyLE: typeof expandKeyLE;\n expandKeyDecLE: typeof expandKeyDecLE;\n encrypt: typeof encrypt;\n decrypt: typeof decrypt;\n encryptBlock: typeof encryptBlock;\n decryptBlock: typeof decryptBlock;\n ctrCounter: typeof ctrCounter;\n ctr32: typeof ctr32;\n dbl: typeof dbl;\n xorBlock: typeof xorBlock;\n xorend: typeof xorend;\n s2v: typeof s2v;\n} = {\n expandKeyLE,\n expandKeyDecLE,\n encrypt,\n decrypt,\n encryptBlock,\n decryptBlock,\n ctrCounter,\n ctr32,\n dbl,\n xorBlock,\n xorend,\n s2v,\n};\n", "import { ProfilePointer } from './nip19.ts'\n\nexport type Nip05 = `${string}@${string}`\n\n/**\n * NIP-05 regex. The localpart is optional, and should be assumed to be `_` otherwise.\n *\n * - 0: full match\n * - 1: name (optional)\n * - 2: domain\n */\nexport const NIP05_REGEX = /^(?:([\\w.+-]+)@)?([\\w_-]+(\\.[\\w_-]+)+)$/\nexport const isNip05 = (value?: string | null): value is Nip05 => NIP05_REGEX.test(value || '')\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet _fetch: any\n\ntry {\n _fetch = fetch\n} catch (_) {\n null\n}\n\nexport function useFetchImplementation(fetchImplementation: unknown) {\n _fetch = fetchImplementation\n}\n\nexport async function searchDomain(domain: string, query = ''): Promise<{ [name: string]: string }> {\n try {\n const url = `https://${domain}/.well-known/nostr.json?name=${query}`\n const res = await _fetch(url, { redirect: 'manual' })\n if (res.status !== 200) {\n throw Error('Wrong response code')\n }\n const json = await res.json()\n return json.names\n } catch (_) {\n return {}\n }\n}\n\nexport async function queryProfile(fullname: string): Promise<ProfilePointer | null> {\n const match = fullname.match(NIP05_REGEX)\n if (!match) return null\n\n const [, name = '_', domain] = match\n\n try {\n const url = `https://${domain}/.well-known/nostr.json?name=${name}`\n const res = await _fetch(url, { redirect: 'manual' })\n if (res.status !== 200) {\n throw Error('Wrong response code')\n }\n const json = await res.json()\n\n const pubkey = json.names[name]\n return pubkey ? { pubkey, relays: json.relays?.[pubkey] } : null\n } catch (_e) {\n return null\n }\n}\n\nexport async function isValid(pubkey: string, nip05: Nip05): Promise<boolean> {\n const res = await queryProfile(nip05)\n return res ? res.pubkey === pubkey : false\n}\n", "import type { Event } from './core.ts'\nimport type { EventPointer, ProfilePointer } from './nip19.ts'\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events that may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * Pointers to events that were directly quoted.\n */\n quotes: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: [],\n quotes: [],\n }\n\n let maybeParent: EventPointer | undefined\n let maybeRoot: EventPointer | undefined\n\n for (let i = event.tags.length - 1; i >= 0; i--) {\n const tag = event.tags[i]\n\n if (tag[0] === 'e' && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl, eTagMarker, eTagAuthor] = tag as [\n string,\n string,\n undefined | string,\n undefined | string,\n undefined | string,\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n author: eTagAuthor,\n }\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (!maybeParent) {\n maybeParent = eventPointer\n } else {\n maybeRoot = eventPointer\n }\n\n result.mentions.push(eventPointer)\n continue\n }\n\n if (tag[0] === 'q' && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl] = tag as [string, string, undefined | string]\n result.quotes.push({\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n })\n }\n\n if (tag[0] === 'p' && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n continue\n }\n }\n\n // get legacy (positional) markers, set reply to root and vice-versa if one of them is missing\n if (!result.root) {\n result.root = maybeRoot || maybeParent || result.reply\n }\n if (!result.reply) {\n result.reply = maybeParent || result.root\n }\n\n // remove root and reply from mentions, inherit relay hints from authors if any\n ;[result.reply, result.root].forEach(ref => {\n if (!ref) return\n\n let idx = result.mentions.indexOf(ref)\n if (idx !== -1) {\n result.mentions.splice(idx, 1)\n }\n if (ref.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!?.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n result.mentions.forEach(ref => {\n if (ref!.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n return result\n}\n", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any): void {\n _fetch = fetchImplementation\n}\n\nexport async function fetchRelayInformation(url: string): Promise<RelayInformation> {\n return (await (\n await fetch(url.replace('ws://', 'http://').replace('wss://', 'https://'), {\n headers: { Accept: 'application/nostr+json' },\n })\n ).json()) as RelayInformation\n}\n\n/**\n * ## Relay Information Document\n\n * Relays may provide server metadata to clients to inform\n * them of capabilities, administrative contacts, and\n * various server attributes. This is made available as a\n * JSON document over HTTP, on the same URI as the relay's\n * websocket.\n\n * Any field may be omitted, and clients MUST ignore any\n * additional fields they do not understand. Relays MUST\n * accept CORS requests by sending\n * `Access-Control-Allow-Origin`,\n * `Access-Control-Allow-Headers`, and\n * `Access-Control-Allow-Methods` headers.\n * @param name string identifying relay\n * @param description string with detailed information\n * @param pubkey administrative contact pubkey\n * @param contact: administrative alternate contact\n * @param supported_nips a list of NIP numbers supported by\n * the relay\n * @param software identifying relay software URL\n * @param version string version identifier\n */\nexport interface BasicRelayInformation {\n // string identifying relay\n name: string\n description: string\n pubkey: string\n contact: string\n supported_nips: number[]\n software: string\n version: string\n // limitation?: Limitations<A, P>\n}\n\n/**\n * * ## Extra Fields\n\n * * ### Server Limitations\n\n * These are limitations imposed by the relay on clients.\n * Your client should expect that requests which exceed\n * these practical_ limitations are rejected or fail immediately.\n * @param max_message_length this is the maximum number of\n * bytes for incoming JSON that the relay will attempt to\n * decode and act upon. When you send large subscriptions,\n * you will be limited by this value. It also effectively\n * limits the maximum size of any event. Value is calculated\n * from `[` to `]` and is after UTF-8 serialization (so some\n * unicode characters will cost 2-3 bytes). It is equal to\n * the maximum size of the WebSocket message frame.\n * @param max_subscriptions total number of subscriptions\n * that may be active on a single websocket connection to\n * this relay. It's possible that authenticated clients with\n * a (paid) relationship to the relay may have higher limits.\n * @param max_filters maximum number of filter values in\n * each subscription. Must be one or higher.\n * @param max_limit the relay server will clamp each\n * filter's `limit` value to this number.\n * This means the client won't be able to get more than this\n * number of events from a single subscription filter. This\n * clamping is typically done silently by the relay, but\n * with this number, you can know that there are additional\n * results if you narrowed your filter's time range or other\n * parameters.\n * @param max_subid_length maximum length of subscription id as a\n * string.\n * @param min_prefix for `authors` and `ids` filters which\n * are to match against a hex prefix, you must provide at\n * least this many hex digits in the prefix.\n * @param max_event_tags in any event, this is the maximum\n * number of elements in the `tags` list.\n * @param max_content_length maximum number of characters in\n * the `content` field of any event. This is a count of\n * unicode characters. After serializing into JSON it may be\n * larger (in bytes), and is still subject to the\n * max_message_length`, if defined.\n * @param min_pow_difficulty new events will require at\n * least this difficulty of PoW, based on [NIP-13](13.md),\n * or they will be rejected by this server.\n * @param auth_required this relay requires [NIP-42](42.md)\n * authentication to happen before a new connection may\n * perform any other action. Even if set to False,\n * authentication may be required for specific actions.\n * @param restricted_writes: this relay requires some kind\n * of condition to be fulfilled in order to accept events\n * (not necessarily, but including\n * @param payment_required this relay requires payment\n * before a new connection may perform any action.\n * @param created_at_lower_limit: 'created_at' lower limit\n * @param created_at_upper_limit: 'created_at' upper limit\n */\nexport interface Limitations {\n max_message_length: number\n max_subscriptions: number\n max_filters: number\n max_limit: number\n max_subid_length: number\n min_prefix: number\n max_event_tags: number\n max_content_length: number\n min_pow_difficulty: number\n auth_required: boolean\n payment_required: boolean\n created_at_lower_limit: number\n created_at_upper_limit: number\n restricted_writes: boolean\n}\n\nexport interface RetentionDetails {\n kinds: (number | number[])[]\n time?: number | null\n count?: number | null\n}\ntype AnyRetentionDetails = RetentionDetails\n/**\n * ### Event Retention\n\n * There may be a cost associated with storing data forever,\n * so relays may wish to state retention times. The values\n * stated here are defaults for unauthenticated users and\n * visitors. Paid users would likely have other policies.\n\n * Retention times are given in seconds, with `null`\n * indicating infinity. If zero is provided, this means the\n * event will not be stored at all, and preferably an error\n * will be provided when those are received.\n * ```json\n{\n...\n \"retention\": [\n { \"kinds\": [0, 1, [5, 7], [40, 49]], \"time\": 3600 },\n { \"kinds\": [[40000, 49999]], \"time\": 100 },\n { \"kinds\": [[30000, 39999]], \"count\": 1000 },\n { \"time\": 3600, \"count\": 10000 }\n ]\n...\n}\n```\n * @param retention is a list of specifications: each will\n * apply to either all kinds, or a subset of kinds. Ranges\n * may be specified for the kind field as a tuple of\n * inclusive start and end values. Events of indicated kind\n * (or all) are then limited to a `count` and/or time\n * period.\n\n * It is possible to effectively blacklist Nostr-based\n * protocols that rely on a specific `kind` number, by\n * giving a retention time of zero for those `kind` values.\n * While that is unfortunate, it does allow clients to\n * discover servers that will support their protocol quickly\n * via a single HTTP fetch.\n\n * There is no need to specify retention times for\n * _ephemeral events_ as defined in [NIP-16](16.md) since\n * they are not retained.\n */\nexport interface Retention {\n retention: AnyRetentionDetails[]\n}\n\n/**\n * Some relays may be governed by the arbitrary laws of a\n * nation state. This may limit what content can be stored\n * in cleartext on those relays. All clients are encouraged\n * to use encryption to work around this limitation.\n\n * It is not possible to describe the limitations of each\n * country's laws and policies which themselves are\n * typically vague and constantly shifting.\n\n * Therefore, this field allows the relay operator to\n * indicate which countries' laws might end up being\n * enforced on them, and then indirectly on their users'\n * content.\n\n * Users should be able to avoid relays in countries they\n * don't like, and/or select relays in more favourable\n * zones. Exposing this flexibility is up to the client\n * software.\n\n * @param relay_countries a list of two-level ISO country\n * codes (ISO 3166-1 alpha-2) whose laws and policies may\n * affect this relay. `EU` may be used for European Union\n * countries.\n\n * Remember that a relay may be hosted in a country which is\n * not the country of the legal entities who own the relay,\n * so it's very likely a number of countries are involved.\n */\nexport interface ContentLimitations {\n relay_countries: string[]\n}\n\n/**\n * ### Community Preferences\n\n * For public text notes at least, a relay may try to foster\n * a local community. This would encourage users to follow\n * the global feed on that relay, in addition to their usual\n * individual follows. To support this goal, relays MAY\n * specify some of the following values.\n\n * @param language_tags is an ordered list of [IETF\n * language\n * tags](https://en.wikipedia.org/wiki/IETF_language_tag\n * indicating the major languages spoken on the relay.\n * @param tags is a list of limitations on the topics to be\n * discussed. For example `sfw-only` indicates that only\n * \"Safe For Work\" content is encouraged on this relay. This\n * relies on assumptions of what the \"work\" \"community\"\n * feels \"safe\" talking about. In time, a common set of tags\n * may emerge that allow users to find relays that suit\n * their needs, and client software will be able to parse\n * these tags easily. The `bitcoin-only` tag indicates that\n * any _altcoin_, _\"crypto\"_ or _blockchain_ comments will\n * be ridiculed without mercy.\n * @param posting_policy is a link to a human-readable page\n * which specifies the community policies for the relay. In\n * cases where `sfw-only` is True, it's important to link to\n * a page which gets into the specifics of your posting\n * policy.\n\n * The `description` field should be used to describe your\n * community goals and values, in brief. The\n * `posting_policy` is for additional detail and legal\n * terms. Use the `tags` field to signify limitations on\n * content, or topics to be discussed, which could be\n * machine processed by appropriate client software.\n */\nexport interface CommunityPreferences {\n language_tags: string[]\n tags: string[]\n posting_policy: string\n}\n\nexport interface Amount {\n amount: number\n unit: 'msat'\n}\nexport interface PublicationAmount extends Amount {\n kinds: number[]\n}\nexport interface Subscription extends Amount {\n period: number\n}\nexport interface Fees {\n admission: Amount[]\n subscription: Subscription[]\n publication: PublicationAmount[]\n}\n/**\n * Relays that require payments may want to expose their fee\n * schedules.\n */\nexport interface PayToRelay {\n payments_url: string\n fees: Fees\n}\n\n/**\n * A URL pointing to an image to be used as an icon for the\n * relay. Recommended to be squared in shape.\n */\nexport interface Icon {\n icon: string\n}\n\nexport type RelayInformation = BasicRelayInformation &\n Partial<Retention> & {\n limitation?: Partial<Limitations>\n } & Partial<ContentLimitations> &\n Partial<CommunityPreferences> &\n Partial<PayToRelay> &\n Partial<Icon>\n", "import { bytesToHex } from '@noble/hashes/utils.js'\nimport { type UnsignedEvent, type Event } from './pure.ts'\nimport { sha256 } from '@noble/hashes/sha2.js'\n\nimport { utf8Encoder } from './utils.ts'\n\n/** Get POW difficulty from a Nostr hex ID. */\nexport function getPow(hex: string): number {\n let count = 0\n\n for (let i = 0; i < 64; i += 8) {\n const nibble = parseInt(hex.substring(i, i + 8), 16)\n if (nibble === 0) {\n count += 32\n } else {\n count += Math.clz32(nibble)\n break\n }\n }\n\n return count\n}\n\n/** Get POW difficulty directly from a Uint8Array hash. */\nfunction getPowFromBytes(hash: Uint8Array): number {\n let count = 0\n\n for (let i = 0; i < hash.length; i++) {\n const byte = hash[i]\n if (byte === 0) {\n count += 8\n } else {\n count += Math.clz32(byte) - 24\n break\n }\n }\n\n return count\n}\n\n/**\n * Mine an event with the desired POW. This function mutates the event.\n * Note that this operation is synchronous and should be run in a worker context to avoid blocking the main thread.\n */\nexport function minePow(unsigned: UnsignedEvent, difficulty: number): Omit<Event, 'sig'> {\n let count = 0\n\n const event = unsigned as Omit<Event, 'sig'>\n const tag = ['nonce', count.toString(), difficulty.toString()]\n\n event.tags.push(tag)\n\n while (true) {\n const now = Math.floor(new Date().getTime() / 1000)\n\n if (now !== event.created_at) {\n count = 0\n event.created_at = now\n }\n\n tag[1] = (++count).toString()\n\n const hash = sha256(\n utf8Encoder.encode(JSON.stringify([0, event.pubkey, event.created_at, event.kind, event.tags, event.content])),\n )\n\n if (getPowFromBytes(hash) >= difficulty) {\n event.id = bytesToHex(hash)\n break\n }\n }\n\n return event\n}\n", "import { PrivateDirectMessage } from './kinds.ts'\nimport { EventTemplate, NostrEvent, getPublicKey } from './pure.ts'\nimport * as nip59 from './nip59.ts'\n\ntype Recipient = {\n publicKey: string\n relayUrl?: string\n}\n\ntype ReplyTo = {\n eventId: string\n relayUrl?: string\n}\n\nfunction createEvent(\n recipients: Recipient | Recipient[],\n message: string,\n conversationTitle?: string,\n replyTo?: ReplyTo,\n): EventTemplate {\n const baseEvent: EventTemplate = {\n created_at: Math.ceil(Date.now() / 1000),\n kind: PrivateDirectMessage,\n tags: [],\n content: message,\n }\n\n const recipientsArray = Array.isArray(recipients) ? recipients : [recipients]\n\n recipientsArray.forEach(({ publicKey, relayUrl }) => {\n baseEvent.tags.push(relayUrl ? ['p', publicKey, relayUrl] : ['p', publicKey])\n })\n\n if (replyTo) {\n baseEvent.tags.push(['e', replyTo.eventId, replyTo.relayUrl || '', 'reply'])\n }\n\n if (conversationTitle) {\n baseEvent.tags.push(['subject', conversationTitle])\n }\n\n return baseEvent\n}\n\nexport function wrapEvent(\n senderPrivateKey: Uint8Array,\n recipient: Recipient,\n message: string,\n conversationTitle?: string,\n replyTo?: ReplyTo,\n): NostrEvent {\n const event = createEvent(recipient, message, conversationTitle, replyTo)\n return nip59.wrapEvent(event, senderPrivateKey, recipient.publicKey)\n}\n\nexport function wrapManyEvents(\n senderPrivateKey: Uint8Array,\n recipients: Recipient[],\n message: string,\n conversationTitle?: string,\n replyTo?: ReplyTo,\n): NostrEvent[] {\n if (!recipients || recipients.length === 0) {\n throw new Error('At least one recipient is required.')\n }\n\n const senderPublicKey = getPublicKey(senderPrivateKey)\n\n // wrap the event for the sender and then for each recipient\n return [{ publicKey: senderPublicKey }, ...recipients].map(recipient =>\n wrapEvent(senderPrivateKey, recipient, message, conversationTitle, replyTo),\n )\n}\n\nexport const unwrapEvent = nip59.unwrapEvent\n\nexport const unwrapManyEvents = nip59.unwrapManyEvents\n", "import { EventTemplate, UnsignedEvent, NostrEvent } from './core.ts'\nimport { getConversationKey, decrypt, encrypt } from './nip44.ts'\nimport { getEventHash, generateSecretKey, finalizeEvent, getPublicKey } from './pure.ts'\nimport { Seal, GiftWrap } from './kinds.ts'\n\ntype Rumor = UnsignedEvent & { id: string }\n\nconst TWO_DAYS = 2 * 24 * 60 * 60\n\nconst now = () => Math.round(Date.now() / 1000)\nconst randomNow = () => Math.round(now() - Math.random() * TWO_DAYS)\n\nconst nip44ConversationKey = (privateKey: Uint8Array, publicKey: string) => getConversationKey(privateKey, publicKey)\n\nconst nip44Encrypt = (data: EventTemplate, privateKey: Uint8Array, publicKey: string) =>\n encrypt(JSON.stringify(data), nip44ConversationKey(privateKey, publicKey))\n\nconst nip44Decrypt = (data: NostrEvent, privateKey: Uint8Array) =>\n JSON.parse(decrypt(data.content, nip44ConversationKey(privateKey, data.pubkey)))\n\nexport function createRumor(event: Partial<UnsignedEvent>, privateKey: Uint8Array): Rumor {\n const rumor = {\n created_at: now(),\n content: '',\n tags: [],\n ...event,\n pubkey: getPublicKey(privateKey),\n } as any\n\n rumor.id = getEventHash(rumor)\n\n return rumor as Rumor\n}\n\nexport function createSeal(rumor: Rumor, privateKey: Uint8Array, recipientPublicKey: string): NostrEvent {\n return finalizeEvent(\n {\n kind: Seal,\n content: nip44Encrypt(rumor, privateKey, recipientPublicKey),\n created_at: randomNow(),\n tags: [],\n },\n privateKey,\n )\n}\n\nexport function createWrap(seal: NostrEvent, recipientPublicKey: string): NostrEvent {\n const randomKey = generateSecretKey()\n\n return finalizeEvent(\n {\n kind: GiftWrap,\n content: nip44Encrypt(seal, randomKey, recipientPublicKey),\n created_at: randomNow(),\n tags: [['p', recipientPublicKey]],\n },\n randomKey,\n ) as NostrEvent\n}\n\nexport function wrapEvent(\n event: Partial<UnsignedEvent>,\n senderPrivateKey: Uint8Array,\n recipientPublicKey: string,\n): NostrEvent {\n const rumor = createRumor(event, senderPrivateKey)\n\n const seal = createSeal(rumor, senderPrivateKey, recipientPublicKey)\n return createWrap(seal, recipientPublicKey)\n}\n\nexport function wrapManyEvents(\n event: Partial<UnsignedEvent>,\n senderPrivateKey: Uint8Array,\n recipientsPublicKeys: string[],\n): NostrEvent[] {\n if (!recipientsPublicKeys || recipientsPublicKeys.length === 0) {\n throw new Error('At least one recipient is required.')\n }\n\n const senderPublicKey = getPublicKey(senderPrivateKey)\n\n const wrappeds = [wrapEvent(event, senderPrivateKey, senderPublicKey)]\n\n recipientsPublicKeys.forEach(recipientPublicKey => {\n wrappeds.push(wrapEvent(event, senderPrivateKey, recipientPublicKey))\n })\n\n return wrappeds\n}\n\nexport function unwrapEvent(wrap: NostrEvent, recipientPrivateKey: Uint8Array): Rumor {\n const unwrappedSeal = nip44Decrypt(wrap, recipientPrivateKey)\n return nip44Decrypt(unwrappedSeal, recipientPrivateKey)\n}\n\nexport function unwrapManyEvents(wrappedEvents: NostrEvent[], recipientPrivateKey: Uint8Array): Rumor[] {\n let unwrappedEvents: Rumor[] = []\n\n wrappedEvents.forEach(e => {\n unwrappedEvents.push(unwrapEvent(e, recipientPrivateKey))\n })\n\n unwrappedEvents.sort((a, b) => a.created_at - b.created_at)\n\n return unwrappedEvents\n}\n", "import { chacha20 } from '@noble/ciphers/chacha.js'\nimport { equalBytes } from '@noble/ciphers/utils.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { extract as hkdf_extract, expand as hkdf_expand } from '@noble/hashes/hkdf.js'\nimport { hmac } from '@noble/hashes/hmac.js'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { concatBytes, hexToBytes, randomBytes } from '@noble/hashes/utils.js'\nimport { base64 } from '@scure/base'\n\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nconst minPlaintextSize = 0x0001 // 1b msg => padded to 32b\nconst maxPlaintextSize = 0xffff // 65535 (64kb-1) => padded to 64kb\n\nexport function getConversationKey(privkeyA: Uint8Array, pubkeyB: string): Uint8Array {\n const sharedX = secp256k1.getSharedSecret(privkeyA, hexToBytes('02' + pubkeyB)).subarray(1, 33)\n return hkdf_extract(sha256, sharedX, utf8Encoder.encode('nip44-v2'))\n}\n\nfunction getMessageKeys(\n conversationKey: Uint8Array,\n nonce: Uint8Array,\n): { chacha_key: Uint8Array; chacha_nonce: Uint8Array; hmac_key: Uint8Array } {\n const keys = hkdf_expand(sha256, conversationKey, nonce, 76)\n return {\n chacha_key: keys.subarray(0, 32),\n chacha_nonce: keys.subarray(32, 44),\n hmac_key: keys.subarray(44, 76),\n }\n}\n\nfunction calcPaddedLen(len: number): number {\n if (!Number.isSafeInteger(len) || len < 1) throw new Error('expected positive integer')\n if (len <= 32) return 32\n const nextPower = 1 << (Math.floor(Math.log2(len - 1)) + 1)\n const chunk = nextPower <= 256 ? 32 : nextPower / 8\n return chunk * (Math.floor((len - 1) / chunk) + 1)\n}\n\nfunction writeU16BE(num: number): Uint8Array {\n if (!Number.isSafeInteger(num) || num < minPlaintextSize || num > maxPlaintextSize)\n throw new Error('invalid plaintext size: must be between 1 and 65535 bytes')\n const arr = new Uint8Array(2)\n new DataView(arr.buffer).setUint16(0, num, false)\n return arr\n}\n\nfunction pad(plaintext: string): Uint8Array {\n const unpadded = utf8Encoder.encode(plaintext)\n const unpaddedLen = unpadded.length\n const prefix = writeU16BE(unpaddedLen)\n const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen)\n return concatBytes(prefix, unpadded, suffix)\n}\n\nfunction unpad(padded: Uint8Array): string {\n const unpaddedLen = new DataView(padded.buffer).getUint16(0)\n const unpadded = padded.subarray(2, 2 + unpaddedLen)\n if (\n unpaddedLen < minPlaintextSize ||\n unpaddedLen > maxPlaintextSize ||\n unpadded.length !== unpaddedLen ||\n padded.length !== 2 + calcPaddedLen(unpaddedLen)\n )\n throw new Error('invalid padding')\n return utf8Decoder.decode(unpadded)\n}\n\nfunction hmacAad(key: Uint8Array, message: Uint8Array, aad: Uint8Array): Uint8Array {\n if (aad.length !== 32) throw new Error('AAD associated data must be 32 bytes')\n const combined = concatBytes(aad, message)\n return hmac(sha256, key, combined)\n}\n\n// metadata: always 65b (version: 1b, nonce: 32b, max: 32b)\n// plaintext: 1b to 0xffff\n// padded plaintext: 32b to 0xffff\n// ciphertext: 32b+2 to 0xffff+2\n// raw payload: 99 (65+32+2) to 65603 (65+0xffff+2)\n// compressed payload (base64): 132b to 87472b\nfunction decodePayload(payload: string): { nonce: Uint8Array; ciphertext: Uint8Array; mac: Uint8Array } {\n if (typeof payload !== 'string') throw new Error('payload must be a valid string')\n const plen = payload.length\n if (plen < 132 || plen > 87472) throw new Error('invalid payload length: ' + plen)\n if (payload[0] === '#') throw new Error('unknown encryption version')\n let data: Uint8Array\n try {\n data = base64.decode(payload)\n } catch (error) {\n throw new Error('invalid base64: ' + (error as any).message)\n }\n const dlen = data.length\n if (dlen < 99 || dlen > 65603) throw new Error('invalid data length: ' + dlen)\n const vers = data[0]\n if (vers !== 2) throw new Error('unknown encryption version ' + vers)\n return {\n nonce: data.subarray(1, 33),\n ciphertext: data.subarray(33, -32),\n mac: data.subarray(-32),\n }\n}\n\nexport function encrypt(plaintext: string, conversationKey: Uint8Array, nonce: Uint8Array = randomBytes(32)): string {\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce)\n const padded = pad(plaintext)\n const ciphertext = chacha20(chacha_key, chacha_nonce, padded)\n const mac = hmacAad(hmac_key, ciphertext, nonce)\n return base64.encode(concatBytes(new Uint8Array([2]), nonce, ciphertext, mac))\n}\n\nexport function decrypt(payload: string, conversationKey: Uint8Array): string {\n const { nonce, ciphertext, mac } = decodePayload(payload)\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce)\n const calculatedMac = hmacAad(hmac_key, ciphertext, nonce)\n if (!equalBytes(calculatedMac, mac)) throw new Error('invalid MAC')\n const padded = chacha20(chacha_key, chacha_nonce, ciphertext)\n return unpad(padded)\n}\n\nexport const v2 = {\n utils: {\n getConversationKey,\n calcPaddedLen,\n },\n encrypt,\n decrypt,\n}\n", "/**\n * Basic utils for ARX (add-rotate-xor) salsa and chacha ciphers.\n\nRFC8439 requires multi-step cipher stream, where\nauthKey starts with counter: 0, actual msg with counter: 1.\n\nFor this, we need a way to re-use nonce / counter:\n\n const counter = new Uint8Array(4);\n chacha(..., counter, ...); // counter is now 1\n chacha(..., counter, ...); // counter is now 2\n\nThis is complicated:\n\n- 32-bit counters are enough, no need for 64-bit: max ArrayBuffer size in JS is 4GB\n- Original papers don't allow mutating counters\n- Counter overflow is undefined [^1]\n- Idea A: allow providing (nonce | counter) instead of just nonce, re-use it\n- Caveat: Cannot be re-used through all cases:\n- * chacha has (counter | nonce)\n- * xchacha has (nonce16 | counter | nonce16)\n- Idea B: separate nonce / counter and provide separate API for counter re-use\n- Caveat: there are different counter sizes depending on an algorithm.\n- salsa & chacha also differ in structures of key & sigma:\n salsa20: s[0] | k(4) | s[1] | nonce(2) | cnt(2) | s[2] | k(4) | s[3]\n chacha: s(4) | k(8) | cnt(1) | nonce(3)\n chacha20orig: s(4) | k(8) | cnt(2) | nonce(2)\n- Idea C: helper method such as `setSalsaState(key, nonce, sigma, data)`\n- Caveat: we can't re-use counter array\n\nxchacha [^2] uses the subkey and remaining 8 byte nonce with ChaCha20 as normal\n(prefixed by 4 NUL bytes, since [RFC8439] specifies a 12-byte nonce).\n\n[^1]: https://mailarchive.ietf.org/arch/msg/cfrg/gsOnTJzcbgG6OqD8Sc0GO5aR_tU/\n[^2]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha#appendix-A.2\n\n * @module\n */\nimport {\n type PRG,\n type XorStream,\n abool,\n abytes,\n anumber,\n checkOpts,\n clean,\n copyBytes,\n randomBytes,\n u32,\n} from './utils.ts';\n\n// Replaces `TextEncoder`, which is not available in all environments\nconst encodeStr = (str: string) => Uint8Array.from(str.split(''), (c) => c.charCodeAt(0));\nconst sigma16 = encodeStr('expand 16-byte k');\nconst sigma32 = encodeStr('expand 32-byte k');\nconst sigma16_32 = u32(sigma16);\nconst sigma32_32 = u32(sigma32);\n\n/** Rotate left. */\nexport function rotl(a: number, b: number): number {\n return (a << b) | (a >>> (32 - b));\n}\n\n/** Ciphers must use u32 for efficiency. */\nexport type CipherCoreFn = (\n sigma: Uint32Array,\n key: Uint32Array,\n nonce: Uint32Array,\n output: Uint32Array,\n counter: number,\n rounds?: number\n) => void;\n\n/** Method which extends key + short nonce into larger nonce / diff key. */\nexport type ExtendNonceFn = (\n sigma: Uint32Array,\n key: Uint32Array,\n input: Uint32Array,\n output: Uint32Array\n) => void;\n\n/** ARX cipher options.\n * * `allowShortKeys` for 16-byte keys\n * * `counterLength` in bytes\n * * `counterRight`: right: `nonce|counter`; left: `counter|nonce`\n * */\nexport type CipherOpts = {\n allowShortKeys?: boolean; // Original salsa / chacha allow 16-byte keys\n extendNonceFn?: ExtendNonceFn;\n counterLength?: number;\n counterRight?: boolean;\n rounds?: number;\n};\n\n// Is byte array aligned to 4 byte offset (u32)?\nfunction isAligned32(b: Uint8Array) {\n return b.byteOffset % 4 === 0;\n}\n\n// Salsa and Chacha block length is always 512-bit\nconst BLOCK_LEN = 64;\nconst BLOCK_LEN32 = 16;\n\n// new Uint32Array([2**32]) // => Uint32Array(1) [ 0 ]\n// new Uint32Array([2**32-1]) // => Uint32Array(1) [ 4294967295 ]\nconst MAX_COUNTER = 2 ** 32 - 1;\n\nconst U32_EMPTY = Uint32Array.of();\nfunction runCipher(\n core: CipherCoreFn,\n sigma: Uint32Array,\n key: Uint32Array,\n nonce: Uint32Array,\n data: Uint8Array,\n output: Uint8Array,\n counter: number,\n rounds: number\n): void {\n const len = data.length;\n const block = new Uint8Array(BLOCK_LEN);\n const b32 = u32(block);\n // Make sure that buffers aligned to 4 bytes\n const isAligned = isAligned32(data) && isAligned32(output);\n const d32 = isAligned ? u32(data) : U32_EMPTY;\n const o32 = isAligned ? u32(output) : U32_EMPTY;\n for (let pos = 0; pos < len; counter++) {\n core(sigma, key, nonce, b32, counter, rounds);\n if (counter >= MAX_COUNTER) throw new Error('arx: counter overflow');\n const take = Math.min(BLOCK_LEN, len - pos);\n // aligned to 4 bytes\n if (isAligned && take === BLOCK_LEN) {\n const pos32 = pos / 4;\n if (pos % 4 !== 0) throw new Error('arx: invalid block position');\n for (let j = 0, posj: number; j < BLOCK_LEN32; j++) {\n posj = pos32 + j;\n o32[posj] = d32[posj] ^ b32[j];\n }\n pos += BLOCK_LEN;\n continue;\n }\n for (let j = 0, posj; j < take; j++) {\n posj = pos + j;\n output[posj] = data[posj] ^ block[j];\n }\n pos += take;\n }\n}\n\n/** Creates ARX-like (ChaCha, Salsa) cipher stream from core function. */\nexport function createCipher(core: CipherCoreFn, opts: CipherOpts): XorStream {\n const { allowShortKeys, extendNonceFn, counterLength, counterRight, rounds } = checkOpts(\n { allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20 },\n opts\n );\n if (typeof core !== 'function') throw new Error('core must be a function');\n anumber(counterLength);\n anumber(rounds);\n abool(counterRight);\n abool(allowShortKeys);\n return (\n key: Uint8Array,\n nonce: Uint8Array,\n data: Uint8Array,\n output?: Uint8Array,\n counter = 0\n ): Uint8Array => {\n abytes(key, undefined, 'key');\n abytes(nonce, undefined, 'nonce');\n abytes(data, undefined, 'data');\n const len = data.length;\n if (output === undefined) output = new Uint8Array(len);\n abytes(output, undefined, 'output');\n anumber(counter);\n if (counter < 0 || counter >= MAX_COUNTER) throw new Error('arx: counter overflow');\n if (output.length < len)\n throw new Error(`arx: output (${output.length}) is shorter than data (${len})`);\n const toClean = [];\n\n // Key & sigma\n // key=16 -> sigma16, k=key|key\n // key=32 -> sigma32, k=key\n let l = key.length;\n let k: Uint8Array;\n let sigma: Uint32Array;\n if (l === 32) {\n toClean.push((k = copyBytes(key)));\n sigma = sigma32_32;\n } else if (l === 16 && allowShortKeys) {\n k = new Uint8Array(32);\n k.set(key);\n k.set(key, 16);\n sigma = sigma16_32;\n toClean.push(k);\n } else {\n abytes(key, 32, 'arx key');\n throw new Error('invalid key size');\n // throw new Error(`\"arx key\" expected Uint8Array of length 32, got length=${l}`);\n }\n\n // Nonce\n // salsa20: 8 (8-byte counter)\n // chacha20orig: 8 (8-byte counter)\n // chacha20: 12 (4-byte counter)\n // xsalsa20: 24 (16 -> hsalsa, 8 -> old nonce)\n // xchacha20: 24 (16 -> hchacha, 8 -> old nonce)\n // Align nonce to 4 bytes\n if (!isAligned32(nonce)) toClean.push((nonce = copyBytes(nonce)));\n\n const k32 = u32(k);\n // hsalsa & hchacha: handle extended nonce\n if (extendNonceFn) {\n if (nonce.length !== 24) throw new Error(`arx: extended nonce must be 24 bytes`);\n extendNonceFn(sigma, k32, u32(nonce.subarray(0, 16)), k32);\n nonce = nonce.subarray(16);\n }\n\n // Handle nonce counter\n const nonceNcLen = 16 - counterLength;\n if (nonceNcLen !== nonce.length)\n throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`);\n\n // Pad counter when nonce is 64 bit\n if (nonceNcLen !== 12) {\n const nc = new Uint8Array(12);\n nc.set(nonce, counterRight ? 0 : 12 - nonce.length);\n nonce = nc;\n toClean.push(nonce);\n }\n const n32 = u32(nonce);\n runCipher(core, sigma, k32, n32, data, output, counter, rounds);\n clean(...toClean);\n return output;\n };\n}\n\n/** Internal class which wraps chacha20 or chacha8 to create CSPRNG. */\nexport class _XorStreamPRG implements PRG {\n readonly blockLen: number;\n readonly keyLen: number;\n readonly nonceLen: number;\n private state: Uint8Array;\n private buf: Uint8Array;\n private key: Uint8Array;\n private nonce: Uint8Array;\n private pos: number;\n private ctr: number;\n private cipher: XorStream;\n constructor(\n cipher: XorStream,\n blockLen: number,\n keyLen: number,\n nonceLen: number,\n seed: Uint8Array\n ) {\n this.cipher = cipher;\n this.blockLen = blockLen;\n this.keyLen = keyLen;\n this.nonceLen = nonceLen;\n this.state = new Uint8Array(this.keyLen + this.nonceLen);\n this.reseed(seed);\n this.ctr = 0;\n this.pos = this.blockLen;\n this.buf = new Uint8Array(this.blockLen);\n this.key = this.state.subarray(0, this.keyLen);\n this.nonce = this.state.subarray(this.keyLen);\n }\n private reseed(seed: Uint8Array) {\n abytes(seed);\n if (!seed || seed.length === 0) throw new Error('entropy required');\n for (let i = 0; i < seed.length; i++) this.state[i % this.state.length] ^= seed[i];\n this.ctr = 0;\n this.pos = this.blockLen;\n }\n addEntropy(seed: Uint8Array): void {\n this.state.set(this.randomBytes(this.state.length));\n this.reseed(seed);\n }\n randomBytes(len: number): Uint8Array {\n anumber(len);\n if (len === 0) return new Uint8Array(0);\n const out = new Uint8Array(len);\n let outPos = 0;\n // Leftovers\n if (this.pos < this.blockLen) {\n const take = Math.min(len, this.blockLen - this.pos);\n out.set(this.buf.subarray(this.pos, this.pos + take), 0);\n this.pos += take;\n outPos += take;\n if (outPos === len) return out; // fast path\n }\n // Full blocks directly to out\n const blocks = Math.floor((len - outPos) / this.blockLen);\n if (blocks > 0) {\n const blockBytes = blocks * this.blockLen;\n const b = out.subarray(outPos, outPos + blockBytes);\n this.cipher(this.key, this.nonce, b, b, this.ctr);\n this.ctr += blocks;\n outPos += blockBytes;\n }\n // Save leftovers\n const left = len - outPos;\n if (left > 0) {\n this.buf.fill(0);\n // NOTE: cipher will handle overflow\n this.cipher(this.key, this.nonce, this.buf, this.buf, this.ctr++);\n out.set(this.buf.subarray(0, left), outPos);\n this.pos = left;\n }\n return out;\n }\n clone(): _XorStreamPRG {\n return new _XorStreamPRG(\n this.cipher,\n this.blockLen,\n this.keyLen,\n this.nonceLen,\n this.randomBytes(this.state.length)\n );\n }\n clean(): void {\n this.pos = 0;\n this.ctr = 0;\n this.buf.fill(0);\n this.state.fill(0);\n }\n}\n\nexport type XorPRG = (seed?: Uint8Array) => _XorStreamPRG;\n\nexport const createPRG = (\n cipher: XorStream,\n blockLen: number,\n keyLen: number,\n nonceLen: number\n): XorPRG => {\n return (seed: Uint8Array = randomBytes(32)): _XorStreamPRG =>\n new _XorStreamPRG(cipher, blockLen, keyLen, nonceLen, seed);\n};\n", "/**\n * Poly1305 ([PDF](https://cr.yp.to/mac/poly1305-20050329.pdf),\n * [wiki](https://en.wikipedia.org/wiki/Poly1305))\n * is a fast and parallel secret-key message-authentication code suitable for\n * a wide variety of applications. It was standardized in\n * [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and is now used in TLS 1.3.\n *\n * Polynomial MACs are not perfect for every situation:\n * they lack Random Key Robustness: the MAC can be forged, and can't be used in PAKE schemes.\n * See [invisible salamanders attack](https://keymaterial.net/2020/09/07/invisible-salamanders-in-aes-gcm-siv/).\n * To combat invisible salamanders, `hash(key)` can be included in ciphertext,\n * however, this would violate ciphertext indistinguishability:\n * an attacker would know which key was used - so `HKDF(key, i)`\n * could be used instead.\n *\n * Check out [original website](https://cr.yp.to/mac.html).\n * Based on Public Domain [poly1305-donna](https://github.com/floodyberry/poly1305-donna).\n * @module\n */\n// prettier-ignore\nimport {\n abytes, aexists, aoutput, bytesToHex,\n clean, concatBytes, copyBytes, hexToNumber, numberToBytesBE,\n type IHash2\n} from './utils.ts';\n\nfunction u8to16(a: Uint8Array, i: number) {\n return (a[i++] & 0xff) | ((a[i++] & 0xff) << 8);\n}\n\nfunction bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\n/** Small version of `poly1305` without loop unrolling. Unused, provided for auditability. */\nfunction poly1305_small(msg: Uint8Array, key: Uint8Array): Uint8Array {\n abytes(msg);\n abytes(key, 32, 'key');\n const POW_2_130_5 = BigInt(2) ** BigInt(130) - BigInt(5); // 2^130-5\n const POW_2_128_1 = BigInt(2) ** BigInt(128) - BigInt(1); // 2^128-1\n const CLAMP_R = BigInt('0x0ffffffc0ffffffc0ffffffc0fffffff');\n const r = bytesToNumberLE(key.subarray(0, 16)) & CLAMP_R;\n const s = bytesToNumberLE(key.subarray(16));\n // Process by 16 byte chunks\n let acc = BigInt(0);\n for (let i = 0; i < msg.length; i += 16) {\n const m = msg.subarray(i, i + 16);\n const n = bytesToNumberLE(m) | (BigInt(1) << BigInt(8 * m.length));\n acc = ((acc + n) * r) % POW_2_130_5;\n }\n const res = (acc + s) & POW_2_128_1;\n return numberToBytesBE(res, 16).reverse(); // LE\n}\n\n// Can be used to replace `computeTag` in chacha.ts. Unused, provided for auditability.\n// @ts-expect-error\nfunction poly1305_computeTag_small(\n authKey: Uint8Array,\n lengths: Uint8Array,\n ciphertext: Uint8Array,\n AAD?: Uint8Array\n): Uint8Array {\n const res = [];\n const updatePadded2 = (msg: Uint8Array) => {\n res.push(msg);\n const leftover = msg.length % 16;\n if (leftover) res.push(new Uint8Array(16).slice(leftover));\n };\n if (AAD) updatePadded2(AAD);\n updatePadded2(ciphertext);\n res.push(lengths);\n return poly1305_small(concatBytes(...res), authKey);\n}\n\n/** Poly1305 class. Prefer poly1305() function instead. */\nexport class Poly1305 implements IHash2 {\n readonly blockLen = 16;\n readonly outputLen = 16;\n private buffer = new Uint8Array(16);\n private r = new Uint16Array(10); // Allocating 1 array with .subarray() here is slower than 3\n private h = new Uint16Array(10);\n private pad = new Uint16Array(8);\n private pos = 0;\n protected finished = false;\n\n // Can be speed-up using BigUint64Array, at the cost of complexity\n constructor(key: Uint8Array) {\n key = copyBytes(abytes(key, 32, 'key'));\n const t0 = u8to16(key, 0);\n const t1 = u8to16(key, 2);\n const t2 = u8to16(key, 4);\n const t3 = u8to16(key, 6);\n const t4 = u8to16(key, 8);\n const t5 = u8to16(key, 10);\n const t6 = u8to16(key, 12);\n const t7 = u8to16(key, 14);\n\n // https://github.com/floodyberry/poly1305-donna/blob/e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781/poly1305-donna-16.h#L47\n this.r[0] = t0 & 0x1fff;\n this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = (t4 >>> 1) & 0x1ffe;\n this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = (t7 >>> 5) & 0x007f;\n for (let i = 0; i < 8; i++) this.pad[i] = u8to16(key, 16 + 2 * i);\n }\n\n private process(data: Uint8Array, offset: number, isLast = false) {\n const hibit = isLast ? 0 : 1 << 11;\n const { h, r } = this;\n const r0 = r[0];\n const r1 = r[1];\n const r2 = r[2];\n const r3 = r[3];\n const r4 = r[4];\n const r5 = r[5];\n const r6 = r[6];\n const r7 = r[7];\n const r8 = r[8];\n const r9 = r[9];\n\n const t0 = u8to16(data, offset + 0);\n const t1 = u8to16(data, offset + 2);\n const t2 = u8to16(data, offset + 4);\n const t3 = u8to16(data, offset + 6);\n const t4 = u8to16(data, offset + 8);\n const t5 = u8to16(data, offset + 10);\n const t6 = u8to16(data, offset + 12);\n const t7 = u8to16(data, offset + 14);\n\n let h0 = h[0] + (t0 & 0x1fff);\n let h1 = h[1] + (((t0 >>> 13) | (t1 << 3)) & 0x1fff);\n let h2 = h[2] + (((t1 >>> 10) | (t2 << 6)) & 0x1fff);\n let h3 = h[3] + (((t2 >>> 7) | (t3 << 9)) & 0x1fff);\n let h4 = h[4] + (((t3 >>> 4) | (t4 << 12)) & 0x1fff);\n let h5 = h[5] + ((t4 >>> 1) & 0x1fff);\n let h6 = h[6] + (((t4 >>> 14) | (t5 << 2)) & 0x1fff);\n let h7 = h[7] + (((t5 >>> 11) | (t6 << 5)) & 0x1fff);\n let h8 = h[8] + (((t6 >>> 8) | (t7 << 8)) & 0x1fff);\n let h9 = h[9] + ((t7 >>> 5) | hibit);\n\n let c = 0;\n\n let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);\n c = d0 >>> 13;\n d0 &= 0x1fff;\n d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);\n c += d0 >>> 13;\n d0 &= 0x1fff;\n\n let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);\n c = d1 >>> 13;\n d1 &= 0x1fff;\n d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);\n c += d1 >>> 13;\n d1 &= 0x1fff;\n\n let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);\n c = d2 >>> 13;\n d2 &= 0x1fff;\n d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);\n c += d2 >>> 13;\n d2 &= 0x1fff;\n\n let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);\n c = d3 >>> 13;\n d3 &= 0x1fff;\n d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);\n c += d3 >>> 13;\n d3 &= 0x1fff;\n\n let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;\n c = d4 >>> 13;\n d4 &= 0x1fff;\n d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);\n c += d4 >>> 13;\n d4 &= 0x1fff;\n\n let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;\n c = d5 >>> 13;\n d5 &= 0x1fff;\n d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);\n c += d5 >>> 13;\n d5 &= 0x1fff;\n\n let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;\n c = d6 >>> 13;\n d6 &= 0x1fff;\n d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);\n c += d6 >>> 13;\n d6 &= 0x1fff;\n\n let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;\n c = d7 >>> 13;\n d7 &= 0x1fff;\n d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);\n c += d7 >>> 13;\n d7 &= 0x1fff;\n\n let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;\n c = d8 >>> 13;\n d8 &= 0x1fff;\n d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);\n c += d8 >>> 13;\n d8 &= 0x1fff;\n\n let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;\n c = d9 >>> 13;\n d9 &= 0x1fff;\n d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;\n c += d9 >>> 13;\n d9 &= 0x1fff;\n\n c = ((c << 2) + c) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = c >>> 13;\n d1 += c;\n\n h[0] = d0;\n h[1] = d1;\n h[2] = d2;\n h[3] = d3;\n h[4] = d4;\n h[5] = d5;\n h[6] = d6;\n h[7] = d7;\n h[8] = d8;\n h[9] = d9;\n }\n\n private finalize() {\n const { h, pad } = this;\n const g = new Uint16Array(10);\n let c = h[1] >>> 13;\n h[1] &= 0x1fff;\n for (let i = 2; i < 10; i++) {\n h[i] += c;\n c = h[i] >>> 13;\n h[i] &= 0x1fff;\n }\n h[0] += c * 5;\n c = h[0] >>> 13;\n h[0] &= 0x1fff;\n h[1] += c;\n c = h[1] >>> 13;\n h[1] &= 0x1fff;\n h[2] += c;\n\n g[0] = h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (let i = 1; i < 10; i++) {\n g[i] = h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= 1 << 13;\n\n let mask = (c ^ 1) - 1;\n for (let i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (let i = 0; i < 10; i++) h[i] = (h[i] & mask) | g[i];\n h[0] = (h[0] | (h[1] << 13)) & 0xffff;\n h[1] = ((h[1] >>> 3) | (h[2] << 10)) & 0xffff;\n h[2] = ((h[2] >>> 6) | (h[3] << 7)) & 0xffff;\n h[3] = ((h[3] >>> 9) | (h[4] << 4)) & 0xffff;\n h[4] = ((h[4] >>> 12) | (h[5] << 1) | (h[6] << 14)) & 0xffff;\n h[5] = ((h[6] >>> 2) | (h[7] << 11)) & 0xffff;\n h[6] = ((h[7] >>> 5) | (h[8] << 8)) & 0xffff;\n h[7] = ((h[8] >>> 8) | (h[9] << 5)) & 0xffff;\n\n let f = h[0] + pad[0];\n h[0] = f & 0xffff;\n for (let i = 1; i < 8; i++) {\n f = (((h[i] + pad[i]) | 0) + (f >>> 16)) | 0;\n h[i] = f & 0xffff;\n }\n clean(g);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n data = copyBytes(data);\n const { buffer, blockLen } = this;\n const len = data.length;\n\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input\n if (take === blockLen) {\n for (; blockLen <= len - pos; pos += blockLen) this.process(data, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(buffer, 0, false);\n this.pos = 0;\n }\n }\n return this;\n }\n destroy(): void {\n clean(this.h, this.r, this.buffer, this.pad);\n }\n digestInto(out: Uint8Array): Uint8Array {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n const { buffer, h } = this;\n let { pos } = this;\n if (pos) {\n buffer[pos++] = 1;\n for (; pos < 16; pos++) buffer[pos] = 0;\n this.process(buffer, 0, true);\n }\n this.finalize();\n let opos = 0;\n for (let i = 0; i < 8; i++) {\n out[opos++] = h[i] >>> 0;\n out[opos++] = h[i] >>> 8;\n }\n return out;\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n}\n\nexport type CHash = ReturnType<typeof wrapConstructorWithKey>;\nexport function wrapConstructorWithKey<H extends IHash2>(\n hashCons: (key: Uint8Array) => H\n): {\n (msg: Uint8Array, key: Uint8Array): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(key: Uint8Array): H;\n} {\n const hashC = (msg: Uint8Array, key: Uint8Array): Uint8Array =>\n hashCons(key).update(msg).digest();\n const tmp = hashCons(new Uint8Array(32)); // tmp array, used just once below\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (key: Uint8Array) => hashCons(key);\n return hashC;\n}\n\n/** Poly1305 MAC from RFC 8439. */\nexport const poly1305: CHash = /** @__PURE__ */ (() =>\n wrapConstructorWithKey((key) => new Poly1305(key)))();\n", "/**\n * ChaCha stream cipher, released\n * in 2008. Developed after Salsa20, ChaCha aims to increase diffusion per round.\n * It was standardized in [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and\n * is now used in TLS 1.3.\n *\n * [XChaCha20](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha)\n * extended-nonce variant is also provided. Similar to XSalsa, it's safe to use with\n * randomly-generated nonces.\n *\n * Check out [PDF](http://cr.yp.to/chacha/chacha-20080128.pdf) and\n * [wiki](https://en.wikipedia.org/wiki/Salsa20) and\n * [website](https://cr.yp.to/chacha.html).\n *\n * @module\n */\nimport { type XorPRG, createCipher, createPRG, rotl } from './_arx.ts';\nimport { poly1305 } from './_poly1305.ts';\nimport {\n type ARXCipher,\n type CipherWithOutput,\n type XorStream,\n abytes,\n clean,\n equalBytes,\n getOutput,\n u64Lengths,\n wrapCipher,\n} from './utils.ts';\n\n/**\n * ChaCha core function. It is implemented twice:\n * 1. Simple loop (chachaCore_small, hchacha_small)\n * 2. Unrolled loop (chachaCore, hchacha) - 4x faster, but larger & harder to read\n * The specific implementation is selected in `createCipher` below.\n */\n\n/** quarter-round */\n// prettier-ignore\nfunction chachaQR(x: Uint32Array, a: number, b: number, c: number, d: number) {\n x[a] = (x[a] + x[b]) | 0; x[d] = rotl(x[d] ^ x[a], 16);\n x[c] = (x[c] + x[d]) | 0; x[b] = rotl(x[b] ^ x[c], 12);\n x[a] = (x[a] + x[b]) | 0; x[d] = rotl(x[d] ^ x[a], 8);\n x[c] = (x[c] + x[d]) | 0; x[b] = rotl(x[b] ^ x[c], 7);\n}\n\n/** single round */\nfunction chachaRound(x: Uint32Array, rounds = 20) {\n for (let r = 0; r < rounds; r += 2) {\n chachaQR(x, 0, 4, 8, 12);\n chachaQR(x, 1, 5, 9, 13);\n chachaQR(x, 2, 6, 10, 14);\n chachaQR(x, 3, 7, 11, 15);\n chachaQR(x, 0, 5, 10, 15);\n chachaQR(x, 1, 6, 11, 12);\n chachaQR(x, 2, 7, 8, 13);\n chachaQR(x, 3, 4, 9, 14);\n }\n}\n\nconst ctmp = /* @__PURE__ */ new Uint32Array(16);\n\n/** Small version of chacha without loop unrolling. Unused, provided for auditability. */\n// prettier-ignore\nfunction chacha(\n s: Uint32Array, k: Uint32Array, i: Uint32Array, out: Uint32Array,\n isHChacha: boolean = true, rounds: number = 20\n): void {\n // Create initial array using common pattern\n const y = Uint32Array.from([\n s[0], s[1], s[2], s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n k[0], k[1], k[2], k[3], // Key Key Key Key\n k[4], k[5], k[6], k[7], // Key Key Key Key\n i[0], i[1], i[2], i[3], // Counter Counter Nonce Nonce\n ]);\n const x = ctmp;\n x.set(y);\n chachaRound(x, rounds);\n\n // hchacha extracts 8 specific bytes, chacha adds orig to result\n if (isHChacha) {\n const xindexes = [0, 1, 2, 3, 12, 13, 14, 15];\n for (let i = 0; i < 8; i++) out[i] = x[xindexes[i]];\n } else {\n for (let i = 0; i < 16; i++) out[i] = (y[i] + x[i]) | 0;\n }\n}\n\n/** Identical to `chachaCore`. Unused. */\n// @ts-ignore\nconst chachaCore_small: typeof chachaCore = (s, k, n, out, cnt, rounds) =>\n chacha(s, k, Uint32Array.from([n[0], n[1], cnt, 0]), out, false, rounds);\n/** Identical to `hchacha`. Unused. */\n// @ts-ignore\nconst hchacha_small: typeof hchacha = chacha;\n\n/** Identical to `chachaCore_small`. Unused. */\n// prettier-ignore\nfunction chachaCore(\n s: Uint32Array, k: Uint32Array, n: Uint32Array, out: Uint32Array, cnt: number, rounds = 20\n): void {\n let y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], // Key Key Key Key\n y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], // Key Key Key Key\n y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; // Counter Counter\tNonce Nonce\n // Save state to temporary variables\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03,\n x04 = y04, x05 = y05, x06 = y06, x07 = y07,\n x08 = y08, x09 = y09, x10 = y10, x11 = y11,\n x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n for (let r = 0; r < rounds; r += 2) {\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);\n\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);\n\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);\n\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8)\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);\n\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);\n\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);\n\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);\n\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16)\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);\n }\n // Write output\n let oi = 0;\n out[oi++] = (y00 + x00) | 0; out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0; out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0; out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0; out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0; out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0; out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0; out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0; out[oi++] = (y15 + x15) | 0;\n}\n/**\n * hchacha hashes key and nonce into key' and nonce' for xchacha20.\n * Identical to `hchacha_small`.\n * Need to find a way to merge it with `chachaCore` without 25% performance hit.\n */\n// prettier-ignore\nexport function hchacha(\n s: Uint32Array, k: Uint32Array, i: Uint32Array, out: Uint32Array\n): void {\n let x00 = s[0], x01 = s[1], x02 = s[2], x03 = s[3],\n x04 = k[0], x05 = k[1], x06 = k[2], x07 = k[3],\n x08 = k[4], x09 = k[5], x10 = k[6], x11 = k[7],\n x12 = i[0], x13 = i[1], x14 = i[2], x15 = i[3];\n for (let r = 0; r < 20; r += 2) {\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);\n\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);\n\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);\n\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8)\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);\n\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);\n\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);\n\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);\n\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16)\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);\n }\n let oi = 0;\n out[oi++] = x00; out[oi++] = x01;\n out[oi++] = x02; out[oi++] = x03;\n out[oi++] = x12; out[oi++] = x13;\n out[oi++] = x14; out[oi++] = x15;\n}\n\n/** Original, non-RFC chacha20 from DJB. 8-byte nonce, 8-byte counter. */\nexport const chacha20orig: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n allowShortKeys: true,\n});\n/**\n * ChaCha stream cipher. Conforms to RFC 8439 (IETF, TLS). 12-byte nonce, 4-byte counter.\n * With smaller nonce, it's not safe to make it random (CSPRNG), due to collision chance.\n */\nexport const chacha20: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n allowShortKeys: false,\n});\n\n/**\n * XChaCha eXtended-nonce ChaCha. With 24-byte nonce, it's safe to make it random (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n extendNonceFn: hchacha,\n allowShortKeys: false,\n});\n\n/** Reduced 8-round chacha, described in original paper. */\nexport const chacha8: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 8,\n});\n\n/** Reduced 12-round chacha, described in original paper. */\nexport const chacha12: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 12,\n});\n\nconst ZEROS16 = /* @__PURE__ */ new Uint8Array(16);\n// Pad to digest size with zeros\nconst updatePadded = (h: ReturnType<typeof poly1305.create>, msg: Uint8Array) => {\n h.update(msg);\n const leftover = msg.length % 16;\n if (leftover) h.update(ZEROS16.subarray(leftover));\n};\n\nconst ZEROS32 = /* @__PURE__ */ new Uint8Array(32);\nfunction computeTag(\n fn: XorStream,\n key: Uint8Array,\n nonce: Uint8Array,\n ciphertext: Uint8Array,\n AAD?: Uint8Array\n): Uint8Array {\n if (AAD !== undefined) abytes(AAD, undefined, 'AAD');\n const authKey = fn(key, nonce, ZEROS32);\n const lengths = u64Lengths(ciphertext.length, AAD ? AAD.length : 0, true);\n\n // Methods below can be replaced with\n // return poly1305_computeTag_small(authKey, lengths, ciphertext, AAD)\n const h = poly1305.create(authKey);\n if (AAD) updatePadded(h, AAD);\n updatePadded(h, ciphertext);\n h.update(lengths);\n const res = h.digest();\n clean(authKey, lengths);\n return res;\n}\n\n/**\n * AEAD algorithm from RFC 8439.\n * Salsa20 and chacha (RFC 8439) use poly1305 differently.\n * We could have composed them, but it's hard because of authKey:\n * In salsa20, authKey changes position in salsa stream.\n * In chacha, authKey can't be computed inside computeTag, it modifies the counter.\n */\nexport const _poly1305_aead =\n (xorStream: XorStream) =>\n (key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): CipherWithOutput => {\n const tagLength = 16;\n return {\n encrypt(plaintext: Uint8Array, output?: Uint8Array) {\n const plength = plaintext.length;\n output = getOutput(plength + tagLength, output, false);\n output.set(plaintext);\n const oPlain = output.subarray(0, -tagLength);\n // Actual encryption\n xorStream(key, nonce, oPlain, oPlain, 1);\n const tag = computeTag(xorStream, key, nonce, oPlain, AAD);\n output.set(tag, plength); // append tag\n clean(tag);\n return output;\n },\n decrypt(ciphertext: Uint8Array, output?: Uint8Array) {\n output = getOutput(ciphertext.length - tagLength, output, false);\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = computeTag(xorStream, key, nonce, data, AAD);\n if (!equalBytes(passedTag, tag)) throw new Error('invalid tag');\n output.set(ciphertext.subarray(0, -tagLength));\n // Actual decryption\n xorStream(key, nonce, output, output, 1); // start stream with i=1\n clean(tag);\n return output;\n },\n };\n };\n\n/**\n * ChaCha20-Poly1305 from RFC 8439.\n *\n * Unsafe to use random nonces under the same key, due to collision chance.\n * Prefer XChaCha instead.\n */\nexport const chacha20poly1305: ARXCipher = /* @__PURE__ */ wrapCipher(\n { blockSize: 64, nonceLength: 12, tagLength: 16 },\n _poly1305_aead(chacha20)\n);\n/**\n * XChaCha20-Poly1305 extended-nonce chacha.\n *\n * Can be safely used with random nonces (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20poly1305: ARXCipher = /* @__PURE__ */ wrapCipher(\n { blockSize: 64, nonceLength: 24, tagLength: 16 },\n _poly1305_aead(xchacha20)\n);\n\n/**\n * Chacha20 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Compatible with libtomcrypt. It does not have a specification, so unclear how secure it is.\n */\nexport const rngChacha20: XorPRG = /* @__PURE__ */ createPRG(chacha20orig, 64, 32, 8);\n/**\n * Chacha20/8 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Faster than `rngChacha20`.\n */\nexport const rngChacha8: XorPRG = /* @__PURE__ */ createPRG(chacha8, 64, 32, 12);\n", "/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nimport { hmac } from './hmac.ts';\nimport { abytes, ahash, anumber, type CHash, clean } from './utils.ts';\n\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nexport function extract(hash: CHash, ikm: Uint8Array, salt?: Uint8Array): Uint8Array {\n ahash(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined) salt = new Uint8Array(hash.outputLen);\n return hmac(hash, salt, ikm);\n}\n\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.of(0);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nexport function expand(\n hash: CHash,\n prk: Uint8Array,\n info?: Uint8Array,\n length: number = 32\n): Uint8Array {\n ahash(hash);\n anumber(length, 'length');\n const olen = hash.outputLen;\n if (length > 255 * olen) throw new Error('Length must be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined) info = EMPTY_BUFFER;\n else abytes(info, undefined, 'info');\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n clean(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nexport const hkdf = (\n hash: CHash,\n ikm: Uint8Array,\n salt: Uint8Array | undefined,\n info: Uint8Array | undefined,\n length: number\n): Uint8Array => expand(hash, extract(hash, ikm, salt), info, length);\n", "import { GenericRepost, Repost, ShortTextNote } from './kinds.ts'\nimport { EventPointer } from './nip19.ts'\nimport { Event, finalizeEvent, verifyEvent } from './pure.ts'\n\nexport type RepostEventTemplate = {\n /**\n * Pass only non-nip18 tags if you have to.\n * Nip18 tags ('e' and 'p' tags pointing to the reposted event) will be added automatically.\n */\n tags?: string[][]\n\n /**\n * Pass an empty string to NOT include the stringified JSON of the reposted event.\n * Any other content will be ignored and replaced with the stringified JSON of the reposted event.\n * @default Stringified JSON of the reposted event\n */\n content?: ''\n\n created_at: number\n}\n\nexport function finishRepostEvent(\n t: RepostEventTemplate,\n reposted: Event,\n relayUrl: string,\n privateKey: Uint8Array,\n): Event {\n let kind: Repost | GenericRepost\n const tags = [...(t.tags ?? []), ['e', reposted.id, relayUrl], ['p', reposted.pubkey]]\n if (reposted.kind === ShortTextNote) {\n kind = Repost\n } else {\n kind = GenericRepost\n tags.push(['k', String(reposted.kind)])\n }\n\n return finalizeEvent(\n {\n kind,\n tags,\n content: t.content === '' || reposted.tags?.find(tag => tag[0] === '-') ? '' : JSON.stringify(reposted),\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport function getRepostedEventPointer(event: Event): undefined | EventPointer {\n if (![Repost, GenericRepost].includes(event.kind)) {\n return undefined\n }\n\n let lastETag: undefined | string[]\n let lastPTag: undefined | string[]\n\n for (let i = event.tags.length - 1; i >= 0 && (lastETag === undefined || lastPTag === undefined); i--) {\n const tag = event.tags[i]\n if (tag.length >= 2) {\n if (tag[0] === 'e' && lastETag === undefined) {\n lastETag = tag\n } else if (tag[0] === 'p' && lastPTag === undefined) {\n lastPTag = tag\n }\n }\n }\n\n if (lastETag === undefined) {\n return undefined\n }\n\n return {\n id: lastETag[1],\n relays: [lastETag[2], lastPTag?.[2]].filter((x): x is string => typeof x === 'string'),\n author: lastPTag?.[1],\n }\n}\n\nexport type GetRepostedEventOptions = {\n skipVerification?: boolean\n}\n\nexport function getRepostedEvent(event: Event, { skipVerification }: GetRepostedEventOptions = {}): undefined | Event {\n const pointer = getRepostedEventPointer(event)\n\n if (pointer === undefined || event.content === '') {\n return undefined\n }\n\n let repostedEvent: undefined | Event\n\n try {\n repostedEvent = JSON.parse(event.content) as Event\n } catch (error) {\n return undefined\n }\n\n if (repostedEvent.id !== pointer.id) {\n return undefined\n }\n\n if (!skipVerification && !verifyEvent(repostedEvent)) {\n return undefined\n }\n\n return repostedEvent\n}\n", "import { AddressPointer, BECH32_REGEX, decode, EventPointer, ProfilePointer } from './nip19.ts'\n\n/** Nostr URI regex, eg `nostr:npub1...` */\nexport const NOSTR_URI_REGEX: RegExp = new RegExp(`nostr:(${BECH32_REGEX.source})`)\n\n/** Test whether the value is a Nostr URI. */\nexport function test(value: unknown): value is `nostr:${string}` {\n return typeof value === 'string' && new RegExp(`^${NOSTR_URI_REGEX.source}$`).test(value)\n}\n\n/** Parsed Nostr URI data. */\nexport interface NostrURI {\n /** Full URI including the `nostr:` protocol. */\n uri: `nostr:${string}`\n /** The bech32-encoded data (eg `npub1...`). */\n value: string\n /** Decoded bech32 string, according to NIP-19. */\n decoded:\n | {\n type: 'nevent'\n data: EventPointer\n }\n | {\n type: 'nprofile'\n data: ProfilePointer\n }\n | {\n type: 'naddr'\n data: AddressPointer\n }\n | {\n type: 'npub'\n data: string\n }\n | {\n type: 'nsec'\n data: Uint8Array\n }\n | {\n type: 'note'\n data: string\n }\n}\n\n/** Parse and decode a Nostr URI. */\nexport function parse(uri: string): NostrURI {\n const match = uri.match(new RegExp(`^${NOSTR_URI_REGEX.source}$`))\n if (!match) throw new Error(`Invalid Nostr URI: ${uri}`)\n return {\n uri: match[0] as `nostr:${string}`,\n value: match[1],\n decoded: decode(match[1]),\n }\n}\n", "import { Event, finalizeEvent } from './pure.ts'\nimport { Reaction } from './kinds.ts'\n\nimport type { EventPointer } from './nip19.ts'\n\nexport type ReactionEventTemplate = {\n /**\n * Pass only non-nip25 tags if you have to. Nip25 tags ('e' and 'p' tags from reacted event) will be added automatically.\n */\n tags?: string[][]\n\n /**\n * @default '+'\n */\n content?: string\n\n created_at: number\n}\n\nexport function finishReactionEvent(t: ReactionEventTemplate, reacted: Event, privateKey: Uint8Array): Event {\n const inheritedTags = reacted.tags.filter(tag => tag.length >= 2 && (tag[0] === 'e' || tag[0] === 'p'))\n\n return finalizeEvent(\n {\n ...t,\n kind: Reaction,\n tags: [...(t.tags ?? []), ...inheritedTags, ['e', reacted.id], ['p', reacted.pubkey]],\n content: t.content ?? '+',\n },\n privateKey,\n )\n}\n\nexport function getReactedEventPointer(event: Event): undefined | EventPointer {\n if (event.kind !== Reaction) {\n return undefined\n }\n\n let lastETag: undefined | string[]\n let lastPTag: undefined | string[]\n\n for (let i = event.tags.length - 1; i >= 0 && (lastETag === undefined || lastPTag === undefined); i--) {\n const tag = event.tags[i]\n if (tag.length >= 2) {\n if (tag[0] === 'e' && lastETag === undefined) {\n lastETag = tag\n } else if (tag[0] === 'p' && lastPTag === undefined) {\n lastPTag = tag\n }\n }\n }\n\n if (lastETag === undefined || lastPTag === undefined) {\n return undefined\n }\n\n return {\n id: lastETag[1],\n relays: [lastETag[2], lastPTag[2]].filter(x => x !== undefined),\n author: lastPTag[1],\n }\n}\n", "import { NostrEvent } from './core.ts'\nimport { AddressPointer, EventPointer, ProfilePointer, decode } from './nip19.ts'\n\nexport type Block =\n | {\n type: 'text'\n text: string\n }\n | {\n type: 'reference'\n pointer: ProfilePointer | AddressPointer | EventPointer\n }\n | {\n type: 'url'\n url: string\n }\n | {\n type: 'relay'\n url: string\n }\n | {\n type: 'image'\n url: string\n }\n | {\n type: 'video'\n url: string\n }\n | {\n type: 'audio'\n url: string\n }\n | {\n type: 'emoji'\n shortcode: string\n url: string\n }\n | {\n type: 'hashtag'\n value: string\n }\n\nconst noCharacter = /\\W/m\nconst noURLCharacter = /[^\\w\\/] |[^\\w\\/]$|$|,| /m\nconst MAX_HASHTAG_LENGTH = 42\n\nexport function* parse(content: string | NostrEvent): Iterable<Block> {\n let emojis: { type: 'emoji'; shortcode: string; url: string }[] = []\n if (typeof content !== 'string') {\n for (let i = 0; i < content.tags.length; i++) {\n const tag = content.tags[i]\n if (tag[0] === 'emoji' && tag.length >= 3) {\n emojis.push({ type: 'emoji', shortcode: tag[1], url: tag[2] })\n }\n }\n content = content.content\n }\n\n const max = content.length\n let prevIndex = 0\n let index = 0\n mainloop: while (index < max) {\n const u = content.indexOf(':', index)\n const h = content.indexOf('#', index)\n if (u === -1 && h === -1) {\n // reached end\n break mainloop\n }\n\n if (u === -1 || (h >= 0 && h < u)) {\n // parse hashtag\n if (h === 0 || content[h - 1].match(noCharacter)) {\n const m = content.slice(h + 1, h + MAX_HASHTAG_LENGTH).match(noCharacter)\n const end = m ? h + 1 + m.index! : max\n yield { type: 'text', text: content.slice(prevIndex, h) }\n yield { type: 'hashtag', value: content.slice(h + 1, end) }\n index = end\n prevIndex = index\n continue mainloop\n }\n\n // ignore this, it is nothing\n index = h + 1\n continue mainloop\n }\n\n // otherwise parse things that have an \":\"\n if (content.slice(u - 5, u) === 'nostr') {\n const m = content.slice(u + 60).match(noCharacter)\n const end = m ? u + 60 + m.index! : max\n try {\n let pointer: ProfilePointer | AddressPointer | EventPointer\n let { data, type } = decode(content.slice(u + 1, end))\n\n switch (type) {\n case 'npub':\n pointer = { pubkey: data } as ProfilePointer\n break\n case 'note':\n pointer = { id: data } as EventPointer\n break\n case 'nsec':\n // ignore this, treat it as not a valid uri\n index = end + 1\n continue\n default:\n pointer = data as any\n }\n\n if (prevIndex !== u - 5) {\n yield { type: 'text', text: content.slice(prevIndex, u - 5) }\n }\n yield { type: 'reference', pointer }\n index = end\n prevIndex = index\n continue mainloop\n } catch (_err) {\n // ignore this, not a valid nostr uri\n index = u + 1\n continue mainloop\n }\n } else if (content.slice(u - 5, u) === 'https' || content.slice(u - 4, u) === 'http') {\n const m = content.slice(u + 4).match(noURLCharacter)\n const end = m ? u + 4 + m.index! : max\n const prefixLen = content[u - 1] === 's' ? 5 : 4\n try {\n let url = new URL(content.slice(u - prefixLen, end))\n if (url.hostname.indexOf('.') === -1) {\n throw new Error('invalid url')\n }\n\n if (prevIndex !== u - prefixLen) {\n yield { type: 'text', text: content.slice(prevIndex, u - prefixLen) }\n }\n\n if (/\\.(png|jpe?g|gif|webp|heic|svg)$/i.test(url.pathname)) {\n yield { type: 'image', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n }\n if (/\\.(mp4|avi|webm|mkv|mov)$/i.test(url.pathname)) {\n yield { type: 'video', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n }\n if (/\\.(mp3|aac|ogg|opus|wav|flac)$/i.test(url.pathname)) {\n yield { type: 'audio', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n }\n\n yield { type: 'url', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n } catch (_err) {\n // ignore this, not a valid url\n index = end + 1\n continue mainloop\n }\n } else if (content.slice(u - 3, u) === 'wss' || content.slice(u - 2, u) === 'ws') {\n const m = content.slice(u + 4).match(noURLCharacter)\n const end = m ? u + 4 + m.index! : max\n const prefixLen = content[u - 1] === 's' ? 3 : 2\n try {\n let url = new URL(content.slice(u - prefixLen, end))\n if (url.hostname.indexOf('.') === -1) {\n throw new Error('invalid ws url')\n }\n\n if (prevIndex !== u - prefixLen) {\n yield { type: 'text', text: content.slice(prevIndex, u - prefixLen) }\n }\n yield { type: 'relay', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n } catch (_err) {\n // ignore this, not a valid url\n index = end + 1\n continue mainloop\n }\n } else {\n // try to parse an emoji shortcode\n for (let e = 0; e < emojis.length; e++) {\n const emoji = emojis[e]\n if (\n content[u + emoji.shortcode.length + 1] === ':' &&\n content.slice(u + 1, u + emoji.shortcode.length + 1) === emoji.shortcode\n ) {\n // found an emoji\n if (prevIndex !== u) {\n yield { type: 'text', text: content.slice(prevIndex, u) }\n }\n yield emoji\n index = u + emoji.shortcode.length + 2\n prevIndex = index\n continue mainloop\n }\n }\n\n // ignore this, it is nothing\n index = u + 1\n continue mainloop\n }\n }\n\n if (prevIndex !== max) {\n yield { type: 'text', text: content.slice(prevIndex) }\n }\n}\n", "import { Event, finalizeEvent } from './pure.ts'\nimport {\n ChannelCreation,\n ChannelHideMessage,\n ChannelMessage,\n ChannelMetadata as KindChannelMetadata,\n ChannelMuteUser,\n} from './kinds.ts'\n\nexport interface ChannelMetadata {\n name: string\n about: string\n picture: string\n}\n\nexport interface ChannelCreateEventTemplate {\n /* JSON string containing ChannelMetadata as defined for Kind 40 and 41 in nip-28. */\n content: string | ChannelMetadata\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelMetadataEventTemplate {\n channel_create_event_id: string\n /* JSON string containing ChannelMetadata as defined for Kind 40 and 41 in nip-28. */\n content: string | ChannelMetadata\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelMessageEventTemplate {\n channel_create_event_id: string\n reply_to_channel_message_event_id?: string\n relay_url: string\n content: string\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelHideMessageEventTemplate {\n channel_message_event_id: string\n content: string | { reason: string }\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelMuteUserEventTemplate {\n content: string | { reason: string }\n created_at: number\n pubkey_to_mute: string\n tags?: string[][]\n}\n\nexport const channelCreateEvent = (t: ChannelCreateEventTemplate, privateKey: Uint8Array): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: ChannelCreation,\n tags: [...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport const channelMetadataEvent = (t: ChannelMetadataEventTemplate, privateKey: Uint8Array): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: KindChannelMetadata,\n tags: [['e', t.channel_create_event_id], ...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport const channelMessageEvent = (t: ChannelMessageEventTemplate, privateKey: Uint8Array): Event => {\n const tags = [['e', t.channel_create_event_id, t.relay_url, 'root']]\n\n if (t.reply_to_channel_message_event_id) {\n tags.push(['e', t.reply_to_channel_message_event_id, t.relay_url, 'reply'])\n }\n\n return finalizeEvent(\n {\n kind: ChannelMessage,\n tags: [...tags, ...(t.tags ?? [])],\n content: t.content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\n/* \"e\" tag should be the kind 42 event to hide */\nexport const channelHideMessageEvent = (\n t: ChannelHideMessageEventTemplate,\n privateKey: Uint8Array,\n): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: ChannelHideMessage,\n tags: [['e', t.channel_message_event_id], ...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport const channelMuteUserEvent = (t: ChannelMuteUserEventTemplate, privateKey: Uint8Array): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: ChannelMuteUser,\n tags: [['p', t.pubkey_to_mute], ...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n", "/** Regex for a single emoji shortcode. */\nexport const EMOJI_SHORTCODE_REGEX = /:(\\w+):/\n\n/** Regex to find emoji shortcodes in content. */\nexport const regex = (): RegExp => new RegExp(`\\\\B${EMOJI_SHORTCODE_REGEX.source}\\\\B`, 'g')\n\n/** Represents a Nostr custom emoji. */\nexport interface CustomEmoji {\n /** The matched emoji name with colons. */\n shortcode: `:${string}:`\n /** The matched emoji name without colons. */\n name: string\n}\n\n/** Match result for a custom emoji in text content. */\nexport interface CustomEmojiMatch extends CustomEmoji {\n /** Index where the emoji begins in the text content. */\n start: number\n /** Index where the emoji ends in the text content. */\n end: number\n}\n\n/** Find all custom emoji shortcodes. */\nexport function* matchAll(content: string): Iterable<CustomEmojiMatch> {\n const matches = content.matchAll(regex())\n\n for (const match of matches) {\n try {\n const [shortcode, name] = match\n\n yield {\n shortcode: shortcode as `:${string}:`,\n name,\n start: match.index!,\n end: match.index! + shortcode.length,\n }\n } catch (_e) {\n // do nothing\n }\n }\n}\n\n/** Replace all emoji shortcodes in the content. */\nexport function replaceAll(content: string, replacer: (match: CustomEmoji) => string): string {\n return content.replaceAll(regex(), (shortcode, name) => {\n return replacer({\n shortcode: shortcode as `:${string}:`,\n name,\n })\n })\n}\n", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function validateGithub(pubkey: string, username: string, proof: string): Promise<boolean> {\n try {\n let res = await (await _fetch(`https://gist.github.com/${username}/${proof}/raw`)).text()\n return res === `Verifying that I control the following Nostr public key: ${pubkey}`\n } catch (_) {\n return false\n }\n}\n", "import { type VerifiedEvent, finalizeEvent } from './pure.ts'\nimport { NWCWalletRequest } from './kinds.ts'\nimport { encrypt } from './nip04.ts'\n\ninterface NWCConnection {\n pubkey: string\n relay: string\n secret: string\n}\n\nexport function parseConnectionString(connectionString: string): NWCConnection {\n const { host, pathname, searchParams } = new URL(connectionString)\n const pubkey = pathname || host\n const relay = searchParams.get('relay')\n const secret = searchParams.get('secret')\n\n if (!pubkey || !relay || !secret) {\n throw new Error('invalid connection string')\n }\n\n return { pubkey, relay, secret }\n}\n\nexport async function makeNwcRequestEvent(\n pubkey: string,\n secretKey: Uint8Array,\n invoice: string,\n): Promise<VerifiedEvent> {\n const content = {\n method: 'pay_invoice',\n params: {\n invoice,\n },\n }\n const encryptedContent = encrypt(secretKey, pubkey, JSON.stringify(content))\n const eventTemplate = {\n kind: NWCWalletRequest,\n created_at: Math.round(Date.now() / 1000),\n content: encryptedContent,\n tags: [['p', pubkey]],\n }\n\n return finalizeEvent(eventTemplate, secretKey)\n}\n", "export function normalizeIdentifier(name: string): string {\n // Trim and lowercase\n name = name.trim().toLowerCase()\n\n // Normalize Unicode to NFKC form\n name = name.normalize('NFKC')\n\n // Convert to array of characters and map each one\n return Array.from(name)\n .map(char => {\n // Check if character is letter or number using Unicode ranges\n if (/\\p{Letter}/u.test(char) || /\\p{Number}/u.test(char)) {\n return char\n }\n\n return '-'\n })\n .join('')\n}\n", "import { bech32 } from '@scure/base'\n\nimport { NostrEvent, validateEvent, verifyEvent, type Event, type EventTemplate } from './pure.ts'\nimport { utf8Decoder } from './utils.ts'\nimport { isReplaceableKind, isAddressableKind } from './kinds.ts'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function getZapEndpoint(metadata: Event): Promise<null | string> {\n try {\n let lnurl: string = ''\n let { lud06, lud16 } = JSON.parse(metadata.content)\n if (lud16) {\n let [name, domain] = lud16.split('@')\n lnurl = new URL(`/.well-known/lnurlp/${name}`, `https://${domain}`).toString()\n } else if (lud06) {\n let { words } = bech32.decode(lud06, 1000)\n let data = bech32.fromWords(words)\n lnurl = utf8Decoder.decode(data)\n } else {\n return null\n }\n\n let res = await _fetch(lnurl)\n let body = await res.json()\n\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback\n }\n } catch (err) {\n /*-*/\n }\n\n return null\n}\n\ntype ProfileZap = {\n pubkey: string\n amount: number\n comment?: string\n relays: string[]\n}\n\ntype EventZap = {\n event: NostrEvent\n amount: number\n comment?: string\n relays: string[]\n}\n\nexport function makeZapRequest(params: ProfileZap | EventZap): EventTemplate {\n let zr: EventTemplate = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1000),\n content: params.comment || '',\n tags: [\n ['p', 'pubkey' in params ? params.pubkey : params.event.pubkey],\n ['amount', params.amount.toString()],\n ['relays', ...params.relays],\n ],\n }\n\n if ('event' in params) {\n zr.tags.push(['e', params.event.id])\n if (isReplaceableKind(params.event.kind)) {\n const a = ['a', `${params.event.kind}:${params.event.pubkey}:`]\n zr.tags.push(a)\n } else if (isAddressableKind(params.event.kind)) {\n let d = params.event.tags.find(([t, v]) => t === 'd' && v)\n if (!d) throw new Error('d tag not found or is empty')\n const a = ['a', `${params.event.kind}:${params.event.pubkey}:${d[1]}`]\n zr.tags.push(a)\n }\n zr.tags.push(['k', params.event.kind.toString()])\n }\n\n return zr\n}\n\nexport function validateZapRequest(zapRequestString: string): string | null {\n let zapRequest: Event\n\n try {\n zapRequest = JSON.parse(zapRequestString)\n } catch (err) {\n return 'Invalid zap request JSON.'\n }\n\n if (!validateEvent(zapRequest)) return 'Zap request is not a valid Nostr event.'\n\n if (!verifyEvent(zapRequest)) return 'Invalid signature on zap request.'\n\n let p = zapRequest.tags.find(([t, v]) => t === 'p' && v)\n if (!p) return \"Zap request doesn't have a 'p' tag.\"\n if (!p[1].match(/^[a-f0-9]{64}$/)) return \"Zap request 'p' tag is not valid hex.\"\n\n let e = zapRequest.tags.find(([t, v]) => t === 'e' && v)\n if (e && !e[1].match(/^[a-f0-9]{64}$/)) return \"Zap request 'e' tag is not valid hex.\"\n\n let relays = zapRequest.tags.find(([t, v]) => t === 'relays' && v)\n if (!relays) return \"Zap request doesn't have a 'relays' tag.\"\n\n return null\n}\n\nexport function makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt,\n}: {\n zapRequest: string\n preimage?: string\n bolt11: string\n paidAt: Date\n}): EventTemplate {\n let zr: Event = JSON.parse(zapRequest)\n let tagsFromZapRequest = zr.tags.filter(([t]) => t === 'e' || t === 'p' || t === 'a')\n\n let zap: EventTemplate = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1000),\n content: '',\n tags: [...tagsFromZapRequest, ['P', zr.pubkey], ['bolt11', bolt11], ['description', zapRequest]],\n }\n\n if (preimage) {\n zap.tags.push(['preimage', preimage])\n }\n\n return zap\n}\n\nexport function getSatoshisAmountFromBolt11(bolt11: string): number {\n if (bolt11.length < 50) {\n return 0\n }\n bolt11 = bolt11.substring(0, 50)\n const idx = bolt11.lastIndexOf('1')\n if (idx === -1) {\n return 0\n }\n const hrp = bolt11.substring(0, idx)\n if (!hrp.startsWith('lnbc')) {\n return 0\n }\n const amount = hrp.substring(4) // equivalent to strings.CutPrefix\n\n if (amount.length < 1) {\n return 0\n }\n\n // if last character is a digit, then the amount can just be interpreted as BTC\n const char = amount[amount.length - 1]\n const digit = char.charCodeAt(0) - '0'.charCodeAt(0)\n const isDigit = digit >= 0 && digit <= 9\n\n let cutPoint = amount.length - 1\n if (isDigit) {\n cutPoint++\n }\n\n if (cutPoint < 1) {\n return 0\n }\n\n const num = parseInt(amount.substring(0, cutPoint))\n\n switch (char) {\n case 'm':\n return num * 100000\n case 'u':\n return num * 100\n case 'n':\n return num / 10\n case 'p':\n return num / 10000\n default:\n return num * 100000000\n }\n}\n", "import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { Filter } from './filter.ts'\nimport { AbstractRelay, Subscription } from './relay.ts'\nimport { sha256 } from '@noble/hashes/sha2.js'\n\n// Negentropy implementation by Doug Hoyte\nconst PROTOCOL_VERSION = 0x61 // Version 1\nconst ID_SIZE = 32\nconst FINGERPRINT_SIZE = 16\n\nconst Mode = {\n Skip: 0,\n Fingerprint: 1,\n IdList: 2,\n}\n\nclass WrappedBuffer {\n _raw: Uint8Array\n length: number\n\n constructor(buffer?: Uint8Array | number) {\n if (typeof buffer === 'number') {\n this._raw = new Uint8Array(buffer)\n this.length = 0\n } else if (buffer instanceof Uint8Array) {\n this._raw = new Uint8Array(buffer)\n this.length = buffer.length\n } else {\n this._raw = new Uint8Array(512)\n this.length = 0\n }\n }\n\n unwrap(): Uint8Array {\n return this._raw.subarray(0, this.length)\n }\n\n get capacity(): number {\n return this._raw.byteLength\n }\n\n extend(buf: Uint8Array | WrappedBuffer): void {\n if (buf instanceof WrappedBuffer) buf = buf.unwrap()\n if (typeof buf.length !== 'number') throw Error('bad length')\n const targetSize = buf.length + this.length\n if (this.capacity < targetSize) {\n const oldRaw = this._raw\n const newCapacity = Math.max(this.capacity * 2, targetSize)\n this._raw = new Uint8Array(newCapacity)\n this._raw.set(oldRaw)\n }\n\n this._raw.set(buf, this.length)\n this.length += buf.length\n }\n\n shift(): number {\n const first = this._raw[0]\n this._raw = this._raw.subarray(1)\n this.length--\n return first\n }\n\n shiftN(n: number = 1): Uint8Array {\n const firstSubarray = this._raw.subarray(0, n)\n this._raw = this._raw.subarray(n)\n this.length -= n\n return firstSubarray\n }\n}\n\nfunction decodeVarInt(buf: WrappedBuffer): number {\n let res = 0\n\n while (1) {\n if (buf.length === 0) throw Error('parse ends prematurely')\n let byte = buf.shift()\n res = (res << 7) | (byte & 127)\n if ((byte & 128) === 0) break\n }\n\n return res\n}\n\nfunction encodeVarInt(n: number): WrappedBuffer {\n if (n === 0) return new WrappedBuffer(new Uint8Array([0]))\n\n let o: number[] = []\n\n while (n !== 0) {\n o.push(n & 127)\n n >>>= 7\n }\n\n o.reverse()\n\n for (let i = 0; i < o.length - 1; i++) o[i] |= 128\n\n return new WrappedBuffer(new Uint8Array(o))\n}\n\nfunction getByte(buf: WrappedBuffer): number {\n return getBytes(buf, 1)[0]\n}\n\nfunction getBytes(buf: WrappedBuffer, n: number): Uint8Array {\n if (buf.length < n) throw Error('parse ends prematurely')\n return buf.shiftN(n)\n}\n\nclass Accumulator {\n buf!: Uint8Array\n\n constructor() {\n this.setToZero()\n }\n\n setToZero(): void {\n this.buf = new Uint8Array(ID_SIZE)\n }\n\n add(otherBuf: Uint8Array): void {\n let currCarry = 0,\n nextCarry = 0\n let p = new DataView(this.buf.buffer)\n let po = new DataView(otherBuf.buffer)\n\n for (let i = 0; i < 8; i++) {\n let offset = i * 4\n let orig = p.getUint32(offset, true)\n let otherV = po.getUint32(offset, true)\n\n let next = orig\n\n next += currCarry\n next += otherV\n if (next > 0xffffffff) nextCarry = 1\n\n p.setUint32(offset, next & 0xffffffff, true)\n currCarry = nextCarry\n nextCarry = 0\n }\n }\n\n negate(): void {\n let p = new DataView(this.buf.buffer)\n\n for (let i = 0; i < 8; i++) {\n let offset = i * 4\n p.setUint32(offset, ~p.getUint32(offset, true))\n }\n\n let one = new Uint8Array(ID_SIZE)\n one[0] = 1\n this.add(one)\n }\n\n getFingerprint(n: number): Uint8Array {\n let input = new WrappedBuffer()\n input.extend(this.buf)\n input.extend(encodeVarInt(n))\n\n let hash = sha256(input.unwrap())\n return hash.subarray(0, FINGERPRINT_SIZE)\n }\n}\n\nexport class NegentropyStorageVector {\n items: { timestamp: number; id: Uint8Array }[]\n sealed: boolean\n\n constructor() {\n this.items = []\n this.sealed = false\n }\n\n insert(timestamp: number, id: string): void {\n if (this.sealed) throw Error('already sealed')\n const idb = hexToBytes(id)\n if (idb.byteLength !== ID_SIZE) throw Error('bad id size for added item')\n this.items.push({ timestamp, id: idb })\n }\n\n seal(): void {\n if (this.sealed) throw Error('already sealed')\n this.sealed = true\n\n this.items.sort(itemCompare)\n\n for (let i = 1; i < this.items.length; i++) {\n if (itemCompare(this.items[i - 1], this.items[i]) === 0) throw Error('duplicate item inserted')\n }\n }\n\n unseal(): void {\n this.sealed = false\n }\n\n size(): number {\n this._checkSealed()\n return this.items.length\n }\n\n getItem(i: number): { timestamp: number; id: Uint8Array } {\n this._checkSealed()\n if (i >= this.items.length) throw Error('out of range')\n return this.items[i]\n }\n\n iterate(begin: number, end: number, cb: (item: { timestamp: number; id: Uint8Array }, i: number) => boolean): void {\n this._checkSealed()\n this._checkBounds(begin, end)\n\n for (let i = begin; i < end; ++i) {\n if (!cb(this.items[i], i)) break\n }\n }\n\n findLowerBound(begin: number, end: number, bound: { timestamp: number; id: Uint8Array }): number {\n this._checkSealed()\n this._checkBounds(begin, end)\n\n return this._binarySearch(this.items, begin, end, a => itemCompare(a, bound) < 0)\n }\n\n fingerprint(begin: number, end: number): Uint8Array {\n let out = new Accumulator()\n out.setToZero()\n\n this.iterate(begin, end, item => {\n out.add(item.id)\n return true\n })\n\n return out.getFingerprint(end - begin)\n }\n\n _checkSealed(): void {\n if (!this.sealed) throw Error('not sealed')\n }\n\n _checkBounds(begin: number, end: number): void {\n if (begin > end || end > this.items.length) throw Error('bad range')\n }\n\n _binarySearch(\n arr: { timestamp: number; id: Uint8Array }[],\n first: number,\n last: number,\n cmp: (a: { timestamp: number; id: Uint8Array }) => boolean,\n ): number {\n let count = last - first\n\n while (count > 0) {\n let it = first\n let step = Math.floor(count / 2)\n it += step\n\n if (cmp(arr[it])) {\n first = ++it\n count -= step + 1\n } else {\n count = step\n }\n }\n\n return first\n }\n}\n\nexport class Negentropy {\n storage: NegentropyStorageVector\n frameSizeLimit: number\n lastTimestampIn: number\n lastTimestampOut: number\n\n constructor(storage: NegentropyStorageVector, frameSizeLimit: number = 60_000) {\n if (frameSizeLimit < 4096) throw Error('frameSizeLimit too small')\n\n this.storage = storage\n this.frameSizeLimit = frameSizeLimit\n\n this.lastTimestampIn = 0\n this.lastTimestampOut = 0\n }\n\n _bound(timestamp: number, id?: Uint8Array): { timestamp: number; id: Uint8Array } {\n return { timestamp, id: id || new Uint8Array(0) }\n }\n\n initiate(): string {\n let output = new WrappedBuffer()\n output.extend(new Uint8Array([PROTOCOL_VERSION]))\n this.splitRange(0, this.storage.size(), this._bound(Number.MAX_VALUE), output)\n return bytesToHex(output.unwrap())\n }\n\n reconcile(queryMsg: string, onhave?: (id: string) => void, onneed?: (id: string) => void): string | null {\n const query = new WrappedBuffer(hexToBytes(queryMsg))\n\n this.lastTimestampIn = this.lastTimestampOut = 0 // reset for each message\n\n let fullOutput = new WrappedBuffer()\n fullOutput.extend(new Uint8Array([PROTOCOL_VERSION]))\n\n let protocolVersion = getByte(query)\n if (protocolVersion < 0x60 || protocolVersion > 0x6f) throw Error('invalid negentropy protocol version byte')\n if (protocolVersion !== PROTOCOL_VERSION) {\n throw Error('unsupported negentropy protocol version requested: ' + (protocolVersion - 0x60))\n }\n\n let storageSize = this.storage.size()\n let prevBound = this._bound(0)\n let prevIndex = 0\n let skip = false\n\n while (query.length !== 0) {\n let o = new WrappedBuffer()\n\n let doSkip = () => {\n if (skip) {\n skip = false\n o.extend(this.encodeBound(prevBound))\n o.extend(encodeVarInt(Mode.Skip))\n }\n }\n\n let currBound = this.decodeBound(query)\n let mode = decodeVarInt(query)\n\n let lower = prevIndex\n let upper = this.storage.findLowerBound(prevIndex, storageSize, currBound)\n\n if (mode === Mode.Skip) {\n skip = true\n } else if (mode === Mode.Fingerprint) {\n let theirFingerprint = getBytes(query, FINGERPRINT_SIZE)\n let ourFingerprint = this.storage.fingerprint(lower, upper)\n\n if (compareUint8Array(theirFingerprint, ourFingerprint) !== 0) {\n doSkip()\n this.splitRange(lower, upper, currBound, o)\n } else {\n skip = true\n }\n } else if (mode === Mode.IdList) {\n let numIds = decodeVarInt(query)\n\n let theirElems: { [key: string]: Uint8Array } = {} // stringified Uint8Array -> original Uint8Array (or hex)\n for (let i = 0; i < numIds; i++) {\n let e = getBytes(query, ID_SIZE)\n theirElems[bytesToHex(e)] = e\n }\n\n skip = true\n this.storage.iterate(lower, upper, item => {\n let k = item.id\n const id = bytesToHex(k)\n\n if (!theirElems[id]) {\n // ID exists on our side, but not their side\n onhave?.(id)\n } else {\n // ID exists on both sides\n delete theirElems[bytesToHex(k)]\n }\n\n return true\n })\n\n if (onneed) {\n for (let v of Object.values(theirElems)) {\n // ID exists on their side, but not our side\n onneed(bytesToHex(v))\n }\n }\n } else {\n throw Error('unexpected mode')\n }\n\n if (this.exceededFrameSizeLimit(fullOutput.length + o.length)) {\n // frameSizeLimit exceeded: stop range processing and return a fingerprint for the remaining range\n let remainingFingerprint = this.storage.fingerprint(upper, storageSize)\n\n fullOutput.extend(this.encodeBound(this._bound(Number.MAX_VALUE)))\n fullOutput.extend(encodeVarInt(Mode.Fingerprint))\n fullOutput.extend(remainingFingerprint)\n break\n } else {\n fullOutput.extend(o)\n }\n\n prevIndex = upper\n prevBound = currBound\n }\n\n return fullOutput.length === 1 ? null : bytesToHex(fullOutput.unwrap())\n }\n\n splitRange(lower: number, upper: number, upperBound: { timestamp: number; id: Uint8Array }, o: WrappedBuffer) {\n let numElems = upper - lower\n let buckets = 16\n\n if (numElems < buckets * 2) {\n o.extend(this.encodeBound(upperBound))\n o.extend(encodeVarInt(Mode.IdList))\n\n o.extend(encodeVarInt(numElems))\n this.storage.iterate(lower, upper, item => {\n o.extend(item.id)\n return true\n })\n } else {\n let itemsPerBucket = Math.floor(numElems / buckets)\n let bucketsWithExtra = numElems % buckets\n let curr = lower\n\n for (let i = 0; i < buckets; i++) {\n let bucketSize = itemsPerBucket + (i < bucketsWithExtra ? 1 : 0)\n let ourFingerprint = this.storage.fingerprint(curr, curr + bucketSize)\n curr += bucketSize\n\n let nextBound: { timestamp: number; id: Uint8Array }\n\n if (curr === upper) {\n nextBound = upperBound\n } else {\n let prevItem: { timestamp: number; id: Uint8Array } | undefined\n let currItem: { timestamp: number; id: Uint8Array } | undefined\n\n this.storage.iterate(curr - 1, curr + 1, (item, index) => {\n if (index === curr - 1) prevItem = item\n else currItem = item\n return true\n })\n\n nextBound = this.getMinimalBound(prevItem!, currItem!)\n }\n\n o.extend(this.encodeBound(nextBound))\n o.extend(encodeVarInt(Mode.Fingerprint))\n o.extend(ourFingerprint)\n }\n }\n }\n\n exceededFrameSizeLimit(n: number): boolean {\n return n > this.frameSizeLimit - 200\n }\n\n // Decoding\n decodeTimestampIn(encoded: WrappedBuffer): number {\n let timestamp = decodeVarInt(encoded)\n timestamp = timestamp === 0 ? Number.MAX_VALUE : timestamp - 1\n if (this.lastTimestampIn === Number.MAX_VALUE || timestamp === Number.MAX_VALUE) {\n this.lastTimestampIn = Number.MAX_VALUE\n return Number.MAX_VALUE\n }\n timestamp += this.lastTimestampIn\n this.lastTimestampIn = timestamp\n return timestamp\n }\n\n decodeBound(encoded: WrappedBuffer): { timestamp: number; id: Uint8Array } {\n let timestamp = this.decodeTimestampIn(encoded)\n let len = decodeVarInt(encoded)\n if (len > ID_SIZE) throw Error('bound key too long')\n let id = getBytes(encoded, len)\n return { timestamp, id }\n }\n\n // Encoding\n encodeTimestampOut(timestamp: number): WrappedBuffer {\n if (timestamp === Number.MAX_VALUE) {\n this.lastTimestampOut = Number.MAX_VALUE\n return encodeVarInt(0)\n }\n\n let temp = timestamp\n timestamp -= this.lastTimestampOut\n this.lastTimestampOut = temp\n return encodeVarInt(timestamp + 1)\n }\n\n encodeBound(key: { timestamp: number; id: Uint8Array }): WrappedBuffer {\n let output = new WrappedBuffer()\n\n output.extend(this.encodeTimestampOut(key.timestamp))\n output.extend(encodeVarInt(key.id.length))\n output.extend(key.id)\n\n return output\n }\n\n getMinimalBound(\n prev: { timestamp: number; id: Uint8Array },\n curr: { timestamp: number; id: Uint8Array },\n ): { timestamp: number; id: Uint8Array } {\n if (curr.timestamp !== prev.timestamp) {\n return this._bound(curr.timestamp)\n } else {\n let sharedPrefixBytes = 0\n let currKey = curr.id\n let prevKey = prev.id\n\n for (let i = 0; i < ID_SIZE; i++) {\n if (currKey[i] !== prevKey[i]) break\n sharedPrefixBytes++\n }\n\n return this._bound(curr.timestamp, curr.id.subarray(0, sharedPrefixBytes + 1))\n }\n }\n}\n\nfunction compareUint8Array(a: Uint8Array, b: Uint8Array): number {\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] < b[i]) return -1\n if (a[i] > b[i]) return 1\n }\n\n if (a.byteLength > b.byteLength) return 1\n if (a.byteLength < b.byteLength) return -1\n\n return 0\n}\n\nfunction itemCompare(a: { timestamp: number; id: Uint8Array }, b: { timestamp: number; id: Uint8Array }): number {\n if (a.timestamp === b.timestamp) {\n return compareUint8Array(a.id, b.id)\n }\n\n return a.timestamp - b.timestamp\n}\n\nexport class NegentropySync {\n relay: AbstractRelay\n storage: NegentropyStorageVector\n private neg: Negentropy\n private filter: Filter\n private subscription: Subscription\n private onhave?: (id: string) => void\n private onneed?: (id: string) => void\n\n constructor(\n relay: AbstractRelay,\n storage: NegentropyStorageVector,\n filter: Filter,\n params: {\n label?: string\n onhave?: (id: string) => void\n onneed?: (id: string) => void\n onclose?: (errReason?: string) => void\n } = {},\n ) {\n this.relay = relay\n this.storage = storage\n this.neg = new Negentropy(storage)\n this.onhave = params.onhave\n this.onneed = params.onneed\n this.filter = filter\n\n // we prepare a subscription with an empty filter, but it will not be used\n this.subscription = this.relay.prepareSubscription([{}], { label: params.label || 'negentropy' })\n this.subscription.oncustom = (data: string[]) => {\n switch (data[0]) {\n case 'NEG-MSG': {\n if (data.length < 3) {\n console.warn(`got invalid NEG-MSG from ${this.relay.url}: ${data}`)\n }\n try {\n const response = this.neg.reconcile(data[2], this.onhave, this.onneed)\n if (response) {\n this.relay.send(`[\"NEG-MSG\", \"${this.subscription.id}\", \"${response}\"]`)\n } else {\n this.close()\n params.onclose?.()\n }\n } catch (error) {\n console.error('negentropy reconcile error:', error)\n params?.onclose?.(`reconcile error: ${error}`)\n }\n break\n }\n case 'NEG-CLOSE': {\n const reason = data[2]\n console.warn('negentropy error:', reason)\n params.onclose?.(reason)\n break\n }\n case 'NEG-ERR': {\n params.onclose?.()\n }\n }\n }\n }\n\n async start(): Promise<void> {\n const initMsg = this.neg.initiate()\n this.relay.send(`[\"NEG-OPEN\",\"${this.subscription.id}\",${JSON.stringify(this.filter)},\"${initMsg}\"]`)\n }\n\n close(): void {\n this.relay.send(`[\"NEG-CLOSE\",\"${this.subscription.id}\"]`)\n this.subscription.close()\n }\n}\n", "import { sha256 } from '@noble/hashes/sha2.js'\nimport { bytesToHex } from '@noble/hashes/utils.js'\nimport { base64 } from '@scure/base'\n\nimport { HTTPAuth } from './kinds.ts'\nimport { Event, EventTemplate, verifyEvent } from './pure.ts'\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nconst _authorizationScheme = 'Nostr '\n\n/**\n * Generate token for NIP-98 flow.\n *\n * @example\n * const sign = window.nostr.signEvent\n * await nip98.getToken('https://example.com/login', 'post', (e) => sign(e), true)\n */\nexport async function getToken(\n loginUrl: string,\n httpMethod: string,\n sign: (e: EventTemplate) => Promise<Event> | Event,\n includeAuthorizationScheme: boolean = false,\n payload?: Record<string, any>,\n): Promise<string> {\n const event: EventTemplate = {\n kind: HTTPAuth,\n tags: [\n ['u', loginUrl],\n ['method', httpMethod],\n ],\n created_at: Math.round(new Date().getTime() / 1000),\n content: '',\n }\n\n if (payload) {\n event.tags.push(['payload', hashPayload(payload)])\n }\n\n const signedEvent = await sign(event)\n const authorizationScheme = includeAuthorizationScheme ? _authorizationScheme : ''\n\n return authorizationScheme + base64.encode(utf8Encoder.encode(JSON.stringify(signedEvent)))\n}\n\n/**\n * Validate token for NIP-98 flow.\n *\n * @example\n * await nip98.validateToken('Nostr base64token', 'https://example.com/login', 'post')\n */\nexport async function validateToken(token: string, url: string, method: string): Promise<boolean> {\n const event = await unpackEventFromToken(token).catch(error => {\n throw error\n })\n\n const valid = await validateEvent(event, url, method).catch(error => {\n throw error\n })\n\n return valid\n}\n\n/**\n * Unpacks an event from a token.\n *\n * @param token - The token to unpack.\n * @returns A promise that resolves to the unpacked event.\n * @throws {Error} If the token is missing, invalid, or cannot be parsed.\n */\nexport async function unpackEventFromToken(token: string): Promise<Event> {\n if (!token) {\n throw new Error('Missing token')\n }\n\n token = token.replace(_authorizationScheme, '')\n\n const eventB64 = utf8Decoder.decode(base64.decode(token))\n if (!eventB64 || eventB64.length === 0 || !eventB64.startsWith('{')) {\n throw new Error('Invalid token')\n }\n\n const event = JSON.parse(eventB64) as Event\n\n return event\n}\n\n/**\n * Validates the timestamp of an event.\n * @param event - The event object to validate.\n * @returns A boolean indicating whether the event timestamp is within the last 60 seconds.\n */\nexport function validateEventTimestamp(event: Event): boolean {\n if (!event.created_at) {\n return false\n }\n\n return Math.round(new Date().getTime() / 1000) - event.created_at < 60\n}\n\n/**\n * Validates the kind of an event.\n * @param event The event to validate.\n * @returns A boolean indicating whether the event kind is valid.\n */\nexport function validateEventKind(event: Event): boolean {\n return event.kind === HTTPAuth\n}\n\n/**\n * Validates if the given URL matches the URL tag of the event.\n * @param event - The event object.\n * @param url - The URL to validate.\n * @returns A boolean indicating whether the URL is valid or not.\n */\nexport function validateEventUrlTag(event: Event, url: string): boolean {\n const urlTag = event.tags.find(t => t[0] === 'u')\n\n if (!urlTag) {\n return false\n }\n\n return urlTag.length > 0 && urlTag[1] === url\n}\n\n/**\n * Validates if the given event has a method tag that matches the specified method.\n * @param event - The event to validate.\n * @param method - The method to match against the method tag.\n * @returns A boolean indicating whether the event has a matching method tag.\n */\nexport function validateEventMethodTag(event: Event, method: string): boolean {\n const methodTag = event.tags.find(t => t[0] === 'method')\n\n if (!methodTag) {\n return false\n }\n\n return methodTag.length > 0 && methodTag[1].toLowerCase() === method.toLowerCase()\n}\n\n/**\n * Calculates the hash of a payload.\n * @param payload - The payload to be hashed.\n * @returns The hash value as a string.\n */\nexport function hashPayload(payload: any): string {\n const hash = sha256(utf8Encoder.encode(JSON.stringify(payload)))\n return bytesToHex(hash)\n}\n\n/**\n * Validates the event payload tag against the provided payload.\n * @param event The event object.\n * @param payload The payload to validate.\n * @returns A boolean indicating whether the payload tag is valid.\n */\nexport function validateEventPayloadTag(event: Event, payload: any): boolean {\n const payloadTag = event.tags.find(t => t[0] === 'payload')\n\n if (!payloadTag) {\n return false\n }\n\n const payloadHash = hashPayload(payload)\n return payloadTag.length > 0 && payloadTag[1] === payloadHash\n}\n\n/**\n * Validates a Nostr event for the NIP-98 flow.\n *\n * @param event - The Nostr event to validate.\n * @param url - The URL associated with the event.\n * @param method - The HTTP method associated with the event.\n * @param body - The request body associated with the event (optional).\n * @returns A promise that resolves to a boolean indicating whether the event is valid.\n * @throws An error if the event is invalid.\n */\nexport async function validateEvent(event: Event, url: string, method: string, body?: any): Promise<boolean> {\n if (!verifyEvent(event)) {\n throw new Error('Invalid nostr event, signature invalid')\n }\n\n if (!validateEventKind(event)) {\n throw new Error('Invalid nostr event, kind invalid')\n }\n\n if (!validateEventTimestamp(event)) {\n throw new Error('Invalid nostr event, created_at timestamp invalid')\n }\n\n if (!validateEventUrlTag(event, url)) {\n throw new Error('Invalid nostr event, url tag invalid')\n }\n\n if (!validateEventMethodTag(event, method)) {\n throw new Error('Invalid nostr event, method tag invalid')\n }\n\n if (Boolean(body) && typeof body === 'object' && Object.keys(body).length > 0) {\n if (!validateEventPayloadTag(event, body)) {\n throw new Error('Invalid nostr event, payload tag does not match request body hash')\n }\n }\n\n return true\n}\n"],
5
- "mappings": "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",
6
- "names": ["i", "i", "hex", "i", "pad", "isLE", "i", "i", "num", "hex", "i", "i", "_0n", "_1n", "_0n", "_1n", "gcd", "i", "num", "_0n", "_1n", "i", "_1n", "_0n", "_1n", "num", "isLE", "isLE", "num", "_1n", "_0n", "_1n", "i", "window", "_0n", "_1n", "window", "i", "isLE", "_0n", "getPublicKey", "pad", "i", "num", "_2n", "_0n", "_1n", "hex", "_3n", "_4n", "pointToBytes", "endo", "mul", "num", "getPublicKey", "randomBytes", "hmac", "_2n", "_1n", "r", "s", "hex", "_0n", "_0n", "_2n", "_3n", "i", "Date", "Date", "i", "challenge", "challenge", "i", "reason", "_WebSocket", "_WebSocket", "isBytes", "abytes", "anumber", "decode", "i", "padding", "num", "alphabet", "abytes", "i", "isBytes", "decode", "hasHexBuiltin", "abytes", "hex", "decrypt", "encrypt", "isBytes", "abool", "anumber", "abytes", "aexists", "aoutput", "clean", "i", "createView", "i", "abytes", "isLE", "abool", "num", "createView", "copyBytes", "i", "clean", "sbox", "sbox2", "i", "abytes", "copyBytes", "clean", "t0", "t1", "t2", "t3", "abytes", "copyBytes", "i", "copyBytes", "i", "clean", "abytes", "i", "abytes", "i", "clean", "encrypt", "decrypt", "i", "useFetchImplementation", "_fetch", "useFetchImplementation", "hex", "i", "now", "unwrapEvent", "unwrapManyEvents", "wrapEvent", "wrapManyEvents", "decrypt", "encrypt", "isAligned32", "anumber", "abool", "abytes", "copyBytes", "clean", "i", "copyBytes", "abytes", "i", "pad", "clean", "aexists", "aoutput", "i", "abytes", "clean", "num", "encrypt", "decrypt", "encrypt", "decrypt", "wrapEvent", "wrapManyEvents", "unwrapEvent", "unwrapManyEvents", "i", "parse", "parse", "i", "parse", "parse", "i", "useFetchImplementation", "_fetch", "useFetchImplementation", "encrypt", "useFetchImplementation", "_fetch", "useFetchImplementation", "num", "i", "validateEvent", "validateEvent"]
3
+ "sources": ["../index.ts", "../node_modules/@noble/hashes/src/utils.ts", "../node_modules/@noble/hashes/src/_md.ts", "../node_modules/@noble/hashes/src/sha2.ts", "../node_modules/@noble/curves/src/utils.ts", "../node_modules/@noble/curves/src/abstract/modular.ts", "../node_modules/@noble/curves/src/abstract/curve.ts", "../node_modules/@noble/hashes/src/hmac.ts", "../node_modules/@noble/curves/src/abstract/weierstrass.ts", "../node_modules/@noble/curves/src/secp256k1.ts", "../core.ts", "../utils.ts", "../pure.ts", "../kinds.ts", "../filter.ts", "../fakejson.ts", "../nip42.ts", "../abstract-relay.ts", "../relay.ts", "../helpers.ts", "../abstract-pool.ts", "../pool.ts", "../nip19.ts", "../node_modules/@scure/base/index.ts", "../references.ts", "../nip04.ts", "../node_modules/@noble/ciphers/src/utils.ts", "../node_modules/@noble/ciphers/src/aes.ts", "../nip05.ts", "../nip10.ts", "../nip11.ts", "../nip13.ts", "../nip17.ts", "../nip59.ts", "../nip44.ts", "../node_modules/@noble/ciphers/src/_arx.ts", "../node_modules/@noble/ciphers/src/_poly1305.ts", "../node_modules/@noble/ciphers/src/chacha.ts", "../node_modules/@noble/hashes/src/hkdf.ts", "../nip18.ts", "../nip21.ts", "../nip22.ts", "../nip25.ts", "../nip27.ts", "../nip28.ts", "../nip30.ts", "../nip39.ts", "../nip47.ts", "../nip54.ts", "../nip57.ts", "../nip77.ts", "../nip98.ts"],
4
+ "sourcesContent": ["export * from './pure.ts'\nexport { Relay } from './relay.ts'\nexport * from './filter.ts'\nexport { SimplePool } from './pool.ts'\nexport * from './references.ts'\n\nexport * as nip04 from './nip04.ts'\nexport * as nip05 from './nip05.ts'\nexport * as nip10 from './nip10.ts'\nexport * as nip11 from './nip11.ts'\nexport * as nip13 from './nip13.ts'\nexport * as nip17 from './nip17.ts'\nexport * as nip18 from './nip18.ts'\nexport * as nip19 from './nip19.ts'\nexport * as nip21 from './nip21.ts'\nexport * as nip22 from './nip22.ts'\nexport * as nip25 from './nip25.ts'\nexport * as nip27 from './nip27.ts'\nexport * as nip28 from './nip28.ts'\nexport * as nip30 from './nip30.ts'\nexport * as nip39 from './nip39.ts'\nexport * as nip42 from './nip42.ts'\nexport * as nip44 from './nip44.ts'\nexport * as nip47 from './nip47.ts'\nexport * as nip54 from './nip54.ts'\nexport * as nip57 from './nip57.ts'\nexport * as nip59 from './nip59.ts'\nexport * as nip77 from './nip77.ts'\nexport * as nip98 from './nip98.ts'\n\nexport * as kinds from './kinds.ts'\nexport * as fj from './fakejson.ts'\nexport * as utils from './utils.ts'\n", "/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number, title: string = ''): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >= 0, got ${n}`);\n }\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts something is hash */\nexport function ahash(h: CHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput, errorTitle = ''): Uint8Array {\n if (typeof data === 'string') return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\n/** Merges default options and passed options. */\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Common interface for all hashes. */\nexport interface Hash<T> {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: Uint8Array): this;\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n destroy(): void;\n _cloneInto(to?: T): T;\n clone(): T;\n}\n\n/** PseudoRandom (number) Generator */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash constructor */\nexport type HasherCons<T, Opts = undefined> = Opts extends undefined ? () => T : (opts?: Opts) => T;\n/** Optional hash params. */\nexport type HashInfo = {\n oid?: Uint8Array; // DER encoded OID in bytes\n};\n/** Hash function */\nexport type CHash<T extends Hash<T> = Hash<any>, Opts = undefined> = {\n outputLen: number;\n blockLen: number;\n} & HashInfo &\n (Opts extends undefined\n ? {\n (msg: Uint8Array): Uint8Array;\n create(): T;\n }\n : {\n (msg: Uint8Array, opts?: Opts): Uint8Array;\n create(opts?: Opts): T;\n });\n/** XOF with output */\nexport type CHashXOF<T extends HashXOF<T> = HashXOF<any>, Opts = undefined> = CHash<T, Opts>;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher<T extends Hash<T>, Opts = undefined>(\n hashCons: HasherCons<T, Opts>,\n info: HashInfo = {}\n): CHash<T, Opts> {\n const hashC: any = (msg: Uint8Array, opts?: Opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: Opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix: number): Required<HashInfo> => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n", "/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, type Hash } from './utils.ts';\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> implements Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to as unknown as any;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n", "/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n", "/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n anumber,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type CHash = {\n (message: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array) => Uint8Array;\nexport function abool(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// Used in weierstrass, der\nfunction abignumber(n: number | bigint) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n)) throw new Error('positive bigint expected, got ' + n);\n } else anumber(n);\n return n;\n}\n\nexport function asafenumber(value: number, title: string = ''): void {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\n\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len) throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, message: Uint8Array) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n const u8n = (len: number): Uint8Array => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs: Uint8Array[]) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed: Uint8Array = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters) throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\nexport function validateObject(\n object: Record<string, any>,\n fields: Record<string, string> = {},\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f: typeof fields, isOpt: boolean) =>\n Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n\nexport interface CryptoKeys {\n lengths: { seed?: number; public?: number; secret?: number };\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n}\n\n/** Generic interface for signatures. Has keygen, sign and verify. */\nexport interface Signer extends CryptoKeys {\n // Interfaces are fun. We cannot just add new fields without copying old ones.\n lengths: {\n seed?: number;\n public?: number;\n secret?: number;\n signRand?: number;\n signature?: number;\n };\n sign: (msg: Uint8Array, secretKey: Uint8Array) => Uint8Array;\n verify: (sig: Uint8Array, msg: Uint8Array, publicKey: Uint8Array) => boolean;\n}\n", "/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes,\n anumber,\n bytesToNumberBE,\n bytesToNumberLE,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from '../utils.ts';\n\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) \u2261 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P \u2261 3 (mod 4)\n * 2. P \u2261 5 (mod 8)\n * 3. P \u2261 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P \u2261 3 (mod 4) => \u221An = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P \u2261 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P \u2261 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n BYTES: number;\n BITS: number;\n isLE: boolean;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) \u2261 1 if a is a square (mod p), quadratic residue\n * * (a | p) \u2261 -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) \u2261 0 if a \u2261 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n isLE: boolean;\n BITS: number;\n sqrt: SqrtFn;\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n}>;\nclass _Field implements IField<bigint> {\n readonly ORDER: bigint;\n readonly BITS: number;\n readonly BYTES: number;\n readonly isLE: boolean;\n readonly ZERO = _0n;\n readonly ONE = _1n;\n readonly _lengths?: number[];\n private _sqrt: ReturnType<typeof FpSqrt> | undefined; // cached sqrt\n private readonly _mod?: boolean;\n constructor(ORDER: bigint, opts: FieldOpts = {}) {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number') _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function') this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean') this.isLE = opts.isLE;\n if (opts.allowedLengths) this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean') this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n\n create(num: bigint) {\n return mod(num, this.ORDER);\n }\n isValid(num: bigint) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num: bigint) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num: bigint) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num: bigint) {\n return (num & _1n) === _1n;\n }\n neg(num: bigint) {\n return mod(-num, this.ORDER);\n }\n eql(lhs: bigint, rhs: bigint) {\n return lhs === rhs;\n }\n\n sqr(num: bigint) {\n return mod(num * num, this.ORDER);\n }\n add(lhs: bigint, rhs: bigint) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs: bigint, rhs: bigint) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs: bigint, rhs: bigint) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num: bigint, power: bigint): bigint {\n return FpPow(this, num, power);\n }\n div(lhs: bigint, rhs: bigint) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n\n // Same as above, but doesn't normalize\n sqrN(num: bigint) {\n return num * num;\n }\n addN(lhs: bigint, rhs: bigint) {\n return lhs + rhs;\n }\n subN(lhs: bigint, rhs: bigint) {\n return lhs - rhs;\n }\n mulN(lhs: bigint, rhs: bigint) {\n return lhs * rhs;\n }\n\n inv(num: bigint) {\n return invert(num, this.ORDER);\n }\n sqrt(num: bigint): bigint {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt) this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num: bigint) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes: Uint8Array, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst: bigint[]): bigint[] {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a: bigint, b: bigint, condition: boolean) {\n return condition ? b : a;\n }\n}\n\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER: bigint, opts: FieldOpts = {}): Readonly<FpField> {\n return new _Field(ORDER, opts);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n", "/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, type Signer } from '../utils.ts';\nimport { Field, FpInvertBatch, validateField, type IField } from './modular.ts';\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\n\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\ntype WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / \uD835\uDC4A) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(\uD835\uDC4A\u22121) * (Math.ceil(\uD835\uDC5B / \uD835\uDC4A) + 1), where:\n * - \uD835\uDC4A is the window size\n * - \uD835\uDC5B is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar \u00D7 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 \u00D7 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 \u00D7 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n\ntype KeygenFn = (\n seed?: Uint8Array,\n isCompressed?: boolean\n) => { secretKey: Uint8Array; publicKey: Uint8Array };\nexport function createKeygen(\n randomSecretKey: Function,\n getPublicKey: Signer['getPublicKey']\n): KeygenFn {\n return function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n", "/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC<T extends Hash<T>> implements Hash<_HMAC<T>> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC<T>): _HMAC<T> {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC<T> {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC<any>;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC<any>(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC<any>(hash, key);\n", "/**\n * Short Weierstrass curve methods. The formula is: y\u00B2 = x\u00B3 + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n * `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n * `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n * it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n * 1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n * which is hard to debug.\n * 2. Params can be generic and we can't enforce them to be constant value:\n * if somebody creates curve from non-constant params,\n * it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils.js';\nimport {\n abool,\n abytes,\n aInRange,\n bitLen,\n bitMask,\n bytesToHex,\n bytesToNumberBE,\n concatBytes,\n createHmacDrbg,\n hexToBytes,\n isBytes,\n memoized,\n numberToHexUnpadded,\n validateObject,\n randomBytes as wcRandomBytes,\n type CHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n mulEndoUnsafe,\n negateCt,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport {\n FpInvertBatch,\n getMinHashLength,\n mapHashToField,\n validateField,\n type IField,\n} from './modular.ts';\n\nexport type { AffinePoint };\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism \u03C8**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism \u03C8 transforms a point: `P = (x, y) \u21A6 \u03C8(P) = (\u03B2\u00B7x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k \u2261 k\u2081 + k\u2082\u00B7\u03BB (mod n)`\n * 3. Then these are combined: `k\u00B7P = k\u2081\u00B7P + k\u2082\u00B7\u03C8(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n * one 256-bit multiplication.\n *\n * where\n * * beta: \u03B2 \u2208 F\u209A with \u03B2\u00B3 = 1, \u03B2 \u2260 1\n * * lambda: \u03BB \u2208 F\u2099 with \u03BB\u00B3 = 1, \u03BB \u2260 1\n * * splitScalar decomposes k \u21A6 k\u2081, k\u2082, by using reduced basis vectors.\n * Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-\u03BB, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n beta: bigint;\n basises?: EndoBasis;\n splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n // Since part can be negative, we need to do this on point.\n // TODO: verifyScalar function which consumes lambda\n const [[a1, b1], [a2, b2]] = basis;\n const c1 = divNearest(b2 * k, n);\n const c2 = divNearest(-b1 * k, n);\n // |k1|/|k2| is < sqrt(N), but can be negative.\n // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n let k1 = k - c1 * a1 - c2 * a2;\n let k2 = -c1 * b1 - c2 * b2;\n const k1neg = k1 < _0n;\n const k2neg = k2 < _0n;\n if (k1neg) k1 = -k1;\n if (k2neg) k2 = -k2;\n // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n throw new Error('splitScalar (endomorphism): failed, k=' + k);\n }\n return { k1neg, k1, k2neg, k2 };\n}\n\n/**\n * Option to enable hedged signatures with improved security.\n *\n * * Randomly generated k is bad, because broken CSPRNG would leak private keys.\n * * Deterministic k (RFC6979) is better; but is suspectible to fault attacks.\n *\n * We allow using technique described in RFC6979 3.6: additional k', a.k.a. adding randomness\n * to deterministic sig. If CSPRNG is broken & randomness is weak, it would STILL be as secure\n * as ordinary sig without ExtraEntropy.\n *\n * * `true` means \"fetch data, from CSPRNG, incorporate it into k generation\"\n * * `false` means \"disable extra entropy, use purely deterministic k\"\n * * `Uint8Array` passed means \"incorporate following data into k generation\"\n *\n * https://paulmillr.com/posts/deterministic-signatures/\n */\nexport type ECDSAExtraEntropy = boolean | Uint8Array;\n/**\n * - `compact` is the default format\n * - `recovered` is the same as compact, but with an extra byte indicating recovery byte\n * - `der` is ASN.1 DER encoding\n */\nexport type ECDSASignatureFormat = 'compact' | 'recovered' | 'der';\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n */\nexport type ECDSARecoverOpts = {\n prehash?: boolean;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n */\nexport type ECDSAVerifyOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n};\n/**\n * - `prehash`: (default: true) indicates whether to do sha256(message).\n * When a custom hash is used, it must be set to `false`.\n * - `lowS`: (default: true) prohibits signatures which have (sig.s >= CURVE.n/2n).\n * Compatible with BTC/ETH. Setting `lowS: false` allows to create malleable signatures,\n * which is default openssl behavior.\n * Non-malleable signatures can still be successfully verified in openssl.\n * - `format`: (default: 'compact') 'compact' or 'recovered' with recovery byte\n * - `extraEntropy`: (default: false) creates sigs with increased security, see {@link ECDSAExtraEntropy}\n */\nexport type ECDSASignOpts = {\n prehash?: boolean;\n lowS?: boolean;\n format?: ECDSASignatureFormat;\n extraEntropy?: ECDSAExtraEntropy;\n};\n\nfunction validateSigFormat(format: string): ECDSASignatureFormat {\n if (!['compact', 'recovered', 'der'].includes(format))\n throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n return format as ECDSASignatureFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n opts: T,\n def: D\n): Required<ECDSASignOpts> {\n const optsn: ECDSASignOpts = {};\n for (let optName of Object.keys(def)) {\n // @ts-ignore\n optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n }\n abool(optsn.lowS!, 'lowS');\n abool(optsn.prehash!, 'prehash');\n if (optsn.format !== undefined) validateSigFormat(optsn.format);\n return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n /** projective X coordinate. Different from affine x. */\n readonly X: T;\n /** projective Y coordinate. Different from affine y. */\n readonly Y: T;\n /** projective z coordinate */\n readonly Z: T;\n /** affine x coordinate. Different from projective X. */\n get x(): T;\n /** affine y coordinate. Different from projective Y. */\n get y(): T;\n /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n toBytes(isCompressed?: boolean): Uint8Array;\n toHex(isCompressed?: boolean): string;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n CURVE(): WeierstrassOpts<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b: T;\n Gx: T;\n Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\nexport type WeierstrassExtraOpts<T> = Partial<{\n Fp: IField<T>;\n Fn: IField<bigint>;\n allowInfinityPoint: boolean;\n endo: EndomorphismOpts;\n isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n toBytes: (\n c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n lowS: boolean;\n hmac: (key: Uint8Array, message: Uint8Array) => Uint8Array;\n randomBytes: (bytesLength?: number) => Uint8Array;\n bits2int: (bytes: Uint8Array) => bigint;\n bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array, isCompressed?: boolean) => Uint8Array;\n getSharedSecret: (\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed?: boolean\n ) => Uint8Array;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n };\n lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n sign: (message: Uint8Array, secretKey: Uint8Array, opts?: ECDSASignOpts) => Uint8Array;\n verify: (\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts?: ECDSAVerifyOpts\n ) => boolean;\n recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n constructor(m = '') {\n super(m);\n }\n}\nexport type IDER = {\n // asn.1 DER encoding utils\n Err: typeof DERErr;\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string) => string;\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n };\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string;\n decode(data: Uint8Array): bigint;\n };\n toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n * [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n // asn.1 DER encoding utils\n Err: DERErr,\n // Basic building block is TLV (Tag-Length-Value)\n _tlv: {\n encode: (tag: number, data: string): string => {\n const { Err: E } = DER;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length & 1) throw new E('tlv.encode: unpadded data');\n const dataLen = data.length / 2;\n const len = numberToHexUnpadded(dataLen);\n if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n // length of length with long form flag\n const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n const t = numberToHexUnpadded(tag);\n return t + lenLen + len + data;\n },\n // v - value, l - left bytes (unparsed)\n decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n const { Err: E } = DER;\n let pos = 0;\n if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n const first = data[pos++];\n const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n let length = 0;\n if (!isLong) length = first;\n else {\n // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n const lenLen = first & 0b0111_1111;\n if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n const lengthBytes = data.subarray(pos, pos + lenLen);\n if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n for (const b of lengthBytes) length = (length << 8) | b;\n pos += lenLen;\n if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n }\n const v = data.subarray(pos, pos + length);\n if (v.length !== length) throw new E('tlv.decode: wrong value length');\n return { v, l: data.subarray(pos + length) };\n },\n },\n // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n // since we always use positive integers here. It must always be empty:\n // - add zero byte if exists\n // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n _int: {\n encode(num: bigint): string {\n const { Err: E } = DER;\n if (num < _0n) throw new E('integer: negative integers are not allowed');\n let hex = numberToHexUnpadded(num);\n // Pad with zero byte if negative flag is present\n if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n return hex;\n },\n decode(data: Uint8Array): bigint {\n const { Err: E } = DER;\n if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n throw new E('invalid signature integer: unnecessary leading zero');\n return bytesToNumberBE(data);\n },\n },\n toSig(bytes: Uint8Array): { r: bigint; s: bigint } {\n // parse DER signature\n const { Err: E, _int: int, _tlv: tlv } = DER;\n const data = abytes(bytes, undefined, 'signature');\n const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n return { r: int.decode(rBytes), s: int.decode(sBytes) };\n },\n hexFromSig(sig: { r: bigint; s: bigint }): string {\n const { _tlv: tlv, _int: int } = DER;\n const rs = tlv.encode(0x02, int.encode(sig.r));\n const ss = tlv.encode(0x02, int.encode(sig.s));\n const seq = rs + ss;\n return tlv.encode(0x30, seq);\n },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * See {@link WeierstrassOpts}.\n *\n * @example\n```js\nconst opts = {\n p: 0xfffffffffffffffffffffffffffffffeffffac73n,\n n: 0x100000000000000000001b8fa16dfab9aca16b6b3n,\n h: 1n,\n a: 0n,\n b: 7n,\n Gx: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\n Gy: 0x938cf935318fdced6bc28286531733c3f03c4feen,\n};\nconst secp160k1_Point = weierstrass(opts);\n```\n */\nexport function weierstrass<T>(\n params: WeierstrassOpts<T>,\n extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n const validated = createCurveFields('weierstrass', params, extraOpts);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as WeierstrassOpts<T>;\n const { h: cofactor, n: CURVE_ORDER } = CURVE;\n validateObject(\n extraOpts,\n {},\n {\n allowInfinityPoint: 'boolean',\n clearCofactor: 'function',\n isTorsionFree: 'function',\n fromBytes: 'function',\n toBytes: 'function',\n endo: 'object',\n }\n );\n\n const { endo } = extraOpts;\n if (endo) {\n // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n }\n }\n\n const lengths = getWLengths(Fp, Fn);\n\n function assertCompressionIsSupported() {\n if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n }\n\n // Implements IEEE P1363 point encoding\n function pointToBytes(\n _c: WeierstrassPointCons<T>,\n point: WeierstrassPoint<T>,\n isCompressed: boolean\n ): Uint8Array {\n const { x, y } = point.toAffine();\n const bx = Fp.toBytes(x);\n abool(isCompressed, 'isCompressed');\n if (isCompressed) {\n assertCompressionIsSupported();\n const hasEvenY = !Fp.isOdd!(y);\n return concatBytes(pprefix(hasEvenY), bx);\n } else {\n return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n }\n }\n function pointFromBytes(bytes: Uint8Array) {\n abytes(bytes, undefined, 'Point');\n const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n const length = bytes.length;\n const head = bytes[0];\n const tail = bytes.subarray(1);\n // No actual validation is done here: use .assertValidity()\n if (length === comp && (head === 0x02 || head === 0x03)) {\n const x = Fp.fromBytes(tail);\n if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n const y2 = weierstrassEquation(x); // y\u00B2 = x\u00B3 + ax + b\n let y: T;\n try {\n y = Fp.sqrt(y2); // y = y\u00B2 ^ (p+1)/4\n } catch (sqrtError) {\n const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n throw new Error('bad point: is not on curve, sqrt error' + err);\n }\n assertCompressionIsSupported();\n const evenY = Fp.isOdd!(y);\n const evenH = (head & 1) === 1; // ECDSA-specific\n if (evenH !== evenY) y = Fp.neg(y);\n return { x, y };\n } else if (length === uncomp && head === 0x04) {\n // TODO: more checks\n const L = Fp.BYTES;\n const x = Fp.fromBytes(tail.subarray(0, L));\n const y = Fp.fromBytes(tail.subarray(L, L * 2));\n if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n return { x, y };\n } else {\n throw new Error(\n `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n );\n }\n }\n\n const encodePoint = extraOpts.toBytes || pointToBytes;\n const decodePoint = extraOpts.fromBytes || pointFromBytes;\n function weierstrassEquation(x: T): T {\n const x2 = Fp.sqr(x); // x * x\n const x3 = Fp.mul(x2, x); // x\u00B2 * x\n return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x\u00B3 + a * x + b\n }\n\n // TODO: move top-level\n /** Checks whether equation holds for given x, y: y\u00B2 == x\u00B3 + ax + b */\n function isValidXY(x: T, y: T): boolean {\n const left = Fp.sqr(y); // y\u00B2\n const right = weierstrassEquation(x); // x\u00B3 + ax + b\n return Fp.eql(left, right);\n }\n\n // Validate whether the passed curve params are valid.\n // Test 1: equation y\u00B2 = x\u00B3 + ax + b should work for generator point.\n if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n // Test 2: discriminant \u0394 part should be non-zero: 4a\u00B3 + 27b\u00B2 != 0.\n // Guarantees curve is genus-1, smooth (non-singular).\n const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n function acoord(title: string, n: T, banZero = false) {\n if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n return n;\n }\n\n function aprjpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('Weierstrass Point expected');\n }\n\n function splitEndoScalarN(k: bigint) {\n if (!endo || !endo.basises) throw new Error('no endo');\n return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n }\n\n // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n // Converts Projective point to affine (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n // (X, Y, Z) \u220B (x=X/Z, y=Y/Z)\n const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n const { X, Y, Z } = p;\n // Fast-path for normalized points\n if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n const is0 = p.is0();\n // If invZ was 0, we return zero point. However we still want to execute\n // all operations, so we replace invZ with a random number, 1.\n if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n const x = Fp.mul(X, iz);\n const y = Fp.mul(Y, iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n return { x, y };\n });\n // NOTE: on exception this will crash 'cached' and no value will be set.\n // Otherwise true will be return\n const assertValidMemo = memoized((p: Point) => {\n if (p.is0()) {\n // (0, 1, 0) aka ZERO is invalid in most contexts.\n // In BLS, ZERO can be serialized, so we allow it.\n // (0, 0, 0) is invalid representation of ZERO.\n if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n throw new Error('bad point: ZERO');\n }\n // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n const { x, y } = p.toAffine();\n if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n return true;\n });\n\n function finishEndo(\n endoBeta: EndomorphismOpts['beta'],\n k1p: Point,\n k2p: Point,\n k1neg: boolean,\n k2neg: boolean\n ) {\n k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n k1p = negateCt(k1neg, k1p);\n k2p = negateCt(k2neg, k2p);\n return k1p.add(k2p);\n }\n\n /**\n * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) \u220B (x=X/Z, y=Y/Z).\n * Default Point works in 2d / affine coordinates: (x, y).\n * We're doing calculations in projective, because its operations don't require costly inversion.\n */\n class Point implements WeierstrassPoint<T> {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n // zero / infinity / identity point\n static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: T;\n readonly Y: T;\n readonly Z: T;\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n constructor(X: T, Y: T, Z: T) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y, true);\n this.Z = acoord('z', Z);\n Object.freeze(this);\n }\n\n static CURVE(): WeierstrassOpts<T> {\n return CURVE;\n }\n\n /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n static fromAffine(p: AffinePoint<T>): Point {\n const { x, y } = p || {};\n if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n if (p instanceof Point) throw new Error('projective point not allowed');\n // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n return new Point(x, y, Fp.ONE);\n }\n\n static fromBytes(bytes: Uint8Array): Point {\n const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n P.assertValidity();\n return P;\n }\n\n static fromHex(hex: string): Point {\n return Point.fromBytes(hexToBytes(hex));\n }\n\n get x(): T {\n return this.toAffine().x;\n }\n get y(): T {\n return this.toAffine().y;\n }\n\n /**\n *\n * @param windowSize\n * @param isLazy true will defer table computation until the first multiplication\n * @returns\n */\n precompute(windowSize: number = 8, isLazy = true): Point {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_3n); // random number\n return this;\n }\n\n // TODO: return `this`\n /** A point on curve is valid if it conforms to equation. */\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n hasEvenY(): boolean {\n const { y } = this.toAffine();\n if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n return !Fp.isOdd(y);\n }\n\n /** Compare one point to another. */\n equals(other: Point): boolean {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n return U1 && U2;\n }\n\n /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n negate(): Point {\n return new Point(this.X, Fp.neg(this.Y), this.Z);\n }\n\n // Renes-Costello-Batina exception-free doubling formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 3\n // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n double() {\n const { a, b } = CURVE;\n const b3 = Fp.mul(b, _3n);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n let t0 = Fp.mul(X1, X1); // step 1\n let t1 = Fp.mul(Y1, Y1);\n let t2 = Fp.mul(Z1, Z1);\n let t3 = Fp.mul(X1, Y1);\n t3 = Fp.add(t3, t3); // step 5\n Z3 = Fp.mul(X1, Z1);\n Z3 = Fp.add(Z3, Z3);\n X3 = Fp.mul(a, Z3);\n Y3 = Fp.mul(b3, t2);\n Y3 = Fp.add(X3, Y3); // step 10\n X3 = Fp.sub(t1, Y3);\n Y3 = Fp.add(t1, Y3);\n Y3 = Fp.mul(X3, Y3);\n X3 = Fp.mul(t3, X3);\n Z3 = Fp.mul(b3, Z3); // step 15\n t2 = Fp.mul(a, t2);\n t3 = Fp.sub(t0, t2);\n t3 = Fp.mul(a, t3);\n t3 = Fp.add(t3, Z3);\n Z3 = Fp.add(t0, t0); // step 20\n t0 = Fp.add(Z3, t0);\n t0 = Fp.add(t0, t2);\n t0 = Fp.mul(t0, t3);\n Y3 = Fp.add(Y3, t0);\n t2 = Fp.mul(Y1, Z1); // step 25\n t2 = Fp.add(t2, t2);\n t0 = Fp.mul(t2, t3);\n X3 = Fp.sub(X3, t0);\n Z3 = Fp.mul(t2, t1);\n Z3 = Fp.add(Z3, Z3); // step 30\n Z3 = Fp.add(Z3, Z3);\n return new Point(X3, Y3, Z3);\n }\n\n // Renes-Costello-Batina exception-free addition formula.\n // There is 30% faster Jacobian formula, but it is not complete.\n // https://eprint.iacr.org/2015/1060, algorithm 1\n // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n add(other: Point): Point {\n aprjpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n const a = CURVE.a;\n const b3 = Fp.mul(CURVE.b, _3n);\n let t0 = Fp.mul(X1, X2); // step 1\n let t1 = Fp.mul(Y1, Y2);\n let t2 = Fp.mul(Z1, Z2);\n let t3 = Fp.add(X1, Y1);\n let t4 = Fp.add(X2, Y2); // step 5\n t3 = Fp.mul(t3, t4);\n t4 = Fp.add(t0, t1);\n t3 = Fp.sub(t3, t4);\n t4 = Fp.add(X1, Z1);\n let t5 = Fp.add(X2, Z2); // step 10\n t4 = Fp.mul(t4, t5);\n t5 = Fp.add(t0, t2);\n t4 = Fp.sub(t4, t5);\n t5 = Fp.add(Y1, Z1);\n X3 = Fp.add(Y2, Z2); // step 15\n t5 = Fp.mul(t5, X3);\n X3 = Fp.add(t1, t2);\n t5 = Fp.sub(t5, X3);\n Z3 = Fp.mul(a, t4);\n X3 = Fp.mul(b3, t2); // step 20\n Z3 = Fp.add(X3, Z3);\n X3 = Fp.sub(t1, Z3);\n Z3 = Fp.add(t1, Z3);\n Y3 = Fp.mul(X3, Z3);\n t1 = Fp.add(t0, t0); // step 25\n t1 = Fp.add(t1, t0);\n t2 = Fp.mul(a, t2);\n t4 = Fp.mul(b3, t4);\n t1 = Fp.add(t1, t2);\n t2 = Fp.sub(t0, t2); // step 30\n t2 = Fp.mul(a, t2);\n t4 = Fp.add(t4, t2);\n t0 = Fp.mul(t1, t4);\n Y3 = Fp.add(Y3, t0);\n t0 = Fp.mul(t5, t4); // step 35\n X3 = Fp.mul(t3, X3);\n X3 = Fp.sub(X3, t0);\n t0 = Fp.mul(t3, t1);\n Z3 = Fp.mul(t5, Z3);\n Z3 = Fp.add(Z3, t0); // step 40\n return new Point(X3, Y3, Z3);\n }\n\n subtract(other: Point) {\n return this.add(other.negate());\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n /**\n * Constant time multiplication.\n * Uses wNAF method. Windowed method may be 10% faster,\n * but takes 2x longer to generate and consumes 2x memory.\n * Uses precomputes when available.\n * Uses endomorphism for Koblitz curves.\n * @param scalar by which the point would be multiplied\n * @returns New point\n */\n multiply(scalar: bigint): Point {\n const { endo } = extraOpts;\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n let point: Point, fake: Point; // Fake point is used to const-time mult\n const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n /** See docs for {@link EndomorphismOpts} */\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n const { p: k1p, f: k1f } = mul(k1);\n const { p: k2p, f: k2f } = mul(k2);\n fake = k1f.add(k2f);\n point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n } else {\n const { p, f } = mul(scalar);\n point = p;\n fake = f;\n }\n // Normalize `z` for both points, but return only real one\n return normalizeZ(Point, [point, fake])[0];\n }\n\n /**\n * Non-constant-time multiplication. Uses double-and-add algorithm.\n * It's faster, but should only be used when you don't care about\n * an exposed secret key e.g. sig verification, which works over *public* keys.\n */\n multiplyUnsafe(sc: bigint): Point {\n const { endo } = extraOpts;\n const p = this as Point;\n if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n if (sc === _0n || p.is0()) return Point.ZERO; // 0\n if (sc === _1n) return p; // 1\n if (wnaf.hasCache(this)) return this.multiply(sc); // precomputes\n // We don't have method for double scalar multiplication (aP + bQ):\n // Even with using Strauss-Shamir trick, it's 35% slower than na\u00EFve mul+add.\n if (endo) {\n const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n } else {\n return wnaf.unsafe(p, sc);\n }\n }\n\n /**\n * Converts Projective point to affine (x, y) coordinates.\n * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n */\n toAffine(invertedZ?: T): AffinePoint<T> {\n return toAffineMemo(this, invertedZ);\n }\n\n /**\n * Checks whether Point is free of torsion elements (is in prime subgroup).\n * Always torsion-free for cofactor=1 curves.\n */\n isTorsionFree(): boolean {\n const { isTorsionFree } = extraOpts;\n if (cofactor === _1n) return true;\n if (isTorsionFree) return isTorsionFree(Point, this);\n return wnaf.unsafe(this, CURVE_ORDER).is0();\n }\n\n clearCofactor(): Point {\n const { clearCofactor } = extraOpts;\n if (cofactor === _1n) return this; // Fast-path\n if (clearCofactor) return clearCofactor(Point, this) as Point;\n return this.multiplyUnsafe(cofactor);\n }\n\n isSmallOrder(): boolean {\n // can we use this.clearCofactor()?\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n toBytes(isCompressed = true): Uint8Array {\n abool(isCompressed, 'isCompressed');\n this.assertValidity();\n return encodePoint(Point, this, isCompressed);\n }\n\n toHex(isCompressed = true): string {\n return bytesToHex(this.toBytes(isCompressed));\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n }\n const bits = Fn.BITS;\n const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n addRecoveryBit(recovery: number): ECDSASignature & { readonly recovery: number };\n hasHighS(): boolean;\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint<bigint>;\n toBytes(format?: string): Uint8Array;\n toHex(format?: string): string;\n}\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n fromBytes(bytes: Uint8Array, format?: ECDSASignatureFormat): ECDSASignature;\n fromHex(hex: string, format?: ECDSASignatureFormat): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n Fp: IField<T>,\n Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n // Generic implementation\n const q = Fp.ORDER;\n let l = _0n;\n for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n // 2n ** c1 == 2n << (c1-1)\n const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic\n const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic\n const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic\n const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic\n const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n let tv1 = c6; // 1. tv1 = c6\n let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n // 17. for i in (c1, c1 - 1, ..., 2):\n for (let i = c1; i > _1n; i--) {\n let tv5 = i - _2n; // 18. tv5 = i - 2\n tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5\n let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5\n const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1\n tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1\n tv1 = Fp.mul(tv1, tv1); // 23. tv1 = tv1 * tv1\n tvv5 = Fp.mul(tv4, tv1); // 24. tv5 = tv4 * tv1\n tv3 = Fp.cmov(tv2, tv3, e1); // 25. tv3 = CMOV(tv2, tv3, e1)\n tv4 = Fp.cmov(tvv5, tv4, e1); // 26. tv4 = CMOV(tv5, tv4, e1)\n }\n return { isValid: isQR, value: tv3 };\n };\n if (Fp.ORDER % _4n === _3n) {\n // sqrt_ratio_3mod4(u, v)\n const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4 # Integer arithmetic\n const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n sqrtRatio = (u: T, v: T) => {\n let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n };\n }\n // No curves uses that\n // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n Fp: IField<T>,\n opts: {\n A: T;\n B: T;\n Z: T;\n }\n): (u: T) => { x: T; y: T } {\n validateField(Fp);\n const { A, B, Z } = opts;\n if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n throw new Error('mapToCurveSimpleSWU: invalid opts');\n const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n // Input: u, an element of F.\n // Output: (x, y), a point on E.\n return (u: T): { x: T; y: T } => {\n // prettier-ignore\n let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, Z); // 2. tv1 = Z * tv1\n tv2 = Fp.sqr(tv1); // 3. tv2 = tv1^2\n tv2 = Fp.add(tv2, tv1); // 4. tv2 = tv2 + tv1\n tv3 = Fp.add(tv2, Fp.ONE); // 5. tv3 = tv2 + 1\n tv3 = Fp.mul(tv3, B); // 6. tv3 = B * tv3\n tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7. tv4 = CMOV(Z, -tv2, tv2 != 0)\n tv4 = Fp.mul(tv4, A); // 8. tv4 = A * tv4\n tv2 = Fp.sqr(tv3); // 9. tv2 = tv3^2\n tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n x = Fp.mul(tv1, tv3); // 17. x = tv1 * tv3\n const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n y = Fp.mul(tv1, u); // 19. y = tv1 * u -> Z * u^3 * y1\n y = Fp.mul(y, value); // 20. y = y * y1\n x = Fp.cmov(x, tv3, isValid); // 21. x = CMOV(x, tv3, is_gx1_square)\n y = Fp.cmov(y, value, isValid); // 22. y = CMOV(y, y1, is_gx1_square)\n const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23. e1 = sgn0(u) == sgn0(y)\n y = Fp.cmov(Fp.neg(y), y, e1); // 24. y = CMOV(-y, y, e1)\n const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n x = Fp.mul(x, tv4_inv); // 25. x = x / tv4\n return { x, y };\n };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n return {\n secretKey: Fn.BYTES,\n publicKey: 1 + Fp.BYTES,\n publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n publicKeyHasPrefix: true,\n signature: 2 * Fn.BYTES,\n };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n Point: WeierstrassPointCons<bigint>,\n ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n const { Fn } = Point;\n const randomBytes_ = ecdhOpts.randomBytes || wcRandomBytes;\n const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n function isValidSecretKey(secretKey: Uint8Array) {\n try {\n const num = Fn.fromBytes(secretKey);\n return Fn.isValidNot0(num);\n } catch (error) {\n return false;\n }\n }\n\n function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n const { publicKey: comp, publicKeyUncompressed } = lengths;\n try {\n const l = publicKey.length;\n if (isCompressed === true && l !== comp) return false;\n if (isCompressed === false && l !== publicKeyUncompressed) return false;\n return !!Point.fromBytes(publicKey);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Produces cryptographically secure secret key from random of size\n * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n */\n function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n }\n\n /**\n * Computes public key for a secret key. Checks for validity of the secret key.\n * @param isCompressed whether to return compact (default), or full key\n * @returns Public key, full when isCompressed=false; short when isCompressed=true\n */\n function getPublicKey(secretKey: Uint8Array, isCompressed = true): Uint8Array {\n return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed);\n }\n\n /**\n * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n */\n function isProbPub(item: Uint8Array): boolean | undefined {\n const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n if (!isBytes(item)) return undefined;\n if (('_lengths' in Fn && Fn._lengths) || secretKey === publicKey) return undefined;\n const l = abytes(item, undefined, 'key').length;\n return l === publicKey || l === publicKeyUncompressed;\n }\n\n /**\n * ECDH (Elliptic Curve Diffie Hellman).\n * Computes shared public key from secret key A and public key B.\n * Checks: 1) secret key validity 2) shared key is on-curve.\n * Does NOT hash the result.\n * @param isCompressed whether to return compact (default), or full key\n * @returns shared public key\n */\n function getSharedSecret(\n secretKeyA: Uint8Array,\n publicKeyB: Uint8Array,\n isCompressed = true\n ): Uint8Array {\n if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n const s = Fn.fromBytes(secretKeyA);\n const b = Point.fromBytes(publicKeyB); // checks for being on-curve\n return b.multiply(s).toBytes(isCompressed);\n }\n\n const utils = {\n isValidSecretKey,\n isValidPublicKey,\n randomSecretKey,\n };\n const keygen = createKeygen(randomSecretKey, getPublicKey);\n\n return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n *\n * @param Point created using {@link weierstrass} function\n * @param hash used for 1) message prehash-ing 2) k generation in `sign`, using hmac_drbg(hash)\n * @param ecdsaOpts rarely needed, see {@link ECDSAOpts}\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n Point: WeierstrassPointCons<bigint>,\n hash: CHash,\n ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n ahash(hash);\n validateObject(\n ecdsaOpts,\n {},\n {\n hmac: 'function',\n lowS: 'boolean',\n randomBytes: 'function',\n bits2int: 'function',\n bits2int_modN: 'function',\n }\n );\n ecdsaOpts = Object.assign({}, ecdsaOpts);\n const randomBytes = ecdsaOpts.randomBytes || wcRandomBytes;\n const hmac = ecdsaOpts.hmac || ((key, msg) => nobleHmac(hash, key, msg));\n\n const { Fp, Fn } = Point;\n const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n const defaultSigOpts: Required<ECDSASignOpts> = {\n prehash: true,\n lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : true,\n format: 'compact' as ECDSASignatureFormat,\n extraEntropy: false,\n };\n const hasLargeCofactor = CURVE_ORDER * _2n < Fp.ORDER; // Won't CURVE().h > 2n be more effective?\n\n function isBiggerThanHalfOrder(number: bigint) {\n const HALF = CURVE_ORDER >> _1n;\n return number > HALF;\n }\n function validateRS(title: string, num: bigint): bigint {\n if (!Fn.isValidNot0(num))\n throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n return num;\n }\n function assertSmallCofactor(): void {\n // ECDSA recovery is hard for cofactor > 1 curves.\n // In sign, `r = q.x mod n`, and here we recover q.x from r.\n // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n // However, for cofactor>1, r+n may not get q.x:\n // r+n*i would need to be done instead where i is unknown.\n // To easily get i, we either need to:\n // a. increase amount of valid recid values (4, 5...); OR\n // b. prohibit non-prime-order signatures (recid > 1).\n if (hasLargeCofactor)\n throw new Error('\"recovered\" sig type is not supported for cofactor >2 curves');\n }\n function validateSigLength(bytes: Uint8Array, format: ECDSASignatureFormat) {\n validateSigFormat(format);\n const size = lengths.signature!;\n const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n return abytes(bytes, sizer);\n }\n\n /**\n * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n */\n class Signature implements ECDSASignature {\n readonly r: bigint;\n readonly s: bigint;\n readonly recovery?: number;\n\n constructor(r: bigint, s: bigint, recovery?: number) {\n this.r = validateRS('r', r); // r in [1..N-1];\n this.s = validateRS('s', s); // s in [1..N-1];\n if (recovery != null) {\n assertSmallCofactor();\n if (![0, 1, 2, 3].includes(recovery)) throw new Error('invalid recovery id');\n this.recovery = recovery;\n }\n Object.freeze(this);\n }\n\n static fromBytes(\n bytes: Uint8Array,\n format: ECDSASignatureFormat = defaultSigOpts.format\n ): Signature {\n validateSigLength(bytes, format);\n let recid: number | undefined;\n if (format === 'der') {\n const { r, s } = DER.toSig(abytes(bytes));\n return new Signature(r, s);\n }\n if (format === 'recovered') {\n recid = bytes[0];\n format = 'compact';\n bytes = bytes.subarray(1);\n }\n const L = lengths.signature! / 2;\n const r = bytes.subarray(0, L);\n const s = bytes.subarray(L, L * 2);\n return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n }\n\n static fromHex(hex: string, format?: ECDSASignatureFormat) {\n return this.fromBytes(hexToBytes(hex), format);\n }\n\n private assertRecovery(): number {\n const { recovery } = this;\n if (recovery == null) throw new Error('invalid recovery id: must be present');\n return recovery;\n }\n\n addRecoveryBit(recovery: number): RecoveredSignature {\n return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n }\n\n recoverPublicKey(messageHash: Uint8Array): WeierstrassPoint<bigint> {\n const { r, s } = this;\n const recovery = this.assertRecovery();\n const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r;\n if (!Fp.isValid(radj)) throw new Error('invalid recovery id: sig.r+curve.n != R.x');\n const x = Fp.toBytes(radj);\n const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x));\n const ir = Fn.inv(radj); // r^-1\n const h = bits2int_modN(abytes(messageHash, undefined, 'msgHash')); // Truncate hash\n const u1 = Fn.create(-h * ir); // -hr^-1\n const u2 = Fn.create(s * ir); // sr^-1\n // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n if (Q.is0()) throw new Error('invalid recovery: point at infinify');\n Q.assertValidity();\n return Q;\n }\n\n // Signatures should be low-s, to prevent malleability.\n hasHighS(): boolean {\n return isBiggerThanHalfOrder(this.s);\n }\n\n toBytes(format: ECDSASignatureFormat = defaultSigOpts.format) {\n validateSigFormat(format);\n if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n const { r, s } = this;\n const rb = Fn.toBytes(r);\n const sb = Fn.toBytes(s);\n if (format === 'recovered') {\n assertSmallCofactor();\n return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb);\n }\n return concatBytes(rb, sb);\n }\n\n toHex(format?: ECDSASignatureFormat) {\n return bytesToHex(this.toBytes(format));\n }\n }\n type RecoveredSignature = Signature & { recovery: number };\n\n // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n const bits2int =\n ecdsaOpts.bits2int ||\n function bits2int_def(bytes: Uint8Array): bigint {\n // Our custom check \"just in case\", for protection against DoS\n if (bytes.length > 8192) throw new Error('input is too large');\n // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n // for some cases, since bytes.length * 8 is not actual bitLength.\n const num = bytesToNumberBE(bytes); // check for == u8 done here\n const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n return delta > 0 ? num >> BigInt(delta) : num;\n };\n const bits2int_modN =\n ecdsaOpts.bits2int_modN ||\n function bits2int_modN_def(bytes: Uint8Array): bigint {\n return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n };\n // Pads output with zero as per spec\n const ORDER_MASK = bitMask(fnBits);\n /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n function int2octets(num: bigint): Uint8Array {\n // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n return Fn.toBytes(num);\n }\n\n function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n abytes(message, undefined, 'message');\n return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n }\n\n /**\n * Steps A, D of RFC6979 3.2.\n * Creates RFC6979 seed; converts msg/privKey to numbers.\n * Used only in sign, not in verify.\n *\n * Warning: we cannot assume here that message has same amount of bytes as curve order,\n * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n */\n function prepSig(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts) {\n const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n // We can't later call bits2octets, since nested bits2int is broken for curves\n // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n const h1int = bits2int_modN(message);\n const d = Fn.fromBytes(secretKey); // validate secret key, convert to bigint\n if (!Fn.isValidNot0(d)) throw new Error('invalid private key');\n const seedArgs = [int2octets(d), int2octets(h1int)];\n // extraEntropy. RFC6979 3.6: additional k' (optional).\n if (extraEntropy != null && extraEntropy !== false) {\n // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n // gen random bytes OR pass as-is\n const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n seedArgs.push(abytes(e, undefined, 'extraEntropy')); // check for being bytes\n }\n const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n const m = h1int; // no need to call bits2int second time here, it is inside truncateHash!\n // Converts signature params into point w r/s, checks result for validity.\n // To transform k => Signature:\n // q = k\u22C5G\n // r = q.x mod n\n // s = k^-1(m + rd) mod n\n // Can use scalar blinding b^-1(bm + bdr) where b \u2208 [1,q\u22121] according to\n // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n function k2sig(kBytes: Uint8Array): Signature | undefined {\n // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n // Important: all mod() calls here must be done over N\n const k = bits2int(kBytes); // Cannot use fields methods, since it is group element\n if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n const ik = Fn.inv(k); // k^-1 mod n\n const q = Point.BASE.multiply(k).toAffine(); // q = k\u22C5G\n const r = Fn.create(q.x); // r = q.x mod n\n if (r === _0n) return;\n const s = Fn.create(ik * Fn.create(m + r * d)); // s = k^-1(m + rd) mod n\n if (s === _0n) return;\n let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3 when q.x>n)\n let normS = s;\n if (lowS && isBiggerThanHalfOrder(s)) {\n normS = Fn.neg(s); // if lowS was passed, ensure s is always in the bottom half of N\n recovery ^= 1;\n }\n return new Signature(r, normS, hasLargeCofactor ? undefined : recovery);\n }\n return { seed, k2sig };\n }\n\n /**\n * Signs message hash with a secret key.\n *\n * ```\n * sign(m, d) where\n * k = rfc6979_hmac_drbg(m, d)\n * (x, y) = G \u00D7 k\n * r = x mod n\n * s = (m + dr) / k mod n\n * ```\n */\n function sign(message: Uint8Array, secretKey: Uint8Array, opts: ECDSASignOpts = {}): Uint8Array {\n const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n const drbg = createHmacDrbg<Signature>(hash.outputLen, Fn.BYTES, hmac);\n const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n return sig.toBytes(opts.format);\n }\n\n /**\n * Verifies a signature against message and public key.\n * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n *\n * ```\n * verify(r, s, h, P) where\n * u1 = hs^-1 mod n\n * u2 = rs^-1 mod n\n * R = u1\u22C5G + u2\u22C5P\n * mod(R.x, n) == r\n * ```\n */\n function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n opts: ECDSAVerifyOpts = {}\n ): boolean {\n const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n publicKey = abytes(publicKey, undefined, 'publicKey');\n message = validateMsgAndHash(message, prehash);\n if (!isBytes(signature as any)) {\n const end = signature instanceof Signature ? ', use sig.toBytes()' : '';\n throw new Error('verify expects Uint8Array signature' + end);\n }\n validateSigLength(signature, format); // execute this twice because we want loud error\n try {\n const sig = Signature.fromBytes(signature, format);\n const P = Point.fromBytes(publicKey);\n if (lowS && sig.hasHighS()) return false;\n const { r, s } = sig;\n const h = bits2int_modN(message); // mod n, not mod p\n const is = Fn.inv(s); // s^-1 mod n\n const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1\u22C5G + u2\u22C5P\n if (R.is0()) return false;\n const v = Fn.create(R.x); // v = r.x mod n\n return v === r;\n } catch (e) {\n return false;\n }\n }\n\n function recoverPublicKey(\n signature: Uint8Array,\n message: Uint8Array,\n opts: ECDSARecoverOpts = {}\n ): Uint8Array {\n const { prehash } = validateSigOpts(opts, defaultSigOpts);\n message = validateMsgAndHash(message, prehash);\n return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n }\n\n return Object.freeze({\n keygen,\n getPublicKey,\n getSharedSecret,\n utils,\n lengths,\n Point,\n sign,\n verify,\n recoverPublicKey,\n Signature,\n hash,\n }) satisfies Signer;\n}\n", "/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism \u03C8,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createKeygen, type CurveLengths } from './abstract/curve.ts';\nimport { createHasher, type H2CHasher, isogenyMap } from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, pow2 } from './abstract/modular.ts';\nimport {\n type ECDSA,\n ecdsa,\n type EndomorphismOpts,\n mapToCurveSimpleSWU,\n type WeierstrassPoint as PointType,\n weierstrass,\n type WeierstrassOpts,\n type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport { abytes, asciiToBytes, bytesToNumberBE, concatBytes } from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Pointk1.BASE.multiply(Pointk1.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n h: BigInt(1),\n a: BigInt(0),\n b: BigInt(7),\n Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n basises: [\n [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * \u221An = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n const P = secp256k1_CURVE.p;\n // prettier-ignore\n const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n // prettier-ignore\n const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n const b2 = (y * y * y) % P; // x^3, 11\n const b3 = (b2 * b2 * y) % P; // x^7\n const b6 = (pow2(b3, _3n, P) * b3) % P;\n const b9 = (pow2(b6, _3n, P) * b3) % P;\n const b11 = (pow2(b9, _2n, P) * b2) % P;\n const b22 = (pow2(b11, _11n, P) * b11) % P;\n const b44 = (pow2(b22, _22n, P) * b22) % P;\n const b88 = (pow2(b44, _44n, P) * b44) % P;\n const b176 = (pow2(b88, _88n, P) * b88) % P;\n const b220 = (pow2(b176, _44n, P) * b44) % P;\n const b223 = (pow2(b220, _3n, P) * b3) % P;\n const t1 = (pow2(b223, _23n, P) * b22) % P;\n const t2 = (pow2(t1, _6n, P) * b2) % P;\n const root = pow2(t2, _2n, P);\n if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\nconst Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {\n Fp: Fpk1,\n endo: secp256k1_ENDO,\n});\n\n/**\n * secp256k1 curve: ECDSA and ECDH methods.\n *\n * Uses sha256 to hash messages. To use a different hash,\n * pass `{ prehash: false }` to sign / verify.\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * // const publicKey = secp256k1.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey);\n * // const sigKeccak = secp256k1.sign(keccak256(msg), secretKey, { prehash: false });\n * ```\n */\nexport const secp256k1: ECDSA = /* @__PURE__ */ ecdsa(Pointk1, sha256);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n let tagP = TAGGED_HASH_PREFIXES[tag];\n if (tagP === undefined) {\n const tagH = sha256(asciiToBytes(tag));\n tagP = concatBytes(tagH, tagH);\n TAGGED_HASH_PREFIXES[tag] = tagP;\n }\n return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: Uint8Array) {\n const { Fn, BASE } = Pointk1;\n const d_ = Fn.fromBytes(priv);\n const p = BASE.multiply(d_); // P = d'\u22C5G; 0 < d' < n check is done inside\n const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n const Fp = Fpk1;\n if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x \u2265 p');\n const xx = Fp.create(x * x);\n const c = Fp.create(xx * x + BigInt(7)); // Let c = x\u00B3 + 7 mod p.\n let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n // Return the unique point P such that x(P) = x and\n // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n if (!hasEven(y)) y = Fp.neg(y);\n const p = Pointk1.fromAffine({ x, y });\n p.assertValidity();\n return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Uint8Array): Uint8Array {\n return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'\u2265n. Ret bytes(d'\u22C5G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(\n message: Uint8Array,\n secretKey: Uint8Array,\n auxRand: Uint8Array = randomBytes(32)\n): Uint8Array {\n const { Fn } = Pointk1;\n const m = abytes(message, undefined, 'message');\n const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n const a = abytes(auxRand, 32, 'auxRand'); // Auxiliary random data a: a 32-byte array\n const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'\u22C5G\n const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n sig.set(rx, 0);\n sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean {\n const { Fp, Fn, BASE } = Pointk1;\n const sig = abytes(signature, 64, 'signature');\n const m = abytes(message, undefined, 'message');\n const pub = abytes(publicKey, 32, 'publicKey');\n try {\n const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r \u2265 p.\n if (!Fp.isValidNot0(r)) return false;\n const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s \u2265 n.\n if (!Fn.isValidNot0(s)) return false;\n\n const e = challenge(Fn.toBytes(r), pointToBytes(P), m); // int(challenge(bytes(r)||bytes(P)||m))%n\n // R = s\u22C5G - e\u22C5P, where -eP == (n-e)P\n const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n const { x, y } = R.toAffine();\n // Fail if is_infinite(R) / not has_even_y(R) / x(R) \u2260 r.\n if (R.is0() || !hasEven(y) || x !== r) return false;\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport type SecpSchnorr = {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: typeof schnorrGetPublicKey;\n sign: typeof schnorrSign;\n verify: typeof schnorrVerify;\n Point: WeierstrassPointCons<bigint>;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n pointToBytes: (point: PointType<bigint>) => Uint8Array;\n lift_x: typeof lift_x;\n taggedHash: typeof taggedHash;\n };\n lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1.js';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n const size = 32;\n const seedLength = 48;\n const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n return mapHashToField(seed, secp256k1_CURVE.n);\n };\n return {\n keygen: createKeygen(randomSecretKey, schnorrGetPublicKey),\n getPublicKey: schnorrGetPublicKey,\n sign: schnorrSign,\n verify: schnorrVerify,\n Point: Pointk1,\n utils: {\n randomSecretKey,\n taggedHash,\n lift_x,\n pointToBytes,\n },\n lengths: {\n secretKey: size,\n publicKey: size,\n publicKeyHasPrefix: false,\n signature: size * 2,\n seed: seedLength,\n },\n };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n isogenyMap(\n Fpk1,\n [\n // xNum\n [\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n ],\n // xDen\n [\n '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n // yNum\n [\n '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n ],\n // yDen\n [\n '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n ],\n ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n mapToCurveSimpleSWU(Fpk1, {\n A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n B: BigInt('1771'),\n Z: Fpk1.create(BigInt('-11')),\n }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<WeierstrassPointCons<bigint>> = /* @__PURE__ */ (() =>\n createHasher(\n Pointk1,\n (scalars: bigint[]) => {\n const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n return isoMap(x, y);\n },\n {\n DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n p: Fpk1.ORDER,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha256,\n }\n ))();\n", "export interface Nostr {\n generateSecretKey(): Uint8Array\n getPublicKey(secretKey: Uint8Array): string\n finalizeEvent(event: EventTemplate, secretKey: Uint8Array): VerifiedEvent\n verifyEvent(event: Event): event is VerifiedEvent\n}\n\n/** Designates a verified event signature. */\nexport const verifiedSymbol = Symbol('verified')\n\nexport type NostrEvent = {\n kind: number\n tags: string[][]\n content: string\n created_at: number\n pubkey: string\n id: string\n sig: string\n [verifiedSymbol]?: boolean\n}\n\nexport type Event = NostrEvent\nexport type EventTemplate = Pick<Event, 'kind' | 'tags' | 'content' | 'created_at'>\nexport type UnsignedEvent = Pick<Event, 'kind' | 'tags' | 'content' | 'created_at' | 'pubkey'>\n\n/** An event whose signature has been verified. */\nexport interface VerifiedEvent extends Event {\n [verifiedSymbol]: true\n}\n\nconst isRecord = (obj: unknown): obj is Record<string, unknown> => obj instanceof Object\n\nexport function validateEvent<T>(event: T): event is T & UnsignedEvent {\n if (!isRecord(event)) return false\n if (typeof event.kind !== 'number') return false\n if (typeof event.content !== 'string') return false\n if (typeof event.created_at !== 'number') return false\n if (typeof event.pubkey !== 'string') return false\n if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return false\n\n if (!Array.isArray(event.tags)) return false\n for (let i = 0; i < event.tags.length; i++) {\n let tag = event.tags[i]\n if (!Array.isArray(tag)) return false\n for (let j = 0; j < tag.length; j++) {\n if (typeof tag[j] !== 'string') return false\n }\n }\n\n return true\n}\n\n/**\n * Sort events in reverse-chronological order by the `created_at` timestamp,\n * and then by the event `id` (lexicographically) in case of ties.\n * This mutates the array.\n */\nexport function sortEvents(events: Event[]): Event[] {\n return events.sort((a: NostrEvent, b: NostrEvent): number => {\n if (a.created_at !== b.created_at) {\n return b.created_at - a.created_at\n }\n return a.id.localeCompare(b.id)\n })\n}\n", "import type { NostrEvent } from './core.ts'\n\nexport const utf8Decoder: TextDecoder = new TextDecoder('utf-8')\nexport const utf8Encoder: TextEncoder = new TextEncoder()\n\nexport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport function normalizeURL(url: string): string {\n try {\n if (url.indexOf('://') === -1) url = 'wss://' + url\n let p = new URL(url)\n if (p.protocol === 'http:') p.protocol = 'ws:'\n else if (p.protocol === 'https:') p.protocol = 'wss:'\n p.pathname = p.pathname.replace(/\\/+/g, '/')\n if (p.pathname.endsWith('/')) p.pathname = p.pathname.slice(0, -1)\n if ((p.port === '80' && p.protocol === 'ws:') || (p.port === '443' && p.protocol === 'wss:')) p.port = ''\n p.searchParams.sort()\n p.hash = ''\n return p.toString()\n } catch (e) {\n throw new Error(`Invalid URL: ${url}`)\n }\n}\n\nexport function insertEventIntoDescendingList(sortedArray: NostrEvent[], event: NostrEvent): NostrEvent[] {\n const [idx, found] = binarySearch(sortedArray, b => {\n if (event.id === b.id) return 0\n if (event.created_at === b.created_at) return -1\n return b.created_at - event.created_at\n })\n if (!found) {\n sortedArray.splice(idx, 0, event)\n }\n return sortedArray\n}\n\nexport function insertEventIntoAscendingList(sortedArray: NostrEvent[], event: NostrEvent): NostrEvent[] {\n const [idx, found] = binarySearch(sortedArray, b => {\n if (event.id === b.id) return 0\n if (event.created_at === b.created_at) return -1\n return event.created_at - b.created_at\n })\n if (!found) {\n sortedArray.splice(idx, 0, event)\n }\n return sortedArray\n}\n\nexport function binarySearch<T>(arr: T[], compare: (b: T) => number): [number, boolean] {\n let start = 0\n let end = arr.length - 1\n\n while (start <= end) {\n const mid = Math.floor((start + end) / 2)\n const cmp = compare(arr[mid])\n\n if (cmp === 0) {\n return [mid, true]\n }\n\n if (cmp < 0) {\n end = mid - 1\n } else {\n start = mid + 1\n }\n }\n\n return [start, false]\n}\n\nexport function mergeReverseSortedLists(list1: NostrEvent[], list2: NostrEvent[]): NostrEvent[] {\n const result: NostrEvent[] = new Array(list1.length + list2.length)\n result.length = 0\n let i1 = 0\n let i2 = 0\n let sameTimestampIds: string[] = []\n\n while (i1 < list1.length && i2 < list2.length) {\n let next: NostrEvent\n if (list1[i1]?.created_at > list2[i2]?.created_at) {\n next = list1[i1]\n i1++\n } else {\n next = list2[i2]\n i2++\n }\n\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id)) continue\n } else {\n sameTimestampIds.length = 0\n }\n\n result.push(next)\n sameTimestampIds.push(next.id)\n }\n\n while (i1 < list1.length) {\n const next = list1[i1]\n i1++\n\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id)) continue\n } else {\n sameTimestampIds.length = 0\n }\n result.push(next)\n sameTimestampIds.push(next.id)\n }\n\n while (i2 < list2.length) {\n const next = list2[i2]\n i2++\n\n if (result.length > 0 && result[result.length - 1].created_at === next.created_at) {\n if (sameTimestampIds.includes(next.id)) continue\n } else {\n sameTimestampIds.length = 0\n }\n result.push(next)\n sameTimestampIds.push(next.id)\n }\n\n return result\n}\n", "import { schnorr } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { Nostr, Event, EventTemplate, UnsignedEvent, VerifiedEvent, verifiedSymbol, validateEvent } from './core.ts'\nimport { sha256 } from '@noble/hashes/sha2.js'\n\nimport { utf8Encoder } from './utils.ts'\n\nclass JS implements Nostr {\n generateSecretKey(): Uint8Array {\n return schnorr.utils.randomSecretKey()\n }\n getPublicKey(secretKey: Uint8Array): string {\n return bytesToHex(schnorr.getPublicKey(secretKey))\n }\n finalizeEvent(t: EventTemplate, secretKey: Uint8Array): VerifiedEvent {\n const event = t as VerifiedEvent\n event.pubkey = bytesToHex(schnorr.getPublicKey(secretKey))\n event.id = getEventHash(event)\n event.sig = bytesToHex(schnorr.sign(hexToBytes(getEventHash(event)), secretKey))\n event[verifiedSymbol] = true\n return event\n }\n verifyEvent(event: Event): event is VerifiedEvent {\n if (typeof event[verifiedSymbol] === 'boolean') return event[verifiedSymbol]\n\n try {\n const hash = getEventHash(event)\n if (hash !== event.id) {\n event[verifiedSymbol] = false\n return false\n }\n\n const valid = schnorr.verify(hexToBytes(event.sig), hexToBytes(hash), hexToBytes(event.pubkey))\n event[verifiedSymbol] = valid\n return valid\n } catch (err) {\n event[verifiedSymbol] = false\n return false\n }\n }\n}\n\nexport function serializeEvent(evt: UnsignedEvent): string {\n if (!validateEvent(evt)) throw new Error(\"can't serialize event with wrong or missing properties\")\n return JSON.stringify([0, evt.pubkey, evt.created_at, evt.kind, evt.tags, evt.content])\n}\n\nexport function getEventHash(event: UnsignedEvent): string {\n let eventHash = sha256(utf8Encoder.encode(serializeEvent(event)))\n return bytesToHex(eventHash)\n}\n\nconst i: JS = new JS()\n\nexport const generateSecretKey = i.generateSecretKey\nexport const getPublicKey = i.getPublicKey\nexport const finalizeEvent = i.finalizeEvent\nexport const verifyEvent = i.verifyEvent\nexport * from './core.ts'\n", "import { NostrEvent, validateEvent } from './pure.ts'\n\n/** Events are **regular**, which means they're all expected to be stored by relays. */\nexport function isRegularKind(kind: number): boolean {\n return kind < 10000 && kind !== 0 && kind !== 3\n}\n\n/** Events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. */\nexport function isReplaceableKind(kind: number): boolean {\n return kind === 0 || kind === 3 || (10000 <= kind && kind < 20000)\n}\n\n/** Events are **ephemeral**, which means they are not expected to be stored by relays. */\nexport function isEphemeralKind(kind: number): boolean {\n return 20000 <= kind && kind < 30000\n}\n\n/** Events are **addressable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag, only the latest event is expected to be stored by relays, older versions are expected to be discarded. */\nexport function isAddressableKind(kind: number): boolean {\n return 30000 <= kind && kind < 40000\n}\n\n/** Classification of the event kind. */\nexport type KindClassification = 'regular' | 'replaceable' | 'ephemeral' | 'parameterized' | 'unknown'\n\n/** Determine the classification of this kind of event if known, or `unknown`. */\nexport function classifyKind(kind: number): KindClassification {\n if (isRegularKind(kind)) return 'regular'\n if (isReplaceableKind(kind)) return 'replaceable'\n if (isEphemeralKind(kind)) return 'ephemeral'\n if (isAddressableKind(kind)) return 'parameterized'\n return 'unknown'\n}\n\nexport function isKind<T extends number>(event: unknown, kind: T | Array<T>): event is NostrEvent & { kind: T } {\n const kindAsArray: number[] = kind instanceof Array ? kind : [kind]\n return (validateEvent(event) && kindAsArray.includes(event.kind)) || false\n}\n\nexport const Metadata = 0\nexport type Metadata = typeof Metadata\nexport const ShortTextNote = 1\nexport type ShortTextNote = typeof ShortTextNote\nexport const RecommendRelay = 2\nexport type RecommendRelay = typeof RecommendRelay\nexport const Contacts = 3\nexport type Contacts = typeof Contacts\nexport const EncryptedDirectMessage = 4\nexport type EncryptedDirectMessage = typeof EncryptedDirectMessage\nexport const EventDeletion = 5\nexport type EventDeletion = typeof EventDeletion\nexport const Repost = 6\nexport type Repost = typeof Repost\nexport const Reaction = 7\nexport type Reaction = typeof Reaction\nexport const BadgeAward = 8\nexport type BadgeAward = typeof BadgeAward\nexport const ChatMessage = 9\nexport type ChatMessage = typeof ChatMessage\nexport const ForumThread = 11\nexport type ForumThread = typeof ForumThread\nexport const Seal = 13\nexport type Seal = typeof Seal\nexport const PrivateDirectMessage = 14\nexport type PrivateDirectMessage = typeof PrivateDirectMessage\nexport const FileMessage = 15\nexport type FileMessage = typeof FileMessage\nexport const GenericRepost = 16\nexport type GenericRepost = typeof GenericRepost\nexport const Photo = 20\nexport type Photo = typeof Photo\nexport const NormalVideo = 21\nexport type NormalVideo = typeof NormalVideo\nexport const ShortVideo = 22\nexport type ShortVideo = typeof ShortVideo\nexport const ChannelCreation = 40\nexport type ChannelCreation = typeof ChannelCreation\nexport const ChannelMetadata = 41\nexport type ChannelMetadata = typeof ChannelMetadata\nexport const ChannelMessage = 42\nexport type ChannelMessage = typeof ChannelMessage\nexport const ChannelHideMessage = 43\nexport type ChannelHideMessage = typeof ChannelHideMessage\nexport const ChannelMuteUser = 44\nexport type ChannelMuteUser = typeof ChannelMuteUser\nexport const OpenTimestamps = 1040\nexport type OpenTimestamps = typeof OpenTimestamps\nexport const GiftWrap = 1059\nexport type GiftWrap = typeof GiftWrap\nexport const Poll = 1068\nexport type Poll = typeof Poll\nexport const FileMetadata = 1063\nexport type FileMetadata = typeof FileMetadata\nexport const Comment = 1111\nexport type Comment = typeof Comment\nexport const LiveChatMessage = 1311\nexport type LiveChatMessage = typeof LiveChatMessage\nexport const Voice = 1222\nexport type Voice = typeof Voice\nexport const VoiceComment = 1244\nexport type VoiceComment = typeof VoiceComment\nexport const ProblemTracker = 1971\nexport type ProblemTracker = typeof ProblemTracker\nexport const Report = 1984\nexport type Report = typeof Report\nexport const Reporting = 1984\nexport type Reporting = typeof Reporting\nexport const Label = 1985\nexport type Label = typeof Label\nexport const CommunityPostApproval = 4550\nexport type CommunityPostApproval = typeof CommunityPostApproval\nexport const JobRequest = 5999\nexport type JobRequest = typeof JobRequest\nexport const JobResult = 6999\nexport type JobResult = typeof JobResult\nexport const JobFeedback = 7000\nexport type JobFeedback = typeof JobFeedback\nexport const ZapGoal = 9041\nexport type ZapGoal = typeof ZapGoal\nexport const ZapRequest = 9734\nexport type ZapRequest = typeof ZapRequest\nexport const Zap = 9735\nexport type Zap = typeof Zap\nexport const Highlights = 9802\nexport type Highlights = typeof Highlights\nexport const PollResponse = 1018\nexport type PollResponse = typeof PollResponse\nexport const Mutelist = 10000\nexport type Mutelist = typeof Mutelist\nexport const Pinlist = 10001\nexport type Pinlist = typeof Pinlist\nexport const RelayList = 10002\nexport type RelayList = typeof RelayList\nexport const BookmarkList = 10003\nexport type BookmarkList = typeof BookmarkList\nexport const CommunitiesList = 10004\nexport type CommunitiesList = typeof CommunitiesList\nexport const PublicChatsList = 10005\nexport type PublicChatsList = typeof PublicChatsList\nexport const BlockedRelaysList = 10006\nexport type BlockedRelaysList = typeof BlockedRelaysList\nexport const SearchRelaysList = 10007\nexport type SearchRelaysList = typeof SearchRelaysList\nexport const FavoriteRelays = 10012\nexport type FavoriteRelays = typeof FavoriteRelays\nexport const InterestsList = 10015\nexport type InterestsList = typeof InterestsList\nexport const UserEmojiList = 10030\nexport type UserEmojiList = typeof UserEmojiList\nexport const DirectMessageRelaysList = 10050\nexport type DirectMessageRelaysList = typeof DirectMessageRelaysList\nexport const FileServerPreference = 10096\nexport type FileServerPreference = typeof FileServerPreference\nexport const BlossomServerList = 10063\nexport type BlossomServerList = typeof BlossomServerList\nexport const NWCWalletInfo = 13194\nexport type NWCWalletInfo = typeof NWCWalletInfo\nexport const LightningPubRPC = 21000\nexport type LightningPubRPC = typeof LightningPubRPC\nexport const ClientAuth = 22242\nexport type ClientAuth = typeof ClientAuth\nexport const NWCWalletRequest = 23194\nexport type NWCWalletRequest = typeof NWCWalletRequest\nexport const NWCWalletResponse = 23195\nexport type NWCWalletResponse = typeof NWCWalletResponse\nexport const NostrConnect = 24133\nexport type NostrConnect = typeof NostrConnect\nexport const HTTPAuth = 27235\nexport type HTTPAuth = typeof HTTPAuth\nexport const Followsets = 30000\nexport type Followsets = typeof Followsets\nexport const Genericlists = 30001\nexport type Genericlists = typeof Genericlists\nexport const Relaysets = 30002\nexport type Relaysets = typeof Relaysets\nexport const Bookmarksets = 30003\nexport type Bookmarksets = typeof Bookmarksets\nexport const Curationsets = 30004\nexport type Curationsets = typeof Curationsets\nexport const ProfileBadges = 30008\nexport type ProfileBadges = typeof ProfileBadges\nexport const BadgeDefinition = 30009\nexport type BadgeDefinition = typeof BadgeDefinition\nexport const Interestsets = 30015\nexport type Interestsets = typeof Interestsets\nexport const CreateOrUpdateStall = 30017\nexport type CreateOrUpdateStall = typeof CreateOrUpdateStall\nexport const CreateOrUpdateProduct = 30018\nexport type CreateOrUpdateProduct = typeof CreateOrUpdateProduct\nexport const LongFormArticle = 30023\nexport type LongFormArticle = typeof LongFormArticle\nexport const DraftLong = 30024\nexport type DraftLong = typeof DraftLong\nexport const Emojisets = 30030\nexport type Emojisets = typeof Emojisets\nexport const Application = 30078\nexport type Application = typeof Application\nexport const LiveEvent = 30311\nexport type LiveEvent = typeof LiveEvent\nexport const UserStatuses = 30315\nexport type UserStatuses = typeof UserStatuses\nexport const ClassifiedListing = 30402\nexport type ClassifiedListing = typeof ClassifiedListing\nexport const DraftClassifiedListing = 30403\nexport type DraftClassifiedListing = typeof DraftClassifiedListing\nexport const Date = 31922\nexport type Date = typeof Date\nexport const Time = 31923\nexport type Time = typeof Time\nexport const Calendar = 31924\nexport type Calendar = typeof Calendar\nexport const CalendarEventRSVP = 31925\nexport type CalendarEventRSVP = typeof CalendarEventRSVP\nexport const RelayReview = 31987\nexport type RelayReview = typeof RelayReview\nexport const Handlerrecommendation = 31989\nexport type Handlerrecommendation = typeof Handlerrecommendation\nexport const Handlerinformation = 31990\nexport type Handlerinformation = typeof Handlerinformation\nexport const CommunityDefinition = 34550\nexport type CommunityDefinition = typeof CommunityDefinition\nexport const GroupMetadata = 39000\nexport type GroupMetadata = typeof GroupMetadata\n", "import { Event } from './core.ts'\nimport { isAddressableKind, isReplaceableKind } from './kinds.ts'\n\nexport type Filter = {\n ids?: string[]\n kinds?: number[]\n authors?: string[]\n since?: number\n until?: number\n limit?: number\n search?: string\n [key: `#${string}`]: string[] | undefined\n}\n\nexport function matchFilter(filter: Filter, event: Event): boolean {\n if (filter.ids && filter.ids.indexOf(event.id) === -1) {\n return false\n }\n if (filter.kinds && filter.kinds.indexOf(event.kind) === -1) {\n return false\n }\n if (filter.authors && filter.authors.indexOf(event.pubkey) === -1) {\n return false\n }\n\n for (let f in filter) {\n if (f[0] === '#') {\n let tagName = f.slice(1)\n let values = filter[`#${tagName}`]\n if (values && !event.tags.find(([t, v]) => t === f.slice(1) && values!.indexOf(v) !== -1)) return false\n }\n }\n\n if (filter.since && event.created_at < filter.since) return false\n if (filter.until && event.created_at > filter.until) return false\n\n return true\n}\n\nexport function matchFilters(filters: Filter[], event: Event): boolean {\n for (let i = 0; i < filters.length; i++) {\n if (matchFilter(filters[i], event)) {\n return true\n }\n }\n return false\n}\n\nexport function mergeFilters(...filters: Filter[]): Filter {\n let result: Filter = {}\n for (let i = 0; i < filters.length; i++) {\n let filter = filters[i]\n Object.entries(filter).forEach(([property, values]) => {\n if (property === 'kinds' || property === 'ids' || property === 'authors' || property[0] === '#') {\n // @ts-ignore\n result[property] = result[property] || []\n // @ts-ignore\n for (let v = 0; v < values.length; v++) {\n // @ts-ignore\n let value = values[v]\n // @ts-ignore\n if (!result[property].includes(value)) result[property].push(value)\n }\n }\n })\n\n if (filter.limit && (!result.limit || filter.limit > result.limit)) result.limit = filter.limit\n if (filter.until && (!result.until || filter.until > result.until)) result.until = filter.until\n if (filter.since && (!result.since || filter.since < result.since)) result.since = filter.since\n }\n\n return result\n}\n\n/**\n * Calculate the intrinsic limit of a filter.\n * This function returns a positive integer, or `Infinity` if there is no intrinsic limit.\n */\nexport function getFilterLimit(filter: Filter): number {\n if (filter.ids && !filter.ids.length) return 0\n if (filter.kinds && !filter.kinds.length) return 0\n if (filter.authors && !filter.authors.length) return 0\n\n for (const [key, value] of Object.entries(filter)) {\n if (key[0] === '#' && Array.isArray(value) && !value.length) return 0\n }\n\n return Math.min(\n // The `limit` property creates an artificial limit.\n Math.max(0, filter.limit ?? Infinity),\n\n // There can only be one event per `id`.\n filter.ids?.length ?? Infinity,\n\n // Replaceable events are limited by the number of authors and kinds.\n filter.authors?.length && filter.kinds?.every(kind => isReplaceableKind(kind))\n ? filter.authors.length * filter.kinds.length\n : Infinity,\n\n // Parameterized replaceable events are limited by the number of authors, kinds, and \"d\" tags.\n filter.authors?.length && filter.kinds?.every(kind => isAddressableKind(kind)) && filter['#d']?.length\n ? filter.authors.length * filter.kinds.length * filter['#d'].length\n : Infinity,\n )\n}\n", "export function getHex64(json: string, field: string): string {\n let len = field.length + 3\n let idx = json.indexOf(`\"${field}\":`) + len\n let s = json.slice(idx).indexOf(`\"`) + idx + 1\n return json.slice(s, s + 64)\n}\n\nexport function getInt(json: string, field: string): number {\n let len = field.length\n let idx = json.indexOf(`\"${field}\":`) + len + 3\n let sliced = json.slice(idx)\n let end = Math.min(sliced.indexOf(','), sliced.indexOf('}'))\n return parseInt(sliced.slice(0, end), 10)\n}\n\nexport function getSubscriptionId(json: string): string | null {\n let idx = json.slice(0, 22).indexOf(`\"EVENT\"`)\n if (idx === -1) return null\n\n let pstart = json.slice(idx + 7 + 1).indexOf(`\"`)\n if (pstart === -1) return null\n let start = idx + 7 + 1 + pstart\n\n let pend = json.slice(start + 1, 80).indexOf(`\"`)\n if (pend === -1) return null\n let end = start + 1 + pend\n\n return json.slice(start + 1, end)\n}\n\nexport function matchEventId(json: string, id: string): boolean {\n return id === getHex64(json, 'id')\n}\n\nexport function matchEventPubkey(json: string, pubkey: string): boolean {\n return pubkey === getHex64(json, 'pubkey')\n}\n\nexport function matchEventKind(json: string, kind: number): boolean {\n return kind === getInt(json, 'kind')\n}\n", "import { EventTemplate } from './core.ts'\nimport { ClientAuth } from './kinds.ts'\n\n/**\n * creates an EventTemplate for an AUTH event to be signed.\n */\nexport function makeAuthEvent(relayURL: string, challenge: string): EventTemplate {\n return {\n kind: ClientAuth,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['relay', relayURL],\n ['challenge', challenge],\n ],\n content: '',\n }\n}\n", "/* global WebSocket */\n\nimport type { Event, EventTemplate, VerifiedEvent, Nostr, NostrEvent } from './core.ts'\nimport { matchFilters, type Filter } from './filter.ts'\nimport { getHex64, getSubscriptionId } from './fakejson.ts'\nimport { normalizeURL } from './utils.ts'\nimport { makeAuthEvent } from './nip42.ts'\n\ntype RelayWebSocket = WebSocket & {\n ping?(): void\n on?(event: 'pong', listener: () => void): any\n}\n\nexport type AbstractRelayConstructorOptions = {\n verifyEvent: Nostr['verifyEvent']\n websocketImplementation?: typeof WebSocket\n enablePing?: boolean\n enableReconnect?: boolean\n}\n\nexport class SendingOnClosedConnection extends Error {\n constructor(message: string, relay: string) {\n super(`Tried to send message '${message} on a closed connection to ${relay}.`)\n this.name = 'SendingOnClosedConnection'\n }\n}\n\nexport class AbstractRelay {\n public readonly url: string\n private _connected: boolean = false\n\n public onclose: (() => void) | null = null\n public onnotice: (msg: string) => void = msg => console.debug(`NOTICE from ${this.url}: ${msg}`)\n public onauth: undefined | ((evt: EventTemplate) => Promise<VerifiedEvent>)\n\n public baseEoseTimeout: number = 4400\n public publishTimeout: number = 4400\n public pingFrequency: number = 29000\n public pingTimeout: number = 20000\n public resubscribeBackoff: number[] = [10000, 10000, 10000, 20000, 20000, 30000, 60000]\n public openSubs: Map<string, Subscription> = new Map()\n public enablePing: boolean | undefined\n public enableReconnect: boolean\n public idleSince: number | undefined = Date.now() // when undefined that means it isn't idle\n public ongoingOperations: number = 0 // used to compute idleness\n private reconnectTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n private pingIntervalHandle: ReturnType<typeof setInterval> | undefined\n private reconnectAttempts: number = 0\n private skipReconnection: boolean = false\n\n private connectionPromise: Promise<void> | undefined\n private openCountRequests = new Map<string, CountResolver>()\n private openEventPublishes = new Map<string, EventPublishResolver>()\n private ws: RelayWebSocket | undefined\n private challenge: string | undefined\n private authPromise: Promise<string> | undefined\n private serial: number = 0\n private verifyEvent: Nostr['verifyEvent']\n\n private _WebSocket: typeof WebSocket\n\n constructor(url: string, opts: AbstractRelayConstructorOptions) {\n this.url = normalizeURL(url)\n this.verifyEvent = opts.verifyEvent\n this._WebSocket = opts.websocketImplementation || WebSocket\n this.enablePing = opts.enablePing\n this.enableReconnect = opts.enableReconnect || false\n }\n\n static async connect(\n url: string,\n opts: AbstractRelayConstructorOptions & Parameters<AbstractRelay['connect']>[0],\n ): Promise<AbstractRelay> {\n const relay = new AbstractRelay(url, opts)\n await relay.connect(opts)\n return relay\n }\n\n private closeAllSubscriptions(reason: string) {\n for (let [_, sub] of this.openSubs) {\n sub.close(reason)\n }\n this.openSubs.clear()\n\n for (let [_, ep] of this.openEventPublishes) {\n ep.reject(new Error(reason))\n }\n this.openEventPublishes.clear()\n\n for (let [_, cr] of this.openCountRequests) {\n cr.reject(new Error(reason))\n }\n this.openCountRequests.clear()\n }\n\n public get connected(): boolean {\n return this._connected\n }\n\n private async reconnect(): Promise<void> {\n const backoff = this.resubscribeBackoff[Math.min(this.reconnectAttempts, this.resubscribeBackoff.length - 1)]\n this.reconnectAttempts++\n\n this.reconnectTimeoutHandle = setTimeout(async () => {\n try {\n await this.connect()\n } catch (err) {\n // this will be called again through onclose/onerror\n }\n }, backoff)\n }\n\n private handleHardClose(reason: string) {\n if (this.pingIntervalHandle) {\n clearInterval(this.pingIntervalHandle)\n this.pingIntervalHandle = undefined\n }\n\n this._connected = false\n this.connectionPromise = undefined\n this.idleSince = undefined\n\n if (this.enableReconnect && !this.skipReconnection) {\n this.reconnect()\n } else {\n this.onclose?.()\n this.closeAllSubscriptions(reason)\n }\n }\n\n public async connect(opts?: { timeout?: number; abort?: AbortSignal }): Promise<void> {\n let connectionTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n\n if (this.connectionPromise) return this.connectionPromise\n\n this.challenge = undefined\n this.authPromise = undefined\n this.skipReconnection = false\n this.connectionPromise = new Promise((resolve, reject) => {\n if (opts?.timeout) {\n connectionTimeoutHandle = setTimeout(() => {\n reject('connection timed out')\n this.connectionPromise = undefined\n this.skipReconnection = true\n this.onclose?.()\n this.handleHardClose('relay connection timed out')\n }, opts.timeout)\n }\n\n if (opts?.abort) {\n opts.abort.onabort = reject\n }\n\n try {\n this.ws = new this._WebSocket(this.url)\n } catch (err) {\n clearTimeout(connectionTimeoutHandle)\n reject(err)\n return\n }\n\n this.ws.onopen = () => {\n if (this.reconnectTimeoutHandle) {\n clearTimeout(this.reconnectTimeoutHandle)\n this.reconnectTimeoutHandle = undefined\n }\n clearTimeout(connectionTimeoutHandle)\n this._connected = true\n\n const isReconnection = this.reconnectAttempts > 0\n this.reconnectAttempts = 0\n\n // resubscribe to all open subscriptions\n for (const sub of this.openSubs.values()) {\n sub.eosed = false\n if (isReconnection) {\n for (let f = 0; f < sub.filters.length; f++) {\n if (sub.lastEmitted) {\n sub.filters[f].since = sub.lastEmitted + 1\n }\n }\n }\n sub.fire()\n }\n\n if (this.enablePing) {\n this.pingIntervalHandle = setInterval(() => this.pingpong(), this.pingFrequency)\n }\n resolve()\n }\n\n this.ws.onerror = () => {\n clearTimeout(connectionTimeoutHandle)\n reject('connection failed')\n this.connectionPromise = undefined\n this.skipReconnection = true\n this.onclose?.()\n this.handleHardClose('relay connection failed')\n }\n\n this.ws.onclose = ev => {\n clearTimeout(connectionTimeoutHandle)\n reject((ev as any).message || 'websocket closed')\n this.handleHardClose('relay connection closed')\n }\n\n this.ws.onmessage = this._onmessage.bind(this)\n })\n\n return this.connectionPromise\n }\n\n private waitForPingPong() {\n return new Promise(resolve => {\n // listen for pong\n ;(this.ws as any).once('pong', () => resolve(true))\n // send a ping\n this.ws!.ping!()\n })\n }\n\n private waitForDummyReq() {\n return new Promise((resolve, reject) => {\n if (!this.connectionPromise) return reject(new Error(`no connection to ${this.url}, can't ping`))\n\n // make a dummy request with expected empty eose reply\n // [\"REQ\", \"_\", {\"ids\":[\"aaaa...aaaa\"], \"limit\": 0}]\n try {\n const sub = this.subscribe(\n [{ ids: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], limit: 0 }],\n {\n label: '<forced-ping>',\n oneose: () => {\n resolve(true)\n sub.close()\n },\n onclose() {\n // if we get a CLOSED it's because the relay is alive\n resolve(true)\n },\n eoseTimeout: this.pingTimeout + 1000,\n },\n )\n } catch (err) {\n reject(err)\n }\n })\n }\n\n // nodejs requires this magic here to ensure connections are closed when internet goes off and stuff\n // in browsers it's done automatically. see https://github.com/nbd-wtf/nostr-tools/issues/491\n private async pingpong() {\n // if the websocket is connected\n if (this.ws?.readyState === 1) {\n // wait for either a ping-pong reply or a timeout\n const result = await Promise.any([\n // browsers don't have ping so use a dummy req\n this.ws && this.ws.ping && (this.ws as any).once ? this.waitForPingPong() : this.waitForDummyReq(),\n new Promise(res => setTimeout(() => res(false), this.pingTimeout)),\n ])\n\n if (!result) {\n // pingpong closing socket\n if (this.ws?.readyState === this._WebSocket.OPEN) {\n this.ws?.close()\n }\n }\n }\n }\n\n public async send(message: string) {\n if (!this.connectionPromise) throw new SendingOnClosedConnection(message, this.url)\n\n this.connectionPromise.then(() => {\n this.ws?.send(message)\n })\n }\n\n public async auth(signAuthEvent: (evt: EventTemplate) => Promise<VerifiedEvent>): Promise<string> {\n const challenge = this.challenge\n if (!challenge) throw new Error(\"can't perform auth, no challenge was received\")\n if (this.authPromise) return this.authPromise\n\n this.authPromise = new Promise<string>(async (resolve, reject) => {\n try {\n let evt = await signAuthEvent(makeAuthEvent(this.url, challenge))\n let timeout = setTimeout(() => {\n let ep = this.openEventPublishes.get(evt.id) as EventPublishResolver\n if (ep) {\n ep.reject(new Error('auth timed out'))\n this.openEventPublishes.delete(evt.id)\n }\n }, this.publishTimeout)\n this.openEventPublishes.set(evt.id, { resolve, reject, timeout })\n this.send('[\"AUTH\",' + JSON.stringify(evt) + ']')\n } catch (err) {\n console.warn('subscribe auth function failed:', err)\n }\n })\n return this.authPromise\n }\n\n public async publish(event: Event): Promise<string> {\n this.idleSince = undefined\n this.ongoingOperations++\n\n const ret = new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(() => {\n const ep = this.openEventPublishes.get(event.id) as EventPublishResolver\n if (ep) {\n ep.reject(new Error('publish timed out'))\n this.openEventPublishes.delete(event.id)\n }\n }, this.publishTimeout)\n this.openEventPublishes.set(event.id, { resolve, reject, timeout })\n })\n this.send('[\"EVENT\",' + JSON.stringify(event) + ']')\n\n // compute idleness state\n this.ongoingOperations--\n if (this.ongoingOperations === 0) this.idleSince = Date.now()\n\n return ret\n }\n\n public async count(filters: Filter[], params: { id?: string | null }): Promise<number> {\n this.serial++\n const id = params?.id || 'count:' + this.serial\n const ret = new Promise<number>((resolve, reject) => {\n this.openCountRequests.set(id, { resolve, reject })\n })\n this.send('[\"COUNT\",\"' + id + '\",' + JSON.stringify(filters).substring(1))\n return ret\n }\n\n public subscribe(\n filters: Filter[],\n params: Partial<SubscriptionParams> & { label?: string; id?: string },\n ): Subscription {\n if (params.label !== '<forced-ping>') {\n this.idleSince = undefined\n this.ongoingOperations++\n }\n\n const sub = this.prepareSubscription(filters, params)\n sub.fire()\n\n if (params.abort) {\n params.abort.onabort = () => sub.close(String(params.abort!.reason || '<aborted>'))\n }\n\n return sub\n }\n\n public prepareSubscription(\n filters: Filter[],\n params: Partial<SubscriptionParams> & { label?: string; id?: string },\n ): Subscription {\n this.serial++\n const id = params.id || (params.label ? params.label + ':' : 'sub:') + this.serial\n const sub = new Subscription(this, id, filters, params)\n this.openSubs.set(id, sub)\n return sub\n }\n\n public close() {\n this.skipReconnection = true\n if (this.reconnectTimeoutHandle) {\n clearTimeout(this.reconnectTimeoutHandle)\n this.reconnectTimeoutHandle = undefined\n }\n if (this.pingIntervalHandle) {\n clearInterval(this.pingIntervalHandle)\n this.pingIntervalHandle = undefined\n }\n this.closeAllSubscriptions('relay connection closed by us')\n this._connected = false\n this.idleSince = undefined\n this.onclose?.()\n if (this.ws?.readyState === this._WebSocket.OPEN) {\n this.ws?.close()\n }\n }\n\n // this is the function assigned to this.ws.onmessage\n // it's exposed for testing and debugging purposes\n public _onmessage(ev: MessageEvent<any>): void {\n const json = ev.data\n if (!json) {\n return\n }\n\n // shortcut EVENT sub\n const subid = getSubscriptionId(json)\n if (subid) {\n const so = this.openSubs.get(subid as string)\n if (!so) {\n // this is an EVENT message, but for a subscription we don't have, so just stop here\n return\n }\n\n // this will be called only when this message is a EVENT message for a subscription we have\n // we do this before parsing the JSON to not have to do that for duplicate events\n // since JSON parsing is slow\n const id = getHex64(json, 'id')\n const alreadyHave = so.alreadyHaveEvent?.(id)\n\n // notify any interested client that the relay has this event\n // (do this after alreadyHaveEvent() because the client may rely on this to answer that)\n so.receivedEvent?.(this, id)\n\n if (alreadyHave) {\n // if we had already seen this event we can just stop here\n return\n }\n }\n\n try {\n let data = JSON.parse(json)\n // we won't do any checks against the data since all failures (i.e. invalid messages from relays)\n // will naturally be caught by the encompassing try..catch block\n\n switch (data[0]) {\n case 'EVENT': {\n const so = this.openSubs.get(data[1] as string) as Subscription\n const event = data[2] as NostrEvent\n if (this.verifyEvent(event) && matchFilters(so.filters, event)) {\n so.onevent(event)\n } else {\n so.oninvalidevent?.(event)\n }\n if (!so.lastEmitted || so.lastEmitted < event.created_at) so.lastEmitted = event.created_at\n return\n }\n case 'COUNT': {\n const id: string = data[1]\n const payload = data[2] as { count: number }\n const cr = this.openCountRequests.get(id) as CountResolver\n if (cr) {\n cr.resolve(payload.count)\n this.openCountRequests.delete(id)\n }\n return\n }\n case 'EOSE': {\n const so = this.openSubs.get(data[1] as string)\n if (!so) return\n so.receivedEose()\n return\n }\n case 'OK': {\n const id: string = data[1]\n const ok: boolean = data[2]\n const reason: string = data[3]\n const ep = this.openEventPublishes.get(id) as EventPublishResolver\n if (ep) {\n clearTimeout(ep.timeout)\n if (ok) ep.resolve(reason)\n else ep.reject(new Error(reason))\n this.openEventPublishes.delete(id)\n }\n return\n }\n case 'CLOSED': {\n const id: string = data[1]\n const so = this.openSubs.get(id)\n if (!so) return\n so.closed = true\n so.close(data[2] as string)\n return\n }\n case 'NOTICE': {\n this.onnotice(data[1] as string)\n return\n }\n case 'AUTH': {\n this.challenge = data[1] as string\n if (this.onauth) {\n this.auth(this.onauth)\n }\n return\n }\n default: {\n const so = this.openSubs.get(data[1])\n so?.oncustom?.(data)\n return\n }\n }\n } catch (err) {\n try {\n const [_, __, event] = JSON.parse(json)\n console.warn(`[nostr] relay ${this.url} error processing message:`, err, event)\n } catch (_) {\n console.warn(`[nostr] relay ${this.url} error processing message:`, err)\n }\n return\n }\n }\n}\n\nexport class Subscription {\n public readonly relay: AbstractRelay\n public readonly id: string\n\n public lastEmitted: number | undefined\n public closed: boolean = false\n public eosed: boolean = false\n public filters: Filter[]\n public alreadyHaveEvent: ((id: string) => boolean) | undefined\n public receivedEvent: ((relay: AbstractRelay, id: string) => void) | undefined\n\n public onevent: (evt: Event) => void\n public oninvalidevent: ((evt: unknown) => void) | undefined\n public oneose: (() => void) | undefined\n public onclose: ((reason: string) => void) | undefined\n\n // will get any messages that have this subscription id as their second item and are not default standard\n public oncustom: ((msg: string[]) => void) | undefined\n\n public eoseTimeout: number\n private eoseTimeoutHandle: ReturnType<typeof setTimeout> | undefined\n\n constructor(relay: AbstractRelay, id: string, filters: Filter[], params: SubscriptionParams) {\n if (filters.length === 0) throw new Error(\"subscription can't be created with zero filters\")\n\n this.relay = relay\n this.filters = filters\n this.id = id\n this.alreadyHaveEvent = params.alreadyHaveEvent\n this.receivedEvent = params.receivedEvent\n this.eoseTimeout = params.eoseTimeout || relay.baseEoseTimeout\n\n this.oneose = params.oneose\n this.onclose = params.onclose\n this.oninvalidevent = params.oninvalidevent\n this.onevent =\n params.onevent ||\n (event => {\n console.warn(\n `onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,\n event,\n )\n })\n }\n\n public fire() {\n this.relay.send('[\"REQ\",\"' + this.id + '\",' + JSON.stringify(this.filters).substring(1))\n\n // only now we start counting the eoseTimeout\n this.eoseTimeoutHandle = setTimeout(this.receivedEose.bind(this), this.eoseTimeout)\n }\n\n public receivedEose() {\n if (this.eosed) return\n clearTimeout(this.eoseTimeoutHandle)\n this.eosed = true\n this.oneose?.()\n }\n\n public close(reason: string = 'closed by caller') {\n if (!this.closed && this.relay.connected) {\n // if the connection was closed by the user calling .close() we will send a CLOSE message\n // otherwise this._open will be already set to false so we will skip this\n try {\n this.relay.send('[\"CLOSE\",' + JSON.stringify(this.id) + ']')\n } catch (err) {\n if (err instanceof SendingOnClosedConnection) {\n /* doesn't matter, it's ok */\n } else {\n throw err\n }\n }\n this.closed = true\n }\n this.relay.openSubs.delete(this.id)\n\n // compute idleness state\n this.relay.ongoingOperations--\n if (this.relay.ongoingOperations === 0) this.relay.idleSince = Date.now()\n\n this.onclose?.(reason)\n }\n}\n\nexport type SubscriptionParams = {\n onevent?: (evt: Event) => void\n oninvalidevent?: (evt: unknown) => void\n oneose?: () => void\n onclose?: (reason: string) => void\n alreadyHaveEvent?: (id: string) => boolean\n receivedEvent?: (relay: AbstractRelay, id: string) => void\n eoseTimeout?: number\n abort?: AbortSignal\n}\n\nexport type CountResolver = {\n resolve: (count: number) => void\n reject: (err: Error) => void\n}\n\nexport type EventPublishResolver = {\n resolve: (reason: string) => void\n reject: (err: Error) => void\n timeout: ReturnType<typeof setTimeout>\n}\n", "/* global WebSocket */\n\nimport { verifyEvent } from './pure.ts'\nimport { AbstractRelay, type AbstractRelayConstructorOptions } from './abstract-relay.ts'\n\nvar _WebSocket: typeof WebSocket\n\ntry {\n _WebSocket = WebSocket\n} catch {}\n\nexport function useWebSocketImplementation(websocketImplementation: any) {\n _WebSocket = websocketImplementation\n}\n\nexport class Relay extends AbstractRelay {\n constructor(url: string, options?: Pick<AbstractRelayConstructorOptions, 'enablePing' | 'enableReconnect'>) {\n super(url, { verifyEvent, websocketImplementation: _WebSocket, ...options })\n }\n\n static async connect(\n url: string,\n options?: Pick<AbstractRelayConstructorOptions, 'enablePing' | 'enableReconnect'>,\n ): Promise<Relay> {\n const relay = new Relay(url, options)\n await relay.connect()\n return relay\n }\n}\n\nexport type RelayRecord = Record<string, { read: boolean; write: boolean }>\n\nexport * from './abstract-relay.ts'\n", "import { verifiedSymbol, type Event, type Nostr, VerifiedEvent } from './core.ts'\n\nexport const alwaysTrue: Nostr['verifyEvent'] = (t: Event): t is VerifiedEvent => {\n t[verifiedSymbol] = true\n return true\n}\n", "/* global WebSocket */\n\nimport {\n AbstractRelay as AbstractRelay,\n SubscriptionParams,\n Subscription,\n type AbstractRelayConstructorOptions,\n} from './abstract-relay.ts'\nimport { normalizeURL } from './utils.ts'\n\nimport type { Event, EventTemplate, Nostr, VerifiedEvent } from './core.ts'\nimport { type Filter } from './filter.ts'\nimport { alwaysTrue } from './helpers.ts'\nimport { Relay } from './relay.ts'\n\nexport type SubCloser = { close: (reason?: string) => void }\n\nexport type AbstractPoolConstructorOptions = AbstractRelayConstructorOptions & {\n // automaticallyAuth takes a relay URL and should return null in case that relay shouldn't be authenticated against\n // or a function to sign the AUTH event template otherwise (that function may still throw in case of failure)\n automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise<VerifiedEvent>)\n // onRelayConnectionFailure is called with the URL of a relay that failed the initial connection\n onRelayConnectionFailure?: (url: string) => void\n // onRelayConnectionSuccess is called with the URL of a relay that succeeds the initial connection\n onRelayConnectionSuccess?: (url: string) => void\n // allowConnectingToRelay takes a relay URL and the operation being performed\n // return false to skip connecting to that relay\n allowConnectingToRelay?: (url: string, operation: ['read', Filter[]] | ['write', Event]) => boolean\n // maxWaitForConnection takes a number in milliseconds that will be given to ensureRelay such that we\n // don't get stuck forever when attempting to connect to a relay, it is 3000 (3 seconds) by default\n maxWaitForConnection: number\n}\n\nexport type SubscribeManyParams = Omit<SubscriptionParams, 'onclose'> & {\n maxWait?: number\n abort?: AbortSignal\n onclose?: (reasons: string[]) => void\n onauth?: (event: EventTemplate) => Promise<VerifiedEvent>\n id?: string\n label?: string\n}\n\nexport class AbstractSimplePool {\n protected relays: Map<string, AbstractRelay> = new Map()\n public seenOn: Map<string, Set<AbstractRelay>> = new Map()\n public trackRelays: boolean = false\n\n public verifyEvent: Nostr['verifyEvent']\n public enablePing: boolean | undefined\n public enableReconnect: boolean\n public automaticallyAuth?: (relayURL: string) => null | ((event: EventTemplate) => Promise<VerifiedEvent>)\n public trustedRelayURLs: Set<string> = new Set()\n public onRelayConnectionFailure?: (url: string) => void\n public onRelayConnectionSuccess?: (url: string) => void\n public allowConnectingToRelay?: (url: string, operation: ['read', Filter[]] | ['write', Event]) => boolean\n public maxWaitForConnection: number\n\n private _WebSocket?: typeof WebSocket\n\n constructor(opts: AbstractPoolConstructorOptions) {\n this.verifyEvent = opts.verifyEvent\n this._WebSocket = opts.websocketImplementation\n this.enablePing = opts.enablePing\n this.enableReconnect = opts.enableReconnect || false\n this.automaticallyAuth = opts.automaticallyAuth\n this.onRelayConnectionFailure = opts.onRelayConnectionFailure\n this.onRelayConnectionSuccess = opts.onRelayConnectionSuccess\n this.allowConnectingToRelay = opts.allowConnectingToRelay\n this.maxWaitForConnection = opts.maxWaitForConnection || 3000\n }\n\n async ensureRelay(\n url: string,\n params?: {\n connectionTimeout?: number\n abort?: AbortSignal\n },\n ): Promise<AbstractRelay> {\n url = normalizeURL(url)\n\n let relay = this.relays.get(url)\n if (!relay) {\n relay = new AbstractRelay(url, {\n verifyEvent: this.trustedRelayURLs.has(url) ? alwaysTrue : this.verifyEvent,\n websocketImplementation: this._WebSocket,\n enablePing: this.enablePing,\n enableReconnect: this.enableReconnect,\n })\n relay.onclose = () => {\n this.relays.delete(url)\n }\n this.relays.set(url, relay)\n }\n\n if (this.automaticallyAuth) {\n const authSignerFn = this.automaticallyAuth(url)\n if (authSignerFn) {\n relay.onauth = authSignerFn\n }\n }\n\n try {\n await relay.connect({\n timeout: params?.connectionTimeout,\n abort: params?.abort,\n })\n } catch (err) {\n this.relays.delete(url)\n throw err\n }\n\n return relay\n }\n\n close(relays: string[]) {\n relays.map(normalizeURL).forEach(url => {\n this.relays.get(url)?.close()\n this.relays.delete(url)\n })\n }\n\n subscribe(relays: string[], filter: Filter, params: SubscribeManyParams): SubCloser {\n const request: { url: string; filter: Filter }[] = []\n const uniqUrls: string[] = []\n for (let i = 0; i < relays.length; i++) {\n const url = normalizeURL(relays[i])\n if (!request.find(r => r.url === url)) {\n if (uniqUrls.indexOf(url) === -1) {\n uniqUrls.push(url)\n request.push({ url, filter: filter })\n }\n }\n }\n\n return this.subscribeMap(request, params)\n }\n\n subscribeMany(relays: string[], filter: Filter, params: SubscribeManyParams): SubCloser {\n return this.subscribe(relays, filter, params)\n }\n\n subscribeMap(requests: { url: string; filter: Filter }[], params: SubscribeManyParams): SubCloser {\n const grouped = new Map<string, Filter[]>()\n for (const req of requests) {\n const { url, filter } = req\n if (!grouped.has(url)) grouped.set(url, [])\n grouped.get(url)!.push(filter)\n }\n const groupedRequests = Array.from(grouped.entries()).map(([url, filters]) => ({ url, filters }))\n\n if (this.trackRelays) {\n params.receivedEvent = (relay: AbstractRelay, id: string) => {\n let set = this.seenOn.get(id)\n if (!set) {\n set = new Set()\n this.seenOn.set(id, set)\n }\n set.add(relay)\n }\n }\n\n const _knownIds = new Set<string>()\n const subs: Subscription[] = []\n\n // batch all EOSEs into a single\n const eosesReceived: boolean[] = []\n let handleEose = (i: number) => {\n if (eosesReceived[i]) return // do not act twice for the same relay\n eosesReceived[i] = true\n if (eosesReceived.filter(a => a).length === groupedRequests.length) {\n params.oneose?.()\n handleEose = () => {}\n }\n }\n // batch all closes into a single\n const closesReceived: string[] = []\n let handleClose = (i: number, reason: string) => {\n if (closesReceived[i]) return // do not act twice for the same relay\n handleEose(i)\n closesReceived[i] = reason\n if (closesReceived.filter(a => a).length === groupedRequests.length) {\n params.onclose?.(closesReceived)\n handleClose = () => {}\n }\n }\n\n const localAlreadyHaveEventHandler = (id: string) => {\n if (params.alreadyHaveEvent?.(id)) {\n return true\n }\n const have = _knownIds.has(id)\n _knownIds.add(id)\n return have\n }\n\n // open a subscription in all given relays\n const allOpened = Promise.all(\n groupedRequests.map(async ({ url, filters }, i) => {\n if (this.allowConnectingToRelay?.(url, ['read', filters]) === false) {\n handleClose(i, 'connection skipped by allowConnectingToRelay')\n return\n }\n\n let relay: AbstractRelay\n try {\n relay = await this.ensureRelay(url, {\n connectionTimeout:\n this.maxWaitForConnection < (params.maxWait || 0)\n ? Math.max(params.maxWait! * 0.8, params.maxWait! - 1000)\n : this.maxWaitForConnection,\n abort: params.abort,\n })\n } catch (err) {\n this.onRelayConnectionFailure?.(url)\n handleClose(i, (err as any)?.message || String(err))\n return\n }\n\n this.onRelayConnectionSuccess?.(url)\n\n let subscription = relay.subscribe(filters, {\n ...params,\n oneose: () => handleEose(i),\n onclose: reason => {\n if (reason.startsWith('auth-required: ') && params.onauth) {\n relay\n .auth(params.onauth)\n .then(() => {\n relay.subscribe(filters, {\n ...params,\n oneose: () => handleEose(i),\n onclose: reason => {\n handleClose(i, reason) // the second time we won't try to auth anymore\n },\n alreadyHaveEvent: localAlreadyHaveEventHandler,\n eoseTimeout: params.maxWait,\n abort: params.abort,\n })\n })\n .catch(err => {\n handleClose(i, `auth was required and attempted, but failed with: ${err}`)\n })\n } else {\n handleClose(i, reason)\n }\n },\n alreadyHaveEvent: localAlreadyHaveEventHandler,\n eoseTimeout: params.maxWait,\n abort: params.abort,\n })\n\n subs.push(subscription)\n }),\n )\n\n return {\n async close(reason?: string) {\n await allOpened\n subs.forEach(sub => {\n sub.close(reason)\n })\n },\n }\n }\n\n subscribeEose(\n relays: string[],\n filter: Filter,\n params: Pick<SubscribeManyParams, 'label' | 'id' | 'onevent' | 'oninvalidevent' | 'onclose' | 'maxWait' | 'onauth'>,\n ): SubCloser {\n let subcloser: SubCloser\n subcloser = this.subscribe(relays, filter, {\n ...params,\n oneose() {\n const reason = 'closed automatically on eose'\n if (subcloser) subcloser.close(reason)\n else params.onclose?.(relays.map(_ => reason))\n },\n })\n return subcloser\n }\n\n subscribeManyEose(\n relays: string[],\n filter: Filter,\n params: Pick<SubscribeManyParams, 'label' | 'id' | 'onevent' | 'oninvalidevent' | 'onclose' | 'maxWait' | 'onauth'>,\n ): SubCloser {\n return this.subscribeEose(relays, filter, params)\n }\n\n async querySync(\n relays: string[],\n filter: Filter,\n params?: Pick<SubscribeManyParams, 'label' | 'id' | 'maxWait'>,\n ): Promise<Event[]> {\n return new Promise(async resolve => {\n const events: Event[] = []\n this.subscribeEose(relays, filter, {\n ...params,\n onevent(event: Event) {\n events.push(event)\n },\n onclose(_: string[]) {\n resolve(events)\n },\n })\n })\n }\n\n async get(\n relays: string[],\n filter: Filter,\n params?: Pick<SubscribeManyParams, 'label' | 'id' | 'maxWait'>,\n ): Promise<Event | null> {\n filter.limit = 1\n const events = await this.querySync(relays, filter, params)\n events.sort((a, b) => b.created_at - a.created_at)\n return events[0] || null\n }\n\n publish(\n relays: string[],\n event: Event,\n params?: {\n onauth?: (evt: EventTemplate) => Promise<VerifiedEvent>\n maxWait?: number\n abort?: AbortSignal\n },\n ): Promise<string>[] {\n return relays.map(normalizeURL).map(async (url, i, arr) => {\n if (arr.indexOf(url) !== i) {\n // duplicate\n return Promise.reject('duplicate url')\n }\n\n if (this.allowConnectingToRelay?.(url, ['write', event]) === false) {\n return Promise.reject('connection skipped by allowConnectingToRelay')\n }\n\n let r: Relay\n try {\n r = await this.ensureRelay(url, {\n connectionTimeout:\n this.maxWaitForConnection < (params?.maxWait || 0)\n ? Math.max(params!.maxWait! * 0.8, params!.maxWait! - 1000)\n : this.maxWaitForConnection,\n abort: params?.abort,\n })\n } catch (err) {\n this.onRelayConnectionFailure?.(url)\n return String('connection failure: ' + String(err))\n }\n\n return r\n .publish(event)\n .catch(async err => {\n if (err instanceof Error && err.message.startsWith('auth-required: ') && params?.onauth) {\n await r.auth(params.onauth)\n return r.publish(event) // retry\n }\n throw err\n })\n .then(reason => {\n if (this.trackRelays) {\n let set = this.seenOn.get(event.id)\n if (!set) {\n set = new Set()\n this.seenOn.set(event.id, set)\n }\n set.add(r)\n }\n return reason\n })\n })\n }\n\n listConnectionStatus(): Map<string, boolean> {\n const map = new Map<string, boolean>()\n this.relays.forEach((relay, url) => map.set(url, relay.connected))\n\n return map\n }\n\n destroy(): void {\n this.relays.forEach(conn => conn.close())\n this.relays = new Map()\n }\n\n pruneIdleRelays(idleThresholdMs: number = 10000): string[] {\n const prunedUrls: string[] = []\n\n // check each relay's idle status and prune if over threshold\n for (const [url, relay] of this.relays) {\n if (relay.idleSince && Date.now() - relay.idleSince >= idleThresholdMs) {\n this.relays.delete(url)\n prunedUrls.push(url)\n relay.close()\n }\n }\n\n return prunedUrls\n }\n}\n", "/* global WebSocket */\n\nimport { verifyEvent } from './pure.ts'\nimport { AbstractSimplePool, type AbstractPoolConstructorOptions } from './abstract-pool.ts'\n\nvar _WebSocket: typeof WebSocket\n\ntry {\n _WebSocket = WebSocket\n} catch {}\n\nexport function useWebSocketImplementation(websocketImplementation: any) {\n _WebSocket = websocketImplementation\n}\n\nexport class SimplePool extends AbstractSimplePool {\n constructor(options?: Pick<AbstractPoolConstructorOptions, 'enablePing' | 'enableReconnect'>) {\n super({ verifyEvent, websocketImplementation: _WebSocket, maxWaitForConnection: 3000, ...options })\n }\n}\n\nexport * from './abstract-pool.ts'\n", "import { bytesToHex, concatBytes, hexToBytes } from '@noble/hashes/utils.js'\nimport { bech32 } from '@scure/base'\n\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nexport type NProfile = `nprofile1${string}`\nexport type NEvent = `nevent1${string}`\nexport type NAddr = `naddr1${string}`\nexport type NSec = `nsec1${string}`\nexport type NPub = `npub1${string}`\nexport type Note = `note1${string}`\nexport type Ncryptsec = `ncryptsec1${string}`\n\nexport const NostrTypeGuard = {\n isNProfile: (value?: string | null): value is NProfile => /^nprofile1[a-z\\d]+$/.test(value || ''),\n isNEvent: (value?: string | null): value is NEvent => /^nevent1[a-z\\d]+$/.test(value || ''),\n isNAddr: (value?: string | null): value is NAddr => /^naddr1[a-z\\d]+$/.test(value || ''),\n isNSec: (value?: string | null): value is NSec => /^nsec1[a-z\\d]{58}$/.test(value || ''),\n isNPub: (value?: string | null): value is NPub => /^npub1[a-z\\d]{58}$/.test(value || ''),\n isNote: (value?: string | null): value is Note => /^note1[a-z\\d]+$/.test(value || ''),\n isNcryptsec: (value?: string | null): value is Ncryptsec => /^ncryptsec1[a-z\\d]+$/.test(value || ''),\n}\n\nexport const Bech32MaxSize = 5000\n\n/**\n * Bech32 regex.\n * @see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32\n */\nexport const BECH32_REGEX = /[\\x21-\\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/\n\nfunction integerToUint8Array(number: number) {\n // Create a Uint8Array with enough space to hold a 32-bit integer (4 bytes).\n const uint8Array = new Uint8Array(4)\n\n // Use bitwise operations to extract the bytes.\n uint8Array[0] = (number >> 24) & 0xff // Most significant byte (MSB)\n uint8Array[1] = (number >> 16) & 0xff\n uint8Array[2] = (number >> 8) & 0xff\n uint8Array[3] = number & 0xff // Least significant byte (LSB)\n\n return uint8Array\n}\n\nexport type ProfilePointer = {\n pubkey: string // hex\n relays?: string[]\n}\n\nexport type EventPointer = {\n id: string // hex\n relays?: string[]\n author?: string\n kind?: number\n}\n\nexport type AddressPointer = {\n identifier: string\n pubkey: string\n kind: number\n relays?: string[]\n}\n\nexport function decodeNostrURI(nip19code: string): ReturnType<typeof decode> | { type: 'invalid'; data: null } {\n try {\n if (nip19code.startsWith('nostr:')) nip19code = nip19code.substring(6)\n return decode(nip19code)\n } catch (_err) {\n return { type: 'invalid', data: null }\n }\n}\n\nexport type DecodedNevent = {\n type: 'nevent'\n data: EventPointer\n}\n\nexport type DecodedNprofile = {\n type: 'nprofile'\n data: ProfilePointer\n}\n\nexport type DecodedNaddr = {\n type: 'naddr'\n data: AddressPointer\n}\n\nexport type DecodedNsec = {\n type: 'nsec'\n data: Uint8Array\n}\n\nexport type DecodedNpub = {\n type: 'npub'\n data: string\n}\n\nexport type DecodedNote = {\n type: 'note'\n data: string\n}\n\nexport type DecodedResult = DecodedNevent | DecodedNprofile | DecodedNaddr | DecodedNpub | DecodedNsec | DecodedNote\n\nexport function decode(nip19: NEvent): DecodedNevent\nexport function decode(nip19: NProfile): DecodedNprofile\nexport function decode(nip19: NAddr): DecodedNaddr\nexport function decode(nip19: NSec): DecodedNsec\nexport function decode(nip19: NPub): DecodedNpub\nexport function decode(nip19: Note): DecodedNote\nexport function decode(code: string): DecodedResult\nexport function decode(code: string): DecodedResult {\n let { prefix, words } = bech32.decode(code as `${string}1${string}`, Bech32MaxSize)\n let data = new Uint8Array(bech32.fromWords(words))\n\n switch (prefix) {\n case 'nprofile': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nprofile')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n\n return {\n type: 'nprofile',\n data: {\n pubkey: bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n },\n }\n }\n case 'nevent': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for nevent')\n if (tlv[0][0].length !== 32) throw new Error('TLV 0 should be 32 bytes')\n if (tlv[2] && tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (tlv[3] && tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'nevent',\n data: {\n id: bytesToHex(tlv[0][0]),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n author: tlv[2]?.[0] ? bytesToHex(tlv[2][0]) : undefined,\n kind: tlv[3]?.[0] ? parseInt(bytesToHex(tlv[3][0]), 16) : undefined,\n },\n }\n }\n\n case 'naddr': {\n let tlv = parseTLV(data)\n if (!tlv[0]?.[0]) throw new Error('missing TLV 0 for naddr')\n if (!tlv[2]?.[0]) throw new Error('missing TLV 2 for naddr')\n if (tlv[2][0].length !== 32) throw new Error('TLV 2 should be 32 bytes')\n if (!tlv[3]?.[0]) throw new Error('missing TLV 3 for naddr')\n if (tlv[3][0].length !== 4) throw new Error('TLV 3 should be 4 bytes')\n\n return {\n type: 'naddr',\n data: {\n identifier: utf8Decoder.decode(tlv[0][0]),\n pubkey: bytesToHex(tlv[2][0]),\n kind: parseInt(bytesToHex(tlv[3][0]), 16),\n relays: tlv[1] ? tlv[1].map(d => utf8Decoder.decode(d)) : [],\n },\n }\n }\n\n case 'nsec':\n return { type: prefix, data }\n\n case 'npub':\n case 'note':\n return { type: prefix, data: bytesToHex(data) }\n\n default:\n throw new Error(`unknown prefix ${prefix}`)\n }\n}\n\ntype TLV = { [t: number]: Uint8Array[] }\n\nfunction parseTLV(data: Uint8Array): TLV {\n let result: TLV = {}\n let rest = data\n while (rest.length > 0) {\n let t = rest[0]\n let l = rest[1]\n let v = rest.slice(2, 2 + l)\n rest = rest.slice(2 + l)\n if (v.length < l) throw new Error(`not enough data to read on TLV ${t}`)\n result[t] = result[t] || []\n result[t].push(v)\n }\n return result\n}\n\nexport function nsecEncode(key: Uint8Array): NSec {\n return encodeBytes('nsec', key)\n}\n\nexport function npubEncode(hex: string): NPub {\n return encodeBytes('npub', hexToBytes(hex))\n}\n\nexport function noteEncode(hex: string): Note {\n return encodeBytes('note', hexToBytes(hex))\n}\n\nfunction encodeBech32<Prefix extends string>(prefix: Prefix, data: Uint8Array): `${Prefix}1${string}` {\n let words = bech32.toWords(data)\n return bech32.encode(prefix, words, Bech32MaxSize) as `${Prefix}1${string}`\n}\n\nexport function encodeBytes<Prefix extends string>(prefix: Prefix, bytes: Uint8Array): `${Prefix}1${string}` {\n return encodeBech32(prefix, bytes)\n}\n\nexport function nprofileEncode(profile: ProfilePointer): NProfile {\n let data = encodeTLV({\n 0: [hexToBytes(profile.pubkey)],\n 1: (profile.relays || []).map(url => utf8Encoder.encode(url)),\n })\n return encodeBech32('nprofile', data)\n}\n\nexport function neventEncode(event: EventPointer): NEvent {\n let kindArray\n if (event.kind !== undefined) {\n kindArray = integerToUint8Array(event.kind)\n }\n\n let data = encodeTLV({\n 0: [hexToBytes(event.id)],\n 1: (event.relays || []).map(url => utf8Encoder.encode(url)),\n 2: event.author ? [hexToBytes(event.author)] : [],\n 3: kindArray ? [new Uint8Array(kindArray)] : [],\n })\n\n return encodeBech32('nevent', data)\n}\n\nexport function naddrEncode(addr: AddressPointer): NAddr {\n let kind = new ArrayBuffer(4)\n new DataView(kind).setUint32(0, addr.kind, false)\n\n let data = encodeTLV({\n 0: [utf8Encoder.encode(addr.identifier)],\n 1: (addr.relays || []).map(url => utf8Encoder.encode(url)),\n 2: [hexToBytes(addr.pubkey)],\n 3: [new Uint8Array(kind)],\n })\n return encodeBech32('naddr', data)\n}\n\nfunction encodeTLV(tlv: TLV): Uint8Array {\n let entries: Uint8Array[] = []\n\n Object.entries(tlv)\n .reverse()\n .forEach(([t, vs]) => {\n vs.forEach(v => {\n let entry = new Uint8Array(v.length + 2)\n entry.set([parseInt(t)], 0)\n entry.set([v.length], 1)\n entry.set(v, 2)\n entries.push(entry)\n })\n })\n\n return concatBytes(...entries)\n}\n", "/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n", "import { decode, type AddressPointer, type ProfilePointer, type EventPointer } from './nip19.ts'\n\nimport type { Event } from './core.ts'\n\ntype Reference = {\n text: string\n profile?: ProfilePointer\n event?: EventPointer\n address?: AddressPointer\n}\n\nconst mentionRegex = /\\bnostr:((note|npub|naddr|nevent|nprofile)1\\w+)\\b|#\\[(\\d+)\\]/g\n\nexport function parseReferences(evt: Event): Reference[] {\n let references: Reference[] = []\n for (let ref of evt.content.matchAll(mentionRegex)) {\n if (ref[2]) {\n // it's a NIP-27 mention\n try {\n let { type, data } = decode(ref[1])\n switch (type) {\n case 'npub': {\n references.push({\n text: ref[0],\n profile: { pubkey: data as string, relays: [] },\n })\n break\n }\n case 'nprofile': {\n references.push({\n text: ref[0],\n profile: data as ProfilePointer,\n })\n break\n }\n case 'note': {\n references.push({\n text: ref[0],\n event: { id: data as string, relays: [] },\n })\n break\n }\n case 'nevent': {\n references.push({\n text: ref[0],\n event: data as EventPointer,\n })\n break\n }\n case 'naddr': {\n references.push({\n text: ref[0],\n address: data as AddressPointer,\n })\n break\n }\n }\n } catch (err) {\n /***/\n }\n } else if (ref[3]) {\n // it's a NIP-10 mention\n let idx = parseInt(ref[3], 10)\n let tag = evt.tags[idx]\n if (!tag) continue\n\n switch (tag[0]) {\n case 'p': {\n references.push({\n text: ref[0],\n profile: { pubkey: tag[1], relays: tag[2] ? [tag[2]] : [] },\n })\n break\n }\n case 'e': {\n references.push({\n text: ref[0],\n event: { id: tag[1], relays: tag[2] ? [tag[2]] : [] },\n })\n break\n }\n case 'a': {\n try {\n let [kind, pubkey, identifier] = tag[1].split(':')\n references.push({\n text: ref[0],\n address: {\n identifier,\n pubkey,\n kind: parseInt(kind, 10),\n relays: tag[2] ? [tag[2]] : [],\n },\n })\n } catch (err) {\n /***/\n }\n break\n }\n }\n }\n }\n\n return references\n}\n", "import { hexToBytes, randomBytes } from '@noble/hashes/utils.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { cbc } from '@noble/ciphers/aes.js'\nimport { base64 } from '@scure/base'\n\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nexport function encrypt(secretKey: string | Uint8Array, pubkey: string, text: string): string {\n const privkey: Uint8Array = secretKey instanceof Uint8Array ? secretKey : hexToBytes(secretKey)\n const key = secp256k1.getSharedSecret(privkey, hexToBytes('02' + pubkey))\n const normalizedKey = getNormalizedX(key)\n\n let iv = Uint8Array.from(randomBytes(16))\n let plaintext = utf8Encoder.encode(text)\n\n let ciphertext = cbc(normalizedKey, iv).encrypt(plaintext)\n\n let ctb64 = base64.encode(new Uint8Array(ciphertext))\n let ivb64 = base64.encode(new Uint8Array(iv.buffer))\n\n return `${ctb64}?iv=${ivb64}`\n}\n\nexport function decrypt(secretKey: string | Uint8Array, pubkey: string, data: string): string {\n const privkey: Uint8Array = secretKey instanceof Uint8Array ? secretKey : hexToBytes(secretKey)\n let [ctb64, ivb64] = data.split('?iv=')\n let key = secp256k1.getSharedSecret(privkey, hexToBytes('02' + pubkey))\n let normalizedKey = getNormalizedX(key)\n\n let iv = base64.decode(ivb64)\n let ciphertext = base64.decode(ctb64)\n\n let plaintext = cbc(normalizedKey, iv).decrypt(ciphertext)\n\n return utf8Decoder.decode(plaintext)\n}\n\nfunction getNormalizedX(key: Uint8Array): Uint8Array {\n return key.slice(1, 33)\n}\n", "/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is boolean. */\nexport function abool(b: boolean): void {\n if (typeof b !== 'boolean') throw new Error(`boolean expected, not ${b}`);\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\nexport type IHash = {\n (data: string | Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n// Used in micro\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return BigInt(hex === '' ? '0' : '0x' + hex); // Big Endian\n}\n\n// Used in ff1\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(bytes));\n}\n\n// Used in micro, ff1\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n return hexToBytes(n.toString(16).padStart(len * 2, '0'));\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(new Uint8Array([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Checks if two U8A use same underlying buffer and overlaps.\n * This is invalid and can corrupt data.\n */\nexport function overlapBytes(a: Uint8Array, b: Uint8Array): boolean {\n return (\n a.buffer === b.buffer && // best we can do, may fail with an obscure Proxy\n a.byteOffset < b.byteOffset + b.byteLength && // a starts before b end\n b.byteOffset < a.byteOffset + a.byteLength // b starts before a end\n );\n}\n\n/**\n * If input and output overlap and input starts before output, we will overwrite end of input before\n * we start processing it, so this is not supported for most ciphers (except chacha/salse, which designed with this)\n */\nexport function complexOverlapBytes(input: Uint8Array, output: Uint8Array): void {\n // This is very cursed. It works somehow, but I'm completely unsure,\n // reasoning about overlapping aligned windows is very hard.\n if (overlapBytes(input, output) && input.byteOffset < output.byteOffset)\n throw new Error('complex overlap of input and output is not supported');\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\n// Used in ARX only\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts: T2\n): T1 & T2 {\n if (opts == null || typeof opts !== 'object') throw new Error('options must be defined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Compares 2 uint8array-s in kinda constant time. */\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n// TODO: remove\nexport interface IHash2 {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: string | Uint8Array): this;\n // Writes digest into buf\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n destroy(): void;\n}\n\n// This will allow to re-use with composable things like packed & base encoders\n// Also, we probably can make tags composable\n\n/** Sync cipher: takes byte array and returns byte array. */\nexport type Cipher = {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array): Uint8Array;\n};\n\n/** Async cipher e.g. from built-in WebCrypto. */\nexport type AsyncCipher = {\n encrypt(plaintext: Uint8Array): Promise<Uint8Array>;\n decrypt(ciphertext: Uint8Array): Promise<Uint8Array>;\n};\n\n/** Cipher with `output` argument which can optimize by doing 1 less allocation. */\nexport type CipherWithOutput = Cipher & {\n encrypt(plaintext: Uint8Array, output?: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array, output?: Uint8Array): Uint8Array;\n};\n\n/**\n * Params are outside of return type, so it is accessible before calling constructor.\n * If function support multiple nonceLength's, we return the best one.\n */\nexport type CipherParams = {\n blockSize: number;\n nonceLength?: number;\n tagLength?: number;\n varSizeNonce?: boolean;\n};\n/** ARX cipher, like salsa or chacha. */\nexport type ARXCipher = ((\n key: Uint8Array,\n nonce: Uint8Array,\n AAD?: Uint8Array\n) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n};\nexport type CipherCons<T extends any[]> = (key: Uint8Array, ...args: T) => Cipher;\n/**\n * Wraps a cipher: validates args, ensures encrypt() can only be called once.\n * @__NO_SIDE_EFFECTS__\n */\nexport const wrapCipher = <C extends CipherCons<any>, P extends CipherParams>(\n params: P,\n constructor: C\n): C & P => {\n function wrappedCipher(key: Uint8Array, ...args: any[]): CipherWithOutput {\n // Validate key\n abytes(key, undefined, 'key');\n\n // Big-Endian hardware is rare. Just in case someone still decides to run ciphers:\n if (!isLE) throw new Error('Non little-endian hardware is not yet supported');\n\n // Validate nonce if nonceLength is present\n if (params.nonceLength !== undefined) {\n const nonce = args[0];\n abytes(nonce, params.varSizeNonce ? undefined : params.nonceLength, 'nonce');\n }\n\n // Validate AAD if tagLength present\n const tagl = params.tagLength;\n if (tagl && args[1] !== undefined) abytes(args[1], undefined, 'AAD');\n\n const cipher = constructor(key, ...args);\n const checkOutput = (fnLength: number, output?: Uint8Array) => {\n if (output !== undefined) {\n if (fnLength !== 2) throw new Error('cipher output not supported');\n abytes(output, undefined, 'output');\n }\n };\n // Create wrapped cipher with validation and single-use encryption\n let called = false;\n const wrCipher = {\n encrypt(data: Uint8Array, output?: Uint8Array) {\n if (called) throw new Error('cannot encrypt() twice with same key + nonce');\n called = true;\n abytes(data);\n checkOutput(cipher.encrypt.length, output);\n return (cipher as CipherWithOutput).encrypt(data, output);\n },\n decrypt(data: Uint8Array, output?: Uint8Array) {\n abytes(data);\n if (tagl && data.length < tagl)\n throw new Error('\"ciphertext\" expected length bigger than tagLength=' + tagl);\n checkOutput(cipher.decrypt.length, output);\n return (cipher as CipherWithOutput).decrypt(data, output);\n },\n };\n\n return wrCipher;\n }\n\n Object.assign(wrappedCipher, params);\n return wrappedCipher as C & P;\n};\n\n/** Represents salsa / chacha stream. */\nexport type XorStream = (\n key: Uint8Array,\n nonce: Uint8Array,\n data: Uint8Array,\n output?: Uint8Array,\n counter?: number\n) => Uint8Array;\n\n/**\n * By default, returns u8a of length.\n * When out is available, it checks it for validity and uses it.\n */\nexport function getOutput(\n expectedLength: number,\n out?: Uint8Array,\n onlyAligned = true\n): Uint8Array {\n if (out === undefined) return new Uint8Array(expectedLength);\n if (out.length !== expectedLength)\n throw new Error(\n '\"output\" expected Uint8Array of length ' + expectedLength + ', got: ' + out.length\n );\n if (onlyAligned && !isAligned32(out)) throw new Error('invalid output, must be aligned');\n return out;\n}\n\nexport function u64Lengths(dataLength: number, aadLength: number, isLE: boolean): Uint8Array {\n abool(isLE);\n const num = new Uint8Array(16);\n const view = createView(num);\n view.setBigUint64(0, BigInt(aadLength), isLE);\n view.setBigUint64(8, BigInt(dataLength), isLE);\n return num;\n}\n\n// Is byte array aligned to 4 byte offset (u32)?\nexport function isAligned32(bytes: Uint8Array): boolean {\n return bytes.byteOffset % 4 === 0;\n}\n\n// copy bytes to new u8a (aligned). Because Buffer.slice is broken.\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/**\n * The pseudorandom number generator doesn't wipe current state:\n * instead, it generates new one based on previous state + entropy.\n * Not reseed/rekey, since AES CTR DRBG does rekey on each randomBytes,\n * which is in fact `reseed`, since it changes counter too.\n */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\ntype RemoveNonceInner<T extends any[], Ret> = ((...args: T) => Ret) extends (\n arg0: any,\n arg1: any,\n ...rest: infer R\n) => any\n ? (key: Uint8Array, ...args: R) => Ret\n : never;\n\nexport type RemoveNonce<T extends (...args: any) => any> = RemoveNonceInner<\n Parameters<T>,\n ReturnType<T>\n>;\nexport type CipherWithNonce = ((\n key: Uint8Array,\n nonce: Uint8Array,\n ...args: any[]\n) => Cipher | AsyncCipher) & {\n nonceLength: number;\n};\n\n/**\n * Uses CSPRG for nonce, nonce injected in ciphertext.\n * For `encrypt`, a `nonceBytes`-length buffer is fetched from CSPRNG and\n * prepended to encrypted ciphertext. For `decrypt`, first `nonceBytes` of ciphertext\n * are treated as nonce.\n *\n * NOTE: Under the same key, using random nonces (e.g. `managedNonce`) with AES-GCM and ChaCha\n * should be limited to `2**23` (8M) messages to get a collision chance of `2**-50`. Stretching to * `2**32` (4B) messages, chance would become `2**-33` - still negligible, but creeping up.\n * @example\n * const gcm = managedNonce(aes.gcm);\n * const ciphr = gcm(key).encrypt(data);\n * const plain = gcm(key).decrypt(ciph);\n */\nexport function managedNonce<T extends CipherWithNonce>(\n fn: T,\n randomBytes_: typeof randomBytes = randomBytes\n): RemoveNonce<T> {\n const { nonceLength } = fn;\n anumber(nonceLength);\n const addNonce = (nonce: Uint8Array, ciphertext: Uint8Array) => {\n const out = concatBytes(nonce, ciphertext);\n ciphertext.fill(0);\n return out;\n };\n // NOTE: we cannot support DST here, it would be mistake:\n // - we don't know how much dst length cipher requires\n // - nonce may unalign dst and break everything\n // - we create new u8a anyway (concatBytes)\n // - previously we passed all args to cipher, but that was mistake!\n return ((key: Uint8Array, ...args: any[]): any => ({\n encrypt(plaintext: Uint8Array) {\n abytes(plaintext);\n const nonce = randomBytes_(nonceLength);\n const encrypted = fn(key, nonce, ...args).encrypt(plaintext);\n // @ts-ignore\n if (encrypted instanceof Promise) return encrypted.then((ct) => addNonce(nonce, ct));\n return addNonce(nonce, encrypted);\n },\n decrypt(ciphertext: Uint8Array) {\n abytes(ciphertext);\n const nonce = ciphertext.subarray(0, nonceLength);\n const decrypted = ciphertext.subarray(nonceLength);\n return fn(key, nonce, ...args).decrypt(decrypted);\n },\n })) as RemoveNonce<T>;\n}\n\n// workaround for TS 5.9 language mess:\nexport type Uint8ArrayBuffer = ReturnType<typeof Uint8Array.of>;\n", "/**\n * [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)\n * a.k.a. Advanced Encryption Standard\n * is a variant of Rijndael block cipher, standardized by NIST in 2001.\n * We provide the fastest available pure JS implementation.\n *\n * `cipher = encrypt(block, key)`\n *\n * Data is split into 128-bit blocks. Encrypted in 10/12/14 rounds (128/192/256 bits). In every round:\n * 1. **S-box**, table substitution\n * 2. **Shift rows**, cyclic shift left of all rows of data array\n * 3. **Mix columns**, multiplying every column by fixed polynomial\n * 4. **Add round key**, round_key xor i-th column of array\n *\n * Check out [FIPS-197](https://csrc.nist.gov/files/pubs/fips/197/final/docs/fips-197.pdf),\n * [NIST 800-38G](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38G.pdf)\n * and [original proposal](https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf)\n * @module\n */\nimport { ghash, polyval } from './_polyval.ts';\n// prettier-ignore\nimport {\n abytes, anumber, clean, complexOverlapBytes, concatBytes,\n copyBytes, createView, equalBytes, getOutput, isAligned32, overlapBytes,\n u32, u64Lengths, u8, wrapCipher,\n type Cipher, type CipherWithOutput, type PRG, type Uint8ArrayBuffer\n} from './utils.ts';\n\nconst BLOCK_SIZE = 16;\nconst BLOCK_SIZE32 = 4;\nconst EMPTY_BLOCK = /* @__PURE__ */ new Uint8Array(BLOCK_SIZE);\nconst ONE_BLOCK = /* @__PURE__ */ Uint8Array.from([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n]);\nconst POLY = 0x11b; // 1 + x + x**3 + x**4 + x**8\n\nfunction validateKeyLength(key: Uint8Array) {\n if (![16, 24, 32].includes(key.length))\n throw new Error('\"aes key\" expected Uint8Array of length 16/24/32, got length=' + key.length);\n}\n\n// TODO: remove multiplication, binary ops only\nfunction mul2(n: number) {\n return (n << 1) ^ (POLY & -(n >> 7));\n}\n\nfunction mul(a: number, b: number) {\n let res = 0;\n for (; b > 0; b >>= 1) {\n // Montgomery ladder\n res ^= a & -(b & 1); // if (b&1) res ^=a (but const-time).\n a = mul2(a); // a = 2*a\n }\n return res;\n}\n\n// Increments bigint with wrap around\n// NOTE: we cannot use u32 here since it may overflow on carry!\nconst incBytes = (data: Uint8Array, isLE: boolean, carry: number = 1) => {\n if (!Number.isSafeInteger(carry)) throw new Error('incBytes: wrong carry ' + carry);\n abytes(data);\n for (let i = 0; i < data.length; i++) {\n const pos = !isLE ? data.length - 1 - i : i;\n carry = (carry + (data[pos] & 0xff)) | 0;\n data[pos] = carry & 0xff;\n carry >>>= 8;\n }\n};\n\n// AES S-box is generated using finite field inversion,\n// an affine transform, and xor of a constant 0x63.\nconst sbox = /* @__PURE__ */ (() => {\n const t = new Uint8Array(256);\n for (let i = 0, x = 1; i < 256; i++, x ^= mul2(x)) t[i] = x;\n const box = new Uint8Array(256);\n box[0] = 0x63; // first elm\n for (let i = 0; i < 255; i++) {\n let x = t[255 - i];\n x |= x << 8;\n box[t[i]] = (x ^ (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7) ^ 0x63) & 0xff;\n }\n clean(t);\n return box;\n})();\n\n// Inverted S-box\nconst invSbox = /* @__PURE__ */ sbox.map((_, j) => sbox.indexOf(j));\n\n// Rotate u32 by 8\nconst rotr32_8 = (n: number) => (n << 24) | (n >>> 8);\nconst rotl32_8 = (n: number) => (n << 8) | (n >>> 24);\n// The byte swap operation for uint32 (LE<->BE)\nconst byteSwap = (word: number) =>\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff);\n\n// T-table is optimization suggested in 5.2 of original proposal (missed from FIPS-197). Changes:\n// - LE instead of BE\n// - bigger tables: T0 and T1 are merged into T01 table and T2 & T3 into T23;\n// so index is u16, instead of u8. This speeds up things, unexpectedly\nfunction genTtable(sbox: Uint8Array, fn: (n: number) => number) {\n if (sbox.length !== 256) throw new Error('Wrong sbox length');\n const T0 = new Uint32Array(256).map((_, j) => fn(sbox[j]));\n const T1 = T0.map(rotl32_8);\n const T2 = T1.map(rotl32_8);\n const T3 = T2.map(rotl32_8);\n const T01 = new Uint32Array(256 * 256);\n const T23 = new Uint32Array(256 * 256);\n const sbox2 = new Uint16Array(256 * 256);\n for (let i = 0; i < 256; i++) {\n for (let j = 0; j < 256; j++) {\n const idx = i * 256 + j;\n T01[idx] = T0[i] ^ T1[j];\n T23[idx] = T2[i] ^ T3[j];\n sbox2[idx] = (sbox[i] << 8) | sbox[j];\n }\n }\n return { sbox, sbox2, T0, T1, T2, T3, T01, T23 };\n}\n\nconst tableEncoding = /* @__PURE__ */ genTtable(\n sbox,\n (s: number) => (mul(s, 3) << 24) | (s << 16) | (s << 8) | mul(s, 2)\n);\nconst tableDecoding = /* @__PURE__ */ genTtable(\n invSbox,\n (s) => (mul(s, 11) << 24) | (mul(s, 13) << 16) | (mul(s, 9) << 8) | mul(s, 14)\n);\n\nconst xPowers = /* @__PURE__ */ (() => {\n const p = new Uint8Array(16);\n for (let i = 0, x = 1; i < 16; i++, x = mul2(x)) p[i] = x;\n return p;\n})();\n\n/** Key expansion used in CTR. */\nfunction expandKeyLE(key: Uint8Array): Uint32Array {\n abytes(key);\n const len = key.length;\n validateKeyLength(key);\n const { sbox2 } = tableEncoding;\n const toClean = [];\n if (!isAligned32(key)) toClean.push((key = copyBytes(key)));\n const k32 = u32(key);\n const Nk = k32.length;\n const subByte = (n: number) => applySbox(sbox2, n, n, n, n);\n const xk = new Uint32Array(len + 28); // expanded key\n xk.set(k32);\n // 4.3.1 Key expansion\n for (let i = Nk; i < xk.length; i++) {\n let t = xk[i - 1];\n if (i % Nk === 0) t = subByte(rotr32_8(t)) ^ xPowers[i / Nk - 1];\n else if (Nk > 6 && i % Nk === 4) t = subByte(t);\n xk[i] = xk[i - Nk] ^ t;\n }\n clean(...toClean);\n return xk;\n}\n\nfunction expandKeyDecLE(key: Uint8Array): Uint32Array {\n const encKey = expandKeyLE(key);\n const xk = encKey.slice();\n const Nk = encKey.length;\n const { sbox2 } = tableEncoding;\n const { T0, T1, T2, T3 } = tableDecoding;\n // Inverse key by chunks of 4 (rounds)\n for (let i = 0; i < Nk; i += 4) {\n for (let j = 0; j < 4; j++) xk[i + j] = encKey[Nk - i - 4 + j];\n }\n clean(encKey);\n // apply InvMixColumn except first & last round\n for (let i = 4; i < Nk - 4; i++) {\n const x = xk[i];\n const w = applySbox(sbox2, x, x, x, x);\n xk[i] = T0[w & 0xff] ^ T1[(w >>> 8) & 0xff] ^ T2[(w >>> 16) & 0xff] ^ T3[w >>> 24];\n }\n return xk;\n}\n\n// Apply tables\nfunction apply0123(\n T01: Uint32Array,\n T23: Uint32Array,\n s0: number,\n s1: number,\n s2: number,\n s3: number\n) {\n return (\n T01[((s0 << 8) & 0xff00) | ((s1 >>> 8) & 0xff)] ^\n T23[((s2 >>> 8) & 0xff00) | ((s3 >>> 24) & 0xff)]\n );\n}\n\nfunction applySbox(sbox2: Uint16Array, s0: number, s1: number, s2: number, s3: number) {\n return (\n sbox2[(s0 & 0xff) | (s1 & 0xff00)] |\n (sbox2[((s2 >>> 16) & 0xff) | ((s3 >>> 16) & 0xff00)] << 16)\n );\n}\n\nfunction encrypt(\n xk: Uint32Array,\n s0: number,\n s1: number,\n s2: number,\n s3: number\n): { s0: number; s1: number; s2: number; s3: number } {\n const { sbox2, T01, T23 } = tableEncoding;\n let k = 0;\n ((s0 ^= xk[k++]), (s1 ^= xk[k++]), (s2 ^= xk[k++]), (s3 ^= xk[k++]));\n const rounds = xk.length / 4 - 2;\n for (let i = 0; i < rounds; i++) {\n const t0 = xk[k++] ^ apply0123(T01, T23, s0, s1, s2, s3);\n const t1 = xk[k++] ^ apply0123(T01, T23, s1, s2, s3, s0);\n const t2 = xk[k++] ^ apply0123(T01, T23, s2, s3, s0, s1);\n const t3 = xk[k++] ^ apply0123(T01, T23, s3, s0, s1, s2);\n ((s0 = t0), (s1 = t1), (s2 = t2), (s3 = t3));\n }\n // last round (without mixcolumns, so using SBOX2 table)\n const t0 = xk[k++] ^ applySbox(sbox2, s0, s1, s2, s3);\n const t1 = xk[k++] ^ applySbox(sbox2, s1, s2, s3, s0);\n const t2 = xk[k++] ^ applySbox(sbox2, s2, s3, s0, s1);\n const t3 = xk[k++] ^ applySbox(sbox2, s3, s0, s1, s2);\n return { s0: t0, s1: t1, s2: t2, s3: t3 };\n}\n\n// Can't be merged with encrypt: arg positions for apply0123 / applySbox are different\nfunction decrypt(\n xk: Uint32Array,\n s0: number,\n s1: number,\n s2: number,\n s3: number\n): {\n s0: number;\n s1: number;\n s2: number;\n s3: number;\n} {\n const { sbox2, T01, T23 } = tableDecoding;\n let k = 0;\n ((s0 ^= xk[k++]), (s1 ^= xk[k++]), (s2 ^= xk[k++]), (s3 ^= xk[k++]));\n const rounds = xk.length / 4 - 2;\n for (let i = 0; i < rounds; i++) {\n const t0 = xk[k++] ^ apply0123(T01, T23, s0, s3, s2, s1);\n const t1 = xk[k++] ^ apply0123(T01, T23, s1, s0, s3, s2);\n const t2 = xk[k++] ^ apply0123(T01, T23, s2, s1, s0, s3);\n const t3 = xk[k++] ^ apply0123(T01, T23, s3, s2, s1, s0);\n ((s0 = t0), (s1 = t1), (s2 = t2), (s3 = t3));\n }\n // Last round\n const t0: number = xk[k++] ^ applySbox(sbox2, s0, s3, s2, s1);\n const t1: number = xk[k++] ^ applySbox(sbox2, s1, s0, s3, s2);\n const t2: number = xk[k++] ^ applySbox(sbox2, s2, s1, s0, s3);\n const t3: number = xk[k++] ^ applySbox(sbox2, s3, s2, s1, s0);\n return { s0: t0, s1: t1, s2: t2, s3: t3 };\n}\n\n// TODO: investigate merging with ctr32\nfunction ctrCounter(\n xk: Uint32Array,\n nonce: Uint8Array,\n src: Uint8Array,\n dst?: Uint8Array\n): Uint8Array {\n abytes(nonce, BLOCK_SIZE, 'nonce');\n abytes(src);\n const srcLen = src.length;\n dst = getOutput(srcLen, dst);\n complexOverlapBytes(src, dst);\n const ctr = nonce;\n const c32 = u32(ctr);\n // Fill block (empty, ctr=0)\n let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);\n const src32 = u32(src);\n const dst32 = u32(dst);\n // process blocks\n for (let i = 0; i + 4 <= src32.length; i += 4) {\n dst32[i + 0] = src32[i + 0] ^ s0;\n dst32[i + 1] = src32[i + 1] ^ s1;\n dst32[i + 2] = src32[i + 2] ^ s2;\n dst32[i + 3] = src32[i + 3] ^ s3;\n incBytes(ctr, false, 1); // Full 128 bit counter with wrap around\n ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));\n }\n // leftovers (less than block)\n // It's possible to handle > u32 fast, but is it worth it?\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n const b32 = new Uint32Array([s0, s1, s2, s3]);\n const buf = u8(b32);\n for (let i = start, pos = 0; i < srcLen; i++, pos++) dst[i] = src[i] ^ buf[pos];\n clean(b32);\n }\n return dst;\n}\n\n// AES CTR with overflowing 32 bit counter\n// It's possible to do 32le significantly simpler (and probably faster) by using u32.\n// But, we need both, and perf bottleneck is in ghash anyway.\nfunction ctr32(\n xk: Uint32Array,\n isLE: boolean,\n nonce: Uint8Array,\n src: Uint8Array,\n dst?: Uint8Array\n): Uint8Array {\n abytes(nonce, BLOCK_SIZE, 'nonce');\n abytes(src);\n dst = getOutput(src.length, dst);\n const ctr = nonce; // write new value to nonce, so it can be re-used\n const c32 = u32(ctr);\n const view = createView(ctr);\n const src32 = u32(src);\n const dst32 = u32(dst);\n const ctrPos = isLE ? 0 : 12;\n const srcLen = src.length;\n // Fill block (empty, ctr=0)\n let ctrNum = view.getUint32(ctrPos, isLE); // read current counter value\n let { s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]);\n // process blocks\n for (let i = 0; i + 4 <= src32.length; i += 4) {\n dst32[i + 0] = src32[i + 0] ^ s0;\n dst32[i + 1] = src32[i + 1] ^ s1;\n dst32[i + 2] = src32[i + 2] ^ s2;\n dst32[i + 3] = src32[i + 3] ^ s3;\n ctrNum = (ctrNum + 1) >>> 0; // u32 wrap\n view.setUint32(ctrPos, ctrNum, isLE);\n ({ s0, s1, s2, s3 } = encrypt(xk, c32[0], c32[1], c32[2], c32[3]));\n }\n // leftovers (less than a block)\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n const b32 = new Uint32Array([s0, s1, s2, s3]);\n const buf = u8(b32);\n for (let i = start, pos = 0; i < srcLen; i++, pos++) dst[i] = src[i] ^ buf[pos];\n clean(b32);\n }\n return dst;\n}\n\n/**\n * **CTR** (Counter Mode): Turns a block cipher into a stream cipher using a counter and IV (nonce).\n * Efficient and parallelizable. Requires a unique nonce per encryption. Unauthenticated: needs MAC.\n */\nexport const ctr: ((key: Uint8Array, nonce: Uint8Array) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 16 },\n function aesctr(key: Uint8Array, nonce: Uint8Array): CipherWithOutput {\n function processCtr(buf: Uint8Array, dst?: Uint8Array) {\n abytes(buf);\n if (dst !== undefined) {\n abytes(dst);\n if (!isAligned32(dst)) throw new Error('unaligned destination');\n }\n const xk = expandKeyLE(key);\n const n = copyBytes(nonce); // align + avoid changing\n const toClean = [xk, n];\n if (!isAligned32(buf)) toClean.push((buf = copyBytes(buf)));\n const out = ctrCounter(xk, n, buf, dst);\n clean(...toClean);\n return out;\n }\n return {\n encrypt: (plaintext: Uint8Array, dst?: Uint8Array) => processCtr(plaintext, dst),\n decrypt: (ciphertext: Uint8Array, dst?: Uint8Array) => processCtr(ciphertext, dst),\n };\n }\n);\n\nfunction validateBlockDecrypt(data: Uint8Array) {\n abytes(data);\n if (data.length % BLOCK_SIZE !== 0) {\n throw new Error(\n 'aes-(cbc/ecb).decrypt ciphertext should consist of blocks with size ' + BLOCK_SIZE\n );\n }\n}\n\nfunction validateBlockEncrypt(plaintext: Uint8Array, pcks5: boolean, dst?: Uint8Array) {\n abytes(plaintext);\n let outLen = plaintext.length;\n const remaining = outLen % BLOCK_SIZE;\n if (!pcks5 && remaining !== 0)\n throw new Error('aec/(cbc-ecb): unpadded plaintext with disabled padding');\n if (!isAligned32(plaintext)) plaintext = copyBytes(plaintext);\n const b = u32(plaintext);\n if (pcks5) {\n let left = BLOCK_SIZE - remaining;\n if (!left) left = BLOCK_SIZE; // if no bytes left, create empty padding block\n outLen = outLen + left;\n }\n dst = getOutput(outLen, dst);\n complexOverlapBytes(plaintext, dst);\n const o = u32(dst);\n return { b, o, out: dst };\n}\n\nfunction validatePCKS(data: Uint8Array, pcks5: boolean) {\n if (!pcks5) return data;\n const len = data.length;\n if (!len) throw new Error('aes/pcks5: empty ciphertext not allowed');\n const lastByte = data[len - 1];\n if (lastByte <= 0 || lastByte > 16) throw new Error('aes/pcks5: wrong padding');\n const out = data.subarray(0, -lastByte);\n for (let i = 0; i < lastByte; i++)\n if (data[len - i - 1] !== lastByte) throw new Error('aes/pcks5: wrong padding');\n return out;\n}\n\nfunction padPCKS(left: Uint8Array) {\n const tmp = new Uint8Array(16);\n const tmp32 = u32(tmp);\n tmp.set(left);\n const paddingByte = BLOCK_SIZE - left.length;\n for (let i = BLOCK_SIZE - paddingByte; i < BLOCK_SIZE; i++) tmp[i] = paddingByte;\n return tmp32;\n}\n\n/** Options for ECB and CBC. */\nexport type BlockOpts = { disablePadding?: boolean };\n\n/**\n * **ECB** (Electronic Codebook): Deterministic encryption; identical plaintext blocks yield\n * identical ciphertexts. Not secure due to pattern leakage.\n * See [AES Penguin](https://words.filippo.io/the-ecb-penguin/).\n */\nexport const ecb: ((key: Uint8Array, opts?: BlockOpts) => CipherWithOutput) & {\n blockSize: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16 },\n function aesecb(key: Uint8Array, opts: BlockOpts = {}): CipherWithOutput {\n const pcks5 = !opts.disablePadding;\n return {\n encrypt(plaintext: Uint8Array, dst?: Uint8Array) {\n const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);\n const xk = expandKeyLE(key);\n let i = 0;\n for (; i + 4 <= b.length; ) {\n const { s0, s1, s2, s3 } = encrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n if (pcks5) {\n const tmp32 = padPCKS(plaintext.subarray(i * 4));\n const { s0, s1, s2, s3 } = encrypt(xk, tmp32[0], tmp32[1], tmp32[2], tmp32[3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(xk);\n return _out;\n },\n decrypt(ciphertext: Uint8Array, dst?: Uint8Array) {\n validateBlockDecrypt(ciphertext);\n const xk = expandKeyDecLE(key);\n dst = getOutput(ciphertext.length, dst);\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n complexOverlapBytes(ciphertext, dst);\n const b = u32(ciphertext);\n const o = u32(dst);\n for (let i = 0; i + 4 <= b.length; ) {\n const { s0, s1, s2, s3 } = decrypt(xk, b[i + 0], b[i + 1], b[i + 2], b[i + 3]);\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(...toClean);\n return validatePCKS(dst, pcks5);\n },\n };\n }\n);\n\n/**\n * **CBC** (Cipher Block Chaining): Each plaintext block is XORed with the\n * previous block of ciphertext before encryption.\n * Hard to use: requires proper padding and an IV. Unauthenticated: needs MAC.\n */\nexport const cbc: ((key: Uint8Array, iv: Uint8Array, opts?: BlockOpts) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 16 },\n function aescbc(key: Uint8Array, iv: Uint8Array, opts: BlockOpts = {}): CipherWithOutput {\n const pcks5 = !opts.disablePadding;\n return {\n encrypt(plaintext: Uint8Array, dst?: Uint8Array) {\n const xk = expandKeyLE(key);\n const { b, o, out: _out } = validateBlockEncrypt(plaintext, pcks5, dst);\n let _iv = iv;\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(_iv)) toClean.push((_iv = copyBytes(_iv)));\n const n32 = u32(_iv);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n let i = 0;\n for (; i + 4 <= b.length; ) {\n ((s0 ^= b[i + 0]), (s1 ^= b[i + 1]), (s2 ^= b[i + 2]), (s3 ^= b[i + 3]));\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n if (pcks5) {\n const tmp32 = padPCKS(plaintext.subarray(i * 4));\n ((s0 ^= tmp32[0]), (s1 ^= tmp32[1]), (s2 ^= tmp32[2]), (s3 ^= tmp32[3]));\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n ((o[i++] = s0), (o[i++] = s1), (o[i++] = s2), (o[i++] = s3));\n }\n clean(...toClean);\n return _out;\n },\n decrypt(ciphertext: Uint8Array, dst?: Uint8Array) {\n validateBlockDecrypt(ciphertext);\n const xk = expandKeyDecLE(key);\n let _iv = iv;\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(_iv)) toClean.push((_iv = copyBytes(_iv)));\n const n32 = u32(_iv);\n dst = getOutput(ciphertext.length, dst);\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n complexOverlapBytes(ciphertext, dst);\n const b = u32(ciphertext);\n const o = u32(dst);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n for (let i = 0; i + 4 <= b.length; ) {\n // prettier-ignore\n const ps0 = s0, ps1 = s1, ps2 = s2, ps3 = s3;\n ((s0 = b[i + 0]), (s1 = b[i + 1]), (s2 = b[i + 2]), (s3 = b[i + 3]));\n const { s0: o0, s1: o1, s2: o2, s3: o3 } = decrypt(xk, s0, s1, s2, s3);\n ((o[i++] = o0 ^ ps0), (o[i++] = o1 ^ ps1), (o[i++] = o2 ^ ps2), (o[i++] = o3 ^ ps3));\n }\n clean(...toClean);\n return validatePCKS(dst, pcks5);\n },\n };\n }\n);\n\n/**\n * CFB: Cipher Feedback Mode. The input for the block cipher is the previous cipher output.\n * Unauthenticated: needs MAC.\n */\nexport const cfb: ((key: Uint8Array, iv: Uint8Array) => CipherWithOutput) & {\n blockSize: number;\n nonceLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 16 },\n function aescfb(key: Uint8Array, iv: Uint8Array): CipherWithOutput {\n function processCfb(src: Uint8Array, isEncrypt: boolean, dst?: Uint8Array) {\n abytes(src);\n const srcLen = src.length;\n dst = getOutput(srcLen, dst);\n if (overlapBytes(src, dst)) throw new Error('overlapping src and dst not supported.');\n const xk = expandKeyLE(key);\n let _iv = iv;\n const toClean: (Uint8Array | Uint32Array)[] = [xk];\n if (!isAligned32(_iv)) toClean.push((_iv = copyBytes(_iv)));\n if (!isAligned32(src)) toClean.push((src = copyBytes(src)));\n const src32 = u32(src);\n const dst32 = u32(dst);\n const next32 = isEncrypt ? dst32 : src32;\n const n32 = u32(_iv);\n // prettier-ignore\n let s0 = n32[0], s1 = n32[1], s2 = n32[2], s3 = n32[3];\n for (let i = 0; i + 4 <= src32.length; ) {\n const { s0: e0, s1: e1, s2: e2, s3: e3 } = encrypt(xk, s0, s1, s2, s3);\n dst32[i + 0] = src32[i + 0] ^ e0;\n dst32[i + 1] = src32[i + 1] ^ e1;\n dst32[i + 2] = src32[i + 2] ^ e2;\n dst32[i + 3] = src32[i + 3] ^ e3;\n ((s0 = next32[i++]), (s1 = next32[i++]), (s2 = next32[i++]), (s3 = next32[i++]));\n }\n // leftovers (less than block)\n const start = BLOCK_SIZE * Math.floor(src32.length / BLOCK_SIZE32);\n if (start < srcLen) {\n ({ s0, s1, s2, s3 } = encrypt(xk, s0, s1, s2, s3));\n const buf = u8(new Uint32Array([s0, s1, s2, s3]));\n for (let i = start, pos = 0; i < srcLen; i++, pos++) dst[i] = src[i] ^ buf[pos];\n clean(buf);\n }\n clean(...toClean);\n return dst;\n }\n return {\n encrypt: (plaintext: Uint8Array, dst?: Uint8Array) => processCfb(plaintext, true, dst),\n decrypt: (ciphertext: Uint8Array, dst?: Uint8Array) => processCfb(ciphertext, false, dst),\n };\n }\n);\n\n// TODO: merge with chacha, however gcm has bitLen while chacha has byteLen\nfunction computeTag(\n fn: typeof ghash,\n isLE: boolean,\n key: Uint8Array,\n data: Uint8Array,\n AAD?: Uint8Array\n) {\n const aadLength = AAD ? AAD.length : 0;\n const h = fn.create(key, data.length + aadLength);\n if (AAD) h.update(AAD);\n const num = u64Lengths(8 * data.length, 8 * aadLength, isLE);\n h.update(data);\n h.update(num);\n const res = h.digest();\n clean(num);\n return res;\n}\n\n/**\n * **GCM** (Galois/Counter Mode): Combines CTR mode with polynomial MAC. Efficient and widely used.\n * Not perfect:\n * a) conservative key wear-out is `2**32` (4B) msgs.\n * b) key wear-out under random nonces is even smaller: `2**23` (8M) messages for `2**-50` chance.\n * c) MAC can be forged: see Poly1305 documentation.\n */\nexport const gcm: ((key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array) => Cipher) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n varSizeNonce: true;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 12, tagLength: 16, varSizeNonce: true },\n function aesgcm(key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): Cipher {\n // NIST 800-38d doesn't enforce minimum nonce length.\n // We enforce 8 bytes for compat with openssl.\n // 12 bytes are recommended. More than 12 bytes would be converted into 12.\n if (nonce.length < 8) throw new Error('aes/gcm: invalid nonce length');\n const tagLength = 16;\n function _computeTag(authKey: Uint8Array, tagMask: Uint8Array, data: Uint8Array) {\n const tag = computeTag(ghash, false, authKey, data, AAD);\n for (let i = 0; i < tagMask.length; i++) tag[i] ^= tagMask[i];\n return tag;\n }\n function deriveKeys() {\n const xk = expandKeyLE(key);\n const authKey = EMPTY_BLOCK.slice();\n const counter = EMPTY_BLOCK.slice();\n ctr32(xk, false, counter, counter, authKey);\n // NIST 800-38d, page 15: different behavior for 96-bit and non-96-bit nonces\n if (nonce.length === 12) {\n counter.set(nonce);\n } else {\n const nonceLen = EMPTY_BLOCK.slice();\n const view = createView(nonceLen);\n view.setBigUint64(8, BigInt(nonce.length * 8), false);\n // ghash(nonce || u64be(0) || u64be(nonceLen*8))\n const g = ghash.create(authKey).update(nonce).update(nonceLen);\n g.digestInto(counter); // digestInto doesn't trigger '.destroy'\n g.destroy();\n }\n const tagMask = ctr32(xk, false, counter, EMPTY_BLOCK);\n return { xk, authKey, counter, tagMask };\n }\n return {\n encrypt(plaintext: Uint8Array) {\n const { xk, authKey, counter, tagMask } = deriveKeys();\n const out = new Uint8Array(plaintext.length + tagLength);\n const toClean: (Uint8Array | Uint32Array)[] = [xk, authKey, counter, tagMask];\n if (!isAligned32(plaintext)) toClean.push((plaintext = copyBytes(plaintext)));\n ctr32(xk, false, counter, plaintext, out.subarray(0, plaintext.length));\n const tag = _computeTag(authKey, tagMask, out.subarray(0, out.length - tagLength));\n toClean.push(tag);\n out.set(tag, plaintext.length);\n clean(...toClean);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n const { xk, authKey, counter, tagMask } = deriveKeys();\n const toClean: (Uint8Array | Uint32Array)[] = [xk, authKey, tagMask, counter];\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = _computeTag(authKey, tagMask, data);\n toClean.push(tag);\n if (!equalBytes(tag, passedTag)) throw new Error('aes/gcm: invalid ghash tag');\n const out = ctr32(xk, false, counter, data);\n clean(...toClean);\n return out;\n },\n };\n }\n);\n\nconst limit = (name: string, min: number, max: number) => (value: number) => {\n if (!Number.isSafeInteger(value) || min > value || value > max) {\n const minmax = '[' + min + '..' + max + ']';\n throw new Error('' + name + ': expected value in range ' + minmax + ', got ' + value);\n }\n};\n\n/**\n * **SIV** (Synthetic IV): GCM with nonce-misuse resistance.\n * Repeating nonces reveal only the fact plaintexts are identical.\n * Also suffers from GCM issues: key wear-out limits & MAC forging.\n * See [RFC 8452](https://www.rfc-editor.org/rfc/rfc8452).\n */\nexport const gcmsiv: ((key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array) => Cipher) & {\n blockSize: number;\n nonceLength: number;\n tagLength: number;\n varSizeNonce: true;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, nonceLength: 12, tagLength: 16, varSizeNonce: true },\n function aessiv(key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): Cipher {\n const tagLength = 16;\n // From RFC 8452: Section 6\n const AAD_LIMIT = limit('AAD', 0, 2 ** 36);\n const PLAIN_LIMIT = limit('plaintext', 0, 2 ** 36);\n const NONCE_LIMIT = limit('nonce', 12, 12);\n const CIPHER_LIMIT = limit('ciphertext', 16, 2 ** 36 + 16);\n abytes(key);\n validateKeyLength(key);\n NONCE_LIMIT(nonce.length);\n if (AAD !== undefined) AAD_LIMIT(AAD.length);\n function deriveKeys() {\n const xk = expandKeyLE(key);\n const encKey = new Uint8Array(key.length);\n const authKey = new Uint8Array(16);\n const toClean: (Uint8Array | Uint32Array)[] = [xk, encKey];\n let _nonce = nonce;\n if (!isAligned32(_nonce)) toClean.push((_nonce = copyBytes(_nonce)));\n const n32 = u32(_nonce);\n // prettier-ignore\n let s0 = 0, s1 = n32[0], s2 = n32[1], s3 = n32[2];\n let counter = 0;\n for (const derivedKey of [authKey, encKey].map(u32)) {\n const d32 = u32(derivedKey);\n for (let i = 0; i < d32.length; i += 2) {\n // aes(u32le(0) || nonce)[:8] || aes(u32le(1) || nonce)[:8] ...\n const { s0: o0, s1: o1 } = encrypt(xk, s0, s1, s2, s3);\n d32[i + 0] = o0;\n d32[i + 1] = o1;\n s0 = ++counter; // increment counter inside state\n }\n }\n const res = { authKey, encKey: expandKeyLE(encKey) };\n // Cleanup\n clean(...toClean);\n return res;\n }\n function _computeTag(encKey: Uint32Array, authKey: Uint8Array, data: Uint8Array) {\n const tag = computeTag(polyval, true, authKey, data, AAD);\n // Compute the expected tag by XORing S_s and the nonce, clearing the\n // most significant bit of the last byte and encrypting with the\n // message-encryption key.\n for (let i = 0; i < 12; i++) tag[i] ^= nonce[i];\n tag[15] &= 0x7f; // Clear the highest bit\n // encrypt tag as block\n const t32 = u32(tag);\n // prettier-ignore\n let s0 = t32[0], s1 = t32[1], s2 = t32[2], s3 = t32[3];\n ({ s0, s1, s2, s3 } = encrypt(encKey, s0, s1, s2, s3));\n ((t32[0] = s0), (t32[1] = s1), (t32[2] = s2), (t32[3] = s3));\n return tag;\n }\n // actual decrypt/encrypt of message.\n function processSiv(encKey: Uint32Array, tag: Uint8Array, input: Uint8Array) {\n let block = copyBytes(tag);\n block[15] |= 0x80; // Force highest bit\n const res = ctr32(encKey, true, block, input);\n // Cleanup\n clean(block);\n return res;\n }\n return {\n encrypt(plaintext: Uint8Array) {\n PLAIN_LIMIT(plaintext.length);\n const { encKey, authKey } = deriveKeys();\n const tag = _computeTag(encKey, authKey, plaintext);\n const toClean: (Uint8Array | Uint32Array)[] = [encKey, authKey, tag];\n if (!isAligned32(plaintext)) toClean.push((plaintext = copyBytes(plaintext)));\n const out = new Uint8Array(plaintext.length + tagLength);\n out.set(tag, plaintext.length);\n out.set(processSiv(encKey, tag, plaintext));\n // Cleanup\n clean(...toClean);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n CIPHER_LIMIT(ciphertext.length);\n const tag = ciphertext.subarray(-tagLength);\n const { encKey, authKey } = deriveKeys();\n const toClean: (Uint8Array | Uint32Array)[] = [encKey, authKey];\n if (!isAligned32(ciphertext)) toClean.push((ciphertext = copyBytes(ciphertext)));\n const plaintext = processSiv(encKey, tag, ciphertext.subarray(0, -tagLength));\n const expectedTag = _computeTag(encKey, authKey, plaintext);\n toClean.push(expectedTag);\n if (!equalBytes(tag, expectedTag)) {\n clean(...toClean);\n throw new Error('invalid polyval tag');\n }\n // Cleanup\n clean(...toClean);\n return plaintext;\n },\n };\n }\n);\n\nfunction isBytes32(a: unknown): a is Uint32Array {\n return (\n a instanceof Uint32Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint32Array')\n );\n}\n\nfunction encryptBlock(xk: Uint32Array, block: Uint8Array): Uint8Array {\n abytes(block, 16, 'block');\n if (!isBytes32(xk)) throw new Error('_encryptBlock accepts result of expandKeyLE');\n const b32 = u32(block);\n let { s0, s1, s2, s3 } = encrypt(xk, b32[0], b32[1], b32[2], b32[3]);\n ((b32[0] = s0), (b32[1] = s1), (b32[2] = s2), (b32[3] = s3));\n return block;\n}\n\nfunction decryptBlock(xk: Uint32Array, block: Uint8Array): Uint8Array {\n abytes(block, 16, 'block');\n if (!isBytes32(xk)) throw new Error('_decryptBlock accepts result of expandKeyLE');\n const b32 = u32(block);\n let { s0, s1, s2, s3 } = decrypt(xk, b32[0], b32[1], b32[2], b32[3]);\n ((b32[0] = s0), (b32[1] = s1), (b32[2] = s2), (b32[3] = s3));\n return block;\n}\n\n/**\n * AES-W (base for AESKW/AESKWP).\n * Specs: [SP800-38F](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf),\n * [RFC 3394](https://www.rfc-editor.org/rfc/rfc3394),\n * [RFC 5649](https://www.rfc-editor.org/rfc/rfc5649).\n */\nconst AESW = {\n /*\n High-level pseudocode:\n ```\n A: u64 = IV\n out = []\n for (let i=0, ctr = 0; i<6; i++) {\n for (const chunk of chunks(plaintext, 8)) {\n A ^= swapEndianess(ctr++)\n [A, res] = chunks(encrypt(A || chunk), 8);\n out ||= res\n }\n }\n out = A || out\n ```\n Decrypt is the same, but reversed.\n */\n encrypt(kek: Uint8Array, out: Uint8Array) {\n // Size is limited to 4GB, otherwise ctr will overflow and we'll need to switch to bigints.\n // If you need it larger, open an issue.\n if (out.length >= 2 ** 32) throw new Error('plaintext should be less than 4gb');\n const xk = expandKeyLE(kek);\n if (out.length === 16) encryptBlock(xk, out);\n else {\n const o32 = u32(out);\n // prettier-ignore\n let a0 = o32[0], a1 = o32[1]; // A\n for (let j = 0, ctr = 1; j < 6; j++) {\n for (let pos = 2; pos < o32.length; pos += 2, ctr++) {\n const { s0, s1, s2, s3 } = encrypt(xk, a0, a1, o32[pos], o32[pos + 1]);\n // A = MSB(64, B) ^ t where t = (n*j)+i\n ((a0 = s0), (a1 = s1 ^ byteSwap(ctr)), (o32[pos] = s2), (o32[pos + 1] = s3));\n }\n }\n ((o32[0] = a0), (o32[1] = a1)); // out = A || out\n }\n xk.fill(0);\n },\n decrypt(kek: Uint8Array, out: Uint8Array) {\n if (out.length - 8 >= 2 ** 32) throw new Error('ciphertext should be less than 4gb');\n const xk = expandKeyDecLE(kek);\n const chunks = out.length / 8 - 1; // first chunk is IV\n if (chunks === 1) decryptBlock(xk, out);\n else {\n const o32 = u32(out);\n // prettier-ignore\n let a0 = o32[0], a1 = o32[1]; // A\n for (let j = 0, ctr = chunks * 6; j < 6; j++) {\n for (let pos = chunks * 2; pos >= 1; pos -= 2, ctr--) {\n a1 ^= byteSwap(ctr);\n const { s0, s1, s2, s3 } = decrypt(xk, a0, a1, o32[pos], o32[pos + 1]);\n ((a0 = s0), (a1 = s1), (o32[pos] = s2), (o32[pos + 1] = s3));\n }\n }\n ((o32[0] = a0), (o32[1] = a1));\n }\n xk.fill(0);\n },\n};\n\nconst AESKW_IV = /* @__PURE__ */ new Uint8Array(8).fill(0xa6); // A6A6A6A6A6A6A6A6\n\n/**\n * AES-KW (key-wrap). Injects static IV into plaintext, adds counter, encrypts 6 times.\n * Reduces block size from 16 to 8 bytes.\n * For padded version, use aeskwp.\n * [RFC 3394](https://www.rfc-editor.org/rfc/rfc3394/),\n * [NIST.SP.800-38F](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf).\n */\nexport const aeskw: ((kek: Uint8Array) => Cipher) & {\n blockSize: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 8 },\n (kek: Uint8Array): Cipher => ({\n encrypt(plaintext: Uint8Array) {\n if (!plaintext.length || plaintext.length % 8 !== 0)\n throw new Error('invalid plaintext length');\n if (plaintext.length === 8)\n throw new Error('8-byte keys not allowed in AESKW, use AESKWP instead');\n const out = concatBytes(AESKW_IV, plaintext);\n AESW.encrypt(kek, out);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n // ciphertext must be at least 24 bytes and a multiple of 8 bytes\n // 24 because should have at least two block (1 iv + 2).\n // Replace with 16 to enable '8-byte keys'\n if (ciphertext.length % 8 !== 0 || ciphertext.length < 3 * 8)\n throw new Error('invalid ciphertext length');\n const out = copyBytes(ciphertext);\n AESW.decrypt(kek, out);\n if (!equalBytes(out.subarray(0, 8), AESKW_IV)) throw new Error('integrity check failed');\n out.subarray(0, 8).fill(0); // ciphertext.subarray(0, 8) === IV, but we clean it anyway\n return out.subarray(8);\n },\n })\n);\n\n/*\nWe don't support 8-byte keys. The rabbit hole:\n\n- Wycheproof says: \"NIST SP 800-38F does not define the wrapping of 8 byte keys.\n RFC 3394 Section 2 on the other hand specifies that 8 byte keys are wrapped\n by directly encrypting one block with AES.\"\n - https://github.com/C2SP/wycheproof/blob/master/doc/key_wrap.md\n - \"RFC 3394 specifies in Section 2, that the input for the key wrap\n algorithm must be at least two blocks and otherwise the constant\n field and key are simply encrypted with ECB as a single block\"\n- What RFC 3394 actually says (in Section 2):\n - \"Before being wrapped, the key data is parsed into n blocks of 64 bits.\n The only restriction the key wrap algorithm places on n is that n be\n at least two\"\n - \"For key data with length less than or equal to 64 bits, the constant\n field used in this specification and the key data form a single\n 128-bit codebook input making this key wrap unnecessary.\"\n- Which means \"assert(n >= 2)\" and \"use something else for 8 byte keys\"\n- NIST SP800-38F actually prohibits 8-byte in \"5.3.1 Mandatory Limits\".\n It states that plaintext for KW should be \"2 to 2^54 -1 semiblocks\".\n- So, where does \"directly encrypt single block with AES\" come from?\n - Not RFC 3394. Pseudocode of key wrap in 2.2 explicitly uses\n loop of 6 for any code path\n - There is a weird W3C spec:\n https://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html#kw-aes128\n - This spec is outdated, as admitted by Wycheproof authors\n - There is RFC 5649 for padded key wrap, which is padding construction on\n top of AESKW. In '4.1.2' it says: \"If the padded plaintext contains exactly\n eight octets, then prepend the AIV as defined in Section 3 above to P[1] and\n encrypt the resulting 128-bit block using AES in ECB mode [Modes] with key\n K (the KEK). In this case, the output is two 64-bit blocks C[0] and C[1]:\"\n - Browser subtle crypto is actually crashes on wrapping keys less than 16 bytes:\n `Error: error:1C8000E6:Provider routines::invalid input length] { opensslErrorStack: [ 'error:030000BD:digital envelope routines::update error' ]`\n\nIn the end, seems like a bug in Wycheproof.\nThe 8-byte check can be easily disabled inside of AES_W.\n*/\n\nconst AESKWP_IV = 0xa65959a6; // single u32le value\n\n/**\n * AES-KW, but with padding and allows random keys.\n * Second u32 of IV is used as counter for length.\n * [RFC 5649](https://www.rfc-editor.org/rfc/rfc5649)\n */\nexport const aeskwp: ((kek: Uint8Array) => Cipher) & {\n blockSize: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 8 },\n (kek: Uint8Array): Cipher => ({\n encrypt(plaintext: Uint8Array) {\n if (!plaintext.length) throw new Error('invalid plaintext length');\n const padded = Math.ceil(plaintext.length / 8) * 8;\n const out = new Uint8Array(8 + padded);\n out.set(plaintext, 8);\n const out32 = u32(out);\n out32[0] = AESKWP_IV;\n out32[1] = byteSwap(plaintext.length);\n AESW.encrypt(kek, out);\n return out;\n },\n decrypt(ciphertext: Uint8Array) {\n // 16 because should have at least one block\n if (ciphertext.length < 16) throw new Error('invalid ciphertext length');\n const out = copyBytes(ciphertext);\n const o32 = u32(out);\n AESW.decrypt(kek, out);\n const len = byteSwap(o32[1]) >>> 0;\n const padded = Math.ceil(len / 8) * 8;\n if (o32[0] !== AESKWP_IV || out.length - 8 !== padded)\n throw new Error('integrity check failed');\n for (let i = len; i < padded; i++)\n if (out[8 + i] !== 0) throw new Error('integrity check failed');\n out.subarray(0, 8).fill(0); // ciphertext.subarray(0, 8) === IV, but we clean it anyway\n return out.subarray(8, 8 + len);\n },\n })\n);\n\nclass _AesCtrDRBG implements PRG {\n readonly blockLen: number;\n private key: Uint8Array;\n private nonce: Uint8Array;\n private state: Uint8Array;\n private reseedCnt: number;\n constructor(keyLen: number, seed: Uint8Array, personalization?: Uint8Array) {\n this.blockLen = ctr.blockSize;\n const keyLenBytes = keyLen / 8;\n const nonceLen = 16;\n this.state = new Uint8Array(keyLenBytes + nonceLen);\n this.key = this.state.subarray(0, keyLenBytes);\n this.nonce = this.state.subarray(keyLenBytes, keyLenBytes + nonceLen);\n this.reseedCnt = 1;\n incBytes(this.nonce, false, 1);\n this.addEntropy(seed, personalization);\n }\n private update(data?: Uint8Array) {\n // cannot re-use state here, because we will wipe current key\n ctr(this.key, this.nonce).encrypt(new Uint8Array(this.state.length), this.state);\n if (data) {\n abytes(data);\n for (let i = 0; i < data.length; i++) this.state[i] ^= data[i];\n }\n incBytes(this.nonce, false, 1);\n }\n addEntropy(seed: Uint8Array, info?: Uint8Array): void {\n abytes(seed, this.state.length, 'seed');\n const _seed = seed.slice();\n if (info) {\n abytes(info);\n if (info.length > _seed.length) throw new Error('info length is too big');\n for (let i = 0; i < info.length; i++) _seed[i] ^= info[i];\n }\n this.update(_seed);\n _seed.fill(0);\n this.reseedCnt = 1;\n }\n randomBytes(len: number, info?: Uint8Array): Uint8Array {\n anumber(len);\n if (this.reseedCnt++ >= 2 ** 48) throw new Error('entropy exhausted');\n if (info) this.update(info);\n const res = new Uint8Array(len);\n ctr(this.key, this.nonce).encrypt(res, res);\n incBytes(this.nonce, false, Math.ceil(len / this.blockLen));\n this.update(info);\n return res;\n }\n clean(): void {\n this.state.fill(0);\n this.reseedCnt = 0;\n }\n}\n\nexport type AesCtrDrbg = (seed: Uint8Array, personalization?: Uint8Array) => _AesCtrDRBG;\n\nconst createAesDrbg: (keyLen: number) => AesCtrDrbg = (keyLen) => {\n return (seed, personalization = undefined) => new _AesCtrDRBG(keyLen, seed, personalization);\n};\n\n/**\n * AES-CTR DRBG 128-bit - CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n */\nexport const rngAesCtrDrbg128: AesCtrDrbg = /* @__PURE__ */ createAesDrbg(128);\n/**\n * AES-CTR DRBG 256-bit - CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n */\nexport const rngAesCtrDrbg256: AesCtrDrbg = /* @__PURE__ */ createAesDrbg(256);\n\n//#region CMAC\n\n/**\n * Left-shift by one bit and conditionally XOR with 0x87:\n * ```\n * if MSB(L) is equal to 0\n * then K1 := L << 1;\n * else K1 := (L << 1) XOR const_Rb;\n * ```\n *\n * Specs: [RFC 4493, Section 2.3](https://www.rfc-editor.org/rfc/rfc4493.html#section-2.3),\n * [RFC 5297 Section 2.3](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.3)\n *\n * @returns modified `block` (for chaining)\n */\nfunction dbl<T extends Uint8Array>(block: T): T {\n let carry = 0;\n\n // Left shift by 1 bit\n for (let i = BLOCK_SIZE - 1; i >= 0; i--) {\n const newCarry = (block[i] & 0x80) >>> 7;\n block[i] = (block[i] << 1) | carry;\n carry = newCarry;\n }\n\n // XOR with 0x87 if there was a carry from the most significant bit\n if (carry) {\n block[BLOCK_SIZE - 1] ^= 0x87;\n }\n\n return block;\n}\n\n/**\n * `a XOR b`, running in-site on `a`.\n * @param a left operand and output\n * @param b right operand\n * @returns `a` (for chaining)\n */\nfunction xorBlock<T extends Uint8Array>(a: T, b: Uint8Array): T {\n if (a.length !== b.length) throw new Error('xorBlock: blocks must have same length');\n for (let i = 0; i < a.length; i++) {\n a[i] = a[i] ^ b[i];\n }\n return a;\n}\n\n/**\n * xorend as defined in [RFC 5297 Section 2.1](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.1).\n *\n * ```\n * leftmost(A, len(A)-len(B)) || (rightmost(A, len(B)) xor B)\n * ```\n */\nfunction xorend<T extends Uint8Array>(a: T, b: Uint8Array): T {\n if (b.length > a.length) {\n throw new Error('xorend: len(B) must be less than or equal to len(A)');\n }\n // keep leftmost part of `a` unchanged\n // and xor only the rightmost part:\n const offset = a.length - b.length;\n for (let i = 0; i < b.length; i++) {\n a[offset + i] = a[offset + i] ^ b[i];\n }\n return a;\n}\n\n/**\n * Internal CMAC class.\n */\nclass _CMAC {\n private buffer: Uint8Array;\n private destroyed: boolean;\n private k1: Uint8Array;\n private k2: Uint8Array;\n private xk: Uint32Array;\n\n constructor(key: Uint8Array) {\n abytes(key);\n validateKeyLength(key);\n this.xk = expandKeyLE(key);\n this.buffer = new Uint8Array(0);\n this.destroyed = false;\n // L = AES_encrypt(K, const_Zero)\n const L = new Uint8Array(BLOCK_SIZE);\n encryptBlock(this.xk, L);\n // Generate subkeys K1 and K2 from the main key according to\n // [RFC 4493, Section 2.3](https://www.rfc-editor.org/rfc/rfc4493.html#section-2.3)\n // K1\n this.k1 = dbl(L);\n this.k2 = dbl(new Uint8Array(this.k1));\n }\n\n update(data: Uint8Array): _CMAC {\n const { destroyed, buffer } = this;\n if (destroyed) throw new Error('CMAC instance was destroyed');\n abytes(data);\n const newBuffer = new Uint8Array(buffer.length + data.length);\n newBuffer.set(buffer);\n newBuffer.set(data, buffer.length);\n this.buffer = newBuffer;\n return this;\n }\n\n // see https://www.rfc-editor.org/rfc/rfc4493.html#section-2.4\n digest(): Uint8ArrayBuffer {\n if (this.destroyed) throw new Error('CMAC instance was destroyed');\n const { buffer } = this;\n const msgLen = buffer.length;\n\n // Step 2:\n let n = Math.ceil(msgLen / BLOCK_SIZE); // n := ceil(len/const_Bsize);\n\n // Step 3:\n let flag: boolean; // denoting if last block is complete or not\n if (n === 0) {\n n = 1;\n flag = false;\n } else {\n flag = msgLen % BLOCK_SIZE === 0; // if len mod const_Bsize is 0\n }\n\n // Step 4:\n const lastBlockStart = (n - 1) * BLOCK_SIZE;\n const lastBlockData = buffer.subarray(lastBlockStart);\n let m_last: Uint8ArrayBuffer;\n if (flag) {\n // M_last := M_n XOR K1;\n m_last = xorBlock(new Uint8Array(lastBlockData), this.k1);\n } else {\n // M_last := padding(M_n) XOR K2;\n //\n // [...] padding(x) is the concatenation of x and a single '1',\n // followed by the minimum number of '0's, so that the total length is\n // equal to 128 bits.\n const padded = new Uint8Array(BLOCK_SIZE);\n padded.set(lastBlockData);\n padded[lastBlockData.length] = 0x80; // single '1' bit\n m_last = xorBlock(padded, this.k2);\n }\n\n // Step 5:\n let x = new Uint8Array(BLOCK_SIZE); // X := const_Zero;\n\n // Step 6:\n for (let i = 0; i < n - 1; i++) {\n const m_i = buffer.subarray(i * BLOCK_SIZE, (i + 1) * BLOCK_SIZE); // M_i\n xorBlock(x, m_i); // Y := X XOR M_i;\n encryptBlock(this.xk, x); // X := AES-128(K,Y);\n }\n\n // Step 7:\n xorBlock(x, m_last); // Y := M_last XOR X;\n encryptBlock(this.xk, x); // T := AES-128(K,Y);\n\n // cleanup:\n clean(m_last);\n\n return x; // T\n }\n\n destroy(): void {\n const { buffer, destroyed, xk, k1, k2 } = this;\n if (destroyed) return;\n this.destroyed = true;\n clean(buffer, xk, k1, k2);\n }\n}\n\n/**\n * AES-CMAC (Cipher-based Message Authentication Code).\n * Specs: [RFC 4493](https://www.rfc-editor.org/rfc/rfc4493.html).\n */\nexport const cmac: {\n (key: Uint8Array, message: Uint8Array): Uint8Array;\n create(key: Uint8Array): _CMAC;\n} = (key: Uint8Array, message: Uint8Array): Uint8Array => new _CMAC(key).update(message).digest();\ncmac.create = (key: Uint8Array): _CMAC => new _CMAC(key);\n\n/**\n * S2V (Synthetic Initialization Vector) function as described in [RFC 5297 Section 2.4](https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.4).\n *\n * ```\n * S2V(K, S1, ..., Sn) {\n * if n = 0 then\n * return V = AES-CMAC(K, <one>)\n * fi\n * D = AES-CMAC(K, <zero>)\n * for i = 1 to n-1 do\n * D = dbl(D) xor AES-CMAC(K, Si)\n * done\n * if len(Sn) >= 128 then\n * T = Sn xorend D\n * else\n * T = dbl(D) xor pad(Sn)\n * fi\n * return V = AES-CMAC(K, T)\n * }\n * ```\n *\n * S2V takes a key and a vector of strings S1, S2, ..., Sn and returns a 128-bit string.\n * The S2V function is used to generate a synthetic IV for AES-SIV.\n *\n * @param key - AES key (128, 192, or 256 bits)\n * @param strings - Array of byte arrays to process\n * @returns 128-bit synthetic IV\n */\nfunction s2v(key: Uint8Array, strings: Uint8Array[]): Uint8Array {\n validateKeyLength(key);\n const len = strings.length;\n if (len > 127) {\n // see https://datatracker.ietf.org/doc/html/rfc5297.html#section-7\n throw new Error('s2v: number of input strings must be less than or equal to 127');\n }\n\n if (len === 0) return cmac(key, ONE_BLOCK);\n\n // D = AES-CMAC(K, <zero>)\n let d = cmac(key, EMPTY_BLOCK);\n\n // for i = 1 to n-1 do\n // D = dbl(D) xor AES-CMAC(K, Si)\n for (let i = 0; i < len - 1; i++) {\n dbl(d);\n const cmacResult = cmac(key, strings[i]);\n xorBlock(d, cmacResult);\n clean(cmacResult);\n }\n\n const s_n = strings[len - 1];\n let t: Uint8Array;\n\n // if len(Sn) >= 128 then\n if (s_n.byteLength >= BLOCK_SIZE) {\n // T = Sn xorend D\n t = xorend(Uint8Array.from(s_n), d);\n } else {\n // pad(Sn):\n const paddedSn = new Uint8Array(BLOCK_SIZE);\n paddedSn.set(s_n);\n paddedSn[s_n.length] = 0x80; // padding: 0x80 followed by zeros\n\n // T = dbl(D) xor pad(Sn)\n t = xorBlock(dbl(d), paddedSn);\n clean(paddedSn);\n }\n\n // V = AES-CMAC(K, T)\n const result = cmac(key, t);\n clean(d, t);\n return result;\n}\n\n/** Use `gcmsiv` or `aessiv`. */\nexport const siv: () => never = () => {\n throw new Error('\"siv\" from v1 is now \"gcmsiv\"');\n};\n\n/**\n * **SIV**: Synthetic Initialization Vector (SIV) Authenticated Encryption\n * Nonce is derived from the plaintext and AAD using the S2V function.\n * See [RFC 5297](https://datatracker.ietf.org/doc/html/rfc5297.html).\n */\nexport const aessiv: ((key: Uint8Array, ...AAD: Uint8Array[]) => Cipher) & {\n blockSize: number;\n tagLength: number;\n} = /* @__PURE__ */ wrapCipher(\n { blockSize: 16, tagLength: 16 },\n function aessiv(key: Uint8Array, ...AAD: Uint8Array[]): Cipher {\n // From RFC 5297: Section 6.1, 6.2, 6.3:\n const PLAIN_LIMIT = limit('plaintext', 0, 2 ** 132);\n const CIPHER_LIMIT = limit('ciphertext', 16, 2 ** 132 + 16);\n if (AAD.length > 126) {\n // see https://datatracker.ietf.org/doc/html/rfc5297.html#section-7\n throw new Error('\"AAD\" number of elements must be less than or equal to 126');\n }\n AAD.forEach((aad) => abytes(aad));\n abytes(key);\n if (![32, 48, 64].includes(key.length))\n throw new Error('\"aes key\" expected Uint8Array of length 32/48/64, got length=' + key.length);\n\n // The key is split into equal halves, K1 = leftmost(K, len(K)/2) and\n // K2 = rightmost(K, len(K)/2). K1 is used for S2V and K2 is used for CTR.\n const k1 = key.subarray(0, key.length / 2);\n const k2 = key.subarray(key.length / 2);\n\n return {\n // https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.6\n encrypt(plaintext: Uint8Array) {\n PLAIN_LIMIT(plaintext.length);\n\n const v = s2v(k1, [...AAD, plaintext]);\n\n // clear out the 31st and 63rd (rightmost) bit:\n const q = Uint8Array.from(v);\n q[8] &= 0x7f;\n q[12] &= 0x7f;\n\n // encrypt:\n const c = ctr(k2, q).encrypt(plaintext);\n\n return concatBytes(v, c);\n },\n // https://datatracker.ietf.org/doc/html/rfc5297.html#section-2.7\n decrypt(ciphertext: Uint8Array) {\n CIPHER_LIMIT(ciphertext.length);\n const v = ciphertext.subarray(0, BLOCK_SIZE);\n const c = ciphertext.subarray(BLOCK_SIZE);\n\n // clear out the 31st and 63rd (rightmost) bit:\n const q = Uint8Array.from(v);\n q[8] &= 0x7f;\n q[12] &= 0x7f;\n\n // decrypt:\n const p = ctr(k2, q).decrypt(c);\n\n // verify tag:\n const t = s2v(k1, [...AAD, p]);\n\n if (equalBytes(t, v)) {\n return p;\n } else {\n throw new Error('invalid siv tag');\n }\n },\n };\n }\n);\n//#endregion\n\n/** Unsafe low-level internal methods. May change at any time. */\nexport const unsafe: {\n expandKeyLE: typeof expandKeyLE;\n expandKeyDecLE: typeof expandKeyDecLE;\n encrypt: typeof encrypt;\n decrypt: typeof decrypt;\n encryptBlock: typeof encryptBlock;\n decryptBlock: typeof decryptBlock;\n ctrCounter: typeof ctrCounter;\n ctr32: typeof ctr32;\n dbl: typeof dbl;\n xorBlock: typeof xorBlock;\n xorend: typeof xorend;\n s2v: typeof s2v;\n} = {\n expandKeyLE,\n expandKeyDecLE,\n encrypt,\n decrypt,\n encryptBlock,\n decryptBlock,\n ctrCounter,\n ctr32,\n dbl,\n xorBlock,\n xorend,\n s2v,\n};\n", "import { ProfilePointer } from './nip19.ts'\n\nexport type Nip05 = `${string}@${string}`\n\n/**\n * NIP-05 regex. The localpart is optional, and should be assumed to be `_` otherwise.\n *\n * - 0: full match\n * - 1: name (optional)\n * - 2: domain\n */\nexport const NIP05_REGEX = /^(?:([\\w.+-]+)@)?([\\w_-]+(\\.[\\w_-]+)+)$/\nexport const isNip05 = (value?: string | null): value is Nip05 => NIP05_REGEX.test(value || '')\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet _fetch: any\n\ntry {\n _fetch = fetch\n} catch (_) {\n null\n}\n\nexport function useFetchImplementation(fetchImplementation: unknown) {\n _fetch = fetchImplementation\n}\n\nexport async function searchDomain(domain: string, query = ''): Promise<{ [name: string]: string }> {\n try {\n const url = `https://${domain}/.well-known/nostr.json?name=${query}`\n const res = await _fetch(url, { redirect: 'manual' })\n if (res.status !== 200) {\n throw Error('Wrong response code')\n }\n const json = await res.json()\n return json.names\n } catch (_) {\n return {}\n }\n}\n\nexport async function queryProfile(fullname: string): Promise<ProfilePointer | null> {\n const match = fullname.match(NIP05_REGEX)\n if (!match) return null\n\n const [, name = '_', domain] = match\n\n try {\n const url = `https://${domain}/.well-known/nostr.json?name=${name}`\n const res = await _fetch(url, { redirect: 'manual' })\n if (res.status !== 200) {\n throw Error('Wrong response code')\n }\n const json = await res.json()\n\n const pubkey = json.names[name]\n return pubkey ? { pubkey, relays: json.relays?.[pubkey] } : null\n } catch (_e) {\n return null\n }\n}\n\nexport async function isValid(pubkey: string, nip05: Nip05): Promise<boolean> {\n const res = await queryProfile(nip05)\n return res ? res.pubkey === pubkey : false\n}\n", "import type { Event } from './core.ts'\nimport type { EventPointer, ProfilePointer } from './nip19.ts'\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to the root of the thread.\n */\n root: EventPointer | undefined\n\n /**\n * Pointer to a \"parent\" event that parsed event replies to (responded to).\n */\n reply: EventPointer | undefined\n\n /**\n * Pointers to events that may or may not be in the reply chain.\n */\n mentions: EventPointer[]\n\n /**\n * Pointers to events that were directly quoted.\n */\n quotes: EventPointer[]\n\n /**\n * List of pubkeys that are involved in the thread in no particular order.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n reply: undefined,\n root: undefined,\n mentions: [],\n profiles: [],\n quotes: [],\n }\n\n let maybeParent: EventPointer | undefined\n let maybeRoot: EventPointer | undefined\n\n for (let i = event.tags.length - 1; i >= 0; i--) {\n const tag = event.tags[i]\n\n if (tag[0] === 'e' && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl, eTagMarker, eTagAuthor] = tag as [\n string,\n string,\n undefined | string,\n undefined | string,\n undefined | string,\n ]\n\n const eventPointer: EventPointer = {\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n author: eTagAuthor,\n }\n\n if (eTagMarker === 'root') {\n result.root = eventPointer\n continue\n }\n\n if (eTagMarker === 'reply') {\n result.reply = eventPointer\n continue\n }\n\n if (eTagMarker === 'mention') {\n result.mentions.push(eventPointer)\n continue\n }\n\n if (!maybeParent) {\n maybeParent = eventPointer\n } else {\n maybeRoot = eventPointer\n }\n\n result.mentions.push(eventPointer)\n continue\n }\n\n if (tag[0] === 'q' && tag[1]) {\n const [_, eTagEventId, eTagRelayUrl] = tag as [string, string, undefined | string]\n result.quotes.push({\n id: eTagEventId,\n relays: eTagRelayUrl ? [eTagRelayUrl] : [],\n })\n }\n\n if (tag[0] === 'p' && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n continue\n }\n }\n\n // get legacy (positional) markers, set reply to root and vice-versa if one of them is missing\n if (!result.root) {\n result.root = maybeRoot || maybeParent || result.reply\n }\n if (!result.reply) {\n result.reply = maybeParent || result.root\n }\n\n // remove root and reply from mentions, inherit relay hints from authors if any\n ;[result.reply, result.root].forEach(ref => {\n if (!ref) return\n\n let idx = result.mentions.indexOf(ref)\n if (idx !== -1) {\n result.mentions.splice(idx, 1)\n }\n if (ref.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!?.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n result.mentions.forEach(ref => {\n if (ref!.author) {\n let author = result.profiles.find(p => p.pubkey === ref.author)\n if (author && author.relays) {\n if (!ref.relays) {\n ref.relays = []\n }\n author.relays.forEach(url => {\n if (ref.relays!.indexOf(url) === -1) ref.relays!.push(url)\n })\n author.relays = ref.relays\n }\n }\n })\n\n return result\n}\n", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any): void {\n _fetch = fetchImplementation\n}\n\nexport async function fetchRelayInformation(url: string): Promise<RelayInformation> {\n return (await (\n await fetch(url.replace('ws://', 'http://').replace('wss://', 'https://'), {\n headers: { Accept: 'application/nostr+json' },\n })\n ).json()) as RelayInformation\n}\n\n/**\n * ## Relay Information Document\n\n * Relays may provide server metadata to clients to inform\n * them of capabilities, administrative contacts, and\n * various server attributes. This is made available as a\n * JSON document over HTTP, on the same URI as the relay's\n * websocket.\n\n * Any field may be omitted, and clients MUST ignore any\n * additional fields they do not understand. Relays MUST\n * accept CORS requests by sending\n * `Access-Control-Allow-Origin`,\n * `Access-Control-Allow-Headers`, and\n * `Access-Control-Allow-Methods` headers.\n * @param name string identifying relay\n * @param description string with detailed information\n * @param pubkey administrative contact pubkey\n * @param contact: administrative alternate contact\n * @param supported_nips a list of NIP numbers supported by\n * the relay\n * @param software identifying relay software URL\n * @param version string version identifier\n */\nexport interface BasicRelayInformation {\n // string identifying relay\n name: string\n description: string\n pubkey: string\n contact: string\n supported_nips: number[]\n software: string\n version: string\n // limitation?: Limitations<A, P>\n}\n\n/**\n * * ## Extra Fields\n\n * * ### Server Limitations\n\n * These are limitations imposed by the relay on clients.\n * Your client should expect that requests which exceed\n * these practical_ limitations are rejected or fail immediately.\n * @param max_message_length this is the maximum number of\n * bytes for incoming JSON that the relay will attempt to\n * decode and act upon. When you send large subscriptions,\n * you will be limited by this value. It also effectively\n * limits the maximum size of any event. Value is calculated\n * from `[` to `]` and is after UTF-8 serialization (so some\n * unicode characters will cost 2-3 bytes). It is equal to\n * the maximum size of the WebSocket message frame.\n * @param max_subscriptions total number of subscriptions\n * that may be active on a single websocket connection to\n * this relay. It's possible that authenticated clients with\n * a (paid) relationship to the relay may have higher limits.\n * @param max_filters maximum number of filter values in\n * each subscription. Must be one or higher.\n * @param max_limit the relay server will clamp each\n * filter's `limit` value to this number.\n * This means the client won't be able to get more than this\n * number of events from a single subscription filter. This\n * clamping is typically done silently by the relay, but\n * with this number, you can know that there are additional\n * results if you narrowed your filter's time range or other\n * parameters.\n * @param max_subid_length maximum length of subscription id as a\n * string.\n * @param min_prefix for `authors` and `ids` filters which\n * are to match against a hex prefix, you must provide at\n * least this many hex digits in the prefix.\n * @param max_event_tags in any event, this is the maximum\n * number of elements in the `tags` list.\n * @param max_content_length maximum number of characters in\n * the `content` field of any event. This is a count of\n * unicode characters. After serializing into JSON it may be\n * larger (in bytes), and is still subject to the\n * max_message_length`, if defined.\n * @param min_pow_difficulty new events will require at\n * least this difficulty of PoW, based on [NIP-13](13.md),\n * or they will be rejected by this server.\n * @param auth_required this relay requires [NIP-42](42.md)\n * authentication to happen before a new connection may\n * perform any other action. Even if set to False,\n * authentication may be required for specific actions.\n * @param restricted_writes: this relay requires some kind\n * of condition to be fulfilled in order to accept events\n * (not necessarily, but including\n * @param payment_required this relay requires payment\n * before a new connection may perform any action.\n * @param created_at_lower_limit: 'created_at' lower limit\n * @param created_at_upper_limit: 'created_at' upper limit\n */\nexport interface Limitations {\n max_message_length: number\n max_subscriptions: number\n max_filters: number\n max_limit: number\n max_subid_length: number\n min_prefix: number\n max_event_tags: number\n max_content_length: number\n min_pow_difficulty: number\n auth_required: boolean\n payment_required: boolean\n created_at_lower_limit: number\n created_at_upper_limit: number\n restricted_writes: boolean\n}\n\nexport interface RetentionDetails {\n kinds: (number | number[])[]\n time?: number | null\n count?: number | null\n}\ntype AnyRetentionDetails = RetentionDetails\n/**\n * ### Event Retention\n\n * There may be a cost associated with storing data forever,\n * so relays may wish to state retention times. The values\n * stated here are defaults for unauthenticated users and\n * visitors. Paid users would likely have other policies.\n\n * Retention times are given in seconds, with `null`\n * indicating infinity. If zero is provided, this means the\n * event will not be stored at all, and preferably an error\n * will be provided when those are received.\n * ```json\n{\n...\n \"retention\": [\n { \"kinds\": [0, 1, [5, 7], [40, 49]], \"time\": 3600 },\n { \"kinds\": [[40000, 49999]], \"time\": 100 },\n { \"kinds\": [[30000, 39999]], \"count\": 1000 },\n { \"time\": 3600, \"count\": 10000 }\n ]\n...\n}\n```\n * @param retention is a list of specifications: each will\n * apply to either all kinds, or a subset of kinds. Ranges\n * may be specified for the kind field as a tuple of\n * inclusive start and end values. Events of indicated kind\n * (or all) are then limited to a `count` and/or time\n * period.\n\n * It is possible to effectively blacklist Nostr-based\n * protocols that rely on a specific `kind` number, by\n * giving a retention time of zero for those `kind` values.\n * While that is unfortunate, it does allow clients to\n * discover servers that will support their protocol quickly\n * via a single HTTP fetch.\n\n * There is no need to specify retention times for\n * _ephemeral events_ as defined in [NIP-16](16.md) since\n * they are not retained.\n */\nexport interface Retention {\n retention: AnyRetentionDetails[]\n}\n\n/**\n * Some relays may be governed by the arbitrary laws of a\n * nation state. This may limit what content can be stored\n * in cleartext on those relays. All clients are encouraged\n * to use encryption to work around this limitation.\n\n * It is not possible to describe the limitations of each\n * country's laws and policies which themselves are\n * typically vague and constantly shifting.\n\n * Therefore, this field allows the relay operator to\n * indicate which countries' laws might end up being\n * enforced on them, and then indirectly on their users'\n * content.\n\n * Users should be able to avoid relays in countries they\n * don't like, and/or select relays in more favourable\n * zones. Exposing this flexibility is up to the client\n * software.\n\n * @param relay_countries a list of two-level ISO country\n * codes (ISO 3166-1 alpha-2) whose laws and policies may\n * affect this relay. `EU` may be used for European Union\n * countries.\n\n * Remember that a relay may be hosted in a country which is\n * not the country of the legal entities who own the relay,\n * so it's very likely a number of countries are involved.\n */\nexport interface ContentLimitations {\n relay_countries: string[]\n}\n\n/**\n * ### Community Preferences\n\n * For public text notes at least, a relay may try to foster\n * a local community. This would encourage users to follow\n * the global feed on that relay, in addition to their usual\n * individual follows. To support this goal, relays MAY\n * specify some of the following values.\n\n * @param language_tags is an ordered list of [IETF\n * language\n * tags](https://en.wikipedia.org/wiki/IETF_language_tag\n * indicating the major languages spoken on the relay.\n * @param tags is a list of limitations on the topics to be\n * discussed. For example `sfw-only` indicates that only\n * \"Safe For Work\" content is encouraged on this relay. This\n * relies on assumptions of what the \"work\" \"community\"\n * feels \"safe\" talking about. In time, a common set of tags\n * may emerge that allow users to find relays that suit\n * their needs, and client software will be able to parse\n * these tags easily. The `bitcoin-only` tag indicates that\n * any _altcoin_, _\"crypto\"_ or _blockchain_ comments will\n * be ridiculed without mercy.\n * @param posting_policy is a link to a human-readable page\n * which specifies the community policies for the relay. In\n * cases where `sfw-only` is True, it's important to link to\n * a page which gets into the specifics of your posting\n * policy.\n\n * The `description` field should be used to describe your\n * community goals and values, in brief. The\n * `posting_policy` is for additional detail and legal\n * terms. Use the `tags` field to signify limitations on\n * content, or topics to be discussed, which could be\n * machine processed by appropriate client software.\n */\nexport interface CommunityPreferences {\n language_tags: string[]\n tags: string[]\n posting_policy: string\n}\n\nexport interface Amount {\n amount: number\n unit: 'msat'\n}\nexport interface PublicationAmount extends Amount {\n kinds: number[]\n}\nexport interface Subscription extends Amount {\n period: number\n}\nexport interface Fees {\n admission: Amount[]\n subscription: Subscription[]\n publication: PublicationAmount[]\n}\n/**\n * Relays that require payments may want to expose their fee\n * schedules.\n */\nexport interface PayToRelay {\n payments_url: string\n fees: Fees\n}\n\n/**\n * A URL pointing to an image to be used as an icon for the\n * relay. Recommended to be squared in shape.\n */\nexport interface Icon {\n icon: string\n}\n\nexport type RelayInformation = BasicRelayInformation &\n Partial<Retention> & {\n limitation?: Partial<Limitations>\n } & Partial<ContentLimitations> &\n Partial<CommunityPreferences> &\n Partial<PayToRelay> &\n Partial<Icon>\n", "import { bytesToHex } from '@noble/hashes/utils.js'\nimport { type UnsignedEvent, type Event } from './pure.ts'\nimport { sha256 } from '@noble/hashes/sha2.js'\n\nimport { utf8Encoder } from './utils.ts'\n\n/** Get POW difficulty from a Nostr hex ID. */\nexport function getPow(hex: string): number {\n let count = 0\n\n for (let i = 0; i < 64; i += 8) {\n const nibble = parseInt(hex.substring(i, i + 8), 16)\n if (nibble === 0) {\n count += 32\n } else {\n count += Math.clz32(nibble)\n break\n }\n }\n\n return count\n}\n\n/** Get POW difficulty directly from a Uint8Array hash. */\nfunction getPowFromBytes(hash: Uint8Array): number {\n let count = 0\n\n for (let i = 0; i < hash.length; i++) {\n const byte = hash[i]\n if (byte === 0) {\n count += 8\n } else {\n count += Math.clz32(byte) - 24\n break\n }\n }\n\n return count\n}\n\n/**\n * Mine an event with the desired POW. This function mutates the event.\n * Note that this operation is synchronous and should be run in a worker context to avoid blocking the main thread.\n */\nexport function minePow(unsigned: UnsignedEvent, difficulty: number): Omit<Event, 'sig'> {\n let count = 0\n\n const event = unsigned as Omit<Event, 'sig'>\n const tag = ['nonce', count.toString(), difficulty.toString()]\n\n event.tags.push(tag)\n\n while (true) {\n const now = Math.floor(new Date().getTime() / 1000)\n\n if (now !== event.created_at) {\n count = 0\n event.created_at = now\n }\n\n tag[1] = (++count).toString()\n\n const hash = sha256(\n utf8Encoder.encode(JSON.stringify([0, event.pubkey, event.created_at, event.kind, event.tags, event.content])),\n )\n\n if (getPowFromBytes(hash) >= difficulty) {\n event.id = bytesToHex(hash)\n break\n }\n }\n\n return event\n}\n", "import { PrivateDirectMessage } from './kinds.ts'\nimport { EventTemplate, NostrEvent, getPublicKey } from './pure.ts'\nimport * as nip59 from './nip59.ts'\n\ntype Recipient = {\n publicKey: string\n relayUrl?: string\n}\n\ntype ReplyTo = {\n eventId: string\n relayUrl?: string\n}\n\nfunction createEvent(\n recipients: Recipient | Recipient[],\n message: string,\n conversationTitle?: string,\n replyTo?: ReplyTo,\n): EventTemplate {\n const baseEvent: EventTemplate = {\n created_at: Math.ceil(Date.now() / 1000),\n kind: PrivateDirectMessage,\n tags: [],\n content: message,\n }\n\n const recipientsArray = Array.isArray(recipients) ? recipients : [recipients]\n\n recipientsArray.forEach(({ publicKey, relayUrl }) => {\n baseEvent.tags.push(relayUrl ? ['p', publicKey, relayUrl] : ['p', publicKey])\n })\n\n if (replyTo) {\n baseEvent.tags.push(['e', replyTo.eventId, replyTo.relayUrl || '', 'reply'])\n }\n\n if (conversationTitle) {\n baseEvent.tags.push(['subject', conversationTitle])\n }\n\n return baseEvent\n}\n\nexport function wrapEvent(\n senderPrivateKey: Uint8Array,\n recipient: Recipient,\n message: string,\n conversationTitle?: string,\n replyTo?: ReplyTo,\n): NostrEvent {\n const event = createEvent(recipient, message, conversationTitle, replyTo)\n return nip59.wrapEvent(event, senderPrivateKey, recipient.publicKey)\n}\n\nexport function wrapManyEvents(\n senderPrivateKey: Uint8Array,\n recipients: Recipient[],\n message: string,\n conversationTitle?: string,\n replyTo?: ReplyTo,\n): NostrEvent[] {\n if (!recipients || recipients.length === 0) {\n throw new Error('At least one recipient is required.')\n }\n\n const senderPublicKey = getPublicKey(senderPrivateKey)\n\n // wrap the event for the sender and then for each recipient\n return [{ publicKey: senderPublicKey }, ...recipients].map(recipient =>\n wrapEvent(senderPrivateKey, recipient, message, conversationTitle, replyTo),\n )\n}\n\nexport const unwrapEvent = nip59.unwrapEvent\n\nexport const unwrapManyEvents = nip59.unwrapManyEvents\n", "import { EventTemplate, UnsignedEvent, NostrEvent } from './core.ts'\nimport { getConversationKey, decrypt, encrypt } from './nip44.ts'\nimport { getEventHash, generateSecretKey, finalizeEvent, getPublicKey } from './pure.ts'\nimport { Seal, GiftWrap } from './kinds.ts'\n\ntype Rumor = UnsignedEvent & { id: string }\n\nconst TWO_DAYS = 2 * 24 * 60 * 60\n\nconst now = () => Math.round(Date.now() / 1000)\nconst randomNow = () => Math.round(now() - Math.random() * TWO_DAYS)\n\nconst nip44ConversationKey = (privateKey: Uint8Array, publicKey: string) => getConversationKey(privateKey, publicKey)\n\nconst nip44Encrypt = (data: EventTemplate, privateKey: Uint8Array, publicKey: string) =>\n encrypt(JSON.stringify(data), nip44ConversationKey(privateKey, publicKey))\n\nconst nip44Decrypt = (data: NostrEvent, privateKey: Uint8Array) =>\n JSON.parse(decrypt(data.content, nip44ConversationKey(privateKey, data.pubkey)))\n\nexport function createRumor(event: Partial<UnsignedEvent>, privateKey: Uint8Array): Rumor {\n const rumor = {\n created_at: now(),\n content: '',\n tags: [],\n ...event,\n pubkey: getPublicKey(privateKey),\n } as any\n\n rumor.id = getEventHash(rumor)\n\n return rumor as Rumor\n}\n\nexport function createSeal(rumor: Rumor, privateKey: Uint8Array, recipientPublicKey: string): NostrEvent {\n return finalizeEvent(\n {\n kind: Seal,\n content: nip44Encrypt(rumor, privateKey, recipientPublicKey),\n created_at: randomNow(),\n tags: [],\n },\n privateKey,\n )\n}\n\nexport function createWrap(seal: NostrEvent, recipientPublicKey: string): NostrEvent {\n const randomKey = generateSecretKey()\n\n return finalizeEvent(\n {\n kind: GiftWrap,\n content: nip44Encrypt(seal, randomKey, recipientPublicKey),\n created_at: randomNow(),\n tags: [['p', recipientPublicKey]],\n },\n randomKey,\n ) as NostrEvent\n}\n\nexport function wrapEvent(\n event: Partial<UnsignedEvent>,\n senderPrivateKey: Uint8Array,\n recipientPublicKey: string,\n): NostrEvent {\n const rumor = createRumor(event, senderPrivateKey)\n\n const seal = createSeal(rumor, senderPrivateKey, recipientPublicKey)\n return createWrap(seal, recipientPublicKey)\n}\n\nexport function wrapManyEvents(\n event: Partial<UnsignedEvent>,\n senderPrivateKey: Uint8Array,\n recipientsPublicKeys: string[],\n): NostrEvent[] {\n if (!recipientsPublicKeys || recipientsPublicKeys.length === 0) {\n throw new Error('At least one recipient is required.')\n }\n\n const senderPublicKey = getPublicKey(senderPrivateKey)\n\n const wrappeds = [wrapEvent(event, senderPrivateKey, senderPublicKey)]\n\n recipientsPublicKeys.forEach(recipientPublicKey => {\n wrappeds.push(wrapEvent(event, senderPrivateKey, recipientPublicKey))\n })\n\n return wrappeds\n}\n\nexport function unwrapEvent(wrap: NostrEvent, recipientPrivateKey: Uint8Array): Rumor {\n const unwrappedSeal = nip44Decrypt(wrap, recipientPrivateKey)\n return nip44Decrypt(unwrappedSeal, recipientPrivateKey)\n}\n\nexport function unwrapManyEvents(wrappedEvents: NostrEvent[], recipientPrivateKey: Uint8Array): Rumor[] {\n let unwrappedEvents: Rumor[] = []\n\n wrappedEvents.forEach(e => {\n unwrappedEvents.push(unwrapEvent(e, recipientPrivateKey))\n })\n\n unwrappedEvents.sort((a, b) => a.created_at - b.created_at)\n\n return unwrappedEvents\n}\n", "import { chacha20 } from '@noble/ciphers/chacha.js'\nimport { equalBytes } from '@noble/ciphers/utils.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { extract as hkdf_extract, expand as hkdf_expand } from '@noble/hashes/hkdf.js'\nimport { hmac } from '@noble/hashes/hmac.js'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { concatBytes, hexToBytes, randomBytes } from '@noble/hashes/utils.js'\nimport { base64 } from '@scure/base'\n\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nconst minPlaintextSize = 0x0001 // 1b msg => padded to 32b\nconst maxPlaintextSize = 0xffffffff // 4294967295 (2^32-1)\nconst extendedPrefixThreshold = 0x10000 // 65536: lengths below use 2-byte u16 prefix, at or above use 6-byte prefix\n\nexport function getConversationKey(privkeyA: Uint8Array, pubkeyB: string): Uint8Array {\n const sharedX = secp256k1.getSharedSecret(privkeyA, hexToBytes('02' + pubkeyB)).subarray(1, 33)\n return hkdf_extract(sha256, sharedX, utf8Encoder.encode('nip44-v2'))\n}\n\nfunction getMessageKeys(\n conversationKey: Uint8Array,\n nonce: Uint8Array,\n): { chacha_key: Uint8Array; chacha_nonce: Uint8Array; hmac_key: Uint8Array } {\n const keys = hkdf_expand(sha256, conversationKey, nonce, 76)\n return {\n chacha_key: keys.subarray(0, 32),\n chacha_nonce: keys.subarray(32, 44),\n hmac_key: keys.subarray(44, 76),\n }\n}\n\nfunction calcPaddedLen(len: number): number {\n if (!Number.isSafeInteger(len) || len < 1) throw new Error('expected positive integer')\n if (len <= 32) return 32\n const nextPower = 2 ** (Math.floor(Math.log2(len - 1)) + 1)\n const chunk = nextPower <= 256 ? 32 : nextPower / 8\n return chunk * (Math.floor((len - 1) / chunk) + 1)\n}\n\nfunction writeU16BE(num: number): Uint8Array {\n if (!Number.isSafeInteger(num) || num < minPlaintextSize || num > 0xffff)\n throw new Error('invalid plaintext size: must be between 1 and 65535 bytes')\n const arr = new Uint8Array(2)\n new DataView(arr.buffer).setUint16(0, num, false)\n return arr\n}\n\nfunction writeU32BE(num: number): Uint8Array {\n if (!Number.isSafeInteger(num) || num < extendedPrefixThreshold || num > maxPlaintextSize)\n throw new Error('invalid plaintext size: must be between 65536 and 4294967295 bytes')\n const arr = new Uint8Array(4)\n new DataView(arr.buffer).setUint32(0, num, false)\n return arr\n}\n\nfunction pad(plaintext: string): Uint8Array {\n const unpadded = utf8Encoder.encode(plaintext)\n const unpaddedLen = unpadded.length\n if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize)\n throw new Error('invalid plaintext size: must be between 1 and 4294967295 bytes')\n const prefix =\n unpaddedLen >= extendedPrefixThreshold\n ? concatBytes(new Uint8Array([0, 0]), writeU32BE(unpaddedLen)) // 6 bytes\n : writeU16BE(unpaddedLen) // 2 bytes\n const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen)\n return concatBytes(prefix, unpadded, suffix)\n}\n\nfunction unpad(padded: Uint8Array): string {\n const dv = new DataView(padded.buffer, padded.byteOffset, padded.byteLength)\n const firstTwo = dv.getUint16(0)\n let unpaddedLen: number\n let prefixLen: number\n if (firstTwo === 0) {\n // Extended format: 2 zero bytes + 4-byte u32 length\n unpaddedLen = dv.getUint32(2)\n if (unpaddedLen < extendedPrefixThreshold) throw new Error('invalid padding')\n prefixLen = 6\n } else {\n unpaddedLen = firstTwo\n prefixLen = 2\n }\n const unpadded = padded.subarray(prefixLen, prefixLen + unpaddedLen)\n if (\n unpaddedLen < minPlaintextSize ||\n unpaddedLen > maxPlaintextSize ||\n unpadded.length !== unpaddedLen ||\n padded.length !== prefixLen + calcPaddedLen(unpaddedLen)\n )\n throw new Error('invalid padding')\n return utf8Decoder.decode(unpadded)\n}\n\nfunction hmacAad(key: Uint8Array, message: Uint8Array, aad: Uint8Array): Uint8Array {\n if (aad.length !== 32) throw new Error('AAD associated data must be 32 bytes')\n const combined = concatBytes(aad, message)\n return hmac(sha256, key, combined)\n}\n\n// metadata: always 65b (version: 1b, nonce: 32b, mac: 32b)\n// plaintext: 1b to 0xffffffff\n// padded plaintext (small, <65536): 32b to 0x10000, with 2b prefix -> 34b to 0x10000+2\n// padded plaintext (large, >=65536): 0x10000 to 0x100000000, with 6b prefix -> 0x10006 to 0x100000000+6\n// ciphertext: same as padded plaintext (chacha20 doesn't change length)\n// raw payload (small): 99 (65+34) to 65603 (65+0x10000+2)\n// raw payload (large): 65607 (65+0x10006) to 4294967367 (65+0x100000000+6)\nfunction decodePayload(payload: string): { nonce: Uint8Array; ciphertext: Uint8Array; mac: Uint8Array } {\n if (typeof payload !== 'string') throw new Error('payload must be a valid string')\n const plen = payload.length\n if (plen < 132) throw new Error('invalid payload length: ' + plen)\n if (payload[0] === '#') throw new Error('unknown encryption version')\n let data: Uint8Array\n try {\n data = base64.decode(payload)\n } catch (error) {\n throw new Error('invalid base64: ' + (error as any).message)\n }\n const dlen = data.length\n if (dlen < 99) throw new Error('invalid data length: ' + dlen)\n const vers = data[0]\n if (vers !== 2) throw new Error('unknown encryption version ' + vers)\n return {\n nonce: data.subarray(1, 33),\n ciphertext: data.subarray(33, -32),\n mac: data.subarray(-32),\n }\n}\n\nexport function encrypt(plaintext: string, conversationKey: Uint8Array, nonce: Uint8Array = randomBytes(32)): string {\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce)\n const padded = pad(plaintext)\n const ciphertext = chacha20(chacha_key, chacha_nonce, padded)\n const mac = hmacAad(hmac_key, ciphertext, nonce)\n return base64.encode(concatBytes(new Uint8Array([2]), nonce, ciphertext, mac))\n}\n\n/** Callers should validate payload size before calling to prevent DoS from oversized inputs. */\nexport function decrypt(payload: string, conversationKey: Uint8Array): string {\n const { nonce, ciphertext, mac } = decodePayload(payload)\n const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce)\n const calculatedMac = hmacAad(hmac_key, ciphertext, nonce)\n if (!equalBytes(calculatedMac, mac)) throw new Error('invalid MAC')\n const padded = chacha20(chacha_key, chacha_nonce, ciphertext)\n return unpad(padded)\n}\n\nexport const v2 = {\n utils: {\n getConversationKey,\n calcPaddedLen,\n pad,\n unpad,\n },\n encrypt,\n decrypt,\n}\n", "/**\n * Basic utils for ARX (add-rotate-xor) salsa and chacha ciphers.\n\nRFC8439 requires multi-step cipher stream, where\nauthKey starts with counter: 0, actual msg with counter: 1.\n\nFor this, we need a way to re-use nonce / counter:\n\n const counter = new Uint8Array(4);\n chacha(..., counter, ...); // counter is now 1\n chacha(..., counter, ...); // counter is now 2\n\nThis is complicated:\n\n- 32-bit counters are enough, no need for 64-bit: max ArrayBuffer size in JS is 4GB\n- Original papers don't allow mutating counters\n- Counter overflow is undefined [^1]\n- Idea A: allow providing (nonce | counter) instead of just nonce, re-use it\n- Caveat: Cannot be re-used through all cases:\n- * chacha has (counter | nonce)\n- * xchacha has (nonce16 | counter | nonce16)\n- Idea B: separate nonce / counter and provide separate API for counter re-use\n- Caveat: there are different counter sizes depending on an algorithm.\n- salsa & chacha also differ in structures of key & sigma:\n salsa20: s[0] | k(4) | s[1] | nonce(2) | cnt(2) | s[2] | k(4) | s[3]\n chacha: s(4) | k(8) | cnt(1) | nonce(3)\n chacha20orig: s(4) | k(8) | cnt(2) | nonce(2)\n- Idea C: helper method such as `setSalsaState(key, nonce, sigma, data)`\n- Caveat: we can't re-use counter array\n\nxchacha [^2] uses the subkey and remaining 8 byte nonce with ChaCha20 as normal\n(prefixed by 4 NUL bytes, since [RFC8439] specifies a 12-byte nonce).\n\n[^1]: https://mailarchive.ietf.org/arch/msg/cfrg/gsOnTJzcbgG6OqD8Sc0GO5aR_tU/\n[^2]: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha#appendix-A.2\n\n * @module\n */\nimport {\n type PRG,\n type XorStream,\n abool,\n abytes,\n anumber,\n checkOpts,\n clean,\n copyBytes,\n randomBytes,\n u32,\n} from './utils.ts';\n\n// Replaces `TextEncoder`, which is not available in all environments\nconst encodeStr = (str: string) => Uint8Array.from(str.split(''), (c) => c.charCodeAt(0));\nconst sigma16 = encodeStr('expand 16-byte k');\nconst sigma32 = encodeStr('expand 32-byte k');\nconst sigma16_32 = u32(sigma16);\nconst sigma32_32 = u32(sigma32);\n\n/** Rotate left. */\nexport function rotl(a: number, b: number): number {\n return (a << b) | (a >>> (32 - b));\n}\n\n/** Ciphers must use u32 for efficiency. */\nexport type CipherCoreFn = (\n sigma: Uint32Array,\n key: Uint32Array,\n nonce: Uint32Array,\n output: Uint32Array,\n counter: number,\n rounds?: number\n) => void;\n\n/** Method which extends key + short nonce into larger nonce / diff key. */\nexport type ExtendNonceFn = (\n sigma: Uint32Array,\n key: Uint32Array,\n input: Uint32Array,\n output: Uint32Array\n) => void;\n\n/** ARX cipher options.\n * * `allowShortKeys` for 16-byte keys\n * * `counterLength` in bytes\n * * `counterRight`: right: `nonce|counter`; left: `counter|nonce`\n * */\nexport type CipherOpts = {\n allowShortKeys?: boolean; // Original salsa / chacha allow 16-byte keys\n extendNonceFn?: ExtendNonceFn;\n counterLength?: number;\n counterRight?: boolean;\n rounds?: number;\n};\n\n// Is byte array aligned to 4 byte offset (u32)?\nfunction isAligned32(b: Uint8Array) {\n return b.byteOffset % 4 === 0;\n}\n\n// Salsa and Chacha block length is always 512-bit\nconst BLOCK_LEN = 64;\nconst BLOCK_LEN32 = 16;\n\n// new Uint32Array([2**32]) // => Uint32Array(1) [ 0 ]\n// new Uint32Array([2**32-1]) // => Uint32Array(1) [ 4294967295 ]\nconst MAX_COUNTER = 2 ** 32 - 1;\n\nconst U32_EMPTY = Uint32Array.of();\nfunction runCipher(\n core: CipherCoreFn,\n sigma: Uint32Array,\n key: Uint32Array,\n nonce: Uint32Array,\n data: Uint8Array,\n output: Uint8Array,\n counter: number,\n rounds: number\n): void {\n const len = data.length;\n const block = new Uint8Array(BLOCK_LEN);\n const b32 = u32(block);\n // Make sure that buffers aligned to 4 bytes\n const isAligned = isAligned32(data) && isAligned32(output);\n const d32 = isAligned ? u32(data) : U32_EMPTY;\n const o32 = isAligned ? u32(output) : U32_EMPTY;\n for (let pos = 0; pos < len; counter++) {\n core(sigma, key, nonce, b32, counter, rounds);\n if (counter >= MAX_COUNTER) throw new Error('arx: counter overflow');\n const take = Math.min(BLOCK_LEN, len - pos);\n // aligned to 4 bytes\n if (isAligned && take === BLOCK_LEN) {\n const pos32 = pos / 4;\n if (pos % 4 !== 0) throw new Error('arx: invalid block position');\n for (let j = 0, posj: number; j < BLOCK_LEN32; j++) {\n posj = pos32 + j;\n o32[posj] = d32[posj] ^ b32[j];\n }\n pos += BLOCK_LEN;\n continue;\n }\n for (let j = 0, posj; j < take; j++) {\n posj = pos + j;\n output[posj] = data[posj] ^ block[j];\n }\n pos += take;\n }\n}\n\n/** Creates ARX-like (ChaCha, Salsa) cipher stream from core function. */\nexport function createCipher(core: CipherCoreFn, opts: CipherOpts): XorStream {\n const { allowShortKeys, extendNonceFn, counterLength, counterRight, rounds } = checkOpts(\n { allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20 },\n opts\n );\n if (typeof core !== 'function') throw new Error('core must be a function');\n anumber(counterLength);\n anumber(rounds);\n abool(counterRight);\n abool(allowShortKeys);\n return (\n key: Uint8Array,\n nonce: Uint8Array,\n data: Uint8Array,\n output?: Uint8Array,\n counter = 0\n ): Uint8Array => {\n abytes(key, undefined, 'key');\n abytes(nonce, undefined, 'nonce');\n abytes(data, undefined, 'data');\n const len = data.length;\n if (output === undefined) output = new Uint8Array(len);\n abytes(output, undefined, 'output');\n anumber(counter);\n if (counter < 0 || counter >= MAX_COUNTER) throw new Error('arx: counter overflow');\n if (output.length < len)\n throw new Error(`arx: output (${output.length}) is shorter than data (${len})`);\n const toClean = [];\n\n // Key & sigma\n // key=16 -> sigma16, k=key|key\n // key=32 -> sigma32, k=key\n let l = key.length;\n let k: Uint8Array;\n let sigma: Uint32Array;\n if (l === 32) {\n toClean.push((k = copyBytes(key)));\n sigma = sigma32_32;\n } else if (l === 16 && allowShortKeys) {\n k = new Uint8Array(32);\n k.set(key);\n k.set(key, 16);\n sigma = sigma16_32;\n toClean.push(k);\n } else {\n abytes(key, 32, 'arx key');\n throw new Error('invalid key size');\n // throw new Error(`\"arx key\" expected Uint8Array of length 32, got length=${l}`);\n }\n\n // Nonce\n // salsa20: 8 (8-byte counter)\n // chacha20orig: 8 (8-byte counter)\n // chacha20: 12 (4-byte counter)\n // xsalsa20: 24 (16 -> hsalsa, 8 -> old nonce)\n // xchacha20: 24 (16 -> hchacha, 8 -> old nonce)\n // Align nonce to 4 bytes\n if (!isAligned32(nonce)) toClean.push((nonce = copyBytes(nonce)));\n\n const k32 = u32(k);\n // hsalsa & hchacha: handle extended nonce\n if (extendNonceFn) {\n if (nonce.length !== 24) throw new Error(`arx: extended nonce must be 24 bytes`);\n extendNonceFn(sigma, k32, u32(nonce.subarray(0, 16)), k32);\n nonce = nonce.subarray(16);\n }\n\n // Handle nonce counter\n const nonceNcLen = 16 - counterLength;\n if (nonceNcLen !== nonce.length)\n throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`);\n\n // Pad counter when nonce is 64 bit\n if (nonceNcLen !== 12) {\n const nc = new Uint8Array(12);\n nc.set(nonce, counterRight ? 0 : 12 - nonce.length);\n nonce = nc;\n toClean.push(nonce);\n }\n const n32 = u32(nonce);\n runCipher(core, sigma, k32, n32, data, output, counter, rounds);\n clean(...toClean);\n return output;\n };\n}\n\n/** Internal class which wraps chacha20 or chacha8 to create CSPRNG. */\nexport class _XorStreamPRG implements PRG {\n readonly blockLen: number;\n readonly keyLen: number;\n readonly nonceLen: number;\n private state: Uint8Array;\n private buf: Uint8Array;\n private key: Uint8Array;\n private nonce: Uint8Array;\n private pos: number;\n private ctr: number;\n private cipher: XorStream;\n constructor(\n cipher: XorStream,\n blockLen: number,\n keyLen: number,\n nonceLen: number,\n seed: Uint8Array\n ) {\n this.cipher = cipher;\n this.blockLen = blockLen;\n this.keyLen = keyLen;\n this.nonceLen = nonceLen;\n this.state = new Uint8Array(this.keyLen + this.nonceLen);\n this.reseed(seed);\n this.ctr = 0;\n this.pos = this.blockLen;\n this.buf = new Uint8Array(this.blockLen);\n this.key = this.state.subarray(0, this.keyLen);\n this.nonce = this.state.subarray(this.keyLen);\n }\n private reseed(seed: Uint8Array) {\n abytes(seed);\n if (!seed || seed.length === 0) throw new Error('entropy required');\n for (let i = 0; i < seed.length; i++) this.state[i % this.state.length] ^= seed[i];\n this.ctr = 0;\n this.pos = this.blockLen;\n }\n addEntropy(seed: Uint8Array): void {\n this.state.set(this.randomBytes(this.state.length));\n this.reseed(seed);\n }\n randomBytes(len: number): Uint8Array {\n anumber(len);\n if (len === 0) return new Uint8Array(0);\n const out = new Uint8Array(len);\n let outPos = 0;\n // Leftovers\n if (this.pos < this.blockLen) {\n const take = Math.min(len, this.blockLen - this.pos);\n out.set(this.buf.subarray(this.pos, this.pos + take), 0);\n this.pos += take;\n outPos += take;\n if (outPos === len) return out; // fast path\n }\n // Full blocks directly to out\n const blocks = Math.floor((len - outPos) / this.blockLen);\n if (blocks > 0) {\n const blockBytes = blocks * this.blockLen;\n const b = out.subarray(outPos, outPos + blockBytes);\n this.cipher(this.key, this.nonce, b, b, this.ctr);\n this.ctr += blocks;\n outPos += blockBytes;\n }\n // Save leftovers\n const left = len - outPos;\n if (left > 0) {\n this.buf.fill(0);\n // NOTE: cipher will handle overflow\n this.cipher(this.key, this.nonce, this.buf, this.buf, this.ctr++);\n out.set(this.buf.subarray(0, left), outPos);\n this.pos = left;\n }\n return out;\n }\n clone(): _XorStreamPRG {\n return new _XorStreamPRG(\n this.cipher,\n this.blockLen,\n this.keyLen,\n this.nonceLen,\n this.randomBytes(this.state.length)\n );\n }\n clean(): void {\n this.pos = 0;\n this.ctr = 0;\n this.buf.fill(0);\n this.state.fill(0);\n }\n}\n\nexport type XorPRG = (seed?: Uint8Array) => _XorStreamPRG;\n\nexport const createPRG = (\n cipher: XorStream,\n blockLen: number,\n keyLen: number,\n nonceLen: number\n): XorPRG => {\n return (seed: Uint8Array = randomBytes(32)): _XorStreamPRG =>\n new _XorStreamPRG(cipher, blockLen, keyLen, nonceLen, seed);\n};\n", "/**\n * Poly1305 ([PDF](https://cr.yp.to/mac/poly1305-20050329.pdf),\n * [wiki](https://en.wikipedia.org/wiki/Poly1305))\n * is a fast and parallel secret-key message-authentication code suitable for\n * a wide variety of applications. It was standardized in\n * [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and is now used in TLS 1.3.\n *\n * Polynomial MACs are not perfect for every situation:\n * they lack Random Key Robustness: the MAC can be forged, and can't be used in PAKE schemes.\n * See [invisible salamanders attack](https://keymaterial.net/2020/09/07/invisible-salamanders-in-aes-gcm-siv/).\n * To combat invisible salamanders, `hash(key)` can be included in ciphertext,\n * however, this would violate ciphertext indistinguishability:\n * an attacker would know which key was used - so `HKDF(key, i)`\n * could be used instead.\n *\n * Check out [original website](https://cr.yp.to/mac.html).\n * Based on Public Domain [poly1305-donna](https://github.com/floodyberry/poly1305-donna).\n * @module\n */\n// prettier-ignore\nimport {\n abytes, aexists, aoutput, bytesToHex,\n clean, concatBytes, copyBytes, hexToNumber, numberToBytesBE,\n type IHash2\n} from './utils.ts';\n\nfunction u8to16(a: Uint8Array, i: number) {\n return (a[i++] & 0xff) | ((a[i++] & 0xff) << 8);\n}\n\nfunction bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));\n}\n\n/** Small version of `poly1305` without loop unrolling. Unused, provided for auditability. */\nfunction poly1305_small(msg: Uint8Array, key: Uint8Array): Uint8Array {\n abytes(msg);\n abytes(key, 32, 'key');\n const POW_2_130_5 = BigInt(2) ** BigInt(130) - BigInt(5); // 2^130-5\n const POW_2_128_1 = BigInt(2) ** BigInt(128) - BigInt(1); // 2^128-1\n const CLAMP_R = BigInt('0x0ffffffc0ffffffc0ffffffc0fffffff');\n const r = bytesToNumberLE(key.subarray(0, 16)) & CLAMP_R;\n const s = bytesToNumberLE(key.subarray(16));\n // Process by 16 byte chunks\n let acc = BigInt(0);\n for (let i = 0; i < msg.length; i += 16) {\n const m = msg.subarray(i, i + 16);\n const n = bytesToNumberLE(m) | (BigInt(1) << BigInt(8 * m.length));\n acc = ((acc + n) * r) % POW_2_130_5;\n }\n const res = (acc + s) & POW_2_128_1;\n return numberToBytesBE(res, 16).reverse(); // LE\n}\n\n// Can be used to replace `computeTag` in chacha.ts. Unused, provided for auditability.\n// @ts-expect-error\nfunction poly1305_computeTag_small(\n authKey: Uint8Array,\n lengths: Uint8Array,\n ciphertext: Uint8Array,\n AAD?: Uint8Array\n): Uint8Array {\n const res = [];\n const updatePadded2 = (msg: Uint8Array) => {\n res.push(msg);\n const leftover = msg.length % 16;\n if (leftover) res.push(new Uint8Array(16).slice(leftover));\n };\n if (AAD) updatePadded2(AAD);\n updatePadded2(ciphertext);\n res.push(lengths);\n return poly1305_small(concatBytes(...res), authKey);\n}\n\n/** Poly1305 class. Prefer poly1305() function instead. */\nexport class Poly1305 implements IHash2 {\n readonly blockLen = 16;\n readonly outputLen = 16;\n private buffer = new Uint8Array(16);\n private r = new Uint16Array(10); // Allocating 1 array with .subarray() here is slower than 3\n private h = new Uint16Array(10);\n private pad = new Uint16Array(8);\n private pos = 0;\n protected finished = false;\n\n // Can be speed-up using BigUint64Array, at the cost of complexity\n constructor(key: Uint8Array) {\n key = copyBytes(abytes(key, 32, 'key'));\n const t0 = u8to16(key, 0);\n const t1 = u8to16(key, 2);\n const t2 = u8to16(key, 4);\n const t3 = u8to16(key, 6);\n const t4 = u8to16(key, 8);\n const t5 = u8to16(key, 10);\n const t6 = u8to16(key, 12);\n const t7 = u8to16(key, 14);\n\n // https://github.com/floodyberry/poly1305-donna/blob/e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781/poly1305-donna-16.h#L47\n this.r[0] = t0 & 0x1fff;\n this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = (t4 >>> 1) & 0x1ffe;\n this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = (t7 >>> 5) & 0x007f;\n for (let i = 0; i < 8; i++) this.pad[i] = u8to16(key, 16 + 2 * i);\n }\n\n private process(data: Uint8Array, offset: number, isLast = false) {\n const hibit = isLast ? 0 : 1 << 11;\n const { h, r } = this;\n const r0 = r[0];\n const r1 = r[1];\n const r2 = r[2];\n const r3 = r[3];\n const r4 = r[4];\n const r5 = r[5];\n const r6 = r[6];\n const r7 = r[7];\n const r8 = r[8];\n const r9 = r[9];\n\n const t0 = u8to16(data, offset + 0);\n const t1 = u8to16(data, offset + 2);\n const t2 = u8to16(data, offset + 4);\n const t3 = u8to16(data, offset + 6);\n const t4 = u8to16(data, offset + 8);\n const t5 = u8to16(data, offset + 10);\n const t6 = u8to16(data, offset + 12);\n const t7 = u8to16(data, offset + 14);\n\n let h0 = h[0] + (t0 & 0x1fff);\n let h1 = h[1] + (((t0 >>> 13) | (t1 << 3)) & 0x1fff);\n let h2 = h[2] + (((t1 >>> 10) | (t2 << 6)) & 0x1fff);\n let h3 = h[3] + (((t2 >>> 7) | (t3 << 9)) & 0x1fff);\n let h4 = h[4] + (((t3 >>> 4) | (t4 << 12)) & 0x1fff);\n let h5 = h[5] + ((t4 >>> 1) & 0x1fff);\n let h6 = h[6] + (((t4 >>> 14) | (t5 << 2)) & 0x1fff);\n let h7 = h[7] + (((t5 >>> 11) | (t6 << 5)) & 0x1fff);\n let h8 = h[8] + (((t6 >>> 8) | (t7 << 8)) & 0x1fff);\n let h9 = h[9] + ((t7 >>> 5) | hibit);\n\n let c = 0;\n\n let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6);\n c = d0 >>> 13;\n d0 &= 0x1fff;\n d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1);\n c += d0 >>> 13;\n d0 &= 0x1fff;\n\n let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7);\n c = d1 >>> 13;\n d1 &= 0x1fff;\n d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2);\n c += d1 >>> 13;\n d1 &= 0x1fff;\n\n let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8);\n c = d2 >>> 13;\n d2 &= 0x1fff;\n d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3);\n c += d2 >>> 13;\n d2 &= 0x1fff;\n\n let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9);\n c = d3 >>> 13;\n d3 &= 0x1fff;\n d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4);\n c += d3 >>> 13;\n d3 &= 0x1fff;\n\n let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0;\n c = d4 >>> 13;\n d4 &= 0x1fff;\n d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5);\n c += d4 >>> 13;\n d4 &= 0x1fff;\n\n let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1;\n c = d5 >>> 13;\n d5 &= 0x1fff;\n d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6);\n c += d5 >>> 13;\n d5 &= 0x1fff;\n\n let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2;\n c = d6 >>> 13;\n d6 &= 0x1fff;\n d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7);\n c += d6 >>> 13;\n d6 &= 0x1fff;\n\n let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3;\n c = d7 >>> 13;\n d7 &= 0x1fff;\n d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8);\n c += d7 >>> 13;\n d7 &= 0x1fff;\n\n let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4;\n c = d8 >>> 13;\n d8 &= 0x1fff;\n d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9);\n c += d8 >>> 13;\n d8 &= 0x1fff;\n\n let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5;\n c = d9 >>> 13;\n d9 &= 0x1fff;\n d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0;\n c += d9 >>> 13;\n d9 &= 0x1fff;\n\n c = ((c << 2) + c) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = c >>> 13;\n d1 += c;\n\n h[0] = d0;\n h[1] = d1;\n h[2] = d2;\n h[3] = d3;\n h[4] = d4;\n h[5] = d5;\n h[6] = d6;\n h[7] = d7;\n h[8] = d8;\n h[9] = d9;\n }\n\n private finalize() {\n const { h, pad } = this;\n const g = new Uint16Array(10);\n let c = h[1] >>> 13;\n h[1] &= 0x1fff;\n for (let i = 2; i < 10; i++) {\n h[i] += c;\n c = h[i] >>> 13;\n h[i] &= 0x1fff;\n }\n h[0] += c * 5;\n c = h[0] >>> 13;\n h[0] &= 0x1fff;\n h[1] += c;\n c = h[1] >>> 13;\n h[1] &= 0x1fff;\n h[2] += c;\n\n g[0] = h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (let i = 1; i < 10; i++) {\n g[i] = h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= 1 << 13;\n\n let mask = (c ^ 1) - 1;\n for (let i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (let i = 0; i < 10; i++) h[i] = (h[i] & mask) | g[i];\n h[0] = (h[0] | (h[1] << 13)) & 0xffff;\n h[1] = ((h[1] >>> 3) | (h[2] << 10)) & 0xffff;\n h[2] = ((h[2] >>> 6) | (h[3] << 7)) & 0xffff;\n h[3] = ((h[3] >>> 9) | (h[4] << 4)) & 0xffff;\n h[4] = ((h[4] >>> 12) | (h[5] << 1) | (h[6] << 14)) & 0xffff;\n h[5] = ((h[6] >>> 2) | (h[7] << 11)) & 0xffff;\n h[6] = ((h[7] >>> 5) | (h[8] << 8)) & 0xffff;\n h[7] = ((h[8] >>> 8) | (h[9] << 5)) & 0xffff;\n\n let f = h[0] + pad[0];\n h[0] = f & 0xffff;\n for (let i = 1; i < 8; i++) {\n f = (((h[i] + pad[i]) | 0) + (f >>> 16)) | 0;\n h[i] = f & 0xffff;\n }\n clean(g);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n data = copyBytes(data);\n const { buffer, blockLen } = this;\n const len = data.length;\n\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input\n if (take === blockLen) {\n for (; blockLen <= len - pos; pos += blockLen) this.process(data, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(buffer, 0, false);\n this.pos = 0;\n }\n }\n return this;\n }\n destroy(): void {\n clean(this.h, this.r, this.buffer, this.pad);\n }\n digestInto(out: Uint8Array): Uint8Array {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n const { buffer, h } = this;\n let { pos } = this;\n if (pos) {\n buffer[pos++] = 1;\n for (; pos < 16; pos++) buffer[pos] = 0;\n this.process(buffer, 0, true);\n }\n this.finalize();\n let opos = 0;\n for (let i = 0; i < 8; i++) {\n out[opos++] = h[i] >>> 0;\n out[opos++] = h[i] >>> 8;\n }\n return out;\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n}\n\nexport type CHash = ReturnType<typeof wrapConstructorWithKey>;\nexport function wrapConstructorWithKey<H extends IHash2>(\n hashCons: (key: Uint8Array) => H\n): {\n (msg: Uint8Array, key: Uint8Array): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(key: Uint8Array): H;\n} {\n const hashC = (msg: Uint8Array, key: Uint8Array): Uint8Array =>\n hashCons(key).update(msg).digest();\n const tmp = hashCons(new Uint8Array(32)); // tmp array, used just once below\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (key: Uint8Array) => hashCons(key);\n return hashC;\n}\n\n/** Poly1305 MAC from RFC 8439. */\nexport const poly1305: CHash = /** @__PURE__ */ (() =>\n wrapConstructorWithKey((key) => new Poly1305(key)))();\n", "/**\n * ChaCha stream cipher, released\n * in 2008. Developed after Salsa20, ChaCha aims to increase diffusion per round.\n * It was standardized in [RFC 8439](https://www.rfc-editor.org/rfc/rfc8439) and\n * is now used in TLS 1.3.\n *\n * [XChaCha20](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha)\n * extended-nonce variant is also provided. Similar to XSalsa, it's safe to use with\n * randomly-generated nonces.\n *\n * Check out [PDF](http://cr.yp.to/chacha/chacha-20080128.pdf) and\n * [wiki](https://en.wikipedia.org/wiki/Salsa20) and\n * [website](https://cr.yp.to/chacha.html).\n *\n * @module\n */\nimport { type XorPRG, createCipher, createPRG, rotl } from './_arx.ts';\nimport { poly1305 } from './_poly1305.ts';\nimport {\n type ARXCipher,\n type CipherWithOutput,\n type XorStream,\n abytes,\n clean,\n equalBytes,\n getOutput,\n u64Lengths,\n wrapCipher,\n} from './utils.ts';\n\n/**\n * ChaCha core function. It is implemented twice:\n * 1. Simple loop (chachaCore_small, hchacha_small)\n * 2. Unrolled loop (chachaCore, hchacha) - 4x faster, but larger & harder to read\n * The specific implementation is selected in `createCipher` below.\n */\n\n/** quarter-round */\n// prettier-ignore\nfunction chachaQR(x: Uint32Array, a: number, b: number, c: number, d: number) {\n x[a] = (x[a] + x[b]) | 0; x[d] = rotl(x[d] ^ x[a], 16);\n x[c] = (x[c] + x[d]) | 0; x[b] = rotl(x[b] ^ x[c], 12);\n x[a] = (x[a] + x[b]) | 0; x[d] = rotl(x[d] ^ x[a], 8);\n x[c] = (x[c] + x[d]) | 0; x[b] = rotl(x[b] ^ x[c], 7);\n}\n\n/** single round */\nfunction chachaRound(x: Uint32Array, rounds = 20) {\n for (let r = 0; r < rounds; r += 2) {\n chachaQR(x, 0, 4, 8, 12);\n chachaQR(x, 1, 5, 9, 13);\n chachaQR(x, 2, 6, 10, 14);\n chachaQR(x, 3, 7, 11, 15);\n chachaQR(x, 0, 5, 10, 15);\n chachaQR(x, 1, 6, 11, 12);\n chachaQR(x, 2, 7, 8, 13);\n chachaQR(x, 3, 4, 9, 14);\n }\n}\n\nconst ctmp = /* @__PURE__ */ new Uint32Array(16);\n\n/** Small version of chacha without loop unrolling. Unused, provided for auditability. */\n// prettier-ignore\nfunction chacha(\n s: Uint32Array, k: Uint32Array, i: Uint32Array, out: Uint32Array,\n isHChacha: boolean = true, rounds: number = 20\n): void {\n // Create initial array using common pattern\n const y = Uint32Array.from([\n s[0], s[1], s[2], s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n k[0], k[1], k[2], k[3], // Key Key Key Key\n k[4], k[5], k[6], k[7], // Key Key Key Key\n i[0], i[1], i[2], i[3], // Counter Counter Nonce Nonce\n ]);\n const x = ctmp;\n x.set(y);\n chachaRound(x, rounds);\n\n // hchacha extracts 8 specific bytes, chacha adds orig to result\n if (isHChacha) {\n const xindexes = [0, 1, 2, 3, 12, 13, 14, 15];\n for (let i = 0; i < 8; i++) out[i] = x[xindexes[i]];\n } else {\n for (let i = 0; i < 16; i++) out[i] = (y[i] + x[i]) | 0;\n }\n}\n\n/** Identical to `chachaCore`. Unused. */\n// @ts-ignore\nconst chachaCore_small: typeof chachaCore = (s, k, n, out, cnt, rounds) =>\n chacha(s, k, Uint32Array.from([n[0], n[1], cnt, 0]), out, false, rounds);\n/** Identical to `hchacha`. Unused. */\n// @ts-ignore\nconst hchacha_small: typeof hchacha = chacha;\n\n/** Identical to `chachaCore_small`. Unused. */\n// prettier-ignore\nfunction chachaCore(\n s: Uint32Array, k: Uint32Array, n: Uint32Array, out: Uint32Array, cnt: number, rounds = 20\n): void {\n let y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], // \"expa\" \"nd 3\" \"2-by\" \"te k\"\n y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], // Key Key Key Key\n y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], // Key Key Key Key\n y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; // Counter Counter\tNonce Nonce\n // Save state to temporary variables\n let x00 = y00, x01 = y01, x02 = y02, x03 = y03,\n x04 = y04, x05 = y05, x06 = y06, x07 = y07,\n x08 = y08, x09 = y09, x10 = y10, x11 = y11,\n x12 = y12, x13 = y13, x14 = y14, x15 = y15;\n for (let r = 0; r < rounds; r += 2) {\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);\n\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);\n\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);\n\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8)\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);\n\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);\n\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);\n\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);\n\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16)\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);\n }\n // Write output\n let oi = 0;\n out[oi++] = (y00 + x00) | 0; out[oi++] = (y01 + x01) | 0;\n out[oi++] = (y02 + x02) | 0; out[oi++] = (y03 + x03) | 0;\n out[oi++] = (y04 + x04) | 0; out[oi++] = (y05 + x05) | 0;\n out[oi++] = (y06 + x06) | 0; out[oi++] = (y07 + x07) | 0;\n out[oi++] = (y08 + x08) | 0; out[oi++] = (y09 + x09) | 0;\n out[oi++] = (y10 + x10) | 0; out[oi++] = (y11 + x11) | 0;\n out[oi++] = (y12 + x12) | 0; out[oi++] = (y13 + x13) | 0;\n out[oi++] = (y14 + x14) | 0; out[oi++] = (y15 + x15) | 0;\n}\n/**\n * hchacha hashes key and nonce into key' and nonce' for xchacha20.\n * Identical to `hchacha_small`.\n * Need to find a way to merge it with `chachaCore` without 25% performance hit.\n */\n// prettier-ignore\nexport function hchacha(\n s: Uint32Array, k: Uint32Array, i: Uint32Array, out: Uint32Array\n): void {\n let x00 = s[0], x01 = s[1], x02 = s[2], x03 = s[3],\n x04 = k[0], x05 = k[1], x06 = k[2], x07 = k[3],\n x08 = k[4], x09 = k[5], x10 = k[6], x11 = k[7],\n x12 = i[0], x13 = i[1], x14 = i[2], x15 = i[3];\n for (let r = 0; r < 20; r += 2) {\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 16);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 12);\n x00 = (x00 + x04) | 0; x12 = rotl(x12 ^ x00, 8);\n x08 = (x08 + x12) | 0; x04 = rotl(x04 ^ x08, 7);\n\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 16);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 12);\n x01 = (x01 + x05) | 0; x13 = rotl(x13 ^ x01, 8);\n x09 = (x09 + x13) | 0; x05 = rotl(x05 ^ x09, 7);\n\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 16);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 12);\n x02 = (x02 + x06) | 0; x14 = rotl(x14 ^ x02, 8);\n x10 = (x10 + x14) | 0; x06 = rotl(x06 ^ x10, 7);\n\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 16);\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 12);\n x03 = (x03 + x07) | 0; x15 = rotl(x15 ^ x03, 8)\n x11 = (x11 + x15) | 0; x07 = rotl(x07 ^ x11, 7);\n\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 16);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 12);\n x00 = (x00 + x05) | 0; x15 = rotl(x15 ^ x00, 8);\n x10 = (x10 + x15) | 0; x05 = rotl(x05 ^ x10, 7);\n\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 16);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 12);\n x01 = (x01 + x06) | 0; x12 = rotl(x12 ^ x01, 8);\n x11 = (x11 + x12) | 0; x06 = rotl(x06 ^ x11, 7);\n\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 16);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 12);\n x02 = (x02 + x07) | 0; x13 = rotl(x13 ^ x02, 8);\n x08 = (x08 + x13) | 0; x07 = rotl(x07 ^ x08, 7);\n\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 16)\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 12);\n x03 = (x03 + x04) | 0; x14 = rotl(x14 ^ x03, 8);\n x09 = (x09 + x14) | 0; x04 = rotl(x04 ^ x09, 7);\n }\n let oi = 0;\n out[oi++] = x00; out[oi++] = x01;\n out[oi++] = x02; out[oi++] = x03;\n out[oi++] = x12; out[oi++] = x13;\n out[oi++] = x14; out[oi++] = x15;\n}\n\n/** Original, non-RFC chacha20 from DJB. 8-byte nonce, 8-byte counter. */\nexport const chacha20orig: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n allowShortKeys: true,\n});\n/**\n * ChaCha stream cipher. Conforms to RFC 8439 (IETF, TLS). 12-byte nonce, 4-byte counter.\n * With smaller nonce, it's not safe to make it random (CSPRNG), due to collision chance.\n */\nexport const chacha20: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n allowShortKeys: false,\n});\n\n/**\n * XChaCha eXtended-nonce ChaCha. With 24-byte nonce, it's safe to make it random (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 8,\n extendNonceFn: hchacha,\n allowShortKeys: false,\n});\n\n/** Reduced 8-round chacha, described in original paper. */\nexport const chacha8: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 8,\n});\n\n/** Reduced 12-round chacha, described in original paper. */\nexport const chacha12: XorStream = /* @__PURE__ */ createCipher(chachaCore, {\n counterRight: false,\n counterLength: 4,\n rounds: 12,\n});\n\nconst ZEROS16 = /* @__PURE__ */ new Uint8Array(16);\n// Pad to digest size with zeros\nconst updatePadded = (h: ReturnType<typeof poly1305.create>, msg: Uint8Array) => {\n h.update(msg);\n const leftover = msg.length % 16;\n if (leftover) h.update(ZEROS16.subarray(leftover));\n};\n\nconst ZEROS32 = /* @__PURE__ */ new Uint8Array(32);\nfunction computeTag(\n fn: XorStream,\n key: Uint8Array,\n nonce: Uint8Array,\n ciphertext: Uint8Array,\n AAD?: Uint8Array\n): Uint8Array {\n if (AAD !== undefined) abytes(AAD, undefined, 'AAD');\n const authKey = fn(key, nonce, ZEROS32);\n const lengths = u64Lengths(ciphertext.length, AAD ? AAD.length : 0, true);\n\n // Methods below can be replaced with\n // return poly1305_computeTag_small(authKey, lengths, ciphertext, AAD)\n const h = poly1305.create(authKey);\n if (AAD) updatePadded(h, AAD);\n updatePadded(h, ciphertext);\n h.update(lengths);\n const res = h.digest();\n clean(authKey, lengths);\n return res;\n}\n\n/**\n * AEAD algorithm from RFC 8439.\n * Salsa20 and chacha (RFC 8439) use poly1305 differently.\n * We could have composed them, but it's hard because of authKey:\n * In salsa20, authKey changes position in salsa stream.\n * In chacha, authKey can't be computed inside computeTag, it modifies the counter.\n */\nexport const _poly1305_aead =\n (xorStream: XorStream) =>\n (key: Uint8Array, nonce: Uint8Array, AAD?: Uint8Array): CipherWithOutput => {\n const tagLength = 16;\n return {\n encrypt(plaintext: Uint8Array, output?: Uint8Array) {\n const plength = plaintext.length;\n output = getOutput(plength + tagLength, output, false);\n output.set(plaintext);\n const oPlain = output.subarray(0, -tagLength);\n // Actual encryption\n xorStream(key, nonce, oPlain, oPlain, 1);\n const tag = computeTag(xorStream, key, nonce, oPlain, AAD);\n output.set(tag, plength); // append tag\n clean(tag);\n return output;\n },\n decrypt(ciphertext: Uint8Array, output?: Uint8Array) {\n output = getOutput(ciphertext.length - tagLength, output, false);\n const data = ciphertext.subarray(0, -tagLength);\n const passedTag = ciphertext.subarray(-tagLength);\n const tag = computeTag(xorStream, key, nonce, data, AAD);\n if (!equalBytes(passedTag, tag)) throw new Error('invalid tag');\n output.set(ciphertext.subarray(0, -tagLength));\n // Actual decryption\n xorStream(key, nonce, output, output, 1); // start stream with i=1\n clean(tag);\n return output;\n },\n };\n };\n\n/**\n * ChaCha20-Poly1305 from RFC 8439.\n *\n * Unsafe to use random nonces under the same key, due to collision chance.\n * Prefer XChaCha instead.\n */\nexport const chacha20poly1305: ARXCipher = /* @__PURE__ */ wrapCipher(\n { blockSize: 64, nonceLength: 12, tagLength: 16 },\n _poly1305_aead(chacha20)\n);\n/**\n * XChaCha20-Poly1305 extended-nonce chacha.\n *\n * Can be safely used with random nonces (CSPRNG).\n * See [IRTF draft](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha).\n */\nexport const xchacha20poly1305: ARXCipher = /* @__PURE__ */ wrapCipher(\n { blockSize: 64, nonceLength: 24, tagLength: 16 },\n _poly1305_aead(xchacha20)\n);\n\n/**\n * Chacha20 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Compatible with libtomcrypt. It does not have a specification, so unclear how secure it is.\n */\nexport const rngChacha20: XorPRG = /* @__PURE__ */ createPRG(chacha20orig, 64, 32, 8);\n/**\n * Chacha20/8 CSPRNG (cryptographically secure pseudorandom number generator).\n * It's best to limit usage to non-production, non-critical cases: for example, test-only.\n * Faster than `rngChacha20`.\n */\nexport const rngChacha8: XorPRG = /* @__PURE__ */ createPRG(chacha8, 64, 32, 12);\n", "/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nimport { hmac } from './hmac.ts';\nimport { abytes, ahash, anumber, type CHash, clean } from './utils.ts';\n\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nexport function extract(hash: CHash, ikm: Uint8Array, salt?: Uint8Array): Uint8Array {\n ahash(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined) salt = new Uint8Array(hash.outputLen);\n return hmac(hash, salt, ikm);\n}\n\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.of(0);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nexport function expand(\n hash: CHash,\n prk: Uint8Array,\n info?: Uint8Array,\n length: number = 32\n): Uint8Array {\n ahash(hash);\n anumber(length, 'length');\n const olen = hash.outputLen;\n if (length > 255 * olen) throw new Error('Length must be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined) info = EMPTY_BUFFER;\n else abytes(info, undefined, 'info');\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n clean(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nexport const hkdf = (\n hash: CHash,\n ikm: Uint8Array,\n salt: Uint8Array | undefined,\n info: Uint8Array | undefined,\n length: number\n): Uint8Array => expand(hash, extract(hash, ikm, salt), info, length);\n", "import { GenericRepost, Repost, ShortTextNote } from './kinds.ts'\nimport { EventPointer } from './nip19.ts'\nimport { Event, finalizeEvent, verifyEvent } from './pure.ts'\n\nexport type RepostEventTemplate = {\n /**\n * Pass only non-nip18 tags if you have to.\n * Nip18 tags ('e' and 'p' tags pointing to the reposted event) will be added automatically.\n */\n tags?: string[][]\n\n /**\n * Pass an empty string to NOT include the stringified JSON of the reposted event.\n * Any other content will be ignored and replaced with the stringified JSON of the reposted event.\n * @default Stringified JSON of the reposted event\n */\n content?: ''\n\n created_at: number\n}\n\nexport function finishRepostEvent(\n t: RepostEventTemplate,\n reposted: Event,\n relayUrl: string,\n privateKey: Uint8Array,\n): Event {\n let kind: Repost | GenericRepost\n const tags = [...(t.tags ?? []), ['e', reposted.id, relayUrl], ['p', reposted.pubkey]]\n if (reposted.kind === ShortTextNote) {\n kind = Repost\n } else {\n kind = GenericRepost\n tags.push(['k', String(reposted.kind)])\n }\n\n return finalizeEvent(\n {\n kind,\n tags,\n content: t.content === '' || reposted.tags?.find(tag => tag[0] === '-') ? '' : JSON.stringify(reposted),\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport function getRepostedEventPointer(event: Event): undefined | EventPointer {\n if (![Repost, GenericRepost].includes(event.kind)) {\n return undefined\n }\n\n let lastETag: undefined | string[]\n let lastPTag: undefined | string[]\n\n for (let i = event.tags.length - 1; i >= 0 && (lastETag === undefined || lastPTag === undefined); i--) {\n const tag = event.tags[i]\n if (tag.length >= 2) {\n if (tag[0] === 'e' && lastETag === undefined) {\n lastETag = tag\n } else if (tag[0] === 'p' && lastPTag === undefined) {\n lastPTag = tag\n }\n }\n }\n\n if (lastETag === undefined) {\n return undefined\n }\n\n return {\n id: lastETag[1],\n relays: [lastETag[2], lastPTag?.[2]].filter((x): x is string => typeof x === 'string'),\n author: lastPTag?.[1],\n }\n}\n\nexport type GetRepostedEventOptions = {\n skipVerification?: boolean\n}\n\nexport function getRepostedEvent(event: Event, { skipVerification }: GetRepostedEventOptions = {}): undefined | Event {\n const pointer = getRepostedEventPointer(event)\n\n if (pointer === undefined || event.content === '') {\n return undefined\n }\n\n let repostedEvent: undefined | Event\n\n try {\n repostedEvent = JSON.parse(event.content) as Event\n } catch (error) {\n return undefined\n }\n\n if (repostedEvent.id !== pointer.id) {\n return undefined\n }\n\n if (!skipVerification && !verifyEvent(repostedEvent)) {\n return undefined\n }\n\n return repostedEvent\n}\n", "import { AddressPointer, BECH32_REGEX, decode, EventPointer, ProfilePointer } from './nip19.ts'\n\n/** Nostr URI regex, eg `nostr:npub1...` */\nexport const NOSTR_URI_REGEX: RegExp = new RegExp(`nostr:(${BECH32_REGEX.source})`)\n\n/** Test whether the value is a Nostr URI. */\nexport function test(value: unknown): value is `nostr:${string}` {\n return typeof value === 'string' && new RegExp(`^${NOSTR_URI_REGEX.source}$`).test(value)\n}\n\n/** Parsed Nostr URI data. */\nexport interface NostrURI {\n /** Full URI including the `nostr:` protocol. */\n uri: `nostr:${string}`\n /** The bech32-encoded data (eg `npub1...`). */\n value: string\n /** Decoded bech32 string, according to NIP-19. */\n decoded:\n | {\n type: 'nevent'\n data: EventPointer\n }\n | {\n type: 'nprofile'\n data: ProfilePointer\n }\n | {\n type: 'naddr'\n data: AddressPointer\n }\n | {\n type: 'npub'\n data: string\n }\n | {\n type: 'nsec'\n data: Uint8Array\n }\n | {\n type: 'note'\n data: string\n }\n}\n\n/** Parse and decode a Nostr URI. */\nexport function parse(uri: string): NostrURI {\n const match = uri.match(new RegExp(`^${NOSTR_URI_REGEX.source}$`))\n if (!match) throw new Error(`Invalid Nostr URI: ${uri}`)\n return {\n uri: match[0] as `nostr:${string}`,\n value: match[1],\n decoded: decode(match[1]),\n }\n}\n", "import type { Event } from './core.ts'\nimport type { AddressPointer, EventPointer, ProfilePointer } from './nip19.ts'\n\nexport type ExternalPointer = {\n value: string\n hint?: string\n}\n\nfunction parseKind(kind: string | undefined): number | string | undefined {\n if (!kind) return undefined\n return /^\\d+$/.test(kind) ? parseInt(kind, 10) : kind\n}\n\nfunction parseAddressPointer(value: string, relayUrl?: string): AddressPointer | undefined {\n const idx = value.indexOf(':')\n const idx2 = value.indexOf(':', idx + 1)\n if (idx === -1 || idx2 === -1) return undefined\n\n const kind = parseInt(value.slice(0, idx), 10)\n if (Number.isNaN(kind)) return undefined\n\n return {\n kind,\n pubkey: value.slice(idx + 1, idx2),\n identifier: value.slice(idx2 + 1),\n relays: relayUrl ? [relayUrl] : [],\n }\n}\n\nfunction parsePointer(tag: string[]): EventPointer | AddressPointer | ExternalPointer | undefined {\n switch (tag[0]) {\n case 'E':\n case 'e':\n if (!tag[1]) return undefined\n return {\n id: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n author: tag[3],\n }\n case 'A':\n case 'a':\n if (!tag[1]) return undefined\n return parseAddressPointer(tag[1], tag[2])\n case 'I':\n case 'i':\n if (!tag[1]) return undefined\n return {\n value: tag[1],\n hint: tag[2],\n }\n }\n}\n\nfunction parseQuote(tag: string[]): EventPointer | AddressPointer | ExternalPointer | undefined {\n if (!tag[1]) return undefined\n\n if (tag[1].includes(':')) {\n return parseAddressPointer(tag[1], tag[2])\n }\n\n return {\n id: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n author: tag[3],\n }\n}\n\nfunction choosePointer(\n candidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }>,\n): EventPointer | AddressPointer | ExternalPointer | undefined {\n return (\n candidates.findLast(candidate => candidate.tagName === 'A' || candidate.tagName === 'a')?.pointer ||\n candidates.findLast(candidate => candidate.tagName === 'I' || candidate.tagName === 'i')?.pointer ||\n candidates.findLast(candidate => candidate.tagName === 'E' || candidate.tagName === 'e')?.pointer\n )\n}\n\nfunction inheritRelayHints(\n pointer: EventPointer | AddressPointer | ExternalPointer | undefined,\n profiles: ProfilePointer[],\n) {\n if (!pointer || !('id' in pointer) || !pointer.author) return\n\n const author = profiles.find(profile => profile.pubkey === pointer.author)\n if (!author || !author.relays) return\n\n if (!pointer.relays) {\n pointer.relays = []\n }\n\n author.relays.forEach(url => {\n if (pointer.relays!.indexOf(url) === -1) pointer.relays!.push(url)\n })\n author.relays = pointer.relays\n}\n\nexport function parse(event: Pick<Event, 'tags'>): {\n /**\n * Pointer to root scope.\n */\n root: EventPointer | AddressPointer | ExternalPointer | undefined\n\n /**\n * Kind of root scope from `K` tag.\n */\n rootKind: number | string | undefined\n\n /**\n * Pointer to parent item being replied to.\n */\n reply: EventPointer | AddressPointer | ExternalPointer | undefined\n\n /**\n * Kind of parent item from `k` tag.\n */\n replyKind: number | string | undefined\n\n /**\n * Reserved for extra referenced items.\n */\n mentions: (EventPointer | AddressPointer | ExternalPointer)[]\n\n /**\n * Pointers directly quoted with `q` tags.\n */\n quotes: (EventPointer | AddressPointer | ExternalPointer)[]\n\n /**\n * Root and parent authors.\n */\n profiles: ProfilePointer[]\n} {\n const result: ReturnType<typeof parse> = {\n root: undefined,\n rootKind: undefined,\n reply: undefined,\n replyKind: undefined,\n mentions: [],\n quotes: [],\n profiles: [],\n }\n\n const rootCandidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }> = []\n const replyCandidates: Array<{ tagName: string; pointer: EventPointer | AddressPointer | ExternalPointer }> = []\n\n for (const tag of event.tags) {\n if ((tag[0] === 'E' || tag[0] === 'A' || tag[0] === 'I') && tag[1]) {\n const pointer = parsePointer(tag)\n if (pointer) rootCandidates.push({ tagName: tag[0], pointer })\n continue\n }\n\n if ((tag[0] === 'e' || tag[0] === 'a' || tag[0] === 'i') && tag[1]) {\n const pointer = parsePointer(tag)\n if (pointer) replyCandidates.push({ tagName: tag[0], pointer })\n continue\n }\n\n if (tag[0] === 'K') {\n result.rootKind = parseKind(tag[1])\n continue\n }\n\n if (tag[0] === 'k') {\n result.replyKind = parseKind(tag[1])\n continue\n }\n\n if (tag[0] === 'q') {\n const pointer = parseQuote(tag)\n if (pointer) result.quotes.push(pointer)\n continue\n }\n\n if ((tag[0] === 'P' || tag[0] === 'p') && tag[1]) {\n result.profiles.push({\n pubkey: tag[1],\n relays: tag[2] ? [tag[2]] : [],\n })\n }\n }\n\n result.root = choosePointer(rootCandidates)\n result.reply = choosePointer(replyCandidates)\n\n inheritRelayHints(result.root, result.profiles)\n inheritRelayHints(result.reply, result.profiles)\n result.quotes.forEach(pointer => inheritRelayHints(pointer, result.profiles))\n\n return result\n}\n", "import { Event, finalizeEvent } from './pure.ts'\nimport { Reaction } from './kinds.ts'\n\nimport type { EventPointer } from './nip19.ts'\n\nexport type ReactionEventTemplate = {\n /**\n * Pass only non-nip25 tags if you have to. Nip25 tags ('e' and 'p' tags from reacted event) will be added automatically.\n */\n tags?: string[][]\n\n /**\n * @default '+'\n */\n content?: string\n\n created_at: number\n}\n\nexport function finishReactionEvent(t: ReactionEventTemplate, reacted: Event, privateKey: Uint8Array): Event {\n const inheritedTags = reacted.tags.filter(tag => tag.length >= 2 && (tag[0] === 'e' || tag[0] === 'p'))\n\n return finalizeEvent(\n {\n ...t,\n kind: Reaction,\n tags: [...(t.tags ?? []), ...inheritedTags, ['e', reacted.id], ['p', reacted.pubkey]],\n content: t.content ?? '+',\n },\n privateKey,\n )\n}\n\nexport function getReactedEventPointer(event: Event): undefined | EventPointer {\n if (event.kind !== Reaction) {\n return undefined\n }\n\n let lastETag: undefined | string[]\n let lastPTag: undefined | string[]\n\n for (let i = event.tags.length - 1; i >= 0 && (lastETag === undefined || lastPTag === undefined); i--) {\n const tag = event.tags[i]\n if (tag.length >= 2) {\n if (tag[0] === 'e' && lastETag === undefined) {\n lastETag = tag\n } else if (tag[0] === 'p' && lastPTag === undefined) {\n lastPTag = tag\n }\n }\n }\n\n if (lastETag === undefined || lastPTag === undefined) {\n return undefined\n }\n\n return {\n id: lastETag[1],\n relays: [lastETag[2], lastPTag[2]].filter(x => x !== undefined),\n author: lastPTag[1],\n }\n}\n", "import { NostrEvent } from './core.ts'\nimport { AddressPointer, EventPointer, ProfilePointer, decode } from './nip19.ts'\n\nexport type Block =\n | {\n type: 'text'\n text: string\n }\n | {\n type: 'reference'\n pointer: ProfilePointer | AddressPointer | EventPointer\n }\n | {\n type: 'url'\n url: string\n }\n | {\n type: 'relay'\n url: string\n }\n | {\n type: 'image'\n url: string\n }\n | {\n type: 'video'\n url: string\n }\n | {\n type: 'audio'\n url: string\n }\n | {\n type: 'emoji'\n shortcode: string\n url: string\n }\n | {\n type: 'hashtag'\n value: string\n }\n\nconst noCharacter = /\\W/m\nconst noURLCharacter = /[^\\w\\/] |[^\\w\\/]$|$|,| /m\nconst MAX_HASHTAG_LENGTH = 42\n\nexport function* parse(content: string | NostrEvent): Iterable<Block> {\n let emojis: { type: 'emoji'; shortcode: string; url: string }[] = []\n if (typeof content !== 'string') {\n for (let i = 0; i < content.tags.length; i++) {\n const tag = content.tags[i]\n if (tag[0] === 'emoji' && tag.length >= 3) {\n emojis.push({ type: 'emoji', shortcode: tag[1], url: tag[2] })\n }\n }\n content = content.content\n }\n\n const max = content.length\n let prevIndex = 0\n let index = 0\n mainloop: while (index < max) {\n const u = content.indexOf(':', index)\n const h = content.indexOf('#', index)\n if (u === -1 && h === -1) {\n // reached end\n break mainloop\n }\n\n if (u === -1 || (h >= 0 && h < u)) {\n // parse hashtag\n if (h === 0 || content[h - 1].match(noCharacter)) {\n const m = content.slice(h + 1, h + MAX_HASHTAG_LENGTH).match(noCharacter)\n const end = m ? h + 1 + m.index! : max\n yield { type: 'text', text: content.slice(prevIndex, h) }\n yield { type: 'hashtag', value: content.slice(h + 1, end) }\n index = end\n prevIndex = index\n continue mainloop\n }\n\n // ignore this, it is nothing\n index = h + 1\n continue mainloop\n }\n\n // otherwise parse things that have an \":\"\n if (content.slice(u - 5, u) === 'nostr') {\n const m = content.slice(u + 60).match(noCharacter)\n const end = m ? u + 60 + m.index! : max\n try {\n let pointer: ProfilePointer | AddressPointer | EventPointer\n let { data, type } = decode(content.slice(u + 1, end))\n\n switch (type) {\n case 'npub':\n pointer = { pubkey: data } as ProfilePointer\n break\n case 'note':\n pointer = { id: data } as EventPointer\n break\n case 'nsec':\n // ignore this, treat it as not a valid uri\n index = end + 1\n continue\n default:\n pointer = data as any\n }\n\n if (prevIndex !== u - 5) {\n yield { type: 'text', text: content.slice(prevIndex, u - 5) }\n }\n yield { type: 'reference', pointer }\n index = end\n prevIndex = index\n continue mainloop\n } catch (_err) {\n // ignore this, not a valid nostr uri\n index = u + 1\n continue mainloop\n }\n } else if (content.slice(u - 5, u) === 'https' || content.slice(u - 4, u) === 'http') {\n const m = content.slice(u + 4).match(noURLCharacter)\n const end = m ? u + 4 + m.index! : max\n const prefixLen = content[u - 1] === 's' ? 5 : 4\n try {\n let url = new URL(content.slice(u - prefixLen, end))\n if (url.hostname.indexOf('.') === -1) {\n throw new Error('invalid url')\n }\n\n if (prevIndex !== u - prefixLen) {\n yield { type: 'text', text: content.slice(prevIndex, u - prefixLen) }\n }\n\n if (/\\.(png|jpe?g|gif|webp|heic|svg)$/i.test(url.pathname)) {\n yield { type: 'image', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n }\n if (/\\.(mp4|avi|webm|mkv|mov)$/i.test(url.pathname)) {\n yield { type: 'video', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n }\n if (/\\.(mp3|aac|ogg|opus|wav|flac)$/i.test(url.pathname)) {\n yield { type: 'audio', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n }\n\n yield { type: 'url', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n } catch (_err) {\n // ignore this, not a valid url\n index = end + 1\n continue mainloop\n }\n } else if (content.slice(u - 3, u) === 'wss' || content.slice(u - 2, u) === 'ws') {\n const m = content.slice(u + 4).match(noURLCharacter)\n const end = m ? u + 4 + m.index! : max\n const prefixLen = content[u - 1] === 's' ? 3 : 2\n try {\n let url = new URL(content.slice(u - prefixLen, end))\n if (url.hostname.indexOf('.') === -1) {\n throw new Error('invalid ws url')\n }\n\n if (prevIndex !== u - prefixLen) {\n yield { type: 'text', text: content.slice(prevIndex, u - prefixLen) }\n }\n yield { type: 'relay', url: url.toString() }\n index = end\n prevIndex = index\n continue mainloop\n } catch (_err) {\n // ignore this, not a valid url\n index = end + 1\n continue mainloop\n }\n } else {\n // try to parse an emoji shortcode\n for (let e = 0; e < emojis.length; e++) {\n const emoji = emojis[e]\n if (\n content[u + emoji.shortcode.length + 1] === ':' &&\n content.slice(u + 1, u + emoji.shortcode.length + 1) === emoji.shortcode\n ) {\n // found an emoji\n if (prevIndex !== u) {\n yield { type: 'text', text: content.slice(prevIndex, u) }\n }\n yield emoji\n index = u + emoji.shortcode.length + 2\n prevIndex = index\n continue mainloop\n }\n }\n\n // ignore this, it is nothing\n index = u + 1\n continue mainloop\n }\n }\n\n if (prevIndex !== max) {\n yield { type: 'text', text: content.slice(prevIndex) }\n }\n}\n", "import { Event, finalizeEvent } from './pure.ts'\nimport {\n ChannelCreation,\n ChannelHideMessage,\n ChannelMessage,\n ChannelMetadata as KindChannelMetadata,\n ChannelMuteUser,\n} from './kinds.ts'\n\nexport interface ChannelMetadata {\n name: string\n about: string\n picture: string\n}\n\nexport interface ChannelCreateEventTemplate {\n /* JSON string containing ChannelMetadata as defined for Kind 40 and 41 in nip-28. */\n content: string | ChannelMetadata\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelMetadataEventTemplate {\n channel_create_event_id: string\n /* JSON string containing ChannelMetadata as defined for Kind 40 and 41 in nip-28. */\n content: string | ChannelMetadata\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelMessageEventTemplate {\n channel_create_event_id: string\n reply_to_channel_message_event_id?: string\n relay_url: string\n content: string\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelHideMessageEventTemplate {\n channel_message_event_id: string\n content: string | { reason: string }\n created_at: number\n tags?: string[][]\n}\n\nexport interface ChannelMuteUserEventTemplate {\n content: string | { reason: string }\n created_at: number\n pubkey_to_mute: string\n tags?: string[][]\n}\n\nexport const channelCreateEvent = (t: ChannelCreateEventTemplate, privateKey: Uint8Array): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: ChannelCreation,\n tags: [...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport const channelMetadataEvent = (t: ChannelMetadataEventTemplate, privateKey: Uint8Array): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: KindChannelMetadata,\n tags: [['e', t.channel_create_event_id], ...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport const channelMessageEvent = (t: ChannelMessageEventTemplate, privateKey: Uint8Array): Event => {\n const tags = [['e', t.channel_create_event_id, t.relay_url, 'root']]\n\n if (t.reply_to_channel_message_event_id) {\n tags.push(['e', t.reply_to_channel_message_event_id, t.relay_url, 'reply'])\n }\n\n return finalizeEvent(\n {\n kind: ChannelMessage,\n tags: [...tags, ...(t.tags ?? [])],\n content: t.content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\n/* \"e\" tag should be the kind 42 event to hide */\nexport const channelHideMessageEvent = (\n t: ChannelHideMessageEventTemplate,\n privateKey: Uint8Array,\n): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: ChannelHideMessage,\n tags: [['e', t.channel_message_event_id], ...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n\nexport const channelMuteUserEvent = (t: ChannelMuteUserEventTemplate, privateKey: Uint8Array): Event | undefined => {\n let content: string\n if (typeof t.content === 'object') {\n content = JSON.stringify(t.content)\n } else if (typeof t.content === 'string') {\n content = t.content\n } else {\n return undefined\n }\n\n return finalizeEvent(\n {\n kind: ChannelMuteUser,\n tags: [['p', t.pubkey_to_mute], ...(t.tags ?? [])],\n content: content,\n created_at: t.created_at,\n },\n privateKey,\n )\n}\n", "/** Regex for a single emoji shortcode. */\nexport const EMOJI_SHORTCODE_REGEX = /:(\\w+):/\n\n/** Regex to find emoji shortcodes in content. */\nexport const regex = (): RegExp => new RegExp(`\\\\B${EMOJI_SHORTCODE_REGEX.source}\\\\B`, 'g')\n\n/** Represents a Nostr custom emoji. */\nexport interface CustomEmoji {\n /** The matched emoji name with colons. */\n shortcode: `:${string}:`\n /** The matched emoji name without colons. */\n name: string\n}\n\n/** Match result for a custom emoji in text content. */\nexport interface CustomEmojiMatch extends CustomEmoji {\n /** Index where the emoji begins in the text content. */\n start: number\n /** Index where the emoji ends in the text content. */\n end: number\n}\n\n/** Find all custom emoji shortcodes. */\nexport function* matchAll(content: string): Iterable<CustomEmojiMatch> {\n const matches = content.matchAll(regex())\n\n for (const match of matches) {\n try {\n const [shortcode, name] = match\n\n yield {\n shortcode: shortcode as `:${string}:`,\n name,\n start: match.index!,\n end: match.index! + shortcode.length,\n }\n } catch (_e) {\n // do nothing\n }\n }\n}\n\n/** Replace all emoji shortcodes in the content. */\nexport function replaceAll(content: string, replacer: (match: CustomEmoji) => string): string {\n return content.replaceAll(regex(), (shortcode, name) => {\n return replacer({\n shortcode: shortcode as `:${string}:`,\n name,\n })\n })\n}\n", "var _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function validateGithub(pubkey: string, username: string, proof: string): Promise<boolean> {\n try {\n let res = await (await _fetch(`https://gist.github.com/${username}/${proof}/raw`)).text()\n return res === `Verifying that I control the following Nostr public key: ${pubkey}`\n } catch (_) {\n return false\n }\n}\n", "import { type VerifiedEvent, finalizeEvent } from './pure.ts'\nimport { NWCWalletRequest } from './kinds.ts'\nimport { encrypt } from './nip04.ts'\n\ninterface NWCConnection {\n pubkey: string\n relay: string\n relays: string[]\n secret: string\n}\n\nexport function parseConnectionString(connectionString: string): NWCConnection {\n const { host, pathname, searchParams } = new URL(connectionString)\n const pubkey = pathname || host\n const relays = searchParams.getAll('relay')\n const secret = searchParams.get('secret')\n\n if (!pubkey || relays.length === 0 || !secret) {\n throw new Error('invalid connection string')\n }\n\n return { pubkey, relay: relays[0], relays, secret }\n}\n\nexport async function makeNwcRequestEvent(\n pubkey: string,\n secretKey: Uint8Array,\n invoice: string,\n): Promise<VerifiedEvent> {\n const content = {\n method: 'pay_invoice',\n params: {\n invoice,\n },\n }\n const encryptedContent = encrypt(secretKey, pubkey, JSON.stringify(content))\n const eventTemplate = {\n kind: NWCWalletRequest,\n created_at: Math.round(Date.now() / 1000),\n content: encryptedContent,\n tags: [['p', pubkey]],\n }\n\n return finalizeEvent(eventTemplate, secretKey)\n}\n", "export function normalizeIdentifier(name: string): string {\n // Trim and lowercase\n name = name.trim().toLowerCase()\n\n // Normalize Unicode to NFKC form\n name = name.normalize('NFKC')\n\n // Convert to array of characters and map each one\n return Array.from(name)\n .map(char => {\n // Check if character is letter or number using Unicode ranges\n if (/\\p{Letter}/u.test(char) || /\\p{Number}/u.test(char)) {\n return char\n }\n\n return '-'\n })\n .join('')\n}\n", "import { bech32 } from '@scure/base'\n\nimport { NostrEvent, validateEvent, verifyEvent, type Event, type EventTemplate } from './pure.ts'\nimport { utf8Decoder } from './utils.ts'\nimport { isReplaceableKind, isAddressableKind } from './kinds.ts'\n\nvar _fetch: any\n\ntry {\n _fetch = fetch\n} catch {}\n\nexport function useFetchImplementation(fetchImplementation: any) {\n _fetch = fetchImplementation\n}\n\nexport async function getZapEndpoint(metadata: Event): Promise<null | string> {\n try {\n let lnurl: string = ''\n let { lud06, lud16 } = JSON.parse(metadata.content)\n if (lud16) {\n let [name, domain] = lud16.split('@')\n lnurl = new URL(`/.well-known/lnurlp/${name}`, `https://${domain}`).toString()\n } else if (lud06) {\n let { words } = bech32.decode(lud06, 1000)\n let data = bech32.fromWords(words)\n lnurl = utf8Decoder.decode(data)\n } else {\n return null\n }\n\n let res = await _fetch(lnurl)\n let body = await res.json()\n\n if (body.allowsNostr && body.nostrPubkey) {\n return body.callback\n }\n } catch (err) {\n /*-*/\n }\n\n return null\n}\n\ntype ProfileZap = {\n pubkey: string\n amount: number\n comment?: string\n relays: string[]\n}\n\ntype EventZap = {\n event: NostrEvent\n amount: number\n comment?: string\n relays: string[]\n}\n\nexport function makeZapRequest(params: ProfileZap | EventZap): EventTemplate {\n let zr: EventTemplate = {\n kind: 9734,\n created_at: Math.round(Date.now() / 1000),\n content: params.comment || '',\n tags: [\n ['p', 'pubkey' in params ? params.pubkey : params.event.pubkey],\n ['amount', params.amount.toString()],\n ['relays', ...params.relays],\n ],\n }\n\n if ('event' in params) {\n zr.tags.push(['e', params.event.id])\n if (isReplaceableKind(params.event.kind)) {\n const a = ['a', `${params.event.kind}:${params.event.pubkey}:`]\n zr.tags.push(a)\n } else if (isAddressableKind(params.event.kind)) {\n let d = params.event.tags.find(([t, v]) => t === 'd' && v)\n if (!d) throw new Error('d tag not found or is empty')\n const a = ['a', `${params.event.kind}:${params.event.pubkey}:${d[1]}`]\n zr.tags.push(a)\n }\n zr.tags.push(['k', params.event.kind.toString()])\n }\n\n return zr\n}\n\nexport function validateZapRequest(zapRequestString: string): string | null {\n let zapRequest: Event\n\n try {\n zapRequest = JSON.parse(zapRequestString)\n } catch (err) {\n return 'Invalid zap request JSON.'\n }\n\n if (!validateEvent(zapRequest)) return 'Zap request is not a valid Nostr event.'\n\n if (!verifyEvent(zapRequest)) return 'Invalid signature on zap request.'\n\n let p = zapRequest.tags.find(([t, v]) => t === 'p' && v)\n if (!p) return \"Zap request doesn't have a 'p' tag.\"\n if (!p[1].match(/^[a-f0-9]{64}$/)) return \"Zap request 'p' tag is not valid hex.\"\n\n let e = zapRequest.tags.find(([t, v]) => t === 'e' && v)\n if (e && !e[1].match(/^[a-f0-9]{64}$/)) return \"Zap request 'e' tag is not valid hex.\"\n\n let relays = zapRequest.tags.find(([t, v]) => t === 'relays' && v)\n if (!relays) return \"Zap request doesn't have a 'relays' tag.\"\n\n return null\n}\n\nexport function makeZapReceipt({\n zapRequest,\n preimage,\n bolt11,\n paidAt,\n}: {\n zapRequest: string\n preimage?: string\n bolt11: string\n paidAt: Date\n}): EventTemplate {\n let zr: Event = JSON.parse(zapRequest)\n let tagsFromZapRequest = zr.tags.filter(([t]) => t === 'e' || t === 'p' || t === 'a')\n\n let zap: EventTemplate = {\n kind: 9735,\n created_at: Math.round(paidAt.getTime() / 1000),\n content: '',\n tags: [...tagsFromZapRequest, ['P', zr.pubkey], ['bolt11', bolt11], ['description', zapRequest]],\n }\n\n if (preimage) {\n zap.tags.push(['preimage', preimage])\n }\n\n return zap\n}\n\nexport function getSatoshisAmountFromBolt11(bolt11: string): number {\n if (bolt11.length < 50) {\n return 0\n }\n bolt11 = bolt11.substring(0, 50)\n const idx = bolt11.lastIndexOf('1')\n if (idx === -1) {\n return 0\n }\n const hrp = bolt11.substring(0, idx)\n if (!hrp.startsWith('lnbc')) {\n return 0\n }\n const amount = hrp.substring(4) // equivalent to strings.CutPrefix\n\n if (amount.length < 1) {\n return 0\n }\n\n // if last character is a digit, then the amount can just be interpreted as BTC\n const char = amount[amount.length - 1]\n const digit = char.charCodeAt(0) - '0'.charCodeAt(0)\n const isDigit = digit >= 0 && digit <= 9\n\n let cutPoint = amount.length - 1\n if (isDigit) {\n cutPoint++\n }\n\n if (cutPoint < 1) {\n return 0\n }\n\n const num = parseInt(amount.substring(0, cutPoint))\n\n switch (char) {\n case 'm':\n return num * 100000\n case 'u':\n return num * 100\n case 'n':\n return num / 10\n case 'p':\n return num / 10000\n default:\n return num * 100000000\n }\n}\n", "import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { Filter } from './filter.ts'\nimport { AbstractRelay, Subscription } from './relay.ts'\nimport { sha256 } from '@noble/hashes/sha2.js'\n\n// Negentropy implementation by Doug Hoyte\nconst PROTOCOL_VERSION = 0x61 // Version 1\nconst ID_SIZE = 32\nconst FINGERPRINT_SIZE = 16\n\nconst Mode = {\n Skip: 0,\n Fingerprint: 1,\n IdList: 2,\n}\n\nclass WrappedBuffer {\n _raw: Uint8Array\n length: number\n\n constructor(buffer?: Uint8Array | number) {\n if (typeof buffer === 'number') {\n this._raw = new Uint8Array(buffer)\n this.length = 0\n } else if (buffer instanceof Uint8Array) {\n this._raw = new Uint8Array(buffer)\n this.length = buffer.length\n } else {\n this._raw = new Uint8Array(512)\n this.length = 0\n }\n }\n\n unwrap(): Uint8Array {\n return this._raw.subarray(0, this.length)\n }\n\n get capacity(): number {\n return this._raw.byteLength\n }\n\n extend(buf: Uint8Array | WrappedBuffer): void {\n if (buf instanceof WrappedBuffer) buf = buf.unwrap()\n if (typeof buf.length !== 'number') throw Error('bad length')\n const targetSize = buf.length + this.length\n if (this.capacity < targetSize) {\n const oldRaw = this._raw\n const newCapacity = Math.max(this.capacity * 2, targetSize)\n this._raw = new Uint8Array(newCapacity)\n this._raw.set(oldRaw)\n }\n\n this._raw.set(buf, this.length)\n this.length += buf.length\n }\n\n shift(): number {\n const first = this._raw[0]\n this._raw = this._raw.subarray(1)\n this.length--\n return first\n }\n\n shiftN(n: number = 1): Uint8Array {\n const firstSubarray = this._raw.subarray(0, n)\n this._raw = this._raw.subarray(n)\n this.length -= n\n return firstSubarray\n }\n}\n\nfunction decodeVarInt(buf: WrappedBuffer): number {\n let res = 0\n\n while (1) {\n if (buf.length === 0) throw Error('parse ends prematurely')\n let byte = buf.shift()\n res = (res << 7) | (byte & 127)\n if ((byte & 128) === 0) break\n }\n\n return res\n}\n\nfunction encodeVarInt(n: number): WrappedBuffer {\n if (n === 0) return new WrappedBuffer(new Uint8Array([0]))\n\n let o: number[] = []\n\n while (n !== 0) {\n o.push(n & 127)\n n >>>= 7\n }\n\n o.reverse()\n\n for (let i = 0; i < o.length - 1; i++) o[i] |= 128\n\n return new WrappedBuffer(new Uint8Array(o))\n}\n\nfunction getByte(buf: WrappedBuffer): number {\n return getBytes(buf, 1)[0]\n}\n\nfunction getBytes(buf: WrappedBuffer, n: number): Uint8Array {\n if (buf.length < n) throw Error('parse ends prematurely')\n return buf.shiftN(n)\n}\n\nclass Accumulator {\n buf!: Uint8Array\n\n constructor() {\n this.setToZero()\n }\n\n setToZero(): void {\n this.buf = new Uint8Array(ID_SIZE)\n }\n\n add(otherBuf: Uint8Array): void {\n let currCarry = 0,\n nextCarry = 0\n let p = new DataView(this.buf.buffer)\n let po = new DataView(otherBuf.buffer)\n\n for (let i = 0; i < 8; i++) {\n let offset = i * 4\n let orig = p.getUint32(offset, true)\n let otherV = po.getUint32(offset, true)\n\n let next = orig\n\n next += currCarry\n next += otherV\n if (next > 0xffffffff) nextCarry = 1\n\n p.setUint32(offset, next & 0xffffffff, true)\n currCarry = nextCarry\n nextCarry = 0\n }\n }\n\n negate(): void {\n let p = new DataView(this.buf.buffer)\n\n for (let i = 0; i < 8; i++) {\n let offset = i * 4\n p.setUint32(offset, ~p.getUint32(offset, true))\n }\n\n let one = new Uint8Array(ID_SIZE)\n one[0] = 1\n this.add(one)\n }\n\n getFingerprint(n: number): Uint8Array {\n let input = new WrappedBuffer()\n input.extend(this.buf)\n input.extend(encodeVarInt(n))\n\n let hash = sha256(input.unwrap())\n return hash.subarray(0, FINGERPRINT_SIZE)\n }\n}\n\nexport class NegentropyStorageVector {\n items: { timestamp: number; id: Uint8Array }[]\n sealed: boolean\n\n constructor() {\n this.items = []\n this.sealed = false\n }\n\n insert(timestamp: number, id: string): void {\n if (this.sealed) throw Error('already sealed')\n const idb = hexToBytes(id)\n if (idb.byteLength !== ID_SIZE) throw Error('bad id size for added item')\n this.items.push({ timestamp, id: idb })\n }\n\n seal(): void {\n if (this.sealed) throw Error('already sealed')\n this.sealed = true\n\n this.items.sort(itemCompare)\n\n for (let i = 1; i < this.items.length; i++) {\n if (itemCompare(this.items[i - 1], this.items[i]) === 0) throw Error('duplicate item inserted')\n }\n }\n\n unseal(): void {\n this.sealed = false\n }\n\n size(): number {\n this._checkSealed()\n return this.items.length\n }\n\n getItem(i: number): { timestamp: number; id: Uint8Array } {\n this._checkSealed()\n if (i >= this.items.length) throw Error('out of range')\n return this.items[i]\n }\n\n iterate(begin: number, end: number, cb: (item: { timestamp: number; id: Uint8Array }, i: number) => boolean): void {\n this._checkSealed()\n this._checkBounds(begin, end)\n\n for (let i = begin; i < end; ++i) {\n if (!cb(this.items[i], i)) break\n }\n }\n\n findLowerBound(begin: number, end: number, bound: { timestamp: number; id: Uint8Array }): number {\n this._checkSealed()\n this._checkBounds(begin, end)\n\n return this._binarySearch(this.items, begin, end, a => itemCompare(a, bound) < 0)\n }\n\n fingerprint(begin: number, end: number): Uint8Array {\n let out = new Accumulator()\n out.setToZero()\n\n this.iterate(begin, end, item => {\n out.add(item.id)\n return true\n })\n\n return out.getFingerprint(end - begin)\n }\n\n _checkSealed(): void {\n if (!this.sealed) throw Error('not sealed')\n }\n\n _checkBounds(begin: number, end: number): void {\n if (begin > end || end > this.items.length) throw Error('bad range')\n }\n\n _binarySearch(\n arr: { timestamp: number; id: Uint8Array }[],\n first: number,\n last: number,\n cmp: (a: { timestamp: number; id: Uint8Array }) => boolean,\n ): number {\n let count = last - first\n\n while (count > 0) {\n let it = first\n let step = Math.floor(count / 2)\n it += step\n\n if (cmp(arr[it])) {\n first = ++it\n count -= step + 1\n } else {\n count = step\n }\n }\n\n return first\n }\n}\n\nexport class Negentropy {\n storage: NegentropyStorageVector\n frameSizeLimit: number\n lastTimestampIn: number\n lastTimestampOut: number\n\n constructor(storage: NegentropyStorageVector, frameSizeLimit: number = 60_000) {\n if (frameSizeLimit < 4096) throw Error('frameSizeLimit too small')\n\n this.storage = storage\n this.frameSizeLimit = frameSizeLimit\n\n this.lastTimestampIn = 0\n this.lastTimestampOut = 0\n }\n\n _bound(timestamp: number, id?: Uint8Array): { timestamp: number; id: Uint8Array } {\n return { timestamp, id: id || new Uint8Array(0) }\n }\n\n initiate(): string {\n let output = new WrappedBuffer()\n output.extend(new Uint8Array([PROTOCOL_VERSION]))\n this.splitRange(0, this.storage.size(), this._bound(Number.MAX_VALUE), output)\n return bytesToHex(output.unwrap())\n }\n\n reconcile(queryMsg: string, onhave?: (id: string) => void, onneed?: (id: string) => void): string | null {\n const query = new WrappedBuffer(hexToBytes(queryMsg))\n\n this.lastTimestampIn = this.lastTimestampOut = 0 // reset for each message\n\n let fullOutput = new WrappedBuffer()\n fullOutput.extend(new Uint8Array([PROTOCOL_VERSION]))\n\n let protocolVersion = getByte(query)\n if (protocolVersion < 0x60 || protocolVersion > 0x6f) throw Error('invalid negentropy protocol version byte')\n if (protocolVersion !== PROTOCOL_VERSION) {\n throw Error('unsupported negentropy protocol version requested: ' + (protocolVersion - 0x60))\n }\n\n let storageSize = this.storage.size()\n let prevBound = this._bound(0)\n let prevIndex = 0\n let skip = false\n\n while (query.length !== 0) {\n let o = new WrappedBuffer()\n\n let doSkip = () => {\n if (skip) {\n skip = false\n o.extend(this.encodeBound(prevBound))\n o.extend(encodeVarInt(Mode.Skip))\n }\n }\n\n let currBound = this.decodeBound(query)\n let mode = decodeVarInt(query)\n\n let lower = prevIndex\n let upper = this.storage.findLowerBound(prevIndex, storageSize, currBound)\n\n if (mode === Mode.Skip) {\n skip = true\n } else if (mode === Mode.Fingerprint) {\n let theirFingerprint = getBytes(query, FINGERPRINT_SIZE)\n let ourFingerprint = this.storage.fingerprint(lower, upper)\n\n if (compareUint8Array(theirFingerprint, ourFingerprint) !== 0) {\n doSkip()\n this.splitRange(lower, upper, currBound, o)\n } else {\n skip = true\n }\n } else if (mode === Mode.IdList) {\n let numIds = decodeVarInt(query)\n\n let theirElems: { [key: string]: Uint8Array } = {} // stringified Uint8Array -> original Uint8Array (or hex)\n for (let i = 0; i < numIds; i++) {\n let e = getBytes(query, ID_SIZE)\n theirElems[bytesToHex(e)] = e\n }\n\n skip = true\n this.storage.iterate(lower, upper, item => {\n let k = item.id\n const id = bytesToHex(k)\n\n if (!theirElems[id]) {\n // ID exists on our side, but not their side\n onhave?.(id)\n } else {\n // ID exists on both sides\n delete theirElems[bytesToHex(k)]\n }\n\n return true\n })\n\n if (onneed) {\n for (let v of Object.values(theirElems)) {\n // ID exists on their side, but not our side\n onneed(bytesToHex(v))\n }\n }\n } else {\n throw Error('unexpected mode')\n }\n\n if (this.exceededFrameSizeLimit(fullOutput.length + o.length)) {\n // frameSizeLimit exceeded: stop range processing and return a fingerprint for the remaining range\n let remainingFingerprint = this.storage.fingerprint(upper, storageSize)\n\n fullOutput.extend(this.encodeBound(this._bound(Number.MAX_VALUE)))\n fullOutput.extend(encodeVarInt(Mode.Fingerprint))\n fullOutput.extend(remainingFingerprint)\n break\n } else {\n fullOutput.extend(o)\n }\n\n prevIndex = upper\n prevBound = currBound\n }\n\n return fullOutput.length === 1 ? null : bytesToHex(fullOutput.unwrap())\n }\n\n splitRange(lower: number, upper: number, upperBound: { timestamp: number; id: Uint8Array }, o: WrappedBuffer) {\n let numElems = upper - lower\n let buckets = 16\n\n if (numElems < buckets * 2) {\n o.extend(this.encodeBound(upperBound))\n o.extend(encodeVarInt(Mode.IdList))\n\n o.extend(encodeVarInt(numElems))\n this.storage.iterate(lower, upper, item => {\n o.extend(item.id)\n return true\n })\n } else {\n let itemsPerBucket = Math.floor(numElems / buckets)\n let bucketsWithExtra = numElems % buckets\n let curr = lower\n\n for (let i = 0; i < buckets; i++) {\n let bucketSize = itemsPerBucket + (i < bucketsWithExtra ? 1 : 0)\n let ourFingerprint = this.storage.fingerprint(curr, curr + bucketSize)\n curr += bucketSize\n\n let nextBound: { timestamp: number; id: Uint8Array }\n\n if (curr === upper) {\n nextBound = upperBound\n } else {\n let prevItem: { timestamp: number; id: Uint8Array } | undefined\n let currItem: { timestamp: number; id: Uint8Array } | undefined\n\n this.storage.iterate(curr - 1, curr + 1, (item, index) => {\n if (index === curr - 1) prevItem = item\n else currItem = item\n return true\n })\n\n nextBound = this.getMinimalBound(prevItem!, currItem!)\n }\n\n o.extend(this.encodeBound(nextBound))\n o.extend(encodeVarInt(Mode.Fingerprint))\n o.extend(ourFingerprint)\n }\n }\n }\n\n exceededFrameSizeLimit(n: number): boolean {\n return n > this.frameSizeLimit - 200\n }\n\n // Decoding\n decodeTimestampIn(encoded: WrappedBuffer): number {\n let timestamp = decodeVarInt(encoded)\n timestamp = timestamp === 0 ? Number.MAX_VALUE : timestamp - 1\n if (this.lastTimestampIn === Number.MAX_VALUE || timestamp === Number.MAX_VALUE) {\n this.lastTimestampIn = Number.MAX_VALUE\n return Number.MAX_VALUE\n }\n timestamp += this.lastTimestampIn\n this.lastTimestampIn = timestamp\n return timestamp\n }\n\n decodeBound(encoded: WrappedBuffer): { timestamp: number; id: Uint8Array } {\n let timestamp = this.decodeTimestampIn(encoded)\n let len = decodeVarInt(encoded)\n if (len > ID_SIZE) throw Error('bound key too long')\n let id = getBytes(encoded, len)\n return { timestamp, id }\n }\n\n // Encoding\n encodeTimestampOut(timestamp: number): WrappedBuffer {\n if (timestamp === Number.MAX_VALUE) {\n this.lastTimestampOut = Number.MAX_VALUE\n return encodeVarInt(0)\n }\n\n let temp = timestamp\n timestamp -= this.lastTimestampOut\n this.lastTimestampOut = temp\n return encodeVarInt(timestamp + 1)\n }\n\n encodeBound(key: { timestamp: number; id: Uint8Array }): WrappedBuffer {\n let output = new WrappedBuffer()\n\n output.extend(this.encodeTimestampOut(key.timestamp))\n output.extend(encodeVarInt(key.id.length))\n output.extend(key.id)\n\n return output\n }\n\n getMinimalBound(\n prev: { timestamp: number; id: Uint8Array },\n curr: { timestamp: number; id: Uint8Array },\n ): { timestamp: number; id: Uint8Array } {\n if (curr.timestamp !== prev.timestamp) {\n return this._bound(curr.timestamp)\n } else {\n let sharedPrefixBytes = 0\n let currKey = curr.id\n let prevKey = prev.id\n\n for (let i = 0; i < ID_SIZE; i++) {\n if (currKey[i] !== prevKey[i]) break\n sharedPrefixBytes++\n }\n\n return this._bound(curr.timestamp, curr.id.subarray(0, sharedPrefixBytes + 1))\n }\n }\n}\n\nfunction compareUint8Array(a: Uint8Array, b: Uint8Array): number {\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] < b[i]) return -1\n if (a[i] > b[i]) return 1\n }\n\n if (a.byteLength > b.byteLength) return 1\n if (a.byteLength < b.byteLength) return -1\n\n return 0\n}\n\nfunction itemCompare(a: { timestamp: number; id: Uint8Array }, b: { timestamp: number; id: Uint8Array }): number {\n if (a.timestamp === b.timestamp) {\n return compareUint8Array(a.id, b.id)\n }\n\n return a.timestamp - b.timestamp\n}\n\nexport class NegentropySync {\n relay: AbstractRelay\n storage: NegentropyStorageVector\n private neg: Negentropy\n private filter: Filter\n private subscription: Subscription\n private onhave?: (id: string) => void\n private onneed?: (id: string) => void\n\n constructor(\n relay: AbstractRelay,\n storage: NegentropyStorageVector,\n filter: Filter,\n params: {\n label?: string\n onhave?: (id: string) => void\n onneed?: (id: string) => void\n onclose?: (errReason?: string) => void\n } = {},\n ) {\n this.relay = relay\n this.storage = storage\n this.neg = new Negentropy(storage)\n this.onhave = params.onhave\n this.onneed = params.onneed\n this.filter = filter\n\n // we prepare a subscription with an empty filter, but it will not be used\n this.subscription = this.relay.prepareSubscription([{}], { label: params.label || 'negentropy' })\n this.subscription.oncustom = (data: string[]) => {\n switch (data[0]) {\n case 'NEG-MSG': {\n if (data.length < 3) {\n console.warn(`got invalid NEG-MSG from ${this.relay.url}: ${data}`)\n }\n try {\n const response = this.neg.reconcile(data[2], this.onhave, this.onneed)\n if (response) {\n this.relay.send(`[\"NEG-MSG\", \"${this.subscription.id}\", \"${response}\"]`)\n } else {\n this.close()\n params.onclose?.()\n }\n } catch (error) {\n console.error('negentropy reconcile error:', error)\n params?.onclose?.(`reconcile error: ${error}`)\n }\n break\n }\n case 'NEG-CLOSE': {\n const reason = data[2]\n console.warn('negentropy error:', reason)\n params.onclose?.(reason)\n break\n }\n case 'NEG-ERR': {\n params.onclose?.()\n }\n }\n }\n }\n\n async start(): Promise<void> {\n const initMsg = this.neg.initiate()\n this.relay.send(`[\"NEG-OPEN\",\"${this.subscription.id}\",${JSON.stringify(this.filter)},\"${initMsg}\"]`)\n }\n\n close(): void {\n this.relay.send(`[\"NEG-CLOSE\",\"${this.subscription.id}\"]`)\n this.subscription.close()\n }\n}\n", "import { sha256 } from '@noble/hashes/sha2.js'\nimport { bytesToHex } from '@noble/hashes/utils.js'\nimport { base64 } from '@scure/base'\n\nimport { HTTPAuth } from './kinds.ts'\nimport { Event, EventTemplate, verifyEvent } from './pure.ts'\nimport { utf8Decoder, utf8Encoder } from './utils.ts'\n\nconst _authorizationScheme = 'Nostr '\n\n/**\n * Generate token for NIP-98 flow.\n *\n * @example\n * const sign = window.nostr.signEvent\n * await nip98.getToken('https://example.com/login', 'post', (e) => sign(e), true)\n */\nexport async function getToken(\n loginUrl: string,\n httpMethod: string,\n sign: (e: EventTemplate) => Promise<Event> | Event,\n includeAuthorizationScheme: boolean = false,\n payload?: Record<string, any>,\n): Promise<string> {\n const event: EventTemplate = {\n kind: HTTPAuth,\n tags: [\n ['u', loginUrl],\n ['method', httpMethod],\n ],\n created_at: Math.round(new Date().getTime() / 1000),\n content: '',\n }\n\n if (payload) {\n event.tags.push(['payload', hashPayload(payload)])\n }\n\n const signedEvent = await sign(event)\n const authorizationScheme = includeAuthorizationScheme ? _authorizationScheme : ''\n\n return authorizationScheme + base64.encode(utf8Encoder.encode(JSON.stringify(signedEvent)))\n}\n\n/**\n * Validate token for NIP-98 flow.\n *\n * @example\n * await nip98.validateToken('Nostr base64token', 'https://example.com/login', 'post')\n */\nexport async function validateToken(token: string, url: string, method: string): Promise<boolean> {\n const event = await unpackEventFromToken(token).catch(error => {\n throw error\n })\n\n const valid = await validateEvent(event, url, method).catch(error => {\n throw error\n })\n\n return valid\n}\n\n/**\n * Unpacks an event from a token.\n *\n * @param token - The token to unpack.\n * @returns A promise that resolves to the unpacked event.\n * @throws {Error} If the token is missing, invalid, or cannot be parsed.\n */\nexport async function unpackEventFromToken(token: string): Promise<Event> {\n if (!token) {\n throw new Error('Missing token')\n }\n\n token = token.replace(_authorizationScheme, '')\n\n const eventB64 = utf8Decoder.decode(base64.decode(token))\n if (!eventB64 || eventB64.length === 0 || !eventB64.startsWith('{')) {\n throw new Error('Invalid token')\n }\n\n const event = JSON.parse(eventB64) as Event\n\n return event\n}\n\n/**\n * Validates the timestamp of an event.\n * @param event - The event object to validate.\n * @returns A boolean indicating whether the event timestamp is within the last 60 seconds.\n */\nexport function validateEventTimestamp(event: Event): boolean {\n if (!event.created_at) {\n return false\n }\n\n return Math.round(new Date().getTime() / 1000) - event.created_at < 60\n}\n\n/**\n * Validates the kind of an event.\n * @param event The event to validate.\n * @returns A boolean indicating whether the event kind is valid.\n */\nexport function validateEventKind(event: Event): boolean {\n return event.kind === HTTPAuth\n}\n\n/**\n * Validates if the given URL matches the URL tag of the event.\n * @param event - The event object.\n * @param url - The URL to validate.\n * @returns A boolean indicating whether the URL is valid or not.\n */\nexport function validateEventUrlTag(event: Event, url: string): boolean {\n const urlTag = event.tags.find(t => t[0] === 'u')\n\n if (!urlTag) {\n return false\n }\n\n return urlTag.length > 0 && urlTag[1] === url\n}\n\n/**\n * Validates if the given event has a method tag that matches the specified method.\n * @param event - The event to validate.\n * @param method - The method to match against the method tag.\n * @returns A boolean indicating whether the event has a matching method tag.\n */\nexport function validateEventMethodTag(event: Event, method: string): boolean {\n const methodTag = event.tags.find(t => t[0] === 'method')\n\n if (!methodTag) {\n return false\n }\n\n return methodTag.length > 0 && methodTag[1].toLowerCase() === method.toLowerCase()\n}\n\n/**\n * Calculates the hash of a payload.\n * @param payload - The payload to be hashed.\n * @returns The hash value as a string.\n */\nexport function hashPayload(payload: any): string {\n const hash = sha256(utf8Encoder.encode(JSON.stringify(payload)))\n return bytesToHex(hash)\n}\n\n/**\n * Validates the event payload tag against the provided payload.\n * @param event The event object.\n * @param payload The payload to validate.\n * @returns A boolean indicating whether the payload tag is valid.\n */\nexport function validateEventPayloadTag(event: Event, payload: any): boolean {\n const payloadTag = event.tags.find(t => t[0] === 'payload')\n\n if (!payloadTag) {\n return false\n }\n\n const payloadHash = hashPayload(payload)\n return payloadTag.length > 0 && payloadTag[1] === payloadHash\n}\n\n/**\n * Validates a Nostr event for the NIP-98 flow.\n *\n * @param event - The Nostr event to validate.\n * @param url - The URL associated with the event.\n * @param method - The HTTP method associated with the event.\n * @param body - The request body associated with the event (optional).\n * @returns A promise that resolves to a boolean indicating whether the event is valid.\n * @throws An error if the event is invalid.\n */\nexport async function validateEvent(event: Event, url: string, method: string, body?: any): Promise<boolean> {\n if (!verifyEvent(event)) {\n throw new Error('Invalid nostr event, signature invalid')\n }\n\n if (!validateEventKind(event)) {\n throw new Error('Invalid nostr event, kind invalid')\n }\n\n if (!validateEventTimestamp(event)) {\n throw new Error('Invalid nostr event, created_at timestamp invalid')\n }\n\n if (!validateEventUrlTag(event, url)) {\n throw new Error('Invalid nostr event, url tag invalid')\n }\n\n if (!validateEventMethodTag(event, method)) {\n throw new Error('Invalid nostr event, method tag invalid')\n }\n\n if (Boolean(body) && typeof body === 'object' && Object.keys(body).length > 0) {\n if (!validateEventPayloadTag(event, body)) {\n throw new Error('Invalid nostr event, payload tag does not match request body hash')\n }\n }\n\n return true\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["i", "i", "hex", "i", "pad", "isLE", "i", "i", "num", "hex", "i", "i", "_0n", "_1n", "_0n", "_1n", "gcd", "i", "num", "_0n", "_1n", "i", "_1n", "_0n", "_1n", "num", "isLE", "isLE", "num", "_1n", "_0n", "_1n", "i", "_0n", "_1n", "i", "isLE", "_0n", "getPublicKey", "pad", "i", "num", "_2n", "_0n", "_1n", "hex", "_3n", "_4n", "pointToBytes", "endo", "mul", "num", "getPublicKey", "randomBytes", "hmac", "_2n", "_1n", "r", "s", "hex", "_0n", "_0n", "_2n", "_3n", "i", "Date", "Date", "i", "challenge", "challenge", "i", "reason", "_WebSocket", "_WebSocket", "isBytes", "abytes", "anumber", "decode", "i", "padding", "num", "alphabet", "abytes", "i", "isBytes", "decode", "hasHexBuiltin", "abytes", "hex", "decrypt", "encrypt", "isBytes", "abool", "anumber", "abytes", "aexists", "aoutput", "clean", "i", "createView", "i", "abytes", "isLE", "abool", "num", "createView", "copyBytes", "i", "clean", "sbox", "sbox2", "i", "abytes", "copyBytes", "clean", "t0", "t1", "t2", "t3", "abytes", "copyBytes", "i", "copyBytes", "i", "clean", "abytes", "i", "abytes", "i", "clean", "encrypt", "decrypt", "i", "useFetchImplementation", "_fetch", "useFetchImplementation", "hex", "i", "now", "unwrapEvent", "unwrapManyEvents", "wrapEvent", "wrapManyEvents", "decrypt", "encrypt", "isAligned32", "anumber", "abool", "abytes", "copyBytes", "clean", "i", "copyBytes", "abytes", "i", "pad", "clean", "aexists", "aoutput", "i", "abytes", "clean", "num", "encrypt", "decrypt", "encrypt", "decrypt", "wrapEvent", "wrapManyEvents", "unwrapEvent", "unwrapManyEvents", "i", "parse", "parse", "parse", "parse", "i", "parse", "parse", "i", "useFetchImplementation", "_fetch", "useFetchImplementation", "encrypt", "useFetchImplementation", "_fetch", "useFetchImplementation", "num", "i", "validateEvent", "validateEvent"]
7
7
  }