stated-protocol 5.0.0

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 (62) hide show
  1. package/README.md +409 -0
  2. package/dist/constants.d.ts +225 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +227 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/esm/constants.d.ts +225 -0
  7. package/dist/esm/constants.d.ts.map +1 -0
  8. package/dist/esm/hash.d.ts +37 -0
  9. package/dist/esm/hash.d.ts.map +1 -0
  10. package/dist/esm/index.d.ts +6 -0
  11. package/dist/esm/index.d.ts.map +1 -0
  12. package/dist/esm/index.js +2104 -0
  13. package/dist/esm/index.js.map +7 -0
  14. package/dist/esm/protocol.d.ts +30 -0
  15. package/dist/esm/protocol.d.ts.map +1 -0
  16. package/dist/esm/signature.d.ts +49 -0
  17. package/dist/esm/signature.d.ts.map +1 -0
  18. package/dist/esm/types.d.ts +115 -0
  19. package/dist/esm/types.d.ts.map +1 -0
  20. package/dist/esm/utils.d.ts +14 -0
  21. package/dist/esm/utils.d.ts.map +1 -0
  22. package/dist/hash.d.ts +37 -0
  23. package/dist/hash.d.ts.map +1 -0
  24. package/dist/hash.js +99 -0
  25. package/dist/hash.js.map +1 -0
  26. package/dist/index.d.ts +6 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +22 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/protocol.d.ts +30 -0
  31. package/dist/protocol.d.ts.map +1 -0
  32. package/dist/protocol.js +677 -0
  33. package/dist/protocol.js.map +1 -0
  34. package/dist/signature.d.ts +49 -0
  35. package/dist/signature.d.ts.map +1 -0
  36. package/dist/signature.js +169 -0
  37. package/dist/signature.js.map +1 -0
  38. package/dist/types.d.ts +115 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +30 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/utils.d.ts +14 -0
  43. package/dist/utils.d.ts.map +1 -0
  44. package/dist/utils.js +96 -0
  45. package/dist/utils.js.map +1 -0
  46. package/package.json +66 -0
  47. package/src/constants.ts +245 -0
  48. package/src/fixtures.test.ts +236 -0
  49. package/src/hash.test.ts +219 -0
  50. package/src/hash.ts +99 -0
  51. package/src/index.ts +5 -0
  52. package/src/organisation-verification.test.ts +50 -0
  53. package/src/person-verification.test.ts +55 -0
  54. package/src/poll.test.ts +28 -0
  55. package/src/protocol.ts +871 -0
  56. package/src/rating.test.ts +25 -0
  57. package/src/signature.test.ts +200 -0
  58. package/src/signature.ts +159 -0
  59. package/src/statement.test.ts +101 -0
  60. package/src/types.ts +185 -0
  61. package/src/utils.test.ts +140 -0
  62. package/src/utils.ts +104 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/constants.ts", "../../node_modules/@noble/hashes/src/utils.ts", "../../node_modules/@noble/hashes/src/_md.ts", "../../node_modules/@noble/hashes/src/_u64.ts", "../../node_modules/@noble/hashes/src/sha2.ts", "../../src/hash.ts", "../../src/utils.ts", "../../node_modules/@noble/ed25519/index.js", "../../src/signature.ts", "../../src/types.ts", "../../src/protocol.ts"],
4
+ "sourcesContent": ["export const legalForms = {\n local_government: 'local government',\n state_government: 'state government',\n foreign_affairs_ministry: 'foreign affairs ministry',\n corporation: 'corporation',\n};\n\nexport const statementTypes = {\n statement: 'statement',\n organisationVerification: 'organisation_verification',\n personVerification: 'person_verification',\n poll: 'poll',\n vote: 'vote',\n response: 'response',\n disputeContent: 'dispute_statement_content',\n disputeAuthenticity: 'dispute_statement_authenticity',\n rating: 'rating',\n signPdf: 'sign_pdf',\n unsupported: 'unsupported',\n};\n\nexport const peopleCountBuckets = {\n '0': '0-10',\n '10': '10-100',\n '100': '100-1000',\n '1000': '1000-10,000',\n '10000': '10,000-100,000',\n '100000': '100,000+',\n '1000000': '1,000,000+',\n '10000000': '10,000,000+',\n};\n\nexport const supportedLanguages = {\n aa: 'aa',\n ab: 'ab',\n af: 'af',\n ak: 'ak',\n am: 'am',\n ar: 'ar',\n an: 'an',\n as: 'as',\n av: 'av',\n ay: 'ay',\n az: 'az',\n ba: 'ba',\n bm: 'bm',\n be: 'be',\n bn: 'bn',\n bi: 'bi',\n bo: 'bo',\n bs: 'bs',\n br: 'br',\n bg: 'bg',\n ca: 'ca',\n cs: 'cs',\n ch: 'ch',\n ce: 'ce',\n cv: 'cv',\n kw: 'kw',\n co: 'co',\n cr: 'cr',\n cy: 'cy',\n da: 'da',\n de: 'de',\n dv: 'dv',\n dz: 'dz',\n el: 'el',\n en: 'en',\n eo: 'eo',\n et: 'et',\n eu: 'eu',\n ee: 'ee',\n fo: 'fo',\n fa: 'fa',\n fj: 'fj',\n fi: 'fi',\n fr: 'fr',\n fy: 'fy',\n ff: 'ff',\n gd: 'gd',\n ga: 'ga',\n gl: 'gl',\n gv: 'gv',\n gn: 'gn',\n gu: 'gu',\n ht: 'ht',\n ha: 'ha',\n sh: 'sh',\n he: 'he',\n hz: 'hz',\n hi: 'hi',\n ho: 'ho',\n hr: 'hr',\n hu: 'hu',\n hy: 'hy',\n ig: 'ig',\n io: 'io',\n ii: 'ii',\n iu: 'iu',\n ie: 'ie',\n ia: 'ia',\n id: 'id',\n ik: 'ik',\n is: 'is',\n it: 'it',\n jv: 'jv',\n ja: 'ja',\n kl: 'kl',\n kn: 'kn',\n ks: 'ks',\n ka: 'ka',\n kr: 'kr',\n kk: 'kk',\n km: 'km',\n ki: 'ki',\n rw: 'rw',\n ky: 'ky',\n kv: 'kv',\n kg: 'kg',\n ko: 'ko',\n kj: 'kj',\n ku: 'ku',\n lo: 'lo',\n la: 'la',\n lv: 'lv',\n li: 'li',\n ln: 'ln',\n lt: 'lt',\n lb: 'lb',\n lu: 'lu',\n lg: 'lg',\n mh: 'mh',\n ml: 'ml',\n mr: 'mr',\n mk: 'mk',\n mg: 'mg',\n mt: 'mt',\n mn: 'mn',\n mi: 'mi',\n ms: 'ms',\n my: 'my',\n na: 'na',\n nv: 'nv',\n nr: 'nr',\n nd: 'nd',\n ng: 'ng',\n ne: 'ne',\n nl: 'nl',\n nn: 'nn',\n nb: 'nb',\n no: 'no',\n ny: 'ny',\n oc: 'oc',\n oj: 'oj',\n or: 'or',\n om: 'om',\n os: 'os',\n pa: 'pa',\n pi: 'pi',\n pl: 'pl',\n pt: 'pt',\n ps: 'ps',\n qu: 'qu',\n rm: 'rm',\n ro: 'ro',\n rn: 'rn',\n ru: 'ru',\n sg: 'sg',\n sa: 'sa',\n si: 'si',\n sk: 'sk',\n sl: 'sl',\n se: 'se',\n sm: 'sm',\n sn: 'sn',\n sd: 'sd',\n so: 'so',\n st: 'st',\n es: 'es',\n sq: 'sq',\n sc: 'sc',\n sr: 'sr',\n ss: 'ss',\n su: 'su',\n sw: 'sw',\n sv: 'sv',\n ty: 'ty',\n ta: 'ta',\n tt: 'tt',\n te: 'te',\n tg: 'tg',\n tl: 'tl',\n th: 'th',\n ti: 'ti',\n to: 'to',\n tn: 'tn',\n ts: 'ts',\n tk: 'tk',\n tr: 'tr',\n tw: 'tw',\n ug: 'ug',\n uk: 'uk',\n ur: 'ur',\n uz: 'uz',\n ve: 've',\n vi: 'vi',\n vo: 'vo',\n wa: 'wa',\n wo: 'wo',\n xh: 'xh',\n yi: 'yi',\n yo: 'yo',\n za: 'za',\n zh: 'zh',\n zu: 'zu',\n} as const;\n\nexport type SupportedLanguage = (typeof supportedLanguages)[keyof typeof supportedLanguages];\n\nexport const UTCFormat: RegExp =\n /(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s\\d{2}\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s\\d{4}\\s\\d{2}:\\d{2}:\\d{2}\\sGMT/;\n\nexport const pollKeys =\n /(Type: |The poll outcome is finalized when the following nodes agree: |Voting deadline: |Poll: |Option 1: |Option 2: |Option 3: |Option 4: |Option 5: |Allow free text votes: |Who can vote: |Description: |Country scope: |City scope: |Legal form scope: |Domain scope: |All entities with the following property: |As observed by: |Link to query defining who can vote: )/g;\n\nexport const organisationVerificationKeys =\n /(Type: |Description: |Name: |English name: |Country: |Legal entity: |Legal form: |Department using the domain: |Owner of the domain: |Foreign domain used for publishing statements: |Province or state: |Business register number: |City: |Longitude: |Latitude: |Population: |Logo: |Employee count: |Reliability policy: |Confidence: |Public key: )/g;\n\nexport const personVerificationKeys =\n /(Type: |Description: |Name: |Date of birth: |City of birth: |Country of birth: |Job title: |Employer: |Owner of the domain: |Foreign domain used for publishing statements: |Picture: |Verification method: |Confidence: |Reliability policy: )/g;\n\nexport const voteKeys = /(Type: |Poll id: |Poll: |Option: )/g;\n\nexport const disputeAuthenticityKeys =\n /(Type: |Description: |Hash of referenced statement: |Confidence: |Reliability policy: )/g;\n\nexport const disputeContentKeys =\n /(Type: |Description: |Hash of referenced statement: |Confidence: |Reliability policy: )/g;\n\nexport const responseKeys = /(Type: |Hash of referenced statement: |Response: )/;\n\nexport const PDFSigningKeys = /(Type: |Description: |PDF file hash: )/g;\n\nexport const ratingKeys =\n /(Type: |Subject type: |Subject name: |URL that identifies the subject: |Document file hash: |Rated quality: |Our rating: |Comment: )/;\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 * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\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 * Universal hash utilities using @noble/hashes\n * Works in both browser and Node.js environments\n */\n\nimport { sha256 as nobleSha256 } from '@noble/hashes/sha2.js';\n\n/**\n * Compute SHA-256 hash of a string and return it as URL-safe base64\n * Works in both browser and Node.js environments\n * @param input - The string or buffer to hash\n * @returns URL-safe base64 encoded hash\n */\nexport const sha256 = (input: string | Uint8Array): string => {\n let data: Uint8Array;\n\n if (typeof input === 'string') {\n const encoder = new TextEncoder();\n data = encoder.encode(input);\n } else {\n data = input;\n }\n\n // Use @noble/hashes for consistent cross-platform hashing\n const hashArray = nobleSha256(data);\n\n // Convert to base64\n const base64 = bytesToBase64(hashArray);\n\n // Make URL-safe: remove padding and replace + with - and / with _\n const urlSafe = base64.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n\n return urlSafe;\n};\n\n/**\n * Verify that content matches a given hash\n * @param content - The content to verify\n * @param hash - The expected hash\n * @returns True if the hash matches\n */\nexport const verify = (content: string | Uint8Array, hash: string): boolean => {\n const computed = sha256(content);\n return computed === hash;\n};\n\n/**\n * Convert URL-safe base64 back to standard base64\n * @param urlSafe - URL-safe base64 string\n * @returns Standard base64 string with padding\n */\nexport const fromUrlSafeBase64 = (urlSafe: string): string => {\n const base64 = urlSafe.replace(/-/g, '+').replace(/_/g, '/');\n // Add padding if needed\n const padding = '='.repeat((4 - (base64.length % 4)) % 4);\n return base64 + padding;\n};\n\n/**\n * Convert standard base64 to URL-safe base64\n * @param base64 - Standard base64 string\n * @returns URL-safe base64 string without padding\n */\nexport const toUrlSafeBase64 = (base64: string): string => {\n return base64.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n};\n\n/**\n * Convert bytes to base64 string\n * @param bytes - Uint8Array to convert\n * @returns Base64 string\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n // Use btoa if available (browser), otherwise use Buffer (Node.js)\n if (typeof btoa !== 'undefined') {\n return btoa(String.fromCharCode(...Array.from(bytes)));\n } else {\n return Buffer.from(bytes).toString('base64');\n }\n}\n\n/**\n * Convert base64 string to bytes\n * @param base64 - Base64 string to convert\n * @returns Uint8Array\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n // Use atob if available (browser), otherwise use Buffer (Node.js)\n if (typeof atob !== 'undefined') {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n } else {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n}\n", "import { peopleCountBuckets } from './constants';\n\nimport { sha256, verify } from './hash';\nimport { parseStatement } from './protocol';\n\nexport const generateFileHash = (fileContent: Buffer | string): string => {\n return sha256(fileContent);\n};\n\nexport const validateFileHash = (fileContent: Buffer | string, expectedHash: string): boolean => {\n return verify(fileContent, expectedHash);\n};\n\nexport const generateStatementContentHash = (statementContent: string): string => {\n return sha256(statementContent);\n};\n\nexport const validateStatementContentHash = (\n statementContent: string,\n expectedHash: string\n): boolean => {\n return verify(statementContent, expectedHash);\n};\n\nexport const generateStatementHash = (statement: string): string => {\n const signatureRegex = /^([\\s\\S]+?)---\\n[\\s\\S]+$/;\n const match = statement.match(signatureRegex);\n\n if (match && match[1]) {\n return sha256(match[1]);\n }\n\n return sha256(statement);\n};\n\nexport const validateStatementHash = (statement: string, expectedHash: string): boolean => {\n const computedHash = generateStatementHash(statement);\n return computedHash === expectedHash;\n};\n\nexport const generateStatementsFile = (statements: string[]): string => {\n return statements.join('\\n\\n');\n};\n\nexport const parseStatementsFile = (statementsFileContent: string): string[] => {\n const statementParts = statementsFileContent.split(/\\n\\nStated protocol version: /);\n const statements: string[] = [];\n\n for (let i = 0; i < statementParts.length; i++) {\n let statement = statementParts[i];\n\n if (i === 0 && statement.trim().length === 0) continue;\n\n if (i > 0) {\n statement = 'Stated protocol version: ' + statement;\n }\n\n statement = statement.replace(/\\n+$/, '\\n');\n\n try {\n parseStatement({ statement });\n statements.push(statement);\n } catch (error) {\n throw new Error(\n `Invalid statement at index ${i}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n return statements;\n};\n\nexport const generateStatementFilename = (statement: string): string => {\n const hash = generateStatementHash(statement);\n return `${hash}.txt`;\n};\n\nexport const generateAttachmentFilename = (\n fileContent: Buffer | string,\n extension: string\n): string => {\n const hash = generateFileHash(fileContent);\n const ext = extension.startsWith('.') ? extension.substring(1) : extension;\n return `${hash}.${ext}`;\n};\n\nexport const minPeopleCountToRange = (n: number): string | undefined => {\n if (n >= 10000000) return peopleCountBuckets['10000000'];\n if (n >= 1000000) return peopleCountBuckets['1000000'];\n if (n >= 100000) return peopleCountBuckets['100000'];\n if (n >= 10000) return peopleCountBuckets['10000'];\n if (n >= 1000) return peopleCountBuckets['1000'];\n if (n >= 100) return peopleCountBuckets['100'];\n if (n >= 10) return peopleCountBuckets['10'];\n if (n >= 0) return peopleCountBuckets['0'];\n};\n\nexport const monthIndex = (month: string): number =>\n ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'].indexOf(\n month.toLowerCase().substr(0, 3)\n );\n\nexport const birthDateFormat: RegExp =\n /(?<d>\\d{1,2})\\s(?<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?<y>\\d{4})/;\n", "/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */\n/**\n * 5KB JS implementation of ed25519 EdDSA signatures.\n * Compliant with RFC8032, FIPS 186-5 & ZIP215.\n * @module\n * @example\n * ```js\nimport * as ed from '@noble/ed25519';\n(async () => {\n const secretKey = ed.utils.randomSecretKey();\n const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);\n const pubKey = await ed.getPublicKeyAsync(secretKey); // Sync methods are also present\n const signature = await ed.signAsync(message, secretKey);\n const isValid = await ed.verifyAsync(signature, message, pubKey);\n})();\n```\n */\n/**\n * Curve params. ed25519 is twisted edwards curve. Equation is \u2212x\u00B2 + y\u00B2 = -a + dx\u00B2y\u00B2.\n * * P = `2n**255n - 19n` // field over which calculations are done\n * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points\n * * h = 8 // cofactor\n * * a = `Fp.create(BigInt(-1))` // equation param\n * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param\n * * Gx, Gy are coordinates of Generator / base point\n */\nconst ed25519_CURVE = {\n p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\n n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\n h: 8n,\n a: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,\n d: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\n Gx: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\n Gy: 0x6666666666666666666666666666666666666666666666666666666666666658n,\n};\nconst { p: P, n: N, Gx, Gy, a: _a, d: _d, h } = ed25519_CURVE;\nconst L = 32; // field / group byte length\nconst L2 = 64;\n// Helpers and Precomputes sections are reused between libraries\n// ## Helpers\n// ----------\nconst captureTrace = (...args) => {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n};\nconst err = (message = '') => {\n const e = new Error(message);\n captureTrace(e, err);\n throw e;\n};\nconst isBig = (n) => typeof n === 'bigint'; // is big integer\nconst isStr = (s) => typeof s === 'string'; // is string\nconst isBytes = (a) => a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n/** Asserts something is Uint8Array. */\nconst abytes = (value, length, title = '') => {\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 err(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n};\n/** create Uint8Array */\nconst u8n = (len) => new Uint8Array(len);\nconst u8fr = (buf) => Uint8Array.from(buf);\nconst padh = (n, pad) => n.toString(16).padStart(pad, '0');\nconst bytesToHex = (b) => Array.from(abytes(b))\n .map((e) => padh(e, 2))\n .join('');\nconst C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters\nconst _ch = (ch) => {\n if (ch >= C._0 && ch <= C._9)\n return ch - C._0; // '2' => 50-48\n if (ch >= C.A && ch <= C.F)\n return ch - (C.A - 10); // 'B' => 66-(65-10)\n if (ch >= C.a && ch <= C.f)\n return ch - (C.a - 10); // 'b' => 98-(97-10)\n return;\n};\nconst hexToBytes = (hex) => {\n const e = 'hex invalid';\n if (!isStr(hex))\n return err(e);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n return err(e);\n const array = u8n(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n // treat each char as ASCII\n const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined)\n return err(e);\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n};\nconst cr = () => globalThis?.crypto; // WebCrypto is available in all modern environments\nconst subtle = () => cr()?.subtle ?? err('crypto.subtle must be defined, consider polyfill');\n// prettier-ignore\nconst concatBytes = (...arrs) => {\n const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0)); // create u8a of summed length\n let pad = 0; // walk through each array,\n arrs.forEach(a => { r.set(a, pad); pad += a.length; }); // ensure they have proper type\n return r;\n};\n/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */\nconst randomBytes = (len = L) => {\n const c = cr();\n return c.getRandomValues(u8n(len));\n};\nconst big = BigInt;\nconst assertRange = (n, min, max, msg = 'bad number: out of range') => (isBig(n) && min <= n && n < max ? n : err(msg));\n/** modular division */\nconst M = (a, b = P) => {\n const r = a % b;\n return r >= 0n ? r : b + r;\n};\nconst modN = (a) => M(a, N);\n/** Modular inversion using euclidean GCD (non-CT). No negative exponent for now. */\n// prettier-ignore\nconst invert = (num, md) => {\n if (num === 0n || md <= 0n)\n err('no inverse n=' + num + ' mod=' + md);\n let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;\n while (a !== 0n) {\n const q = b / a, r = b % a;\n const m = x - u * q, n = y - v * q;\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point\n};\nconst callHash = (name) => {\n // @ts-ignore\n const fn = hashes[name];\n if (typeof fn !== 'function')\n err('hashes.' + name + ' not set');\n return fn;\n};\nconst hash = (msg) => callHash('sha512')(msg);\nconst apoint = (p) => (p instanceof Point ? p : err('Point expected'));\n// ## End of Helpers\n// -----------------\nconst B256 = 2n ** 256n;\n/** Point in XYZT extended coordinates. */\nclass Point {\n static BASE;\n static ZERO;\n X;\n Y;\n Z;\n T;\n constructor(X, Y, Z, T) {\n const max = B256;\n this.X = assertRange(X, 0n, max);\n this.Y = assertRange(Y, 0n, max);\n this.Z = assertRange(Z, 1n, max);\n this.T = assertRange(T, 0n, max);\n Object.freeze(this);\n }\n static CURVE() {\n return ed25519_CURVE;\n }\n static fromAffine(p) {\n return new Point(p.x, p.y, 1n, M(p.x * p.y));\n }\n /** RFC8032 5.1.3: Uint8Array to Point. */\n static fromBytes(hex, zip215 = false) {\n const d = _d;\n // Copy array to not mess it up.\n const normed = u8fr(abytes(hex, L));\n // adjust first LE byte = last BE byte\n const lastByte = hex[31];\n normed[31] = lastByte & ~0x80;\n const y = bytesToNumLE(normed);\n // zip215=true: 0 <= y < 2^256\n // zip215=false, RFC8032: 0 <= y < 2^255-19\n const max = zip215 ? B256 : P;\n assertRange(y, 0n, max);\n const y2 = M(y * y); // y\u00B2\n const u = M(y2 - 1n); // u=y\u00B2-1\n const v = M(d * y2 + 1n); // v=dy\u00B2+1\n let { isValid, value: x } = uvRatio(u, v); // (uv\u00B3)(uv\u2077)^(p-5)/8; square root\n if (!isValid)\n err('bad point: y not sqrt'); // not square root: bad point\n const isXOdd = (x & 1n) === 1n; // adjust sign of x coordinate\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === 0n && isLastByteOdd)\n err('bad point: x==0, isLastByteOdd'); // x=0, x_0=1\n if (isLastByteOdd !== isXOdd)\n x = M(-x);\n return new Point(x, y, 1n, M(x * y)); // Z=1, T=xy\n }\n static fromHex(hex, zip215) {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /** Checks if the point is valid and on-curve. */\n assertValidity() {\n const a = _a;\n const d = _d;\n const p = this;\n if (p.is0())\n return err('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax\u00B2 + y\u00B2 = 1 + dx\u00B2y\u00B2\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX\u00B2 + Y\u00B2)Z\u00B2 = Z\u2074 + dX\u00B2Y\u00B2\n const { X, Y, Z, T } = p;\n const X2 = M(X * X); // X\u00B2\n const Y2 = M(Y * Y); // Y\u00B2\n const Z2 = M(Z * Z); // Z\u00B2\n const Z4 = M(Z2 * Z2); // Z\u2074\n const aX2 = M(X2 * a); // aX\u00B2\n const left = M(Z2 * M(aX2 + Y2)); // (aX\u00B2 + Y\u00B2)Z\u00B2\n const right = M(Z4 + M(d * M(X2 * Y2))); // Z\u2074 + dX\u00B2Y\u00B2\n if (left !== right)\n return err('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = M(X * Y);\n const ZT = M(Z * T);\n if (XY !== ZT)\n return err('bad point: equation left != right (2)');\n return this;\n }\n /** Equality check: compare points P&Q. */\n equals(other) {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality\n const X1Z2 = M(X1 * Z2);\n const X2Z1 = M(X2 * Z1);\n const Y1Z2 = M(Y1 * Z2);\n const Y2Z1 = M(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(I);\n }\n /** Flip point over y coordinate. */\n negate() {\n return new Point(M(-this.X), this.Y, this.Z, M(-this.T));\n }\n /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */\n double() {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const a = _a;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n const A = M(X1 * X1);\n const B = M(Y1 * Y1);\n const C = M(2n * M(Z1 * Z1));\n const D = M(a * A);\n const x1y1 = X1 + Y1;\n const E = M(M(x1y1 * x1y1) - A - B);\n const G = D + B;\n const F = G - C;\n const H = D - B;\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */\n add(other) {\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = apoint(other); // doesn't check if other on-curve\n const a = _a;\n const d = _d;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3\n const A = M(X1 * X2);\n const B = M(Y1 * Y2);\n const C = M(T1 * d * T2);\n const D = M(Z1 * Z2);\n const E = M((X1 + Y1) * (X2 + Y2) - A - B);\n const F = M(D - C);\n const G = M(D + C);\n const H = M(B - a * A);\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(apoint(other).negate());\n }\n /**\n * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.\n * Uses {@link wNAF} for base point.\n * Uses fake point to mitigate side-channel leakage.\n * @param n scalar by which point is multiplied\n * @param safe safe mode guards against timing attacks; unsafe mode is faster\n */\n multiply(n, safe = true) {\n if (!safe && (n === 0n || this.is0()))\n return I;\n assertRange(n, 1n, N);\n if (n === 1n)\n return this;\n if (this.equals(G))\n return wNAF(n).p;\n // init result point & fake point\n let p = I;\n let f = G;\n for (let d = this; n > 0n; d = d.double(), n >>= 1n) {\n // if bit is present, add to point\n // if not present, add to fake, for timing safety\n if (n & 1n)\n p = p.add(d);\n else if (safe)\n f = f.add(d);\n }\n return p;\n }\n multiplyUnsafe(scalar) {\n return this.multiply(scalar, false);\n }\n /** Convert point to 2d xy affine point. (X, Y, Z) \u220B (x=X/Z, y=Y/Z) */\n toAffine() {\n const { X, Y, Z } = this;\n // fast-paths for ZERO point OR Z=1\n if (this.equals(I))\n return { x: 0n, y: 1n };\n const iz = invert(Z, P);\n // (Z * Z^-1) must be 1, otherwise bad math\n if (M(Z * iz) !== 1n)\n err('invalid inverse');\n // x = X*Z^-1; y = Y*Z^-1\n const x = M(X * iz);\n const y = M(Y * iz);\n return { x, y };\n }\n toBytes() {\n const { x, y } = this.assertValidity().toAffine();\n const b = numTo32bLE(y);\n // store sign in first LE byte\n b[31] |= x & 1n ? 0x80 : 0;\n return b;\n }\n toHex() {\n return bytesToHex(this.toBytes());\n }\n clearCofactor() {\n return this.multiply(big(h), false);\n }\n isSmallOrder() {\n return this.clearCofactor().is0();\n }\n isTorsionFree() {\n // Multiply by big number N. We can't `mul(N)` because of checks. Instead, we `mul(N/2)*2+1`\n let p = this.multiply(N / 2n, false).double();\n if (N % 2n)\n p = p.add(this);\n return p.is0();\n }\n}\n/** Generator / base point */\nconst G = new Point(Gx, Gy, 1n, M(Gx * Gy));\n/** Identity / zero point */\nconst I = new Point(0n, 1n, 1n, 0n);\n// Static aliases\nPoint.BASE = G;\nPoint.ZERO = I;\nconst numTo32bLE = (num) => hexToBytes(padh(assertRange(num, 0n, B256), L2)).reverse();\nconst bytesToNumLE = (b) => big('0x' + bytesToHex(u8fr(abytes(b)).reverse()));\nconst pow2 = (x, power) => {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n};\n// prettier-ignore\nconst pow_2_252_3 = (x) => {\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n};\nconst RM1 = 0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n; // \u221A-1\n// for sqrt comp\n// prettier-ignore\nconst uvRatio = (u, v) => {\n const v3 = M(v * v * v); // v\u00B3\n const v7 = M(v3 * v3 * v); // v\u2077\n const pow = pow_2_252_3(u * v7).pow_p_5_8; // (uv\u2077)^(p-5)/8\n let x = M(u * v3 * pow); // (uv\u00B3)(uv\u2077)^(p-5)/8\n const vx2 = M(v * x * x); // vx\u00B2\n const root1 = x; // First root candidate\n const root2 = M(x * RM1); // Second root candidate; RM1 is \u221A-1\n const useRoot1 = vx2 === u; // If vx\u00B2 = u (mod p), x is a square root\n const useRoot2 = vx2 === M(-u); // If vx\u00B2 = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === M(-u * RM1); // There is no valid root, vx\u00B2 = -u\u221A-1\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((M(x) & 1n) === 1n)\n x = M(-x); // edIsNegative\n return { isValid: useRoot1 || useRoot2, value: x };\n};\n// N == L, just weird naming\nconst modL_LE = (hash) => modN(bytesToNumLE(hash)); // modulo L; but little-endian\n/** hashes.sha512 should conform to the interface. */\n// TODO: rename\nconst sha512a = (...m) => hashes.sha512Async(concatBytes(...m)); // Async SHA512\nconst sha512s = (...m) => callHash('sha512')(concatBytes(...m));\n// RFC8032 5.1.5\nconst hash2extK = (hashed) => {\n // slice creates a copy, unlike subarray\n const head = hashed.slice(0, L);\n head[0] &= 248; // Clamp bits: 0b1111_1000\n head[31] &= 127; // 0b0111_1111\n head[31] |= 64; // 0b0100_0000\n const prefix = hashed.slice(L, L2); // secret key \"prefix\"\n const scalar = modL_LE(head); // modular division over curve order\n const point = G.multiply(scalar); // public key point\n const pointBytes = point.toBytes(); // point serialized to Uint8Array\n return { head, prefix, scalar, point, pointBytes };\n};\n// RFC8032 5.1.5; getPublicKey async, sync. Hash priv key and extract point.\nconst getExtendedPublicKeyAsync = (secretKey) => sha512a(abytes(secretKey, L)).then(hash2extK);\nconst getExtendedPublicKey = (secretKey) => hash2extK(sha512s(abytes(secretKey, L)));\n/** Creates 32-byte ed25519 public key from 32-byte secret key. Async. */\nconst getPublicKeyAsync = (secretKey) => getExtendedPublicKeyAsync(secretKey).then((p) => p.pointBytes);\n/** Creates 32-byte ed25519 public key from 32-byte secret key. To use, set `hashes.sha512` first. */\nconst getPublicKey = (priv) => getExtendedPublicKey(priv).pointBytes;\nconst hashFinishA = (res) => sha512a(res.hashable).then(res.finish);\nconst hashFinishS = (res) => res.finish(sha512s(res.hashable));\n// Code, shared between sync & async sign\nconst _sign = (e, rBytes, msg) => {\n const { pointBytes: P, scalar: s } = e;\n const r = modL_LE(rBytes); // r was created outside, reduce it modulo L\n const R = G.multiply(r).toBytes(); // R = [r]B\n const hashable = concatBytes(R, P, msg); // dom2(F, C) || R || A || PH(M)\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n const S = modN(r + modL_LE(hashed) * s); // S = (r + k * s) mod L; 0 <= s < l\n return abytes(concatBytes(R, numTo32bLE(S)), L2); // 64-byte sig: 32b R.x + 32b LE(S)\n };\n return { hashable, finish };\n};\n/**\n * Signs message using secret key. Async.\n * Follows RFC8032 5.1.6.\n */\nconst signAsync = async (message, secretKey) => {\n const m = abytes(message);\n const e = await getExtendedPublicKeyAsync(secretKey);\n const rBytes = await sha512a(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishA(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\n/**\n * Signs message using secret key. To use, set `hashes.sha512` first.\n * Follows RFC8032 5.1.6.\n */\nconst sign = (message, secretKey) => {\n const m = abytes(message);\n const e = getExtendedPublicKey(secretKey);\n const rBytes = sha512s(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishS(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\nconst defaultVerifyOpts = { zip215: true };\nconst _verify = (sig, msg, pub, opts = defaultVerifyOpts) => {\n sig = abytes(sig, L2); // Signature hex str/Bytes, must be 64 bytes\n msg = abytes(msg); // Message hex str/Bytes\n pub = abytes(pub, L);\n const { zip215 } = opts; // switch between zip215 and rfc8032 verif\n let A;\n let R;\n let s;\n let SB;\n let hashable = Uint8Array.of();\n try {\n A = Point.fromBytes(pub, zip215); // public key A decoded\n R = Point.fromBytes(sig.slice(0, L), zip215); // 0 <= R < 2^256: ZIP215 R can be >= P\n s = bytesToNumLE(sig.slice(L, L2)); // Decode second half as an integer S\n SB = G.multiply(s, false); // in the range 0 <= s < L\n hashable = concatBytes(R.toBytes(), A.toBytes(), msg); // dom2(F, C) || R || A || PH(M)\n }\n catch (error) { }\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n if (SB == null)\n return false; // false if try-catch catched an error\n if (!zip215 && A.isSmallOrder())\n return false; // false for SBS: Strongly Binding Signature\n const k = modL_LE(hashed); // decode in little-endian, modulo L\n const RkA = R.add(A.multiply(k, false)); // [8]R + [8][k]A'\n return RkA.add(SB.negate()).clearCofactor().is0(); // [8][S]B = [8]R + [8][k]A'\n };\n return { hashable, finish };\n};\n/** Verifies signature on message and public key. Async. Follows RFC8032 5.1.7. */\nconst verifyAsync = async (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishA(_verify(signature, message, publicKey, opts));\n/** Verifies signature on message and public key. To use, set `hashes.sha512` first. Follows RFC8032 5.1.7. */\nconst verify = (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishS(_verify(signature, message, publicKey, opts));\n/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */\nconst etc = {\n bytesToHex: bytesToHex,\n hexToBytes: hexToBytes,\n concatBytes: concatBytes,\n mod: M,\n invert: invert,\n randomBytes: randomBytes,\n};\nconst hashes = {\n sha512Async: async (message) => {\n const s = subtle();\n const m = concatBytes(message);\n return u8n(await s.digest('SHA-512', m.buffer));\n },\n sha512: undefined,\n};\n// FIPS 186 B.4.1 compliant key generation produces private keys\n// with modulo bias being neglible. takes >N+16 bytes, returns (hash mod n-1)+1\nconst randomSecretKey = (seed = randomBytes(L)) => seed;\nconst keygen = (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = getPublicKey(secretKey);\n return { secretKey, publicKey };\n};\nconst keygenAsync = async (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = await getPublicKeyAsync(secretKey);\n return { secretKey, publicKey };\n};\n/** ed25519-specific key utilities. */\nconst utils = {\n getExtendedPublicKeyAsync: getExtendedPublicKeyAsync,\n getExtendedPublicKey: getExtendedPublicKey,\n randomSecretKey: randomSecretKey,\n};\n// ## Precomputes\n// --------------\nconst W = 8; // W is window size\nconst scalarBits = 256;\nconst pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop\nconst pwindowSize = 2 ** (W - 1); // 128 for W=8\nconst precompute = () => {\n const points = [];\n let p = G;\n let b = p;\n for (let w = 0; w < pwindows; w++) {\n b = p;\n points.push(b);\n for (let i = 1; i < pwindowSize; i++) {\n b = b.add(p);\n points.push(b);\n } // i=1, bc we skip 0\n p = b.double();\n }\n return points;\n};\nlet Gpows = undefined; // precomputes for base point G\n// const-time negate\nconst ctneg = (cnd, p) => {\n const n = p.negate();\n return cnd ? n : p;\n};\n/**\n * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by\n * caching multiples of G (base point). Cache is stored in 32MB of RAM.\n * Any time `G.multiply` is done, precomputes are used.\n * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.\n *\n * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,\n * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.\n *\n * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().\n */\nconst wNAF = (n) => {\n const comp = Gpows || (Gpows = precompute());\n let p = I;\n let f = G; // f must be G, or could become I in the end\n const pow_2_w = 2 ** W; // 256 for W=8\n const maxNum = pow_2_w; // 256 for W=8\n const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111\n const shiftBy = big(W); // 8 for W=8\n for (let w = 0; w < pwindows; w++) {\n let wbits = Number(n & mask); // extract W bits.\n n >>= shiftBy; // shift number by W bits.\n // We use negative indexes to reduce size of precomputed table by 2x.\n // Instead of needing precomputes 0..256, we only calculate them for 0..128.\n // If an index > 128 is found, we do (256-index) - where 256 is next window.\n // Naive: index +127 => 127, +224 => 224\n // Optimized: index +127 => 127, +224 => 256-32\n if (wbits > pwindowSize) {\n wbits -= maxNum;\n n += 1n;\n }\n const off = w * pwindowSize;\n const offF = off; // offsets, evaluate both\n const offP = off + Math.abs(wbits) - 1;\n const isEven = w % 2 !== 0; // conditions, evaluate both\n const isNeg = wbits < 0;\n if (wbits === 0) {\n // off == I: can't add it. Adding random offF instead.\n f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point\n }\n else {\n p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point\n }\n }\n if (n !== 0n)\n err('invalid wnaf');\n return { p, f }; // return both real and fake points for JIT\n};\n// !! Remove the export to easily use in REPL / browser console\nexport { etc, getPublicKey, getPublicKeyAsync, hash, hashes, keygen, keygenAsync, Point, sign, signAsync, utils, verify, verifyAsync, };\n", "/**\n * Universal signature utilities using @noble/ed25519\n * Works in both browser and Node.js environments\n */\n\nimport * as ed from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha2.js';\nimport { toUrlSafeBase64, fromUrlSafeBase64, sha256, base64ToBytes } from './hash';\nimport type { CryptographicallySignedStatement } from './types';\n\n// Set up sha512 for @noble/ed25519\ned.hashes.sha512 = (message: Uint8Array) => sha512(message);\n\nconst ALGORITHM = 'Ed25519'; // Fully specifies: EdDSA signature scheme with Curve25519\n\n/**\n * Generate a new Ed25519 key pair for signing statements\n * @returns Object containing publicKey and privateKey as URL-safe base64\n */\nexport const generateKeyPair = async (): Promise<{ publicKey: string; privateKey: string }> => {\n const privateKey = ed.utils.randomSecretKey();\n const publicKey = await ed.getPublicKey(privateKey);\n\n return {\n publicKey: toUrlSafeBase64(bytesToBase64(publicKey)),\n privateKey: toUrlSafeBase64(bytesToBase64(privateKey)),\n };\n};\n\n/**\n * Sign a statement with a private key\n * @param statement - The statement text to sign\n * @param privateKeyUrlSafe - Private key in URL-safe base64 format\n * @returns URL-safe base64-encoded signature\n */\nexport const signStatement = async (\n statement: string,\n privateKeyUrlSafe: string\n): Promise<string> => {\n const privateKeyBytes = base64ToBytes(fromUrlSafeBase64(privateKeyUrlSafe));\n const messageBytes = new TextEncoder().encode(statement);\n\n const signature = await ed.sign(messageBytes, privateKeyBytes);\n\n return toUrlSafeBase64(bytesToBase64(signature));\n};\n\n/**\n * Verify a statement signature\n * @param statement - The statement text that was signed\n * @param signatureUrlSafe - URL-safe base64-encoded signature\n * @param publicKeyUrlSafe - Public key in URL-safe base64 format\n * @returns true if signature is valid, false otherwise\n */\nexport const verifySignature = async (\n statement: string,\n signatureUrlSafe: string,\n publicKeyUrlSafe: string\n): Promise<boolean> => {\n try {\n const publicKeyBytes = base64ToBytes(fromUrlSafeBase64(publicKeyUrlSafe));\n const signatureBytes = base64ToBytes(fromUrlSafeBase64(signatureUrlSafe));\n const messageBytes = new TextEncoder().encode(statement);\n\n return await ed.verify(signatureBytes, messageBytes, publicKeyBytes);\n } catch (error) {\n return false;\n }\n};\n\n/**\n * Build a signed statement\n * @param statement - The statement text to sign\n * @param privateKeyUrlSafe - Private key in URL-safe base64 format\n * @param publicKeyUrlSafe - Public key in URL-safe base64 format\n * @returns Signed statement with appended signature fields\n */\nexport const buildSignedStatement = async (\n statement: string,\n privateKeyUrlSafe: string,\n publicKeyUrlSafe: string\n): Promise<string> => {\n const statementHash = sha256(statement);\n const signature = await signStatement(statement, privateKeyUrlSafe);\n return (\n statement +\n `---\\n` +\n `Statement hash: ${statementHash}\\n` +\n `Public key: ${publicKeyUrlSafe}\\n` +\n `Signature: ${signature}\\n` +\n `Algorithm: ${ALGORITHM}\\n`\n );\n};\n\n/**\n * Parse a signed statement\n * @param signedStatement - The signed statement text\n * @returns Parsed CryptographicallySignedStatement object or null if invalid\n */\nexport const parseSignedStatement = (\n signedStatement: string\n): CryptographicallySignedStatement | null => {\n const regex =\n /^([\\s\\S]+?)---\\nStatement hash: ([A-Za-z0-9_-]+)\\nPublic key: ([A-Za-z0-9_-]+)\\nSignature: ([A-Za-z0-9_-]+)\\nAlgorithm: ([^\\n]+)\\n$/;\n const match = signedStatement.match(regex);\n\n if (!match) return null;\n\n const statement = match[1];\n const statementHash = match[2];\n const publicKey = match[3];\n const signature = match[4];\n const algorithm = match[5];\n\n // Verify statement hash matches\n const computedHash = sha256(statement);\n if (computedHash !== statementHash) {\n return null;\n }\n\n // Verify algorithm is supported\n if (algorithm !== ALGORITHM) {\n return null;\n }\n\n return {\n statement,\n publicKey,\n signature,\n statementHash,\n algorithm,\n };\n};\n\n/**\n * Verify a signed statement\n * @param signedStatement - The signed statement text\n * @returns true if signature is valid, false otherwise\n */\nexport const verifySignedStatement = async (signedStatement: string): Promise<boolean> => {\n const parsed = parseSignedStatement(signedStatement);\n if (!parsed) return false;\n\n return await verifySignature(parsed.statement, parsed.signature, parsed.publicKey);\n};\n\n/**\n * Convert bytes to base64 string\n * @param bytes - Uint8Array to convert\n * @returns Base64 string\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n // Use btoa if available (browser), otherwise use Buffer (Node.js)\n if (typeof btoa !== 'undefined') {\n return btoa(String.fromCharCode(...Array.from(bytes)));\n } else {\n return Buffer.from(bytes).toString('base64');\n }\n}\n", "import type { SupportedLanguage } from './constants';\n\nexport type LegalForm =\n | 'local government'\n | 'state government'\n | 'foreign affairs ministry'\n | 'corporation';\n\nexport type PeopleCountBucket =\n | '0-10'\n | '10-100'\n | '100-1000'\n | '1000-10,000'\n | '10,000-100,000'\n | '100,000+'\n | '1,000,000+'\n | '10,000,000+';\n\n// Type guards\nexport function isLegalForm(value: string): value is LegalForm {\n return [\n 'local government',\n 'state government',\n 'foreign affairs ministry',\n 'corporation',\n ].includes(value);\n}\n\nexport function isPeopleCountBucket(value: string): value is PeopleCountBucket {\n return [\n '0-10',\n '10-100',\n '100-1000',\n '1000-10,000',\n '10,000-100,000',\n '100,000+',\n '1,000,000+',\n '10,000,000+',\n ].includes(value);\n}\n\nexport function isRatingValue(value: number): value is RatingValue {\n return [1, 2, 3, 4, 5].includes(value);\n}\n\nexport type StatementTypeValue =\n | 'statement'\n | 'organisation_verification'\n | 'person_verification'\n | 'poll'\n | 'vote'\n | 'response'\n | 'dispute_statement_content'\n | 'dispute_statement_authenticity'\n | 'rating'\n | 'sign_pdf';\n\nexport type Statement = {\n domain: string;\n author: string;\n time: Date;\n tags?: string[];\n content: string;\n representative?: string;\n supersededStatement?: string;\n formatVersion?: string;\n translations?: Partial<Record<SupportedLanguage, string>>;\n attachments?: string[];\n};\n\nexport type CryptographicallySignedStatement = {\n statement: string;\n statementHash: string;\n publicKey: string;\n signature: string;\n algorithm: string;\n};\n\nexport type Poll = {\n deadline: Date | undefined;\n poll: string;\n scopeDescription?: string;\n options: string[];\n allowArbitraryVote?: boolean;\n};\n\nexport type OrganisationVerification = {\n name: string;\n englishName?: string;\n country: string;\n city?: string;\n province?: string;\n legalForm: LegalForm;\n department?: string;\n domain: string;\n foreignDomain?: string;\n serialNumber?: string;\n confidence?: number;\n reliabilityPolicy?: string;\n employeeCount?: PeopleCountBucket;\n pictureHash?: string;\n latitude?: number;\n longitude?: number;\n population?: PeopleCountBucket;\n publicKey?: string;\n};\n\nexport type withOwnDomain = {\n ownDomain: string;\n foreignDomain?: string;\n};\n\nexport type withForeignDomain = {\n foreignDomain: string;\n ownDomain?: string;\n};\n\nexport type PersonVerification = {\n name: string;\n countryOfBirth: string;\n cityOfBirth: string;\n dateOfBirth: Date;\n jobTitle?: string;\n employer?: string;\n verificationMethod?: string;\n confidence?: number;\n picture?: string;\n reliabilityPolicy?: string;\n publicKey?: string;\n} & (withOwnDomain | withForeignDomain);\n\nexport type Vote = {\n pollHash: string;\n poll: string;\n vote: string;\n};\n\nexport type DisputeAuthenticity = {\n hash: string;\n confidence?: number;\n reliabilityPolicy?: string;\n};\n\nexport type DisputeContent = {\n hash: string;\n confidence?: number;\n reliabilityPolicy?: string;\n};\n\nexport type ResponseContent = {\n hash: string;\n response: string;\n};\n\nexport type PDFSigning = {\n hash: string;\n};\n\nexport type RatingSubjectTypeValue =\n | 'Organisation'\n | 'Policy proposal'\n | 'Treaty draft'\n | 'Research publication'\n | 'Regulation'\n | 'Product';\n\nexport type RatingValue = 1 | 2 | 3 | 4 | 5;\n\nexport type Rating = {\n subjectType?: RatingSubjectTypeValue;\n subjectName: string;\n subjectReference?: string;\n documentFileHash?: string;\n rating: RatingValue;\n quality?: string;\n comment?: string;\n};\n\nexport type Bounty = {\n motivation?: string;\n bounty: string;\n reward: string;\n judge: string;\n judgePay?: string;\n};\n", "import { legalForms, UTCFormat, peopleCountBuckets } from './constants';\nimport { monthIndex, birthDateFormat } from './utils';\nimport { verifySignature } from './signature';\nimport { sha256 } from './hash';\nimport type {\n Statement,\n Poll,\n OrganisationVerification,\n PersonVerification,\n Vote,\n DisputeAuthenticity,\n DisputeContent,\n ResponseContent,\n PDFSigning,\n Rating,\n RatingSubjectTypeValue,\n} from './types';\nimport { isLegalForm, isPeopleCountBucket, isRatingValue } from './types';\n\nconst version = 5;\n\nexport * from './types';\nexport * from './constants';\nexport * from './utils';\n\nexport const buildStatement = ({\n domain,\n author,\n time,\n tags,\n content,\n representative,\n supersededStatement,\n translations,\n attachments,\n}: Statement) => {\n if (content.match(/\\nPublishing domain: /))\n throw new Error(\n \"Statement must not contain 'Publishing domain: ', as this marks the beginning of a new statement.\"\n );\n if (content.match(/\\n\\n/))\n throw new Error(\n 'Statement content must not contain two line breaks in a row, as this is used for separating statements.'\n );\n if (content.match(/\\nTranslation [a-z]{2,3}:\\n/))\n throw new Error(\n \"Statement content must not contain 'Translation XX:\\\\n' pattern, as this is reserved for translations.\"\n );\n if (content.match(/\\nAttachments: /))\n throw new Error(\n \"Statement content must not contain 'Attachments: ' on a new line, as this is reserved for file attachments.\"\n );\n if (typeof time !== 'object' || !time.toUTCString) throw new Error('Time must be a Date object.');\n if (!domain) throw new Error('Publishing domain missing.');\n if (attachments && attachments.length > 5) throw new Error('Maximum 5 attachments allowed.');\n if (attachments) {\n attachments.forEach((attachment, index) => {\n if (!attachment.match(/^[A-Za-z0-9_-]+\\.[a-zA-Z0-9]+$/)) {\n throw new Error(\n `Attachment ${index + 1} must be in format 'base64hash.extension' (URL-safe base64)`\n );\n }\n });\n }\n\n if (translations) {\n for (const [lang, translation] of Object.entries(translations)) {\n if (translation.match(/\\nPublishing domain: /))\n throw new Error(`Translation for ${lang} must not contain 'Publishing domain: '.`);\n if (translation.match(/Translation [a-z]{2,3}:\\n/))\n throw new Error(`Translation for ${lang} must not contain 'Translation XX:\\\\n' pattern.`);\n }\n }\n\n const translationLines = translations\n ? Object.entries(translations)\n .map(([lang, translation]) => {\n const translationWithNewline = translation + (translation.match(/\\n$/) ? '' : '\\n');\n const indentedTranslation = translationWithNewline\n .split('\\n')\n .map((line) => (line ? ' ' + line : line))\n .join('\\n');\n return `Translation ${lang}:\\n${indentedTranslation}`;\n })\n .join('')\n : '';\n\n const attachmentLines =\n attachments && attachments.length > 0 ? 'Attachments: ' + attachments.join(', ') + '\\n' : '';\n\n const contentWithNewline = content + (content.match(/\\n$/) ? '' : '\\n');\n // Only indent plain content (non-typed statements). Typed statements already have indentation from build functions.\n const isTypedContent = contentWithNewline.trim().startsWith('Type:');\n const finalContent = isTypedContent\n ? contentWithNewline\n : contentWithNewline\n .split('\\n')\n .map((line) => (line ? ' ' + line : line))\n .join('\\n');\n\n const statement =\n 'Stated protocol version: ' +\n version +\n '\\n' +\n 'Publishing domain: ' +\n domain +\n '\\n' +\n 'Author: ' +\n (author || '') +\n '\\n' +\n (representative && representative?.length > 0\n ? 'Authorized signing representative: ' + (representative || '') + '\\n'\n : '') +\n 'Time: ' +\n time.toUTCString() +\n '\\n' +\n (tags && tags.length > 0 ? 'Tags: ' + tags.join(', ') + '\\n' : '') +\n (supersededStatement && supersededStatement?.length > 0\n ? 'Superseded statement: ' + (supersededStatement || '') + '\\n'\n : '') +\n 'Statement content:\\n' +\n finalContent +\n translationLines +\n attachmentLines;\n if (statement.length > 3000)\n throw new Error('Statement must not be longer than 3,000 characters.');\n return statement;\n};\n\nexport const parseStatement = ({\n statement: input,\n}: {\n statement: string;\n}): Statement & { type?: string; formatVersion: string } => {\n if (input.length > 3000) throw new Error('Statement must not be longer than 3,000 characters.');\n const beforeTranslations = input.split(/\\nTranslation [a-z]{2,3}:\\n/)[0];\n if (beforeTranslations.match(/\\n\\n/))\n throw new Error(\n 'Statements cannot contain two line breaks in a row before translations, as this is used for separating statements.'\n );\n\n const signatureRegex = new RegExp(\n '' +\n /^(?<statement>[\\s\\S]+?)---\\n/.source +\n /Statement hash: (?<statementHash>[A-Za-z0-9_-]+)\\n/.source +\n /Public key: (?<publicKey>[A-Za-z0-9_-]+)\\n/.source +\n /Signature: (?<signature>[A-Za-z0-9_-]+)\\n/.source +\n /Algorithm: (?<algorithm>[^\\n]+)\\n/.source +\n /$/.source\n );\n const signatureMatch = input.match(signatureRegex);\n\n let statementToVerify = input;\n let publicKey: string | undefined;\n let signature: string | undefined;\n\n if (signatureMatch && signatureMatch.groups) {\n statementToVerify = signatureMatch.groups.statement;\n const statementHash = signatureMatch.groups.statementHash;\n publicKey = signatureMatch.groups.publicKey;\n signature = signatureMatch.groups.signature;\n const algorithm = signatureMatch.groups.algorithm;\n\n if (algorithm !== 'Ed25519') {\n throw new Error('Unsupported signature algorithm: ' + algorithm);\n }\n\n const computedHash = sha256(statementToVerify);\n if (computedHash !== statementHash) {\n throw new Error('Statement hash mismatch');\n }\n\n const isValid = verifySignature(statementToVerify, signature, publicKey);\n if (!isValid) {\n throw new Error('Invalid cryptographic signature');\n }\n }\n\n const statementRegex = new RegExp(\n '' +\n /^Stated protocol version: (?<formatVersion>[^\\n]+?)\\n/.source +\n /Publishing domain: (?<domain>[^\\n]+?)\\n/.source +\n /Author: (?<author>[^\\n]+?)\\n/.source +\n /(?:Authorized signing representative: (?<representative>[^\\n]*?)\\n)?/.source +\n /Time: (?<time>[^\\n]+?)\\n/.source +\n /(?:Tags: (?<tags>[^\\n]*?)\\n)?/.source +\n /(?:Superseded statement: (?<supersededStatement>[^\\n]*?)\\n)?/.source +\n /Statement content:\\n/.source +\n /(?:(?<typedContent> Type: (?<type>[^\\n]+?)\\n[\\s\\S]+?)(?=\\nTranslation [a-z]{2,3}:\\n|Attachments: |$)|(?<content>(?: [\\s\\S]+?)?))/\n .source +\n /(?=\\nTranslation [a-z]{2,3}:\\n|Attachments: |$)/.source +\n /(?<translations>(?:\\nTranslation [a-z]{2,3}:\\n[\\s\\S]+?)*)/.source +\n /(?:Attachments: (?<attachments>[^\\n]+?)\\n)?/.source +\n /$/.source\n );\n const match = statementToVerify.match(statementRegex);\n if (!match || !match.groups) throw new Error('Invalid statement format: ' + input);\n\n const {\n domain,\n author,\n representative,\n time: timeStr,\n tags: tagsStr,\n supersededStatement,\n attachments: attachmentsStr,\n formatVersion,\n content,\n typedContent,\n type,\n translations: translationsStr,\n } = match.groups;\n\n const parsed = {\n domain,\n author,\n representative,\n timeStr,\n tagsStr,\n supersededStatement,\n formatVersion,\n content: content\n ? content\n .split('\\n')\n .map((line) => (line.startsWith(' ') ? line.substring(4) : line))\n .join('\\n')\n .replace(/\\n$/, '')\n : typedContent,\n type: type ? type.toLowerCase().replace(' ', '_') : undefined,\n translationsStr,\n };\n if (!parsed.timeStr.match(UTCFormat))\n throw new Error('Invalid statement format: time must be in UTC');\n if (!parsed.domain) throw new Error('Invalid statement format: domain is required');\n if (!parsed.author) throw new Error('Invalid statement format: author is required');\n if (!parsed.content) throw new Error('Invalid statement format: statement content is required');\n if (!parsed.formatVersion)\n throw new Error('Invalid statement format: format version is required');\n if (parsed.formatVersion !== '5')\n throw new Error(\n `Invalid statement format: only version 5 is supported, got version ${parsed.formatVersion}`\n );\n\n const tags = parsed.tagsStr?.split(', ');\n const time = new Date(parsed.timeStr);\n\n let attachments: string[] | undefined = undefined;\n if (attachmentsStr && attachmentsStr.length > 0) {\n attachments = attachmentsStr.split(', ').map((a) => a.trim());\n if (attachments.length > 5) {\n throw new Error('Maximum 5 attachments allowed');\n }\n }\n\n let translations: Record<string, string> | undefined = undefined;\n if (parsed.translationsStr && parsed.translationsStr.length > 0) {\n translations = {};\n const translationParts = parsed.translationsStr\n .split(/\\nTranslation ([a-z]{2,3}):\\n/)\n .filter((part) => part.length > 0);\n for (let i = 0; i < translationParts.length; i += 2) {\n if (i + 1 < translationParts.length) {\n const lang = translationParts[i];\n const rawTranslation = translationParts[i + 1];\n // Strip indentation from translation content\n const translation = rawTranslation\n .split('\\n')\n .map((line) => (line.startsWith(' ') ? line.substring(4) : line))\n .join('\\n')\n .replace(/\\n$/, '');\n translations[lang] = translation;\n }\n }\n }\n\n return {\n domain: parsed.domain,\n author: parsed.author,\n representative: parsed.representative,\n time,\n tags: tags && tags.length > 0 ? tags : undefined,\n supersededStatement: parsed.supersededStatement,\n formatVersion: parsed.formatVersion,\n content: parsed.content,\n type: parsed.type?.toLowerCase().replace(' ', '_'),\n translations: translations && Object.keys(translations).length > 0 ? translations : undefined,\n attachments: attachments && attachments.length > 0 ? attachments : undefined,\n };\n};\n\nexport const buildPollContent = ({\n deadline,\n poll,\n scopeDescription,\n options,\n allowArbitraryVote,\n}: Poll) => {\n if (!poll) throw new Error('Poll must contain a poll question.');\n if (poll.includes('\\n')) throw new Error('Poll question must be single line.');\n if (scopeDescription && scopeDescription.includes('\\n'))\n throw new Error('Scope description must be single line.');\n options.forEach((option, index) => {\n if (option && option.includes('\\n'))\n throw new Error(`Option ${index + 1} must be single line.`);\n });\n const content =\n ' Type: Poll\\n' +\n (deadline ? ' Voting deadline: ' + deadline.toUTCString() + '\\n' : '') +\n ' Poll: ' +\n poll +\n '\\n' +\n (options.length > 0 && options[0] ? ' Option 1: ' + options[0] + '\\n' : '') +\n (options.length > 1 && options[1] ? ' Option 2: ' + options[1] + '\\n' : '') +\n (options.length > 2 && options[2] ? ' Option 3: ' + options[2] + '\\n' : '') +\n (options.length > 3 && options[3] ? ' Option 4: ' + options[3] + '\\n' : '') +\n (options.length > 4 && options[4] ? ' Option 5: ' + options[4] + '\\n' : '') +\n (allowArbitraryVote === true || allowArbitraryVote === false\n ? ' Allow free text votes: ' + (allowArbitraryVote ? 'Yes' : 'No') + '\\n'\n : '') +\n (scopeDescription ? ' Who can vote: ' + scopeDescription + '\\n' : '');\n return content;\n};\n\nexport const parsePoll = (content: string, version?: string): Poll => {\n if (version !== '5') throw new Error('Invalid version ' + version);\n const pollRegex = new RegExp(\n '' +\n /^ Type: Poll\\n/.source +\n /(?: Voting deadline: (?<deadline>[^\\n]+?)\\n)?/.source +\n / Poll: (?<poll>[^\\n]+?)\\n/.source +\n /(?: Option 1: (?<option1>[^\\n]+?)\\n)?/.source +\n /(?: Option 2: (?<option2>[^\\n]+?)\\n)?/.source +\n /(?: Option 3: (?<option3>[^\\n]+?)\\n)?/.source +\n /(?: Option 4: (?<option4>[^\\n]+?)\\n)?/.source +\n /(?: Option 5: (?<option5>[^\\n]+?)\\n)?/.source +\n /(?: Allow free text votes: (?<allowArbitraryVote>Yes|No)\\n)?/.source +\n /(?: Who can vote: (?<scopeDescription>[^\\n]+?)\\n)?/.source +\n /$/.source\n );\n const match = content.match(pollRegex);\n if (!match || !match.groups) throw new Error('Invalid poll format: ' + content);\n\n const {\n deadline,\n poll,\n option1,\n option2,\n option3,\n option4,\n option5,\n allowArbitraryVote: allowArbitraryVoteStr,\n scopeDescription,\n } = match.groups;\n\n const options = [option1, option2, option3, option4, option5].filter((o) => o);\n const allowArbitraryVote =\n allowArbitraryVoteStr === 'Yes' ? true : allowArbitraryVoteStr === 'No' ? false : undefined;\n const deadlineStr = deadline;\n if (deadlineStr && !deadlineStr.match(UTCFormat))\n throw new Error('Invalid poll, deadline must be in UTC: ' + deadlineStr);\n return {\n deadline: deadlineStr ? new Date(deadlineStr) : undefined,\n poll,\n options,\n allowArbitraryVote,\n scopeDescription,\n };\n};\n\nexport const buildOrganisationVerificationContent = ({\n name,\n englishName,\n country,\n city,\n province,\n legalForm,\n department,\n domain,\n foreignDomain,\n serialNumber,\n confidence,\n reliabilityPolicy,\n employeeCount,\n pictureHash,\n latitude,\n longitude,\n population,\n publicKey,\n}: OrganisationVerification) => {\n if (!name || !country || !legalForm || (!domain && !foreignDomain))\n throw new Error('Missing required fields');\n if (!Object.values(legalForms).includes(legalForm))\n throw new Error('Invalid legal form ' + legalForm);\n if (employeeCount && !Object.values(peopleCountBuckets).includes(employeeCount))\n throw new Error('Invalid employee count ' + employeeCount);\n if (population && !Object.values(peopleCountBuckets).includes(population))\n throw new Error('Invalid population ' + population);\n if (confidence && !('' + confidence)?.match(/^[0-9.]+$/))\n throw new Error('Invalid confidence ' + confidence);\n if (pictureHash && !pictureHash.match(/^[A-Za-z0-9_-]+\\.[a-zA-Z0-9]+$/)) {\n throw new Error(\"Logo must be in format 'base64hash.extension' (URL-safe base64)\");\n }\n if (publicKey && !publicKey.match(/^[A-Za-z0-9_-]+$/)) {\n throw new Error('Public key must be in URL-safe base64 format (A-Z, a-z, 0-9, _, -)');\n }\n\n return (\n ' Type: Organisation verification\\n' +\n ' Description: We verified the following information about an organisation.\\n' +\n ' Name: ' +\n name +\n '\\n' +\n (englishName ? ' English name: ' + englishName + '\\n' : '') +\n ' Country: ' +\n country +\n '\\n' +\n ' Legal form: ' +\n legalForm +\n '\\n' +\n (domain ? ' Owner of the domain: ' + domain + '\\n' : '') +\n (foreignDomain\n ? ' Foreign domain used for publishing statements: ' + foreignDomain + '\\n'\n : '') +\n (department ? ' Department using the domain: ' + department + '\\n' : '') +\n (province ? ' Province or state: ' + province + '\\n' : '') +\n (serialNumber ? ' Business register number: ' + serialNumber + '\\n' : '') +\n (city ? ' City: ' + city + '\\n' : '') +\n (latitude ? ' Latitude: ' + latitude + '\\n' : '') +\n (longitude ? ' Longitude: ' + longitude + '\\n' : '') +\n (population ? ' Population: ' + population + '\\n' : '') +\n (pictureHash ? ' Logo: ' + pictureHash + '\\n' : '') +\n (employeeCount ? ' Employee count: ' + employeeCount + '\\n' : '') +\n (publicKey ? ' Public key: ' + publicKey + '\\n' : '') +\n (reliabilityPolicy ? ' Reliability policy: ' + reliabilityPolicy + '\\n' : '') +\n (confidence ? ' Confidence: ' + confidence + '\\n' : '')\n );\n};\n\nexport const parseOrganisationVerification = (content: string): OrganisationVerification => {\n const organisationVerificationRegex = new RegExp(\n '' +\n /^ Type: Organisation verification\\n/.source +\n / Description: We verified the following information about an organisation.\\n/.source +\n / Name: (?<name>[^\\n]+?)\\n/.source +\n /(?: English name: (?<englishName>[^\\n]+?)\\n)?/.source +\n / Country: (?<country>[^\\n]+?)\\n/.source +\n / Legal (?:form|entity): (?<legalForm>[^\\n]+?)\\n/.source +\n /(?: Owner of the domain: (?<domain>[^\\n]+?)\\n)?/.source +\n /(?: Foreign domain used for publishing statements: (?<foreignDomain>[^\\n]+?)\\n)?/.source +\n /(?: Department using the domain: (?<department>[^\\n]+?)\\n)?/.source +\n /(?: Province or state: (?<province>[^\\n]+?)\\n)?/.source +\n /(?: Business register number: (?<serialNumber>[^\\n]+?)\\n)?/.source +\n /(?: City: (?<city>[^\\n]+?)\\n)?/.source +\n /(?: Latitude: (?<latitude>[^\\n]+?)\\n)?/.source +\n /(?: Longitude: (?<longitude>[^\\n]+?)\\n)?/.source +\n /(?: Population: (?<population>[^\\n]+?)\\n)?/.source +\n /(?: Logo: (?<pictureHash>[A-Za-z0-9_-]+\\.[a-zA-Z0-9]+)\\n)?/.source +\n /(?: Employee count: (?<employeeCount>[01,+-]+?)\\n)?/.source +\n /(?: Public key: (?<publicKey>[A-Za-z0-9_-]+)\\n)?/.source +\n /(?: Reliability policy: (?<reliabilityPolicy>[^\\n]+?)\\n)?/.source +\n /(?: Confidence: (?<confidence>[0-9.]+?))?/.source +\n /\\n?$/.source\n );\n const match = content.match(organisationVerificationRegex);\n if (!match || !match.groups)\n throw new Error('Invalid organisation verification format: ' + content);\n\n const {\n name,\n englishName,\n country,\n legalForm,\n domain,\n foreignDomain,\n department,\n province,\n serialNumber,\n city,\n latitude,\n longitude,\n population,\n pictureHash,\n employeeCount,\n publicKey,\n reliabilityPolicy,\n confidence,\n } = match.groups;\n\n if (!isLegalForm(legalForm)) {\n throw new Error('Invalid legal form after validation: ' + legalForm);\n }\n\n return {\n name,\n englishName,\n country,\n legalForm,\n domain,\n foreignDomain,\n department,\n province,\n serialNumber,\n city,\n latitude: latitude ? parseFloat(latitude) : undefined,\n longitude: longitude ? parseFloat(longitude) : undefined,\n population: population && isPeopleCountBucket(population) ? population : undefined,\n pictureHash,\n employeeCount: employeeCount && isPeopleCountBucket(employeeCount) ? employeeCount : undefined,\n publicKey,\n reliabilityPolicy,\n confidence: confidence ? parseFloat(confidence) : undefined,\n };\n};\n\nexport const buildPersonVerificationContent = ({\n name,\n countryOfBirth,\n cityOfBirth,\n ownDomain,\n foreignDomain,\n dateOfBirth,\n jobTitle,\n employer,\n verificationMethod,\n confidence,\n picture,\n reliabilityPolicy,\n publicKey,\n}: PersonVerification) => {\n if (!name || !countryOfBirth || !cityOfBirth || !dateOfBirth || (!ownDomain && !foreignDomain)) {\n throw new Error('Missing required fields for person verification');\n }\n if (publicKey && !publicKey.match(/^[A-Za-z0-9_-]+$/)) {\n throw new Error('Public key must be in URL-safe base64 format (A-Z, a-z, 0-9, _, -)');\n }\n const [day, month, year] = dateOfBirth\n .toUTCString()\n .split(' ')\n .filter((_i, j) => [1, 2, 3].includes(j));\n const content =\n ' Type: Person verification\\n' +\n ' Description: We verified the following information about a person.\\n' +\n ' Name: ' +\n name +\n '\\n' +\n ' Date of birth: ' +\n [day.replace(/^0/, ''), month, year].join(' ') +\n '\\n' +\n ' City of birth: ' +\n cityOfBirth +\n '\\n' +\n ' Country of birth: ' +\n countryOfBirth +\n '\\n' +\n (jobTitle ? ' Job title: ' + jobTitle + '\\n' : '') +\n (employer ? ' Employer: ' + employer + '\\n' : '') +\n (ownDomain ? ' Owner of the domain: ' + ownDomain + '\\n' : '') +\n (foreignDomain\n ? ' Foreign domain used for publishing statements: ' + foreignDomain + '\\n'\n : '') +\n (picture ? ' Picture: ' + picture + '\\n' : '') +\n (verificationMethod ? ' Verification method: ' + verificationMethod + '\\n' : '') +\n (publicKey ? ' Public key: ' + publicKey + '\\n' : '') +\n (confidence ? ' Confidence: ' + confidence + '\\n' : '') +\n (reliabilityPolicy ? ' Reliability policy: ' + reliabilityPolicy + '\\n' : '');\n return content;\n};\n\nexport const parsePersonVerification = (content: string): PersonVerification => {\n const domainVerificationRegex = new RegExp(\n '' +\n /^ Type: Person verification\\n/.source +\n / Description: We verified the following information about a person.\\n/.source +\n / Name: (?<name>[^\\n]+?)\\n/.source +\n / Date of birth: (?<dateOfBirth>[^\\n]+?)\\n/.source +\n / City of birth: (?<cityOfBirth>[^\\n]+?)\\n/.source +\n / Country of birth: (?<countryOfBirth>[^\\n]+?)\\n/.source +\n /(?: Job title: (?<jobTitle>[^\\n]+?)\\n)?/.source +\n /(?: Employer: (?<employer>[^\\n]+?)\\n)?/.source +\n /(?: Owner of the domain: (?<domain>[^\\n]+?)\\n)?/.source +\n /(?: Foreign domain used for publishing statements: (?<foreignDomain>[^\\n]+?)\\n)?/.source +\n /(?: Picture: (?<picture>[^\\n]+?)\\n)?/.source +\n /(?: Verification method: (?<verificationMethod>[^\\n]+?)\\n)?/.source +\n /(?: Public key: (?<publicKey>[A-Za-z0-9_-]+)\\n)?/.source +\n /(?: Confidence: (?<confidence>[^\\n]+?)\\n)?/.source +\n /(?: Reliability policy: (?<reliabilityPolicy>[^\\n]+?)\\n)?/.source +\n /$/.source\n );\n const match = content.match(domainVerificationRegex);\n if (!match || !match.groups) throw new Error('Invalid person verification format: ' + content);\n\n const {\n name,\n dateOfBirth: dateOfBirthStr,\n cityOfBirth,\n countryOfBirth,\n jobTitle,\n employer,\n domain,\n foreignDomain,\n picture,\n verificationMethod,\n publicKey,\n confidence,\n reliabilityPolicy,\n } = match.groups;\n\n if (dateOfBirthStr && !dateOfBirthStr.match(birthDateFormat))\n throw new Error('Invalid birth date format: ' + dateOfBirthStr);\n const { d, month, y } = dateOfBirthStr.match(birthDateFormat)?.groups || {};\n if (!d || !month || !y) throw new Error('Invalid birth date format: ' + dateOfBirthStr);\n\n return {\n name,\n dateOfBirth: new Date(Date.UTC(parseInt(y), monthIndex(month), parseInt(d))),\n cityOfBirth,\n countryOfBirth,\n jobTitle,\n employer,\n ownDomain: domain,\n foreignDomain,\n picture,\n verificationMethod,\n publicKey,\n confidence: confidence ? parseFloat(confidence) : undefined,\n reliabilityPolicy,\n };\n};\n\nexport const buildVoteContent = ({ pollHash, poll, vote }: Vote) => {\n const content =\n ' Type: Vote\\n' +\n ' Poll id: ' +\n pollHash +\n '\\n' +\n ' Poll:\\n ' +\n poll +\n '\\n' +\n ' Option:\\n ' +\n vote +\n '\\n';\n return content;\n};\n\nexport const parseVote = (content: string): Vote => {\n const voteRegex = new RegExp(\n '' +\n /^ Type: Vote\\n/.source +\n / Poll id: (?<pollHash>[^\\n]+?)\\n/.source +\n / Poll:\\n (?<poll>[^\\n]+?)\\n/.source +\n / Option:\\n (?<vote>[^\\n]+?)\\n/.source +\n /$/.source\n );\n const match = content.match(voteRegex);\n if (!match || !match.groups) throw new Error('Invalid vote format: ' + content);\n\n const { pollHash, poll, vote } = match.groups;\n return { pollHash, poll, vote };\n};\n\nexport const buildDisputeAuthenticityContent = ({\n hash,\n confidence,\n reliabilityPolicy,\n}: DisputeAuthenticity) => {\n const content =\n ' Type: Dispute statement authenticity\\n' +\n ' Description: We think that the referenced statement is not authentic.\\n' +\n ' Hash of referenced statement: ' +\n hash +\n '\\n' +\n (confidence ? ' Confidence: ' + confidence + '\\n' : '') +\n (reliabilityPolicy ? ' Reliability policy: ' + reliabilityPolicy + '\\n' : '');\n return content;\n};\n\nexport const parseDisputeAuthenticity = (content: string): DisputeAuthenticity => {\n const disputeRegex = new RegExp(\n '' +\n /^ Type: Dispute statement authenticity\\n/.source +\n / Description: We think that the referenced statement is not authentic.\\n/.source +\n / Hash of referenced statement: (?<hash>[^\\n]+?)\\n/.source +\n /(?: Confidence: (?<confidence>[^\\n]*?)\\n)?/.source +\n /(?: Reliability policy: (?<reliabilityPolicy>[^\\n]+?)\\n)?/.source +\n /$/.source\n );\n const match = content.match(disputeRegex);\n if (!match || !match.groups) throw new Error('Invalid dispute authenticity format: ' + content);\n\n const { hash, confidence, reliabilityPolicy } = match.groups;\n return {\n hash,\n confidence: confidence ? parseFloat(confidence) : undefined,\n reliabilityPolicy,\n };\n};\n\nexport const buildDisputeContentContent = ({\n hash,\n confidence,\n reliabilityPolicy,\n}: DisputeContent) => {\n const content =\n ' Type: Dispute statement content\\n' +\n ' Description: We think that the content of the referenced statement is false.\\n' +\n ' Hash of referenced statement: ' +\n hash +\n '\\n' +\n (confidence ? ' Confidence: ' + confidence + '\\n' : '') +\n (reliabilityPolicy ? ' Reliability policy: ' + reliabilityPolicy + '\\n' : '');\n return content;\n};\n\nexport const parseDisputeContent = (content: string): DisputeContent => {\n const disputeRegex = new RegExp(\n '' +\n /^ Type: Dispute statement content\\n/.source +\n / Description: We think that the content of the referenced statement is false.\\n/.source +\n / Hash of referenced statement: (?<hash>[^\\n]+?)\\n/.source +\n /(?: Confidence: (?<confidence>[^\\n]*?)\\n)?/.source +\n /(?: Reliability policy: (?<reliabilityPolicy>[^\\n]+?)\\n)?/.source +\n /$/.source\n );\n const match = content.match(disputeRegex);\n if (!match || !match.groups) throw new Error('Invalid dispute content format: ' + content);\n\n const { hash, confidence, reliabilityPolicy } = match.groups;\n return {\n hash,\n confidence: confidence ? parseFloat(confidence) : undefined,\n reliabilityPolicy,\n };\n};\n\nexport const buildResponseContent = ({ hash, response }: ResponseContent) => {\n const content =\n ' Type: Response\\n' +\n ' Hash of referenced statement: ' +\n hash +\n '\\n' +\n ' Response:\\n ' +\n response +\n '\\n';\n return content;\n};\n\nexport const parseResponseContent = (content: string): ResponseContent => {\n const responseRegex = new RegExp(\n '' +\n /^ Type: Response\\n/.source +\n / Hash of referenced statement: (?<hash>[^\\n]+?)\\n/.source +\n / Response:\\n (?<response>[^\\n]*?)\\n/.source +\n /$/.source\n );\n const match = content.match(responseRegex);\n if (!match || !match.groups) throw new Error('Invalid response content format: ' + content);\n\n const { hash, response } = match.groups;\n return { hash, response };\n};\n\nexport const buildPDFSigningContent = ({ hash }: PDFSigning) => {\n if (!hash.match(/^[A-Za-z0-9_-]+$/)) {\n throw new Error('PDF file hash must be in URL-safe base64 format (A-Z, a-z, 0-9, _, -)');\n }\n const content =\n ' Type: Sign PDF\\n' +\n ' Description: We hereby digitally sign the referenced PDF file.\\n' +\n ' PDF file hash: ' +\n hash +\n '\\n';\n return content;\n};\n\nexport const parsePDFSigning = (content: string): PDFSigning => {\n const signingRegex = new RegExp(\n '' +\n /^ Type: Sign PDF\\n/.source +\n / Description: We hereby digitally sign the referenced PDF file.\\n/.source +\n / PDF file hash: (?<hash>[A-Za-z0-9_-]+)\\n/.source +\n /$/.source\n );\n const match = content.match(signingRegex);\n if (!match || !match.groups) throw new Error('Invalid PDF signing format: ' + content);\n\n const { hash } = match.groups;\n return { hash };\n};\n\nexport const buildRating = ({\n subjectName,\n subjectType,\n subjectReference,\n documentFileHash,\n rating,\n quality,\n comment,\n}: Rating) => {\n if (![1, 2, 3, 4, 5].includes(rating)) throw new Error('Invalid rating: ' + rating);\n const content =\n ' Type: Rating\\n' +\n (subjectType ? ' Subject type: ' + subjectType + '\\n' : '') +\n ' Subject name: ' +\n subjectName +\n '\\n' +\n (subjectReference ? ' URL that identifies the subject: ' + subjectReference + '\\n' : '') +\n (documentFileHash ? ' Document file hash: ' + documentFileHash + '\\n' : '') +\n (quality ? ' Rated quality: ' + quality + '\\n' : '') +\n ' Our rating: ' +\n rating +\n '/5 Stars\\n' +\n (comment ? ' Comment:\\n ' + comment + '\\n' : '');\n return content;\n};\n\nexport const parseRating = (content: string): Rating => {\n const ratingRegex = new RegExp(\n '' +\n /^ Type: Rating\\n/.source +\n /(?: Subject type: (?<subjectType>[^\\n]*?)\\n)?/.source +\n / Subject name: (?<subjectName>[^\\n]*?)\\n/.source +\n /(?: URL that identifies the subject: (?<subjectReference>[^\\n]*?)\\n)?/.source +\n /(?: Document file hash: (?<documentFileHash>[^\\n]*?)\\n)?/.source +\n /(?: Rated quality: (?<quality>[^\\n]*?)\\n)?/.source +\n / Our rating: (?<rating>[1-5])\\/5 Stars\\n/.source +\n /(?: Comment:\\n (?<comment>[\\s\\S]+?)\\n)?/.source +\n /$/.source\n );\n const match = content.match(ratingRegex);\n if (!match || !match.groups) throw new Error('Invalid rating format: ' + content);\n\n const {\n subjectType,\n subjectName,\n subjectReference,\n documentFileHash,\n quality,\n rating: ratingStr,\n comment,\n } = match.groups;\n\n const rating = parseInt(ratingStr);\n if (![1, 2, 3, 4, 5].includes(rating)) throw new Error('Invalid rating: ' + ratingStr);\n if (\n subjectType &&\n ![\n 'Organisation',\n 'Policy proposal',\n 'Regulation',\n 'Treaty draft',\n 'Product',\n 'Research publication',\n ].includes(subjectType)\n )\n throw new Error('Invalid subject type: ' + subjectType);\n if (!subjectName) throw new Error('Missing subject name');\n\n if (!isRatingValue(rating)) {\n throw new Error('Invalid rating after validation: ' + rating);\n }\n\n return {\n subjectType: subjectType as RatingSubjectTypeValue,\n subjectName,\n subjectReference,\n documentFileHash,\n quality,\n rating,\n comment,\n };\n};\n"],
5
+ "mappings": ";;;;;AAAO,IAAM,aAAa;AAAA,EACxB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,aAAa;AACf;AAEO,IAAM,iBAAiB;AAAA,EAC5B,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,aAAa;AACf;AAEO,IAAM,qBAAqB;AAAA,EAChC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AACd;AAEO,IAAM,qBAAqB;AAAA,EAChC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ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",
6
+ "names": ["h", "h", "C", "G", "sha256", "sha256", "isBytes", "abytes", "abytes", "C", "G", "P", "abytes", "abytes", "verify", "bytesToBase64", "verify", "sha256", "sha256", "version"]
7
+ }
@@ -0,0 +1,30 @@
1
+ import type { Statement, Poll, OrganisationVerification, PersonVerification, Vote, DisputeAuthenticity, DisputeContent, ResponseContent, PDFSigning, Rating } from './types';
2
+ export * from './types';
3
+ export * from './constants';
4
+ export * from './utils';
5
+ export declare const buildStatement: ({ domain, author, time, tags, content, representative, supersededStatement, translations, attachments, }: Statement) => string;
6
+ export declare const parseStatement: ({ statement: input, }: {
7
+ statement: string;
8
+ }) => Statement & {
9
+ type?: string;
10
+ formatVersion: string;
11
+ };
12
+ export declare const buildPollContent: ({ deadline, poll, scopeDescription, options, allowArbitraryVote, }: Poll) => string;
13
+ export declare const parsePoll: (content: string, version?: string) => Poll;
14
+ export declare const buildOrganisationVerificationContent: ({ name, englishName, country, city, province, legalForm, department, domain, foreignDomain, serialNumber, confidence, reliabilityPolicy, employeeCount, pictureHash, latitude, longitude, population, publicKey, }: OrganisationVerification) => string;
15
+ export declare const parseOrganisationVerification: (content: string) => OrganisationVerification;
16
+ export declare const buildPersonVerificationContent: ({ name, countryOfBirth, cityOfBirth, ownDomain, foreignDomain, dateOfBirth, jobTitle, employer, verificationMethod, confidence, picture, reliabilityPolicy, publicKey, }: PersonVerification) => string;
17
+ export declare const parsePersonVerification: (content: string) => PersonVerification;
18
+ export declare const buildVoteContent: ({ pollHash, poll, vote }: Vote) => string;
19
+ export declare const parseVote: (content: string) => Vote;
20
+ export declare const buildDisputeAuthenticityContent: ({ hash, confidence, reliabilityPolicy, }: DisputeAuthenticity) => string;
21
+ export declare const parseDisputeAuthenticity: (content: string) => DisputeAuthenticity;
22
+ export declare const buildDisputeContentContent: ({ hash, confidence, reliabilityPolicy, }: DisputeContent) => string;
23
+ export declare const parseDisputeContent: (content: string) => DisputeContent;
24
+ export declare const buildResponseContent: ({ hash, response }: ResponseContent) => string;
25
+ export declare const parseResponseContent: (content: string) => ResponseContent;
26
+ export declare const buildPDFSigningContent: ({ hash }: PDFSigning) => string;
27
+ export declare const parsePDFSigning: (content: string) => PDFSigning;
28
+ export declare const buildRating: ({ subjectName, subjectType, subjectReference, documentFileHash, rating, quality, comment, }: Rating) => string;
29
+ export declare const parseRating: (content: string) => Rating;
30
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,IAAI,EACJ,wBAAwB,EACxB,kBAAkB,EAClB,IAAI,EACJ,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,UAAU,EACV,MAAM,EAEP,MAAM,SAAS,CAAC;AAKjB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AAExB,eAAO,MAAM,cAAc,GAAI,0GAU5B,SAAS,WA4FX,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,uBAE5B;IACD,SAAS,EAAE,MAAM,CAAC;CACnB,KAAG,SAAS,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CA2JrD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,oEAM9B,IAAI,WAyBN,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,IA4C7D,CAAC;AAEF,eAAO,MAAM,oCAAoC,GAAI,oNAmBlD,wBAAwB,WAgD1B,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,SAAS,MAAM,KAAG,wBA0E/D,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,0KAc5C,kBAAkB,WAsCpB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,SAAS,MAAM,KAAG,kBA2DzD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,0BAA0B,IAAI,WAa9D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,KAAG,IAc3C,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,0CAI7C,mBAAmB,WAUrB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,KAAG,mBAmB1D,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,0CAIxC,cAAc,WAUhB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,cAmBrD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,oBAAoB,eAAe,WAUvE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,MAAM,KAAG,eAatD,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,UAAU,UAAU,WAW1D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,UAajD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,6FAQzB,MAAM,WAgBR,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,MAuD7C,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Universal signature utilities using @noble/ed25519
3
+ * Works in both browser and Node.js environments
4
+ */
5
+ import type { CryptographicallySignedStatement } from './types';
6
+ /**
7
+ * Generate a new Ed25519 key pair for signing statements
8
+ * @returns Object containing publicKey and privateKey as URL-safe base64
9
+ */
10
+ export declare const generateKeyPair: () => Promise<{
11
+ publicKey: string;
12
+ privateKey: string;
13
+ }>;
14
+ /**
15
+ * Sign a statement with a private key
16
+ * @param statement - The statement text to sign
17
+ * @param privateKeyUrlSafe - Private key in URL-safe base64 format
18
+ * @returns URL-safe base64-encoded signature
19
+ */
20
+ export declare const signStatement: (statement: string, privateKeyUrlSafe: string) => Promise<string>;
21
+ /**
22
+ * Verify a statement signature
23
+ * @param statement - The statement text that was signed
24
+ * @param signatureUrlSafe - URL-safe base64-encoded signature
25
+ * @param publicKeyUrlSafe - Public key in URL-safe base64 format
26
+ * @returns true if signature is valid, false otherwise
27
+ */
28
+ export declare const verifySignature: (statement: string, signatureUrlSafe: string, publicKeyUrlSafe: string) => Promise<boolean>;
29
+ /**
30
+ * Build a signed statement
31
+ * @param statement - The statement text to sign
32
+ * @param privateKeyUrlSafe - Private key in URL-safe base64 format
33
+ * @param publicKeyUrlSafe - Public key in URL-safe base64 format
34
+ * @returns Signed statement with appended signature fields
35
+ */
36
+ export declare const buildSignedStatement: (statement: string, privateKeyUrlSafe: string, publicKeyUrlSafe: string) => Promise<string>;
37
+ /**
38
+ * Parse a signed statement
39
+ * @param signedStatement - The signed statement text
40
+ * @returns Parsed CryptographicallySignedStatement object or null if invalid
41
+ */
42
+ export declare const parseSignedStatement: (signedStatement: string) => CryptographicallySignedStatement | null;
43
+ /**
44
+ * Verify a signed statement
45
+ * @param signedStatement - The signed statement text
46
+ * @returns true if signature is valid, false otherwise
47
+ */
48
+ export declare const verifySignedStatement: (signedStatement: string) => Promise<boolean>;
49
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../src/signature.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,SAAS,CAAC;AAOhE;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAQzF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,WAAW,MAAM,EACjB,mBAAmB,MAAM,KACxB,OAAO,CAAC,MAAM,CAOhB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,kBAAkB,MAAM,EACxB,kBAAkB,MAAM,KACvB,OAAO,CAAC,OAAO,CAUjB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,WAAW,MAAM,EACjB,mBAAmB,MAAM,EACzB,kBAAkB,MAAM,KACvB,OAAO,CAAC,MAAM,CAWhB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,iBAAiB,MAAM,KACtB,gCAAgC,GAAG,IA+BrC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAU,iBAAiB,MAAM,KAAG,OAAO,CAAC,OAAO,CAKpF,CAAC"}