{"version":3,"file":"index.mjs","sources":["../../src/core/utils.ts","../../src/core/prime.ts","../../src/core/codec.ts","../../src/core/hash.ts","../../src/hash/sm3.ts","../../src/hash/md5.ts","../../src/hash/sha1.ts","../../src/hash/sha256.ts","../../src/hash/sha512.ts","../../src/hash/keccak1600.ts","../../src/hash/sha3.ts","../../src/hash/sha3Derived.ts","../../src/hash/turboSHAKE.ts","../../src/hash/kangaroo12.ts","../../src/hash/hmac.ts","../../src/hash/totp.ts","../../src/core/cipher.ts","../../src/cipher/streamCipher/arc4.ts","../../src/cipher/streamCipher/rabbit.ts","../../src/cipher/streamCipher/salsa20.ts","../../src/cipher/streamCipher/zuc.ts","../../src/cipher/blockCipher/aes.ts","../../src/cipher/blockCipher/arc5.ts","../../src/cipher/blockCipher/aria.ts","../../src/cipher/blockCipher/blowfish.ts","../../src/cipher/blockCipher/camellia.ts","../../src/cipher/blockCipher/des.ts","../../src/cipher/blockCipher/sm4.ts","../../src/cipher/blockCipher/tea.ts","../../src/cipher/blockCipher/twofish.ts","../../src/core/asn1.ts","../../src/cipher/pkcs/rsa.ts","../../src/cipher/pkcs/pkcs1.ts","../../src/core/kdf.ts","../../src/core/galois_field.ts","../../src/core/coordinate_system.ts","../../src/core/ec.ts","../../src/cipher/ecc/ecc.ts","../../src/core/ec_params.ts","../../src/cipher/ecc/x25519_448.ts","../../src/cipher/ecc/sm2.ts"],"sourcesContent":["import type { Codec } from './codec';\r\n\r\n// * Math Utility Functions\r\n\r\n/**\r\n * 32-bit 循环左移 / 32-bit Rotate Left\r\n *\r\n * @param {number | bigint} x - 数值 / value\r\n * @param {number | bigint} n - 位移 / shift\r\n */\r\nexport function rotateL32(x: number, n: number) {\r\n  return ((x << n) | (x >>> (32 - n))) >>> 0;\r\n}\r\n\r\n/**\r\n * 32-bit 循环右移 / 32-bit Rotate Right\r\n *\r\n * @param {number | bigint} x - 数值 / value\r\n * @param {number | bigint} n - 位移 / shift\r\n */\r\nexport function rotateR32(x: number, n: number) {\r\n  return (x >>> n) | ((x << (32 - n)) >>> 0);\r\n}\r\n\r\n/**\r\n * 位循环左移 / Rotate Left\r\n *\r\n * @param {number} bit - 限制位数 / limit bit\r\n * @param {number | bigint} x - 数值 / value\r\n * @param {number | bigint} n - 位移 / shift\r\n * @param {bigint} [mask] - 位掩码 / bit mask\r\n */\r\nexport function rotateL(bit: number | bigint, x: number | bigint, n: number | bigint, mask?: bigint) {\r\n  bit = BigInt(bit);\r\n  mask ??= genBitMask(bit);\r\n  x = BigInt(x);\r\n  n = BigInt(n);\r\n  x &= mask;\r\n  n %= bit;\r\n  x = (x << n) | (x >> (bit - n));\r\n  return x & mask;\r\n}\r\n\r\n/**\r\n * 位循环右移 / Rotate Right\r\n *\r\n * @param {number} bit - 限制位数 / limit bit\r\n * @param {number | bigint} x - 数值 / value\r\n * @param {number | bigint} n - 位移 / shift\r\n * @param {bigint} [mask] - 位掩码 / bit mask\r\n */\r\nexport function rotateR(bit: number | bigint, x: number | bigint, n: number | bigint, mask?: bigint) {\r\n  bit = BigInt(bit);\r\n  mask ??= genBitMask(bit);\r\n  x = BigInt(x);\r\n  n = BigInt(n);\r\n  x &= mask;\r\n  n %= bit;\r\n  x = (x >> n) | (x << (bit - n));\r\n  return x & mask;\r\n}\r\n\r\n/**\r\n * 在指定缓存区长度内生成随机大整数 / Generate random BigInt within specified buffer length\r\n *\r\n * @param {bigint} max - 最大值 (不包含) / maximum value (exclusive)\r\n * @param {number} byte - 缓存区长度 / buffer length in byte\r\n * @param {number} [max_attempts] - 最大尝试次数 / maximum attempts (default: 1000)\r\n *\r\n * @returns\r\n * - buffer: 生成的随机缓存区 / generated random buffer\r\n * - result: 生成的随机大整数 / generated random bigint\r\n */\r\nexport function genRandomBI(max: bigint, byte: number, max_attempts: number = 1000) {\r\n  if (max <= 1n) throw new KitError('Max must be greater than 1');\r\n\r\n  // 创建缓存区\r\n  const buffer = new U8(byte);\r\n\r\n  // 生成随机数直到小于 max\r\n  let result = 0n;\r\n  let attempts = 0;\r\n  while (attempts < max_attempts) {\r\n    crypto.getRandomValues(buffer);\r\n    result = buffer.toBI();\r\n    if (result < max) return { buffer, result };\r\n    attempts++;\r\n  }\r\n\r\n  throw new KitError('Failed to generate random bigint within max attempts');\r\n}\r\n\r\n/**\r\n * 获取大整数的比特长度\r\n *\r\n * Get the bit length of a BigInt\r\n */\r\nexport function getBIBits(n: bigint) {\r\n  return n === 0n ? 0 : n.toString(2).length;\r\n}\r\n\r\n/**\r\n * 生成位掩码 / Generate Bit Mask\r\n *\r\n * @param {number} w - 位数 / bit\r\n *\r\n * ```ts\r\n * const mask = genBitMask(8) // 0xFFn\r\n * ```\r\n */\r\nexport function genBitMask(w: number | bigint) {\r\n  w = BigInt(w);\r\n  let mask = 0x0n;\r\n  for (let i = 0; i < w; i++) {\r\n    mask = (mask << 1n) | 1n;\r\n  }\r\n  return mask;\r\n}\r\n\r\n/**\r\n * 扩展欧几里得算法\r\n *\r\n * Extended Euclidean Algorithm\r\n *\r\n * @returns\r\n * - gcd: 最大公约数 / greatest common divisor\r\n * - x: a 的贝祖系数 / Bézout coefficient of a\r\n */\r\nexport function extendedEuclidean(a: bigint, b: bigint) {\r\n  let [s0, s1, t0, t1, r0, r1] = [1n, 0n, 0n, 1n, a, b];\r\n\r\n  if (b === 0n) {\r\n    return {\r\n      gcd: a,\r\n      x: 1n,\r\n    };\r\n  }\r\n\r\n  while (r1 !== 0n) {\r\n    const q = r0 / r1;\r\n    [r0, r1] = [r1, r0 - q * r1];\r\n    [s0, s1] = [s1, s0 - q * s1];\r\n    [t0, t1] = [t1, t0 - q * t1];\r\n  }\r\n\r\n  return {\r\n    gcd: r0,\r\n    x: s0,\r\n  };\r\n}\r\n\r\n/**\r\n * 勒让德符号\r\n *\r\n * Legendre Symbol\r\n */\r\nexport function legendreSymbol(a: bigint, p: bigint): bigint {\r\n  return modPow(a, (p - 1n) >> 1n, p);\r\n}\r\n\r\n/**\r\n * 托内利-香克斯算法\r\n *\r\n * Tonelli-Shanks Algorithm\r\n */\r\nexport function tonelliShanks(a: bigint, p: bigint): bigint {\r\n  if (legendreSymbol(a, p) !== 1n) {\r\n    throw new KitError('There is no square root');\r\n  }\r\n  if (a === 0n) {\r\n    return 0n;\r\n  }\r\n  if (p === 2n) {\r\n    return a;\r\n  }\r\n  if (p % 4n === 3n) {\r\n    return modPow(a, (p + 1n) >> 2n, p);\r\n  }\r\n\r\n  let q = p - 1n;\r\n  let s = 0n;\r\n  while (mod(q, 2n) === 0n) {\r\n    q >>= 1n;\r\n    s++;\r\n  }\r\n\r\n  let z = 2n;\r\n  while (legendreSymbol(z, p) !== p - 1n) {\r\n    z++;\r\n  }\r\n\r\n  let m = s;\r\n  let c = modPow(z, q, p);\r\n  let t = modPow(a, q, p);\r\n  let r = modPow(a, (q + 1n) >> 1n, p);\r\n\r\n  while (t !== 0n && t !== 1n) {\r\n    let t2i = t;\r\n    let i = 1n;\r\n    for (; i < m; i++) {\r\n      t2i = modPow(t2i, 2n, p);\r\n      if (t2i === 1n) {\r\n        break;\r\n      }\r\n    }\r\n\r\n    const b = modPow(c, 1n << (m - i - 1n), p);\r\n    m = i;\r\n    c = modPow(b, 2n, p);\r\n    t = (t * c) % p;\r\n    r = (r * b) % p;\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n/**\r\n * 最大公约数\r\n *\r\n * Greatest Common Divisor\r\n */\r\nexport function gcd(a: bigint, b: bigint): bigint {\r\n  return extendedEuclidean(a, b).gcd;\r\n}\r\n\r\n/**\r\n * 最小公倍数\r\n *\r\n * Least Common Multiple\r\n */\r\nexport function lcm(a: bigint, b: bigint): bigint {\r\n  return (a * b) / gcd(a, b);\r\n}\r\n\r\n/**\r\n * 求模: a mod b\r\n *\r\n * Modulo operation: a mod b\r\n *\r\n * @param {bigint} a - 被除数 / dividend\r\n * @param {bigint} b - 除数 / divisor\r\n */\r\nexport function mod(a: bigint, b: bigint): bigint {\r\n  const r = a % b;\r\n  return r < 0n ? r + b : r;\r\n}\r\n\r\n/**\r\n * 模幂运算: x ^ y mod n\r\n *\r\n * Modular exponentiation: x ^ y mod n\r\n *\r\n * @param {bigint} x - base\r\n * @param {bigint} y - exponent\r\n * @param {bigint} n - modulus\r\n */\r\nexport function modPow(x: bigint, y: bigint, n: bigint): bigint {\r\n  x %= n;\r\n  let r = 1n;\r\n  while (y > 0n) {\r\n    if (y & 1n) r = (r * x) % n;\r\n    x = (x * x) % n;\r\n    y >>= 1n;\r\n  }\r\n  return r;\r\n}\r\n\r\n/**\r\n * 模逆运算: e ≡ x ^ -1 (mod n)\r\n *\r\n * Modular inverse operation: e ≡ x ^ -1 (mod n)\r\n *\r\n * @param {bigint} x - base\r\n * @param {bigint} n - modulus\r\n */\r\nexport function modInverse(x: bigint, n: bigint): bigint {\r\n  const { gcd, x: _x } = extendedEuclidean(x, n);\r\n  if (gcd !== 1n) throw new KitError('Modular inverse does not exist');\r\n\r\n  return mod(_x, n);\r\n}\r\n\r\n/**\r\n * 模素平方根运算: n ^ 0.5 (mod p)\r\n *\r\n * Modular prime square operation: n ^ 0.5 (mod p)\r\n */\r\nexport function modPrimeSquareRoot(n: bigint, p: bigint): bigint {\r\n  n = mod(n, p);\r\n  if (n === 0n) return 0n;\r\n  const r1 = tonelliShanks(n, p);\r\n  const r2 = mod(p - r1, p);\r\n  return r1 <= r2 ? r1 : r2;\r\n}\r\n\r\n// * Buffer Utility Functions\r\n\r\n/**\r\n * @extends Uint8Array\r\n */\r\nexport class U8 extends Uint8Array {\r\n  /**\r\n   * 从 U8 中获取一个字 / Get a word from U8\r\n   *\r\n   * @param {number} word_size - 字长 / word size (byte)\r\n   * @param {number} index - 字索引 / word index\r\n   * @param {boolean} [little_endian] - 是否为小端序 / little-endian (default: false)\r\n   */\r\n  getWord(word_size: number, index: number, little_endian = false): bigint {\r\n    const offset = index * word_size;\r\n    const buffer = this.subarray(offset, offset + word_size);\r\n    return little_endian ? buffer.toBI(true) : buffer.toBI();\r\n  }\r\n\r\n  /**\r\n   * 将一个字写入 U8 / Set a word to U8\r\n   *\r\n   * @param {number} word_size - 字长 / word size (byte)\r\n   * @param {number} index - 字索引 / word index\r\n   * @param {bigint | Uint8Array} word - 字 / word\r\n   * @param {boolean} [little_endian] - 是否为小端序 / little-endian (default: false)\r\n   */\r\n  setWord(word_size: number, index: number, word: bigint | Uint8Array, little_endian = false) {\r\n    const offset = index * word_size;\r\n    const buffer = typeof word === 'bigint' ? U8.fromBI(word, word_size) : word;\r\n    this.set(little_endian ? buffer.toReversed() : buffer, offset);\r\n  }\r\n\r\n  /**\r\n   * U8 视图 / U8 view\r\n   *\r\n   * @param {number} word_size - 字长 / word size (byte)\r\n   */\r\n  view(word_size: number) {\r\n    const length = Math.floor(this.length / word_size);\r\n    const get = (index: number, little_endian = false) => this.getWord(word_size, index, little_endian);\r\n    const set = (index: number, word: bigint | Uint8Array, little_endian = false) =>\r\n      this.setWord(word_size, index, word, little_endian);\r\n    return { get, set, length };\r\n  }\r\n\r\n  /**\r\n   * 将 U8 编码为字符串 / stringify U8 to encoded string\r\n   */\r\n  to(codec: Codec) {\r\n    return codec(this);\r\n  }\r\n\r\n  /**\r\n   * 将 U8 转换为 BigInt / Convert U8 to BigInt\r\n   *\r\n   * @param {boolean} [little_endian] - 是否为小端序 / little-endian (default: false)\r\n   */\r\n  toBI(little_endian = false) {\r\n    const buffer = little_endian ? this.toReversed() : this;\r\n    let bigint = 0n;\r\n    buffer.forEach((byte) => {\r\n      bigint = (bigint << 8n) | BigInt(byte);\r\n    });\r\n    return bigint;\r\n  }\r\n\r\n  /**\r\n   * Convert U8 to Uint8Array\r\n   *\r\n   * 将 U8 转换为 Uint8Array\r\n   */\r\n  toUint8Array() {\r\n    return new Uint8Array(this);\r\n  }\r\n\r\n  /**\r\n   * Convert string to U8\r\n   *\r\n   * 将 字符串 转换为 U8\r\n   */\r\n  static fromString(input: string, codec: Codec): U8 {\r\n    return codec(input);\r\n  }\r\n\r\n  /**\r\n   * Convert BigInt to U8\r\n   *\r\n   * 将 BigInt 转换为 U8\r\n   */\r\n  static fromBI(bigint: bigint, length?: number, little_endian = false): U8 {\r\n    length = length || (getBIBits(bigint) + 7) >> 3;\r\n    const buffer = new U8(length);\r\n    if (little_endian) {\r\n      for (let i = 0; i < buffer.length; i++) {\r\n        buffer[i] = Number(bigint & 0xffn);\r\n        bigint >>= 8n;\r\n      }\r\n    } else {\r\n      for (let i = buffer.length - 1; i >= 0; i--) {\r\n        buffer[i] = Number(bigint & 0xffn);\r\n        bigint >>= 8n;\r\n      }\r\n    }\r\n    return buffer;\r\n  }\r\n\r\n  /**\r\n   * Returns the elements of an array that meet the condition specified in a callback function.\r\n   * @param predicate A function that accepts up to three arguments. The filter method calls\r\n   * the predicate function one time for each element in the array.\r\n   * @param thisArg An object to which the this keyword can refer in the predicate function.\r\n   * If thisArg is omitted, undefined is used as the this value.\r\n   */\r\n  filter(predicate: (value: number, index: number, array: this) => any, thisArg?: any): U8 {\r\n    const _ = super.filter(predicate, thisArg);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Returns a new array from a set of elements.\r\n   * @param items A set of elements to include in the new array object.\r\n   */\r\n  static of(...items: number[]): U8 {\r\n    const _ = Uint8Array.of(...items);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Creates an array from an array-like or iterable object.\r\n   * @param elements An iterable object to convert to an array.\r\n   */\r\n  static from(elements: Iterable<number>): U8;\r\n  /**\r\n   * Creates an array from an array-like or iterable object.\r\n   * @param elements An iterable object to convert to an array.\r\n   * @param mapfn A mapping function to call on every element of the array.\r\n   * @param thisArg Value of 'this' used to invoke the mapfn.\r\n   */\r\n  static from<T>(elements: Iterable<T>, mapfn?: (v: T, k: number) => number, thisArg?: any): U8;\r\n  /**\r\n   * Creates an array from an array-like or iterable object.\r\n   * @param arrayLike An array-like object to convert to an array.\r\n   */\r\n  static from(arrayLike: ArrayLike<number>): U8;\r\n  /**\r\n   * Creates an array from an array-like or iterable object.\r\n   * @param arrayLike An array-like object to convert to an array.\r\n   * @param mapfn A mapping function to call on every element of the array.\r\n   * @param thisArg Value of 'this' used to invoke the mapfn.\r\n   */\r\n  static from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): U8;\r\n  static from(array_like: any, mapfn?: any, this_arg?: any): U8 {\r\n    const _ = Uint8Array.from(array_like, mapfn, this_arg);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Calls a defined callback function on each element of an array, and returns an array that\r\n   * contains the results.\r\n   * @param callbackfn A function that accepts up to three arguments. The map method calls the\r\n   * callbackfn function one time for each element in the array.\r\n   * @param thisArg An object to which the this keyword can refer in the callbackfn function.\r\n   * If thisArg is omitted, undefined is used as the this value.\r\n   */\r\n  map(callbackfn: (value: number, index: number, array: this) => number, thisArg?: any): U8 {\r\n    const _ = super.map(callbackfn, thisArg);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Returns a section of an array.\r\n   * @param start The beginning of the specified portion of the array.\r\n   * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\r\n   */\r\n  slice(start?: number, end?: number): U8 {\r\n    const _ = super.slice(start, end);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements\r\n   * at begin, inclusive, up to end, exclusive.\r\n   * @param begin The index of the beginning of the array.\r\n   * @param end The index of the end of the array.\r\n   */\r\n  subarray(begin?: number, end?: number): U8 {\r\n    const _ = super.subarray(begin, end);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Copies the array and returns the copy with the elements in reverse order.\r\n   */\r\n  toReversed(): U8 {\r\n    const _ = super.toReversed();\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Copies and sorts the array.\r\n   * @param compareFn Function used to determine the order of the elements. It is expected to return\r\n   * a negative value if the first argument is less than the second argument, zero if they're equal, and a positive\r\n   * value otherwise. If omitted, the elements are sorted in ascending order.\r\n   * ```ts\r\n   * const myNums = Uint8Array.from([11, 2, 22, 1]);\r\n   * myNums.toSorted((a, b) => a - b) // Uint8Array(4) [1, 2, 11, 22]\r\n   * ```\r\n   */\r\n  toSorted(compareFn?: (a: number, b: number) => number): U8 {\r\n    const _ = super.toSorted(compareFn);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n\r\n  /**\r\n   * Copies the array and inserts the given number at the provided index.\r\n   * @param index The index of the value to overwrite. If the index is\r\n   * negative, then it replaces from the end of the array.\r\n   * @param value The value to insert into the copied array.\r\n   * @returns A copy of the original array with the inserted value.\r\n   */\r\n  with(index: number, value: number): U8 {\r\n    const _ = super.with(index, value);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  }\r\n}\r\n\r\ntype TypedArray = Uint8Array | Int8Array | Uint8ClampedArray | Uint16Array | Int16Array | Uint32Array | Int32Array;\r\n\r\n/**\r\n * Convert TypedArray to Uint8Array\r\n *\r\n * 将 TypedArray 转换为 Uint8Array\r\n */\r\nexport function u8(source: TypedArray): U8 {\r\n  return new U8(source.buffer as ArrayBuffer, source.byteOffset, source.byteLength);\r\n}\r\n\r\n/**\r\n * Convert TypedArray to Uint16Array\r\n *\r\n * 将 TypedArray 转换为 Uint16Array\r\n */\r\nexport function u16(source: TypedArray): Uint16Array {\r\n  return new Uint16Array(source.buffer, source.byteOffset, source.byteLength >> 1);\r\n}\r\n\r\n/**\r\n * Convert TypedArray to Uint32Array\r\n *\r\n * 将 TypedArray 转换为 Uint32Array\r\n */\r\nexport function u32(source: TypedArray): Uint32Array {\r\n  return new Uint32Array(source.buffer, source.byteOffset, source.byteLength >> 2);\r\n}\r\n\r\n/**\r\n * Merging multiple ArrayBuffers\r\n *\r\n * 合并多个 ArrayBuffer\r\n */\r\nexport function joinBuffer(...buffers: Uint8Array[]) {\r\n  const byte_total = buffers.reduce((acc, cur) => acc + cur.byteLength, 0);\r\n  const result = new U8(byte_total);\r\n  let offset = 0;\r\n  for (const buffer of buffers) {\r\n    result.set(new U8(buffer), offset);\r\n    offset += buffer.byteLength;\r\n  }\r\n  return result;\r\n}\r\n\r\n/**\r\n * resize ArrayBuffer\r\n *\r\n * 调整 ArrayBuffer 大小\r\n *\r\n * @param {ArrayBuffer} buffer\r\n * @param {number} size - byte\r\n */\r\nexport function resizeBuffer(buffer: Uint8Array, size: number) {\r\n  const b = new U8(size);\r\n  b.set(buffer);\r\n  return b;\r\n}\r\n\r\nconst nibble_reverse_map = [\r\n  0x0n,\r\n  0x8n,\r\n  0x4n,\r\n  0xcn,\r\n  0x2n,\r\n  0xan,\r\n  0x6n,\r\n  0xen,\r\n  0x1n,\r\n  0x9n,\r\n  0x5n,\r\n  0xdn,\r\n  0x3n,\r\n  0xbn,\r\n  0x7n,\r\n  0xfn,\r\n];\r\n\r\n/**\r\n * 快速翻转字节位序 / Fast Reverse Byte's Bit Order\r\n *\r\n * @param {number} byte - 字节 / byte\r\n */\r\nexport function reverseBit(byte: number) {\r\n  byte &= 0xff;\r\n  const b_h = nibble_reverse_map[byte >> 4];\r\n  const b_l = nibble_reverse_map[byte & 0xf];\r\n  return (b_l << 4n) | b_h;\r\n}\r\n\r\nexport class Counter extends U8 {\r\n  /**\r\n   * @param {number} offset - 计数器偏移 / counter offset\r\n   * @param {number} length - 计数器长度 / counter length\r\n   */\r\n  inc(offset?: number, length?: number, little_endian = false) {\r\n    // 如果不提供偏移，则默认计数器从 0 开始\r\n    offset = offset || 0;\r\n    if (offset < 0 || offset >= this.length) {\r\n      throw new KitError('Invalid counter offset');\r\n    }\r\n    // 如果不提供长度，则默认计数器长度为剩余长度\r\n    length = length || this.length - offset;\r\n    if (length < 0 || offset + length > this.length) {\r\n      throw new KitError('Invalid counter length');\r\n    }\r\n    if (little_endian) {\r\n      for (let i = offset; i < offset + length; i++) {\r\n        if (this[i] < 0xff) {\r\n          this[i] += 1;\r\n          break;\r\n        }\r\n        this[i] = 0;\r\n      }\r\n    } else {\r\n      for (let i = offset + length - 1; i >= offset; i--) {\r\n        if (this[i] < 0xff) {\r\n          this[i] += 1;\r\n          break;\r\n        }\r\n        this[i] = 0;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n// * Other Utility Functions\r\n\r\nexport function trying<T>(fn: () => T): [Error, null] | [null, T] {\r\n  try {\r\n    const result = fn();\r\n    return [null, result];\r\n  } catch (error) {\r\n    return error instanceof Error ? [error, null] : [new KitError('Unknown error'), null];\r\n  }\r\n}\r\n\r\nexport function wrap<T = any>(...args: any[]): T {\r\n  // @ts-expect-error Object assign\r\n  return Object.assign(...args);\r\n}\r\n\r\nexport class KitError extends Error {\r\n  constructor(message: string) {\r\n    super(message);\r\n    this.name = 'mima-kit Error';\r\n  }\r\n}\r\n","import { modPow, U8 } from './utils';\r\n\r\n// * Interfaces\r\n\r\n/** 随机素数生成器 / Random Prime Generator */\r\nexport interface RandomPrimeGenerator {\r\n  /**\r\n   * @param {bigint} b - 位数 / Bits\r\n   */\r\n  (b: number): bigint;\r\n}\r\n\r\n// * Constants\r\n\r\n/** deterministic >= 1 - 0.5^t */\r\nconst T = 40;\r\nconst LOW_PRIMES = [\r\n  2n,\r\n  3n,\r\n  5n,\r\n  7n,\r\n  11n,\r\n  13n,\r\n  17n,\r\n  19n,\r\n  23n,\r\n  29n,\r\n  31n,\r\n  37n,\r\n  41n,\r\n  43n,\r\n  47n,\r\n  53n,\r\n  59n,\r\n  61n,\r\n  67n,\r\n  71n,\r\n  73n,\r\n  79n,\r\n  83n,\r\n  89n,\r\n  97n,\r\n  101n,\r\n  103n,\r\n  107n,\r\n  109n,\r\n  113n,\r\n  127n,\r\n  131n,\r\n  137n,\r\n  139n,\r\n  149n,\r\n  151n,\r\n  157n,\r\n  163n,\r\n  167n,\r\n  173n,\r\n  179n,\r\n  181n,\r\n  191n,\r\n  193n,\r\n  197n,\r\n  199n,\r\n  211n,\r\n  223n,\r\n  227n,\r\n  229n,\r\n  233n,\r\n  239n,\r\n  241n,\r\n  251n,\r\n  257n,\r\n  263n,\r\n  269n,\r\n  271n,\r\n  277n,\r\n  281n,\r\n  283n,\r\n  293n,\r\n  307n,\r\n  311n,\r\n  313n,\r\n  317n,\r\n  331n,\r\n  337n,\r\n  347n,\r\n  349n,\r\n  353n,\r\n  359n,\r\n  367n,\r\n  373n,\r\n  379n,\r\n  383n,\r\n  389n,\r\n  397n,\r\n  401n,\r\n  409n,\r\n  419n,\r\n  421n,\r\n  431n,\r\n  433n,\r\n  439n,\r\n  443n,\r\n  449n,\r\n  457n,\r\n  461n,\r\n  463n,\r\n  467n,\r\n  479n,\r\n  487n,\r\n  491n,\r\n  499n,\r\n  503n,\r\n  509n,\r\n  521n,\r\n  523n,\r\n  541n,\r\n  547n,\r\n  557n,\r\n  563n,\r\n  569n,\r\n  571n,\r\n  577n,\r\n  587n,\r\n  593n,\r\n  599n,\r\n  601n,\r\n  607n,\r\n  613n,\r\n  617n,\r\n  619n,\r\n  631n,\r\n  641n,\r\n  643n,\r\n  647n,\r\n  653n,\r\n  659n,\r\n  661n,\r\n  673n,\r\n  677n,\r\n  683n,\r\n  691n,\r\n  701n,\r\n  709n,\r\n  719n,\r\n  727n,\r\n  733n,\r\n  739n,\r\n  743n,\r\n  751n,\r\n  757n,\r\n  761n,\r\n  769n,\r\n  773n,\r\n  787n,\r\n  797n,\r\n  809n,\r\n  811n,\r\n  821n,\r\n  823n,\r\n  827n,\r\n  829n,\r\n  839n,\r\n  853n,\r\n  857n,\r\n  859n,\r\n  863n,\r\n  877n,\r\n  881n,\r\n  883n,\r\n  887n,\r\n  907n,\r\n  911n,\r\n  919n,\r\n  929n,\r\n  937n,\r\n  941n,\r\n  947n,\r\n  953n,\r\n  967n,\r\n  971n,\r\n  977n,\r\n  983n,\r\n  991n,\r\n  997n,\r\n];\r\nconst LOW_PRIMES_LIMIT = (1n << 26n) / LOW_PRIMES[LOW_PRIMES.length - 1];\r\n\r\n// * Functions\r\n\r\n/**\r\n * Miller-Rabin 素性测试 / Primality Test\r\n *\r\n * @param {bigint} n - 待测试的数 / Number to be tested\r\n * @param {number} t - 测试轮数 / Number of tests\r\n */\r\nfunction MillerRabin(n: bigint, t: number): boolean {\r\n  const n_1 = n - 1n;\r\n  let s = 0n;\r\n  let d = n_1;\r\n  while ((d & 1n) === 0n) {\r\n    d >>= 1n;\r\n    s++;\r\n  }\r\n\r\n  t = (t + 1) >> 1;\r\n  if (t > LOW_PRIMES.length) t = LOW_PRIMES.length;\r\n\r\n  const tested: bigint[] = [2n];\r\n  for (let i = 0; i < t; ++i) {\r\n    // Pick bases at random\r\n    let base: bigint;\r\n    do {\r\n      base = LOW_PRIMES[Math.floor(Math.random() * LOW_PRIMES.length)];\r\n    } while (tested.includes(base));\r\n    tested.push(base);\r\n    if (StrongPseudoPrime(n, n_1, s, d, base) === false) {\r\n      return false;\r\n    }\r\n  }\r\n  return true;\r\n}\r\n\r\n/**\r\n * 根据费马小定理: `base^(n-1) ≡ 1 (mod n)` 时 `n` 可能是素数,\r\n * 通过将 `n-1` 分解为 `2^s * d` 优化计算\r\n *\r\n * According to Fermat's Little Theorem: `base^(n-1) ≡ 1 (mod n)` when `n` may be a prime,\r\n * optimize the calculation by decomposing `n-1` into `2^s * d`\r\n *\r\n * @param {bigint} n - 待测试的数 / Number to be tested\r\n * @param {bigint} n_1 - n - 1\r\n * @param {bigint} s - n - 1 = 2^s * d\r\n * @param {bigint} d - n - 1 = 2^s * d\r\n * @param {bigint} base - 测试基数 / Test base\r\n */\r\nfunction StrongPseudoPrime(n: bigint, n_1: bigint, s: bigint, d: bigint, base: bigint): boolean {\r\n  let x = modPow(base, d, n);\r\n  if (x === 1n || x === n_1) return true;\r\n\r\n  let y = 0n;\r\n  for (let i = 1; i < s; i++) {\r\n    y = modPow(x, 2n, n);\r\n    if (y === 1n && x !== 1n && x !== n_1) return false;\r\n    x = y;\r\n  }\r\n  return y === 1n;\r\n}\r\n\r\n/**\r\n * 高级素性测试: 确定性 >= 1-.5^t\r\n *\r\n * Advanced primality test: deterministic >= 1-.5^t\r\n */\r\nfunction _isProbablePrime(n: bigint, t: number = T): boolean {\r\n  // 低素数倍数\r\n  for (let i = 1; i < LOW_PRIMES.length; ) {\r\n    let m = LOW_PRIMES[i];\r\n    let j = i + 1;\r\n    while (j < LOW_PRIMES.length && m < LOW_PRIMES_LIMIT) {\r\n      m *= LOW_PRIMES[j++];\r\n    }\r\n    m = n % m;\r\n    while (i < j) {\r\n      if (m % LOW_PRIMES[i++] === 0n) return false;\r\n    }\r\n  }\r\n\r\n  return MillerRabin(n, t);\r\n}\r\n\r\nfunction genPrimeCandidate(buffer: U8) {\r\n  crypto.getRandomValues(buffer);\r\n  buffer[0] |= 0x80;\r\n  let n = buffer.toBI() | 1n;\r\n  const n_mod_6 = n % 6n;\r\n  if (n_mod_6 !== 1n && n_mod_6 !== 5n) n += 4n;\r\n\r\n  return n;\r\n}\r\n\r\n/**\r\n * 随机素数生成器 / Random Prime Generator\r\n *\r\n * @param {bigint} b - 位数 / Bits\r\n */\r\nexport const genPrime: RandomPrimeGenerator = (b: number): bigint => {\r\n  const buffer = new U8(b >> 3);\r\n  let n: bigint;\r\n  do {\r\n    n = genPrimeCandidate(buffer);\r\n  } while (!_isProbablePrime(n));\r\n  return n;\r\n};\r\n\r\n/**\r\n * 素性测试: 确定性 >= 1-.5^t\r\n *\r\n * Primality test: deterministic >= 1-.5^t\r\n *\r\n * @param {bigint} n - 待测试的数 / Number to be tested\r\n * @param {number} t - 测试轮数 / Number of tests\r\n */\r\nexport function isProbablePrime(n: bigint, t: number = T): boolean {\r\n  if (t <= 0) return false;\r\n  // 偶数\r\n  if ((n & 1n) === 0n) return false;\r\n  // 六倍原理\r\n  const n_mod_6 = n % 6n;\r\n  if (n_mod_6 !== 1n && n_mod_6 !== 5n) return false;\r\n  // 小素数\r\n  if (n <= LOW_PRIMES[LOW_PRIMES.length - 1]) return LOW_PRIMES.includes(n);\r\n\r\n  return _isProbablePrime(n, t);\r\n}\r\n","import { KitError, trying, U8, u8, wrap } from './utils';\r\n\r\n/** 字符编解码器 / String Codec */\r\nexport interface Codec {\r\n  /**\r\n   * 将编码字符串解析为 Uint8Array\r\n   *\r\n   * Parse encoded string to Uint8Array\r\n   */\r\n  (input: string): U8;\r\n  /**\r\n   * 将 Uint8Array 编码为字符串\r\n   *\r\n   * Stringify Uint8Array to encoded string\r\n   */\r\n  (input: Uint8Array): string;\r\n  FORMAT: string;\r\n}\r\nfunction createCodec(\r\n  parse: (input: string) => U8,\r\n  stringify: (input: Uint8Array) => string,\r\n  format: string,\r\n): Codec {\r\n  function codec(input: string): U8;\r\n  function codec(input: Uint8Array): string;\r\n  function codec(input: string | Uint8Array) {\r\n    return typeof input === 'string' ? parse(input) : stringify(input);\r\n  }\r\n  return wrap(codec, { FORMAT: format });\r\n}\r\n\r\nfunction UTF8ToU8(input: string) {\r\n  /**\r\n   * 尝试使用 TextEncoder 编码\r\n   * 否则使用自定义编码器\r\n   */\r\n  const [error, result] = trying(() => new TextEncoder().encode(input));\r\n  if (!error) return u8(result);\r\n\r\n  /** provided by xingluo233 */\r\n  const buffer: number[] = [];\r\n  for (let i = 0; i < input.length; i++) {\r\n    const char_code = input.codePointAt(i);\r\n    if (char_code === undefined) {\r\n    } else if (char_code < 0x80) {\r\n      buffer.push(char_code);\r\n    } else if (char_code < 0x800) {\r\n      buffer.push(0xc0 | (char_code >> 6));\r\n      buffer.push(0x80 | (char_code & 0x3f));\r\n    } else if (char_code < 0x10000) {\r\n      buffer.push(0xe0 | (char_code >> 12));\r\n      buffer.push(0x80 | ((char_code >> 6) & 0x3f));\r\n      buffer.push(0x80 | (char_code & 0x3f));\r\n    } else if (char_code < 0x110000) {\r\n      buffer.push(0xf0 | (char_code >> 18));\r\n      buffer.push(0x80 | ((char_code >> 12) & 0x3f));\r\n      buffer.push(0x80 | ((char_code >> 6) & 0x3f));\r\n      buffer.push(0x80 | (char_code & 0x3f));\r\n      i++;\r\n    }\r\n  }\r\n  return U8.from(buffer);\r\n}\r\nfunction U8ToUTF8(input: Uint8Array) {\r\n  /**\r\n   * 尝试使用 TextDecoder 解码\r\n   * 否则使用自定义解码器\r\n   */\r\n  const [error, result] = trying(() => new TextDecoder().decode(input));\r\n  if (!error) return result;\r\n\r\n  /** provided by xingluo233 */\r\n  const str = [];\r\n  for (let i = 0; i < input.length; ) {\r\n    const byte1 = input[i++];\r\n    if (byte1 < 0x80) {\r\n      str.push(String.fromCharCode(byte1));\r\n    } else if (byte1 >= 0xc0 && byte1 < 0xe0) {\r\n      const byte2 = input[i++];\r\n      const char_code = ((byte1 & 0x1f) << 6) | (byte2 & 0x3f);\r\n      str.push(String.fromCharCode(char_code));\r\n    } else if (byte1 >= 0xe0 && byte1 < 0xf0) {\r\n      const byte2 = input[i++];\r\n      const byte3 = input[i++];\r\n      const char_code = ((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f);\r\n      str.push(String.fromCharCode(char_code));\r\n    } else if (byte1 >= 0xf0 && byte1 < 0xf8) {\r\n      const byte2 = input[i++];\r\n      const byte3 = input[i++];\r\n      const byte4 = input[i++];\r\n      const char_code =\r\n        ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\r\n      str.push(String.fromCodePoint(char_code));\r\n    } else {\r\n      console.warn('Included an invalid UTF-8 byte');\r\n    }\r\n  }\r\n  return str.join('');\r\n}\r\n/** UTF-8 编解码器 / Codec */\r\nexport const UTF8 = createCodec(UTF8ToU8, U8ToUTF8, 'utf-8');\r\n\r\nfunction HEXToU8(input: string) {\r\n  input = input.replace(/^0x/, '');\r\n  // eslint-disable-next-line node/prefer-global/buffer\r\n  const [error, result] = trying(() => Buffer.from(input.replace(/[^0-9a-f]/gi, ''), 'hex'));\r\n  if (!error) return u8(result);\r\n\r\n  const arr = input.match(/[\\da-f]{2}/gi);\r\n  if (arr == null) {\r\n    return new U8();\r\n  }\r\n  return new U8(arr.map((h) => Number.parseInt(h, 16)));\r\n}\r\nfunction U8ToHEX(input: Uint8Array) {\r\n  // eslint-disable-next-line node/prefer-global/buffer\r\n  const [error, result] = trying(() => Buffer.from(input).toString('hex'));\r\n  if (!error) return result;\r\n\r\n  let str = '';\r\n  for (let i = 0; i < input.length; i++) {\r\n    str += input[i].toString(16).padStart(2, '0');\r\n  }\r\n  return str;\r\n}\r\n/** hex 编解码器 / Codec */\r\nexport const HEX = createCodec(HEXToU8, U8ToHEX, 'hex');\r\n\r\nfunction B64ToU8(input: string) {\r\n  // eslint-disable-next-line node/prefer-global/buffer\r\n  const [error, result] = trying(() => Buffer.from(input.replace(/[^A-Z0-9+/]/gi, ''), 'base64'));\r\n  if (!error) return u8(result);\r\n\r\n  return B64CommonParse(input);\r\n}\r\nfunction U8ToB64(input: Uint8Array) {\r\n  // eslint-disable-next-line node/prefer-global/buffer\r\n  const [error, result] = trying(() => Buffer.from(input).toString('base64'));\r\n  if (!error) return result;\r\n\r\n  return B64CommonStringify(input, false);\r\n}\r\n/** base64 编解码器 / Codec */\r\nexport const B64 = createCodec(B64ToU8, U8ToB64, 'base64');\r\n\r\nfunction B64URLToU8(input: string) {\r\n  // eslint-disable-next-line node/prefer-global/buffer\r\n  const [error, result] = trying(() => Buffer.from(input.replace(/[^\\w-]/g, ''), 'base64url'));\r\n  if (!error) return u8(result);\r\n\r\n  return B64CommonParse(input);\r\n}\r\nfunction U8ToB64URL(input: Uint8Array) {\r\n  // eslint-disable-next-line node/prefer-global/buffer\r\n  const [error, result] = trying(() => Buffer.from(input).toString('base64url'));\r\n  if (!error) return result;\r\n\r\n  return B64(input).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\r\n}\r\n/** base64url 编解码器 / Codec */\r\nexport const B64URL = createCodec(B64URLToU8, U8ToB64URL, 'base64url');\r\n\r\n/**\r\n * provided by xingluo233\r\n *\r\n * B64CommonParse can parse B64 or B64url string to Uint8Array\r\n *\r\n * B64CommonParse 可以将 B64 或者 B64url 字符串解析为 Uint8Array\r\n *\r\n * @param {string} input - B64 或 B64url 字符串\r\n */\r\nfunction B64CommonParse(input: string) {\r\n  const map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n  input = input\r\n    .replace(/-/g, '+')\r\n    .replace(/_/g, '/')\r\n    .replace(/[^A-Z0-9+/]/gi, '');\r\n  const length = input.length * 0.75;\r\n  const result = new U8(length);\r\n\r\n  let i = 0;\r\n  let j = 0;\r\n  while (i < input.length) {\r\n    const a = map.indexOf(input.charAt(i++));\r\n    const b = map.indexOf(input.charAt(i++));\r\n    const c = map.indexOf(input.charAt(i++));\r\n    const d = map.indexOf(input.charAt(i++));\r\n\r\n    const combined = (a << 18) | (b << 12) | (c << 6) | d;\r\n\r\n    result[j++] = (combined >> 16) & 0xff;\r\n    result[j++] = (combined >> 8) & 0xff;\r\n    result[j++] = combined & 0xff;\r\n  }\r\n  return result;\r\n}\r\n\r\n/**\r\n * B64CommonStringify can stringify Uint8Array to B64 or B64url string\r\n *\r\n * B64CommonStringify 可以将 Uint8Array 编码为 B64 或 B64url 字符串\r\n *\r\n * @param {Uint8Array} input - Uint8Array\r\n * @param {boolean} url - 是否是 B64url 字符串\r\n */\r\nfunction B64CommonStringify(input: Uint8Array, url: boolean) {\r\n  let map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n  map += url ? '-_' : '+/';\r\n  let result = '';\r\n  let i: number;\r\n  for (i = 0; i < input.length - 2; i += 3) {\r\n    result += map[input[i] >> 2];\r\n    result += map[((input[i] & 3) << 4) | (input[i + 1] >> 4)];\r\n    result += map[((input[i + 1] & 15) << 2) | (input[i + 2] >> 6)];\r\n    result += map[input[i + 2] & 63];\r\n  }\r\n\r\n  if (i === input.length - 2) {\r\n    result += map[input[i] >> 2];\r\n    result += map[((input[i] & 3) << 4) | (input[i + 1] >> 4)];\r\n    result += map[(input[i + 1] & 15) << 2];\r\n    result += url ? '' : '=';\r\n  } else if (i === input.length - 1) {\r\n    result += map[input[i] >> 2];\r\n    result += map[(input[i] & 3) << 4];\r\n    result += url ? '' : '==';\r\n  }\r\n  return result;\r\n}\r\n\r\ninterface B32Params {\r\n  variant?: 'rfc4648' | 'rfc4648-hex' | 'crockford';\r\n  padding?: boolean;\r\n}\r\ninterface B32Codec extends Codec {\r\n  /**\r\n   * 创建一个 base32 编解码器\r\n   *\r\n   * Create a base32 codec\r\n   */\r\n  (params: B32Params): Codec;\r\n}\r\n\r\nfunction TheB32Codec(input: string): U8;\r\nfunction TheB32Codec(input: Uint8Array): string;\r\nfunction TheB32Codec(params: B32Params): Codec;\r\nfunction TheB32Codec(args: string | Uint8Array | B32Params) {\r\n  // 使用默认配置处理 B32 编解码\r\n\r\n  const RFC4648_B32_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\r\n  if (typeof args === 'string') {\r\n    const input = args.toUpperCase().replace(/[^A-Z2-7]/g, '');\r\n    return B32CommonParse(input, RFC4648_B32_MAP);\r\n  } else if (args instanceof Uint8Array) {\r\n    return B32CommonStringify(args, RFC4648_B32_MAP, false);\r\n  }\r\n\r\n  // 创建 B32 变体\r\n\r\n  const { variant = 'rfc4648', padding = false } = args;\r\n  if (variant === 'rfc4648') {\r\n    function B32ToU8(input: string) {\r\n      input = input.toUpperCase().replace(/[^A-Z2-7]/g, '');\r\n      return B32CommonParse(input, RFC4648_B32_MAP);\r\n    }\r\n    function U8ToB32(input: Uint8Array) {\r\n      return B32CommonStringify(input, RFC4648_B32_MAP, padding);\r\n    }\r\n    return createCodec(B32ToU8, U8ToB32, 'base32');\r\n  } else if (variant === 'rfc4648-hex') {\r\n    const RFC4648_B32_HEX_MAP = '0123456789ABCDEFGHIJKLMNOPQRSTUV';\r\n    function B32HexToU8(input: string) {\r\n      input = input.toUpperCase().replace(/[^0-9A-V]/g, '');\r\n      return B32CommonParse(input, RFC4648_B32_HEX_MAP);\r\n    }\r\n    function U8ToB32Hex(input: Uint8Array) {\r\n      return B32CommonStringify(input, RFC4648_B32_HEX_MAP, padding);\r\n    }\r\n    return createCodec(B32HexToU8, U8ToB32Hex, 'base32-hex');\r\n  } else if (variant === 'crockford') {\r\n    const RFC4648_B32_CROCKFORD_MAP = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\r\n    function B32CrockfordToU8(input: string) {\r\n      input = input\r\n        .toUpperCase()\r\n        .replace(/O/g, '0')\r\n        .replace(/[IL]/g, '1')\r\n        .replace(/[^0-9A-HJKMNP-TV-Z]/g, '');\r\n      return B32CommonParse(input, RFC4648_B32_CROCKFORD_MAP);\r\n    }\r\n    function U8ToB32Crockford(input: Uint8Array) {\r\n      return B32CommonStringify(input, RFC4648_B32_CROCKFORD_MAP, padding);\r\n    }\r\n    return createCodec(B32CrockfordToU8, U8ToB32Crockford, 'base32-crockford');\r\n  }\r\n}\r\n/** base32 编解码器 / Codec */\r\nexport const B32: B32Codec = wrap(TheB32Codec, { FORMAT: 'base32' });\r\n\r\n/**\r\n * B32CommonParse can parse B32 string to Uint8Array\r\n *\r\n * B32CommonParse 可以将 B32 字符串解析为 Uint8Array\r\n *\r\n * @param {string} input - B32 或 B32url 字符串\r\n * @param {string} map - 字符表\r\n */\r\nfunction B32CommonParse(input: string, map: string) {\r\n  const length = input.length * 0.625;\r\n  const result = new U8(length);\r\n\r\n  let i = 0;\r\n  let j = 0;\r\n  while (i < input.length) {\r\n    const a = map.indexOf(input.charAt(i++));\r\n    const b = map.indexOf(input.charAt(i++));\r\n    const c = map.indexOf(input.charAt(i++));\r\n    const d = map.indexOf(input.charAt(i++));\r\n    const e = map.indexOf(input.charAt(i++));\r\n    const f = map.indexOf(input.charAt(i++));\r\n    const g = map.indexOf(input.charAt(i++));\r\n    const h = map.indexOf(input.charAt(i++));\r\n\r\n    result[j++] = (a << 3) | (b >> 2);\r\n    result[j++] = ((b & 0b11) << 6) | (c << 1) | (d >> 4);\r\n    result[j++] = ((d & 0b1111) << 4) | (e >> 1);\r\n    result[j++] = ((e & 0b1) << 7) | (f << 2) | (g >> 3);\r\n    result[j++] = ((g & 0b111) << 5) | h;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * B32CommonStringify can stringify Uint8Array to B32 string\r\n *\r\n * B32CommonStringify 可以将 Uint8Array 编码为 B32 字符串\r\n *\r\n * @param {Uint8Array} input - Uint8Array\r\n * @param {string} map - 字符表\r\n * @param {boolean} pad - 是否填充\r\n */\r\nfunction B32CommonStringify(input: Uint8Array, map: string, pad: boolean) {\r\n  let result = '';\r\n  let i: number;\r\n  for (i = 0; i < input.length - 4; i += 5) {\r\n    const E0 = input[i];\r\n    const E1 = input[i + 1];\r\n    const E2 = input[i + 2];\r\n    const E3 = input[i + 3];\r\n    const E4 = input[i + 4];\r\n\r\n    result += map[E0 >> 3];\r\n    result += map[((E0 & 0b111) << 2) | (E1 >> 6)];\r\n    result += map[(E1 >> 1) & 0b11111];\r\n    result += map[((E1 & 0b1) << 4) | (E2 >> 4)];\r\n    result += map[((E2 & 0b1111) << 1) | (E3 >> 7)];\r\n    result += map[(E3 >> 2) & 0b11111];\r\n    result += map[((E3 & 0b11) << 3) | (E4 >> 5)];\r\n    result += map[E4 & 0b11111];\r\n  }\r\n\r\n  if (i === input.length - 4) {\r\n    const E0 = input[i];\r\n    const E1 = input[i + 1];\r\n    const E2 = input[i + 2];\r\n    const E3 = input[i + 3];\r\n\r\n    result += map[E0 >> 3];\r\n    result += map[((E0 & 0b111) << 2) | (E1 >> 6)];\r\n    result += map[(E1 >> 1) & 0b11111];\r\n    result += map[((E1 & 0b1) << 4) | (E2 >> 4)];\r\n    result += map[((E2 & 0b1111) << 1) | (E3 >> 7)];\r\n    result += map[(E3 >> 2) & 0b11111];\r\n    result += map[(E3 & 0b11) << 3];\r\n    result += pad ? '=' : '';\r\n  } else if (i === input.length - 3) {\r\n    const E0 = input[i];\r\n    const E1 = input[i + 1];\r\n    const E2 = input[i + 2];\r\n\r\n    result += map[E0 >> 3];\r\n    result += map[((E0 & 0b111) << 2) | (E1 >> 6)];\r\n    result += map[(E1 >> 1) & 0b11111];\r\n    result += map[((E1 & 0b1) << 4) | (E2 >> 4)];\r\n    result += map[(E2 & 0b1111) << 1];\r\n    result += pad ? '===' : '';\r\n  } else if (i === input.length - 2) {\r\n    const E0 = input[i];\r\n    const E1 = input[i + 1];\r\n\r\n    result += map[E0 >> 3];\r\n    result += map[((E0 & 0b111) << 2) | (E1 >> 6)];\r\n    result += map[(E1 >> 1) & 0b11111];\r\n    result += map[(E1 & 0b1) << 4];\r\n    result += pad ? '====' : '';\r\n  } else if (i === input.length - 1) {\r\n    const E0 = input[i];\r\n\r\n    result += map[E0 >> 3];\r\n    result += map[(E0 & 0b111) << 2];\r\n    result += pad ? '======' : '';\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction CSVToU8(input: string) {\r\n  const coreValueMap = new Map<string, number>();\r\n  coreValueMap.set('富强', 0);\r\n  coreValueMap.set('民主', 1);\r\n  coreValueMap.set('文明', 2);\r\n  coreValueMap.set('和谐', 3);\r\n  coreValueMap.set('自由', 4);\r\n  coreValueMap.set('平等', 5);\r\n  coreValueMap.set('公正', 6);\r\n  coreValueMap.set('法治', 7);\r\n  coreValueMap.set('爱国', 8);\r\n  coreValueMap.set('敬业', 9);\r\n  coreValueMap.set('诚信', 10);\r\n  coreValueMap.set('友善', 11);\r\n\r\n  const from = (value: string) => {\r\n    const nibble = coreValueMap.get(value);\r\n    if (nibble === undefined) {\r\n      throw new KitError('你竟然在社会主义核心价值观里夹带私货！');\r\n    }\r\n    return nibble;\r\n  };\r\n\r\n  const coreValues = input.match(/(\\S){2}/g);\r\n  if (coreValues == null) return new U8();\r\n\r\n  let h = 0;\r\n  let l = 0;\r\n  let count = 0;\r\n  const result: number[] = [];\r\n  for (let i = 0; i < coreValues.length; i++) {\r\n    const isHigh = count % 2 === 0;\r\n\r\n    let nibble = from(coreValues[i]);\r\n    if (nibble === 10 || nibble === 11) {\r\n      i++;\r\n      if (i === coreValues.length) {\r\n        throw new KitError('你的社会主义核心价值观破碎了！');\r\n      }\r\n      nibble = nibble === 10 ? 10 + from(coreValues[i]) : 6 + from(coreValues[i]);\r\n    }\r\n    if (isHigh) {\r\n      h = nibble;\r\n    } else {\r\n      l = nibble;\r\n    }\r\n\r\n    if (!isHigh) {\r\n      result.push(((h << 4) | l) & 0xff);\r\n    }\r\n    count++;\r\n  }\r\n\r\n  return new U8(result);\r\n}\r\nfunction U8ToCSV(input: Uint8Array) {\r\n  const rand = () => Math.random() >= 0.5;\r\n  const map = [\r\n    '富强',\r\n    '民主',\r\n    '文明',\r\n    '和谐',\r\n    '自由',\r\n    '平等',\r\n    '公正',\r\n    '法治',\r\n    '爱国',\r\n    '敬业',\r\n    '诚信',\r\n    '友善',\r\n  ];\r\n\r\n  let result = '';\r\n  input.forEach((byte) => {\r\n    const h = (byte >> 4) & 0xf;\r\n    const l = byte & 0xf;\r\n    if (h < 10) {\r\n      result += map[h];\r\n    } else if (rand()) {\r\n      result += map[11] + map[h - 6];\r\n    } else {\r\n      result += map[11] + map[h - 6];\r\n    }\r\n\r\n    if (l < 10) {\r\n      result += map[l];\r\n    } else if (rand()) {\r\n      result += map[10] + map[l - 10];\r\n    } else {\r\n      result += map[11] + map[l - 6];\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n/** 社会主义核心价值观编解码器 / Core Socialist Values Codec */\r\nexport const CSV = createCodec(CSVToU8, U8ToCSV, 'core-socialist-values');\r\n","import type { U8 } from './utils';\r\nimport { wrap } from './utils';\r\n\r\n// * 散列函数包装器\r\n\r\nexport interface Digest {\r\n  /**\r\n   * @param {Uint8Array} M - 消息 / message\r\n   */\r\n  (M: Uint8Array): U8;\r\n}\r\nexport interface HashDescription {\r\n  /** 算法名称 / Algorithm name */\r\n  ALGORITHM: string;\r\n  /** 分块大小 / Block size (byte) */\r\n  BLOCK_SIZE: number;\r\n  /** 摘要大小 / Digest size (byte) */\r\n  DIGEST_SIZE: number;\r\n  OID?: string;\r\n}\r\nexport interface Hash extends Digest, HashDescription {}\r\n/**\r\n * 散列算法包装器,\r\n * 提供散列算法描述, 以实现 `HMAC` 等拓展算法.\r\n *\r\n * Hash algorithm wrapper,\r\n * provide hash algorithm description to implement extended algorithms such as `HMAC`.\r\n *\r\n * @param {Digest} digest - 摘要函数 / digest function\r\n * @param {HashDescription} description - 算法描述 / algorithm description\r\n *\r\n * ```ts\r\n * const digest: Digest = (M: Uint8Array): U8 => { ... }\r\n * const description: HashDescription = { ... }\r\n * const hash = createHash(digest, description)\r\n * ```\r\n */\r\nexport const createHash = (digest: Digest, description: HashDescription): Hash => wrap(digest, description);\r\n\r\n// * 元组散列函数包装器\r\n\r\nexport interface TupleDigest {\r\n  /**\r\n   * @param {Uint8Array[]} M - 消息 / message\r\n   */\r\n  (M: Uint8Array[]): U8;\r\n}\r\nexport interface TupleHashDescription extends HashDescription {}\r\nexport interface TupleHash extends TupleDigest, TupleHashDescription {}\r\n/**\r\n * 元组散列算法包装器\r\n *\r\n * Tuple hash algorithm wrapper\r\n *\r\n * @param {TupleDigest} digest - 元组摘要函数 / tuple digest function\r\n * @param {TupleHashDescription} description - 算法描述 / algorithm description\r\n *\r\n * ```ts\r\n * const digest: TupleDigest = (M: Uint8Array[]): U8 => { ... }\r\n * const description: TupleHashDescription = { ... }\r\n * const hash = createTupleHash(digest, description)\r\n * ```\r\n */\r\nexport const createTupleHash = (digest: TupleDigest, description: TupleHashDescription): TupleHash =>\r\n  wrap(digest, description);\r\n\r\n// * 密钥散列函数\r\n\r\nexport interface KeyDigest {\r\n  /**\r\n   * @param {Uint8Array} K - 密钥 / key\r\n   * @param {Uint8Array} M - 消息 / message\r\n   */\r\n  (K: Uint8Array, M: Uint8Array): U8;\r\n}\r\nexport interface KeyHashDescription extends HashDescription {\r\n  /** 推荐的密钥大小 / Recommended key size (byte) */\r\n  KEY_SIZE: number;\r\n}\r\n/** 密钥散列函数 / Keyed hash function */\r\nexport interface KeyHash extends KeyDigest, KeyHashDescription {}\r\nexport const createKeyHash = (digest: KeyDigest, description: KeyHashDescription): KeyHash => wrap(digest, description);\r\n","import { createHash } from '../core/hash';\r\nimport { rotateL32, U8 } from '../core/utils';\r\n\r\n// * Function\r\n\r\nconst FF = (X: number, Y: number, Z: number, j: number) =>\r\n  j < 16 ? X ^ Y ^ Z : (X & Y) | (X & Z) | (Y & Z);\r\nconst GG = (X: number, Y: number, Z: number, j: number) =>\r\n  j < 16 ? X ^ Y ^ Z : (X & Y) | (~X & Z);\r\nconst P0 = (X: number) => X ^ rotateL32(X, 9) ^ rotateL32(X, 17);\r\nconst P1 = (X: number) => X ^ rotateL32(X, 15) ^ rotateL32(X, 23);\r\n\r\n// * Algorithm\r\n\r\nfunction digest(message: Uint8Array) {\r\n  // * 初始化\r\n  const state = new U8(32);\r\n  const state_view = state.view(4);\r\n  state_view.set(0, 0x7380166fn);\r\n  state_view.set(1, 0x4914b2b9n);\r\n  state_view.set(2, 0x172442d7n);\r\n  state_view.set(3, 0xda8a0600n);\r\n  state_view.set(4, 0xa96f30bcn);\r\n  state_view.set(5, 0x163138aan);\r\n  state_view.set(6, 0xe38dee4dn);\r\n  state_view.set(7, 0xb0fb0e4en);\r\n\r\n  const m_byte = message.length;\r\n  const m_bit = BigInt(m_byte) << 3n;\r\n  const block_size = 64;\r\n  // ceil((M_BYTE + 9) / 64)\r\n  const block_total = (m_byte + 9 + 63) >> 6;\r\n\r\n  // * 填充\r\n  const p = new U8(block_total * block_size);\r\n  p.set(message);\r\n\r\n  // appending the bit '1' to the message\r\n  p[m_byte] = 0x80;\r\n\r\n  // appending length\r\n  const p_view = new DataView(p.buffer, p.byteOffset, p.byteLength);\r\n  p_view.setBigUint64(p.length - 8, m_bit, false);\r\n\r\n  // * 迭代压缩\r\n  for (let offset = 0; offset < p.length; offset += block_size) {\r\n    /** B(n) = p[offset:offset + block_size] */\r\n\r\n    // 准备状态字\r\n    const H0 = Number(state_view.get(0));\r\n    const H1 = Number(state_view.get(1));\r\n    const H2 = Number(state_view.get(2));\r\n    const H3 = Number(state_view.get(3));\r\n    const H4 = Number(state_view.get(4));\r\n    const H5 = Number(state_view.get(5));\r\n    const H6 = Number(state_view.get(6));\r\n    const H7 = Number(state_view.get(7));\r\n    let A = H0;\r\n    let B = H1;\r\n    let C = H2;\r\n    let D = H3;\r\n    let E = H4;\r\n    let F = H5;\r\n    let G = H6;\r\n    let H = H7;\r\n\r\n    // 合并执行 扩展 & 压缩\r\n    const W = new Uint32Array(68);\r\n    const W1 = new Uint32Array(64);\r\n    for (let i = 0; i < 68; i++) {\r\n      // 拓展 W\r\n      if (i < 16) {\r\n        // W[i] = B(n)[i]\r\n        W[i] = p_view.getUint32(offset + (i << 2), false);\r\n      } else {\r\n        W[i] =\r\n          P1(W[i - 16] ^ W[i - 9] ^ rotateL32(W[i - 3], 15)) ^ rotateL32(W[i - 13], 7) ^ W[i - 6];\r\n      }\r\n\r\n      // W1 拓展 & 压缩\r\n      if (i > 3) {\r\n        // W1 拓展\r\n        const j = i - 4;\r\n        // W1[j] = W[j] ^ W[j + 4]\r\n        W1[j] = W[j] ^ W[i];\r\n\r\n        // 压缩\r\n        const T = j < 16 ? 0x79cc4519 : 0x7a879d8a;\r\n        const SS1 = rotateL32(rotateL32(A, 12) + E + rotateL32(T, j), 7);\r\n        const SS2 = SS1 ^ rotateL32(A, 12);\r\n        const TT1 = FF(A, B, C, j) + D + SS2 + W1[j];\r\n        const TT2 = GG(E, F, G, j) + H + SS1 + W[j];\r\n        D = C;\r\n        C = rotateL32(B, 9);\r\n        B = A;\r\n        A = TT1;\r\n        H = G;\r\n        G = rotateL32(F, 19);\r\n        F = E;\r\n        E = P0(TT2);\r\n      }\r\n    }\r\n\r\n    // 更新状态字\r\n    state_view.set(0, BigInt(H0 ^ A));\r\n    state_view.set(1, BigInt(H1 ^ B));\r\n    state_view.set(2, BigInt(H2 ^ C));\r\n    state_view.set(3, BigInt(H3 ^ D));\r\n    state_view.set(4, BigInt(H4 ^ E));\r\n    state_view.set(5, BigInt(H5 ^ F));\r\n    state_view.set(6, BigInt(H6 ^ G));\r\n    state_view.set(7, BigInt(H7 ^ H));\r\n  }\r\n\r\n  // * 截断输出\r\n  return state;\r\n}\r\n\r\nexport const sm3 = createHash(digest, {\r\n  ALGORITHM: 'SM3',\r\n  BLOCK_SIZE: 64,\r\n  DIGEST_SIZE: 32,\r\n  OID: '1.2.156.10197.1.401',\r\n});\r\n","import { createHash } from '../core/hash';\r\nimport { rotateL32, U8 } from '../core/utils';\r\n\r\n// * Constants\r\n\r\n/**\r\n * 轮常量列表 K 由 64 个 32 位无符号整数组成, 使用 1 到 64 的正弦函数生成.\r\n *\r\n * The round constants K is a list of 64 32-bit unsigned integers,\r\n * generated by the sine function from 1 to 64.\r\n *\r\n * ```ts\r\n * const K: number[] = []\r\n * for (let i = 0; i < 64; i++) {\r\n *   K[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) >>> 0\r\n * }\r\n * ```\r\n */\r\nconst K = new Uint32Array([\r\n  0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\r\n  0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\r\n  0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\r\n  0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\r\n  0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\r\n  0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\r\n  0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\r\n  0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,\r\n]);\r\n\r\n// * Function\r\n\r\nfunction FF(a: number, b: number, c: number, d: number, m: number, s: number, k: number) {\r\n  const n = a + ((b & c) | (~b & d)) + m + k;\r\n  return rotateL32(n, s) + b;\r\n}\r\n\r\nfunction GG(a: number, b: number, c: number, d: number, m: number, s: number, k: number) {\r\n  const n = a + ((b & d) | (c & ~d)) + m + k;\r\n  return rotateL32(n, s) + b;\r\n}\r\n\r\nfunction HH(a: number, b: number, c: number, d: number, m: number, s: number, k: number) {\r\n  const n = a + (b ^ c ^ d) + m + k;\r\n  return rotateL32(n, s) + b;\r\n}\r\n\r\nfunction II(a: number, b: number, c: number, d: number, m: number, s: number, k: number) {\r\n  const n = a + (c ^ (b | ~d)) + m + k;\r\n  return rotateL32(n, s) + b;\r\n}\r\n\r\n// * Algorithm\r\n\r\nfunction digest(message: Uint8Array) {\r\n  // * 初始化\r\n  const state = new Uint32Array([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]);\r\n\r\n  const m_byte = message.length;\r\n  const m_bit = BigInt(m_byte) << 3n;\r\n  const block_size = 64;\r\n  // ceil((M_BYTE + 9) / 64)\r\n  const block_total = (m_byte + 9 + 63) >> 6;\r\n\r\n  // * 填充\r\n  const p = new U8(block_total * block_size);\r\n  p.set(message);\r\n\r\n  // appending the bit '1' to the message\r\n  p[m_byte] = 0x80;\r\n\r\n  // appending length\r\n  const p_view = new DataView(p.buffer, p.byteOffset, p.byteLength);\r\n  p_view.setBigUint64(p.length - 8, m_bit, true);\r\n\r\n  // * 分块处理\r\n  for (let offset = 0; offset < p.length; ) {\r\n    // 获取分块\r\n    const end = offset + block_size;\r\n    const M = new Uint32Array(p.buffer, p.byteOffset + offset, block_size >> 2);\r\n    offset = end;\r\n\r\n    // 准备状态字\r\n    const A = state[0];\r\n    const B = state[1];\r\n    const C = state[2];\r\n    const D = state[3];\r\n    let a = A;\r\n    let b = B;\r\n    let c = C;\r\n    let d = D;\r\n\r\n    // 划分词典\r\n    /* Round 1 */\r\n    a = FF(a, b, c, d, M[0], 7, K[0]);\r\n    d = FF(d, a, b, c, M[1], 12, K[1]);\r\n    c = FF(c, d, a, b, M[2], 17, K[2]);\r\n    b = FF(b, c, d, a, M[3], 22, K[3]);\r\n    a = FF(a, b, c, d, M[4], 7, K[4]);\r\n    d = FF(d, a, b, c, M[5], 12, K[5]);\r\n    c = FF(c, d, a, b, M[6], 17, K[6]);\r\n    b = FF(b, c, d, a, M[7], 22, K[7]);\r\n    a = FF(a, b, c, d, M[8], 7, K[8]);\r\n    d = FF(d, a, b, c, M[9], 12, K[9]);\r\n    c = FF(c, d, a, b, M[10], 17, K[10]);\r\n    b = FF(b, c, d, a, M[11], 22, K[11]);\r\n    a = FF(a, b, c, d, M[12], 7, K[12]);\r\n    d = FF(d, a, b, c, M[13], 12, K[13]);\r\n    c = FF(c, d, a, b, M[14], 17, K[14]);\r\n    b = FF(b, c, d, a, M[15], 22, K[15]);\r\n\r\n    /* Round 2 */\r\n    a = GG(a, b, c, d, M[1], 5, K[16]);\r\n    d = GG(d, a, b, c, M[6], 9, K[17]);\r\n    c = GG(c, d, a, b, M[11], 14, K[18]);\r\n    b = GG(b, c, d, a, M[0], 20, K[19]);\r\n    a = GG(a, b, c, d, M[5], 5, K[20]);\r\n    d = GG(d, a, b, c, M[10], 9, K[21]);\r\n    c = GG(c, d, a, b, M[15], 14, K[22]);\r\n    b = GG(b, c, d, a, M[4], 20, K[23]);\r\n    a = GG(a, b, c, d, M[9], 5, K[24]);\r\n    d = GG(d, a, b, c, M[14], 9, K[25]);\r\n    c = GG(c, d, a, b, M[3], 14, K[26]);\r\n    b = GG(b, c, d, a, M[8], 20, K[27]);\r\n    a = GG(a, b, c, d, M[13], 5, K[28]);\r\n    d = GG(d, a, b, c, M[2], 9, K[29]);\r\n    c = GG(c, d, a, b, M[7], 14, K[30]);\r\n    b = GG(b, c, d, a, M[12], 20, K[31]);\r\n\r\n    /* Round 3 */\r\n    a = HH(a, b, c, d, M[5], 4, K[32]);\r\n    d = HH(d, a, b, c, M[8], 11, K[33]);\r\n    c = HH(c, d, a, b, M[11], 16, K[34]);\r\n    b = HH(b, c, d, a, M[14], 23, K[35]);\r\n    a = HH(a, b, c, d, M[1], 4, K[36]);\r\n    d = HH(d, a, b, c, M[4], 11, K[37]);\r\n    c = HH(c, d, a, b, M[7], 16, K[38]);\r\n    b = HH(b, c, d, a, M[10], 23, K[39]);\r\n    a = HH(a, b, c, d, M[13], 4, K[40]);\r\n    d = HH(d, a, b, c, M[0], 11, K[41]);\r\n    c = HH(c, d, a, b, M[3], 16, K[42]);\r\n    b = HH(b, c, d, a, M[6], 23, K[43]);\r\n    a = HH(a, b, c, d, M[9], 4, K[44]);\r\n    d = HH(d, a, b, c, M[12], 11, K[45]);\r\n    c = HH(c, d, a, b, M[15], 16, K[46]);\r\n    b = HH(b, c, d, a, M[2], 23, K[47]);\r\n\r\n    /* Round 4 */\r\n    a = II(a, b, c, d, M[0], 6, K[48]);\r\n    d = II(d, a, b, c, M[7], 10, K[49]);\r\n    c = II(c, d, a, b, M[14], 15, K[50]);\r\n    b = II(b, c, d, a, M[5], 21, K[51]);\r\n    a = II(a, b, c, d, M[12], 6, K[52]);\r\n    d = II(d, a, b, c, M[3], 10, K[53]);\r\n    c = II(c, d, a, b, M[10], 15, K[54]);\r\n    b = II(b, c, d, a, M[1], 21, K[55]);\r\n    a = II(a, b, c, d, M[8], 6, K[56]);\r\n    d = II(d, a, b, c, M[15], 10, K[57]);\r\n    c = II(c, d, a, b, M[6], 15, K[58]);\r\n    b = II(b, c, d, a, M[13], 21, K[59]);\r\n    a = II(a, b, c, d, M[4], 6, K[60]);\r\n    d = II(d, a, b, c, M[11], 10, K[61]);\r\n    c = II(c, d, a, b, M[2], 15, K[62]);\r\n    b = II(b, c, d, a, M[9], 21, K[63]);\r\n\r\n    // 更新状态字\r\n    state[0] = A + a;\r\n    state[1] = B + b;\r\n    state[2] = C + c;\r\n    state[3] = D + d;\r\n  }\r\n\r\n  // * 返回状态\r\n  return new U8(state.buffer);\r\n}\r\n\r\nexport const md5 = createHash(digest, {\r\n  ALGORITHM: 'MD5',\r\n  BLOCK_SIZE: 64,\r\n  DIGEST_SIZE: 16,\r\n  OID: '1.2.840.113549.2.5',\r\n});\r\n","import { createHash } from '../core/hash';\r\nimport { rotateL32, U8 } from '../core/utils';\r\n\r\n// * Constants\r\n\r\nfunction K(t: number) {\r\n  if (t < 20) return 0x5a827999;\r\n  if (t < 40) return 0x6ed9eba1;\r\n  if (t < 60) return 0x8f1bbcdc;\r\n  return 0xca62c1d6;\r\n}\r\n\r\n// * Function\r\n\r\nconst Ch = (x: number, y: number, z: number) => (x & y) ^ (~x & z);\r\nconst Parity = (x: number, y: number, z: number) => x ^ y ^ z;\r\nconst Maj = (x: number, y: number, z: number) => (x & y) ^ (x & z) ^ (y & z);\r\nfunction ft(x: number, y: number, z: number, t: number) {\r\n  if (t < 20) return Ch(x, y, z);\r\n  if (t < 40) return Parity(x, y, z);\r\n  if (t < 60) return Maj(x, y, z);\r\n  return Parity(x, y, z);\r\n}\r\n\r\n// * Algorithm\r\n\r\nfunction digest(message: Uint8Array) {\r\n  // * 初始化\r\n  const state = new U8(20);\r\n  const state_view = state.view(4);\r\n  state_view.set(0, 0x67452301n);\r\n  state_view.set(1, 0xefcdab89n);\r\n  state_view.set(2, 0x98badcfen);\r\n  state_view.set(3, 0x10325476n);\r\n  state_view.set(4, 0xc3d2e1f0n);\r\n\r\n  const m_byte = message.length;\r\n  const m_bit = BigInt(m_byte) << 3n;\r\n  const block_size = 64;\r\n  // ceil((M_BYTE + 9) / 64)\r\n  const block_total = (m_byte + 9 + 63) >> 6;\r\n\r\n  // * 填充\r\n  const p = new U8(block_total * block_size);\r\n  p.set(message);\r\n\r\n  // appending the bit '1' to the message\r\n  p[m_byte] = 0x80;\r\n\r\n  // appending length\r\n  const p_view = new DataView(p.buffer, p.byteOffset, p.byteLength);\r\n  p_view.setBigUint64(p.length - 8, m_bit);\r\n\r\n  // * 分块处理\r\n  for (let offset = 0; offset < p.length; offset += block_size) {\r\n    /** B(n) = p[offset:offset + block_size] */\r\n\r\n    // 准备状态字\r\n    const H0 = Number(state_view.get(0));\r\n    const H1 = Number(state_view.get(1));\r\n    const H2 = Number(state_view.get(2));\r\n    const H3 = Number(state_view.get(3));\r\n    const H4 = Number(state_view.get(4));\r\n    let a = H0;\r\n    let b = H1;\r\n    let c = H2;\r\n    let d = H3;\r\n    let e = H4;\r\n\r\n    // 合并执行 扩展 & 压缩\r\n    const W = new Uint32Array(80);\r\n    for (let i = 0; i < 80; i++) {\r\n      // 扩展\r\n      if (i < 16)\r\n        // W[i] = B(n)[i]\r\n        W[i] = p_view.getUint32(offset + (i << 2));\r\n      else W[i] = rotateL32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\r\n\r\n      // 压缩\r\n      const T = rotateL32(a, 5) + ft(b, c, d, i) + K(i) + e + W[i];\r\n      e = d;\r\n      d = c;\r\n      c = rotateL32(b, 30);\r\n      b = a;\r\n      a = T;\r\n    }\r\n\r\n    // 更新状态字\r\n    state_view.set(0, BigInt(H0 + a));\r\n    state_view.set(1, BigInt(H1 + b));\r\n    state_view.set(2, BigInt(H2 + c));\r\n    state_view.set(3, BigInt(H3 + d));\r\n    state_view.set(4, BigInt(H4 + e));\r\n  }\r\n\r\n  // * 返回状态\r\n  return state;\r\n}\r\n\r\nexport const sha1 = createHash(digest, {\r\n  ALGORITHM: 'SHA-1',\r\n  BLOCK_SIZE: 64,\r\n  DIGEST_SIZE: 20,\r\n  OID: '1.3.14.3.2.26',\r\n});\r\n","import { createHash } from '../core/hash';\r\nimport { rotateR32, U8 } from '../core/utils';\r\n\r\n// * Constants\r\n\r\nconst K = new Uint32Array([\r\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\r\n]);\r\n\r\n// * Function\r\n\r\nconst Ch = (x: number, y: number, z: number) => (x & y) ^ (~x & z);\r\nconst Maj = (x: number, y: number, z: number) => (x & y) ^ (x & z) ^ (y & z);\r\nconst Sigma0 = (x: number) => rotateR32(x, 2) ^ rotateR32(x, 13) ^ rotateR32(x, 22);\r\nconst Sigma1 = (x: number) => rotateR32(x, 6) ^ rotateR32(x, 11) ^ rotateR32(x, 25);\r\nconst sigma0 = (x: number) => rotateR32(x, 7) ^ rotateR32(x, 18) ^ (x >>> 3);\r\nconst sigma1 = (x: number) => rotateR32(x, 17) ^ rotateR32(x, 19) ^ (x >>> 10);\r\n\r\n// * Algorithm\r\n\r\nfunction digest(state: U8, message: Uint8Array) {\r\n  // * 初始化\r\n  state = state.slice(0);\r\n  const state_view = state.view(4);\r\n\r\n  const m_byte = message.length;\r\n  const m_bit = BigInt(m_byte) << 3n;\r\n  const block_size = 64;\r\n  // ceil((m_byte + 9) / 64)\r\n  const block_total = (m_byte + 9 + 63) >> 6;\r\n\r\n  // * 填充\r\n  const p = new U8(block_total * block_size);\r\n  p.set(message);\r\n\r\n  // appending the bit '1' to the message\r\n  p[m_byte] = 0x80;\r\n\r\n  // appending length\r\n  const p_view = new DataView(p.buffer, p.byteOffset, p.byteLength);\r\n  p_view.setBigUint64(p.length - 8, m_bit);\r\n\r\n  // * 分块处理\r\n  for (let offset = 0; offset < p.length; offset += block_size) {\r\n    /** B(n) = p[offset:offset + block_size] */\r\n\r\n    // 准备状态字\r\n    const h0 = Number(state_view.get(0));\r\n    const h1 = Number(state_view.get(1));\r\n    const h2 = Number(state_view.get(2));\r\n    const h3 = Number(state_view.get(3));\r\n    const h4 = Number(state_view.get(4));\r\n    const h5 = Number(state_view.get(5));\r\n    const h6 = Number(state_view.get(6));\r\n    const h7 = Number(state_view.get(7));\r\n    let a = h0;\r\n    let b = h1;\r\n    let c = h2;\r\n    let d = h3;\r\n    let e = h4;\r\n    let f = h5;\r\n    let g = h6;\r\n    let h = h7;\r\n\r\n    // 合并执行 扩展 & 压缩\r\n    const W = new Uint32Array(64);\r\n    for (let i = 0; i < W.length; i++) {\r\n      // 扩展\r\n      if (i < 16)\r\n        // W[i] = B(n)[i]\r\n        W[i] = p_view.getUint32(offset + (i << 2));\r\n      else W[i] = sigma1(W[i - 2]) + W[i - 7] + sigma0(W[i - 15]) + W[i - 16];\r\n\r\n      // 压缩\r\n      const T1 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];\r\n      const T2 = Sigma0(a) + Maj(a, b, c);\r\n      h = g;\r\n      g = f;\r\n      f = e;\r\n      e = d + T1;\r\n      d = c;\r\n      c = b;\r\n      b = a;\r\n      a = T1 + T2;\r\n    }\r\n\r\n    // 更新状态字\r\n    state_view.set(0, BigInt(h0 + a));\r\n    state_view.set(1, BigInt(h1 + b));\r\n    state_view.set(2, BigInt(h2 + c));\r\n    state_view.set(3, BigInt(h3 + d));\r\n    state_view.set(4, BigInt(h4 + e));\r\n    state_view.set(5, BigInt(h5 + f));\r\n    state_view.set(6, BigInt(h6 + g));\r\n    state_view.set(7, BigInt(h7 + h));\r\n  }\r\n\r\n  // * 返回状态\r\n  return state;\r\n}\r\n\r\nfunction sha224Digest(M: Uint8Array) {\r\n  // * 初始化 SHA-224 状态\r\n  const state = new U8(32);\r\n  const state_view = state.view(4);\r\n  state_view.set(0, 0xc1059ed8n);\r\n  state_view.set(1, 0x367cd507n);\r\n  state_view.set(2, 0x3070dd17n);\r\n  state_view.set(3, 0xf70e5939n);\r\n  state_view.set(4, 0xffc00b31n);\r\n  state_view.set(5, 0x68581511n);\r\n  state_view.set(6, 0x64f98fa7n);\r\n  state_view.set(7, 0xbefa4fa4n);\r\n\r\n  return digest(state, M).slice(0, 28);\r\n}\r\n\r\nfunction sha256Digest(M: Uint8Array) {\r\n  // * 初始化 SHA-256 状态\r\n  const state = new U8(32);\r\n  const state_view = state.view(4);\r\n  state_view.set(0, 0x6a09e667n);\r\n  state_view.set(1, 0xbb67ae85n);\r\n  state_view.set(2, 0x3c6ef372n);\r\n  state_view.set(3, 0xa54ff53an);\r\n  state_view.set(4, 0x510e527fn);\r\n  state_view.set(5, 0x9b05688cn);\r\n  state_view.set(6, 0x1f83d9abn);\r\n  state_view.set(7, 0x5be0cd19n);\r\n\r\n  return digest(state, M);\r\n}\r\n\r\nexport const sha224 = createHash(sha224Digest, {\r\n  ALGORITHM: 'SHA-224',\r\n  BLOCK_SIZE: 64,\r\n  DIGEST_SIZE: 28,\r\n  OID: '2.16.840.1.101.3.4.2.4',\r\n});\r\n\r\nexport const sha256 = createHash(sha256Digest, {\r\n  ALGORITHM: 'SHA-256',\r\n  BLOCK_SIZE: 64,\r\n  DIGEST_SIZE: 32,\r\n  OID: '2.16.840.1.101.3.4.2.1',\r\n});\r\n","import { UTF8 } from '../core/codec';\r\nimport { createHash } from '../core/hash';\r\nimport { genBitMask, KitError, rotateR, U8 } from '../core/utils';\r\n\r\n// * Constants\r\n\r\nconst K = new BigUint64Array([\r\n  0x428a2f98d728ae22n,\r\n  0x7137449123ef65cdn,\r\n  0xb5c0fbcfec4d3b2fn,\r\n  0xe9b5dba58189dbbcn,\r\n  0x3956c25bf348b538n,\r\n  0x59f111f1b605d019n,\r\n  0x923f82a4af194f9bn,\r\n  0xab1c5ed5da6d8118n,\r\n  0xd807aa98a3030242n,\r\n  0x12835b0145706fben,\r\n  0x243185be4ee4b28cn,\r\n  0x550c7dc3d5ffb4e2n,\r\n  0x72be5d74f27b896fn,\r\n  0x80deb1fe3b1696b1n,\r\n  0x9bdc06a725c71235n,\r\n  0xc19bf174cf692694n,\r\n  0xe49b69c19ef14ad2n,\r\n  0xefbe4786384f25e3n,\r\n  0x0fc19dc68b8cd5b5n,\r\n  0x240ca1cc77ac9c65n,\r\n  0x2de92c6f592b0275n,\r\n  0x4a7484aa6ea6e483n,\r\n  0x5cb0a9dcbd41fbd4n,\r\n  0x76f988da831153b5n,\r\n  0x983e5152ee66dfabn,\r\n  0xa831c66d2db43210n,\r\n  0xb00327c898fb213fn,\r\n  0xbf597fc7beef0ee4n,\r\n  0xc6e00bf33da88fc2n,\r\n  0xd5a79147930aa725n,\r\n  0x06ca6351e003826fn,\r\n  0x142929670a0e6e70n,\r\n  0x27b70a8546d22ffcn,\r\n  0x2e1b21385c26c926n,\r\n  0x4d2c6dfc5ac42aedn,\r\n  0x53380d139d95b3dfn,\r\n  0x650a73548baf63den,\r\n  0x766a0abb3c77b2a8n,\r\n  0x81c2c92e47edaee6n,\r\n  0x92722c851482353bn,\r\n  0xa2bfe8a14cf10364n,\r\n  0xa81a664bbc423001n,\r\n  0xc24b8b70d0f89791n,\r\n  0xc76c51a30654be30n,\r\n  0xd192e819d6ef5218n,\r\n  0xd69906245565a910n,\r\n  0xf40e35855771202an,\r\n  0x106aa07032bbd1b8n,\r\n  0x19a4c116b8d2d0c8n,\r\n  0x1e376c085141ab53n,\r\n  0x2748774cdf8eeb99n,\r\n  0x34b0bcb5e19b48a8n,\r\n  0x391c0cb3c5c95a63n,\r\n  0x4ed8aa4ae3418acbn,\r\n  0x5b9cca4f7763e373n,\r\n  0x682e6ff3d6b2b8a3n,\r\n  0x748f82ee5defb2fcn,\r\n  0x78a5636f43172f60n,\r\n  0x84c87814a1f0ab72n,\r\n  0x8cc702081a6439ecn,\r\n  0x90befffa23631e28n,\r\n  0xa4506cebde82bde9n,\r\n  0xbef9a3f7b2c67915n,\r\n  0xc67178f2e372532bn,\r\n  0xca273eceea26619cn,\r\n  0xd186b8c721c0c207n,\r\n  0xeada7dd6cde0eb1en,\r\n  0xf57d4f7fee6ed178n,\r\n  0x06f067aa72176fban,\r\n  0x0a637dc5a2c898a6n,\r\n  0x113f9804bef90daen,\r\n  0x1b710b35131c471bn,\r\n  0x28db77f523047d84n,\r\n  0x32caab7b40c72493n,\r\n  0x3c9ebe0a15c9bebcn,\r\n  0x431d67c49c100d4cn,\r\n  0x4cc5d4becb3e42b6n,\r\n  0x597f299cfc657e2an,\r\n  0x5fcb6fab3ad6faecn,\r\n  0x6c44198c4a475817n,\r\n]);\r\n\r\n// * Function\r\nconst mask64 = genBitMask(64);\r\nconst rotateR64 = (x: bigint, n: bigint) => rotateR(64, x, n, mask64);\r\n\r\nconst Ch = (x: bigint, y: bigint, z: bigint) => (x & y) ^ (~x & z);\r\nconst Maj = (x: bigint, y: bigint, z: bigint) => (x & y) ^ (x & z) ^ (y & z);\r\nconst Sigma0 = (x: bigint) => rotateR64(x, 28n) ^ rotateR64(x, 34n) ^ rotateR64(x, 39n);\r\nconst Sigma1 = (x: bigint) => rotateR64(x, 14n) ^ rotateR64(x, 18n) ^ rotateR64(x, 41n);\r\nconst sigma0 = (x: bigint) => rotateR64(x, 1n) ^ rotateR64(x, 8n) ^ (x >> 7n);\r\nconst sigma1 = (x: bigint) => rotateR64(x, 19n) ^ rotateR64(x, 61n) ^ (x >> 6n);\r\n\r\n/**\r\n * SHA-512/t IV 生成函数 / generator\r\n *\r\n * ```ts\r\n * (0 < t < 512) && (t !== 384)\r\n * ```\r\n *\r\n * @param {number} t - 截断长度 / truncation length (bit)\r\n */\r\nfunction IVGen(t: number) {\r\n  if (t <= 0) {\r\n    throw new KitError('SHA-512 truncation must be greater than 0');\r\n  }\r\n  if (t >= 512) {\r\n    throw new KitError('SHA-512 truncation must be less than 512');\r\n  }\r\n  if (t === 384) {\r\n    throw new KitError('SHA-512 truncation must not be 384');\r\n  }\r\n\r\n  const state = new U8(64);\r\n  const state_view = state.view(8);\r\n  state_view.set(0, 0x6a09e667f3bcc908n ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(1, 0xbb67ae8584caa73bn ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(2, 0x3c6ef372fe94f82bn ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(3, 0xa54ff53a5f1d36f1n ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(4, 0x510e527fade682d1n ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(5, 0x9b05688c2b3e6c1fn ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(6, 0x1f83d9abfb41bd6bn ^ 0xa5a5a5a5a5a5a5a5n);\r\n  state_view.set(7, 0x5be0cd19137e2179n ^ 0xa5a5a5a5a5a5a5a5n);\r\n\r\n  return digest(state, UTF8(`SHA-512/${t}`));\r\n}\r\n\r\n// * Algorithm\r\n\r\nfunction digest(state: U8, message: Uint8Array) {\r\n  // * 初始化\r\n  state = state.slice(0);\r\n  const state_view = state.view(8);\r\n\r\n  const m_byte = message.byteLength;\r\n  const m_bit = BigInt(m_byte) << 3n;\r\n  const block_size = 128;\r\n  // ceil((m_byte + 17) / 128)\r\n  const block_total = (m_byte + 17 + 127) >> 7;\r\n\r\n  // * 填充\r\n  const p = new U8(block_total * block_size);\r\n  p.set(message);\r\n\r\n  // appending the bit '1' to the message\r\n  p[m_byte] = 0x80;\r\n\r\n  // appending length\r\n  const p_view = new DataView(p.buffer, p.byteOffset, p.byteLength);\r\n  p_view.setBigUint64(p.byteLength - 16, m_bit >> 32n);\r\n  p_view.setBigUint64(p.byteLength - 8, m_bit & 0xffffffffffffffffn);\r\n\r\n  // * 分块处理\r\n  for (let offset = 0; offset < p.length; offset += block_size) {\r\n    /** B(n) = p[offset:offset + block_size] */\r\n\r\n    // 准备状态字\r\n    const H0 = state_view.get(0);\r\n    const H1 = state_view.get(1);\r\n    const H2 = state_view.get(2);\r\n    const H3 = state_view.get(3);\r\n    const H4 = state_view.get(4);\r\n    const H5 = state_view.get(5);\r\n    const H6 = state_view.get(6);\r\n    const H7 = state_view.get(7);\r\n    let a = H0;\r\n    let b = H1;\r\n    let c = H2;\r\n    let d = H3;\r\n    let e = H4;\r\n    let f = H5;\r\n    let g = H6;\r\n    let h = H7;\r\n\r\n    // 合并执行 扩展 & 压缩\r\n    const W = new BigUint64Array(80);\r\n    for (let i = 0; i < W.length; i++) {\r\n      // 扩展\r\n      if (i < 16)\r\n        // W[i] = B(n)[i]\r\n        W[i] = p_view.getBigUint64(offset + (i << 3));\r\n      else W[i] = sigma1(W[i - 2]) + W[i - 7] + sigma0(W[i - 15]) + W[i - 16];\r\n\r\n      // 压缩\r\n      const T1 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];\r\n      const T2 = Sigma0(a) + Maj(a, b, c);\r\n      h = g;\r\n      g = f;\r\n      f = e;\r\n      e = (d + T1) & 0xffffffffffffffffn;\r\n      d = c;\r\n      c = b;\r\n      b = a;\r\n      a = (T1 + T2) & 0xffffffffffffffffn;\r\n    }\r\n\r\n    // 更新状态字\r\n    state_view.set(0, H0 + a);\r\n    state_view.set(1, H1 + b);\r\n    state_view.set(2, H2 + c);\r\n    state_view.set(3, H3 + d);\r\n    state_view.set(4, H4 + e);\r\n    state_view.set(5, H5 + f);\r\n    state_view.set(6, H6 + g);\r\n    state_view.set(7, H7 + h);\r\n  }\r\n\r\n  // * 返回状态\r\n  return state;\r\n}\r\n\r\nfunction sha384Digest(M: Uint8Array) {\r\n  // * 初始化 SHA-384 状态\r\n  const state = new U8(64);\r\n  const state_view = state.view(8);\r\n  state_view.set(0, 0xcbbb9d5dc1059ed8n);\r\n  state_view.set(1, 0x629a292a367cd507n);\r\n  state_view.set(2, 0x9159015a3070dd17n);\r\n  state_view.set(3, 0x152fecd8f70e5939n);\r\n  state_view.set(4, 0x67332667ffc00b31n);\r\n  state_view.set(5, 0x8eb44a8768581511n);\r\n  state_view.set(6, 0xdb0c2e0d64f98fa7n);\r\n  state_view.set(7, 0x47b5481dbefa4fa4n);\r\n\r\n  return digest(state, M).slice(0, 48);\r\n}\r\n\r\nfunction sha512Digest(M: Uint8Array) {\r\n  // * 初始化 SHA-512 状态\r\n  const state = new U8(64);\r\n  const state_view = state.view(8);\r\n  state_view.set(0, 0x6a09e667f3bcc908n);\r\n  state_view.set(1, 0xbb67ae8584caa73bn);\r\n  state_view.set(2, 0x3c6ef372fe94f82bn);\r\n  state_view.set(3, 0xa54ff53a5f1d36f1n);\r\n  state_view.set(4, 0x510e527fade682d1n);\r\n  state_view.set(5, 0x9b05688c2b3e6c1fn);\r\n  state_view.set(6, 0x1f83d9abfb41bd6bn);\r\n  state_view.set(7, 0x5be0cd19137e2179n);\r\n\r\n  return digest(state, M);\r\n}\r\n\r\nexport const sha384 = createHash(sha384Digest, {\r\n  ALGORITHM: 'SHA-384',\r\n  BLOCK_SIZE: 128,\r\n  DIGEST_SIZE: 48,\r\n  OID: '2.16.840.1.101.3.4.2.2',\r\n});\r\n\r\nexport const sha512 = createHash(sha512Digest, {\r\n  ALGORITHM: 'SHA-512',\r\n  BLOCK_SIZE: 128,\r\n  DIGEST_SIZE: 64,\r\n  OID: '2.16.840.1.101.3.4.2.3',\r\n});\r\n\r\n/**\r\n * @param {number} t - 截断长度 / truncation length (bit)\r\n */\r\nexport function sha512t(t: number) {\r\n  // * 初始化 SHA-512/t 状态\r\n  const status = IVGen(t);\r\n\r\n  let OID: string | undefined;\r\n  if (t === 224) OID = '2.16.840.1.101.3.4.2.5';\r\n  if (t === 256) OID = '2.16.840.1.101.3.4.2.6';\r\n\r\n  return createHash((M: Uint8Array) => digest(status, M).slice(0, t >> 3), {\r\n    ALGORITHM: `SHA-512/${t}`,\r\n    BLOCK_SIZE: 128,\r\n    DIGEST_SIZE: t >> 3,\r\n    OID,\r\n  });\r\n}\r\n","import { genBitMask, joinBuffer, KitError, rotateL, U8 } from '../core/utils';\r\n\r\n// * Constants\r\n\r\n/**\r\n * ρ(A) 位移表 / Shift Table\r\n */\r\nconst R = [\r\n  [0n, 36n, 3n, 41n, 18n],\r\n  [1n, 44n, 10n, 45n, 2n],\r\n  [62n, 6n, 43n, 15n, 61n],\r\n  [28n, 55n, 25n, 21n, 56n],\r\n  [27n, 20n, 39n, 8n, 14n],\r\n];\r\n/**\r\n * https://datatracker.ietf.org/doc/draft-irtf-cfrg-kangarootwelve/\r\n */\r\nconst RC12 = [\r\n  0x000000008000808bn,\r\n  0x800000000000008bn,\r\n  0x8000000000008089n,\r\n  0x8000000000008003n,\r\n  0x8000000000008002n,\r\n  0x8000000000000080n,\r\n  0x000000000000800an,\r\n  0x800000008000000an,\r\n  0x8000000080008081n,\r\n  0x8000000000008080n,\r\n  0x0000000080000001n,\r\n  0x8000000080008008n,\r\n];\r\n/**\r\n * `RCGen(6, 24)`\r\n */\r\nconst RC24 = [\r\n  0x0000000000000001n,\r\n  0x0000000000008082n,\r\n  0x800000000000808an,\r\n  0x8000000080008000n,\r\n  0x000000000000808bn,\r\n  0x0000000080000001n,\r\n  0x8000000080008081n,\r\n  0x8000000000008009n,\r\n  0x000000000000008an,\r\n  0x0000000000000088n,\r\n  0x0000000080008009n,\r\n  0x000000008000000an,\r\n  0x000000008000808bn,\r\n  0x800000000000008bn,\r\n  0x8000000000008089n,\r\n  0x8000000000008003n,\r\n  0x8000000000008002n,\r\n  0x8000000000000080n,\r\n  0x000000000000800an,\r\n  0x800000008000000an,\r\n  0x8000000080008081n,\r\n  0x8000000000008080n,\r\n  0x0000000080000001n,\r\n  0x8000000080008008n,\r\n];\r\n\r\nconst mask64 = genBitMask(64);\r\nconst rotateL64 = (x: bigint, n: bigint) => rotateL(64, x, n, mask64);\r\n\r\n// * Keccak Utils\r\n\r\n/**\r\n * RC Table Generation Function\r\n *\r\n * @param {number} l - log2(w)\r\n * @param {number} [nr] - 轮数\r\n */\r\nexport function RCGen(l = 6, nr = 24) {\r\n  const RCTable = [];\r\n  for (let ir = 0; ir < nr; ir++) {\r\n    let RC = 0n;\r\n    for (let j = 0; j <= l; j++) {\r\n      const t = j + 7 * ir;\r\n\r\n      // rc(t)\r\n      let rc: bigint;\r\n      if (t % 255 === 0) {\r\n        rc = 1n;\r\n      } else {\r\n        let R = 0x80n;\r\n        for (let i = 1; i <= t % 255; i++) {\r\n          const b = R & 1n;\r\n          R ^= (b << 8n) | (b << 4n) | (b << 3n) | (b << 2n);\r\n          R >>= 1n;\r\n        }\r\n        rc = R >> 7n;\r\n      }\r\n\r\n      // RC[2^j - 1] = rc(j + 7ir)\r\n      RC |= rc << BigInt(2 ** j - 1);\r\n    }\r\n    RCTable.push(RC);\r\n  }\r\n  return RCTable;\r\n}\r\n\r\n/**\r\n * @param {number} w - 工作字长度 / Word Size\r\n */\r\nexport function RGen(w: number | bigint) {\r\n  w = BigInt(w);\r\n  const R = [\r\n    [0n, 36n, 3n, 105n, 210n],\r\n    [1n, 300n, 10n, 45n, 66n],\r\n    [190n, 6n, 171n, 15n, 253n],\r\n    [28n, 276n, 120n, 136n, 55n],\r\n    [91n, 276n, 210n, 66n, 253n],\r\n  ];\r\n\r\n  return R.map((x) => x.map((y) => y % w));\r\n}\r\n\r\n// * Permutation Function\r\n\r\ntype StateArray1600 = BigUint64Array[];\r\n\r\n/**\r\n * create a 5x5 `State Array`\r\n *\r\n * 创建一个 5x5 `状态矩阵`\r\n */\r\nfunction createStateArray(): StateArray1600 {\r\n  return Array.from({ length: 5 }).map(() => new BigUint64Array(5));\r\n}\r\n\r\n/**\r\n * Converting `State` to `State Arrays`\r\n *\r\n * 将 `状态` 转换为 `状态矩阵`\r\n */\r\nfunction toStateArray(S: Uint8Array) {\r\n  const A = createStateArray();\r\n  const view = new DataView(S.buffer, S.byteOffset, S.byteLength);\r\n\r\n  for (let x = 0; x < 5; x++) {\r\n    for (let y = 0; y < 5; y++) {\r\n      A[x][y] = view.getBigUint64((y * 5 + x) << 3, true);\r\n    }\r\n  }\r\n\r\n  return A;\r\n}\r\n\r\n/**\r\n * Converting `State Arrays` to `State`\r\n *\r\n * 将 `状态矩阵` 转换为 `状态`\r\n */\r\nfunction toState(A: StateArray1600) {\r\n  const S = new Uint8Array(200);\r\n  const view = new DataView(S.buffer, S.byteOffset, S.byteLength);\r\n\r\n  for (let x = 0; x < 5; x++) {\r\n    for (let y = 0; y < 5; y++) {\r\n      view.setBigUint64((y * 5 + x) << 3, A[x][y], true);\r\n    }\r\n  }\r\n\r\n  return S;\r\n}\r\n\r\n// * Mapping Function\r\n\r\n/** Algorithm 1: θ(A) */\r\nfunction theta(A: StateArray1600) {\r\n  const C = new BigUint64Array(5);\r\n  const D = new BigUint64Array(5);\r\n\r\n  for (let x = 0; x < 5; x++) {\r\n    C[x] = A[x][0] ^ A[x][1] ^ A[x][2] ^ A[x][3] ^ A[x][4];\r\n  }\r\n\r\n  for (let x = 0; x < 5; x++) {\r\n    D[x] = C[(x + 4) % 5] ^ rotateL64(C[(x + 1) % 5], 1n);\r\n\r\n    for (let y = 0; y < 5; y++) {\r\n      A[x][y] = A[x][y] ^ D[x];\r\n    }\r\n  }\r\n\r\n  return A;\r\n}\r\n\r\n/** Algorithm 2: ρ(A) */\r\n// biome-ignore lint/correctness/noUnusedVariables: <tips>\r\nfunction rho(A: StateArray1600) {\r\n  const _A = createStateArray();\r\n  for (let x = 0; x < 5; x++) {\r\n    for (let y = 0; y < 5; y++) {\r\n      _A[x][y] = rotateL64(A[x][y], R[x][y]);\r\n    }\r\n  }\r\n  return _A;\r\n}\r\n\r\n/** Algorithm 3: π(A) */\r\n// biome-ignore lint/correctness/noUnusedVariables: <tips>\r\nfunction pi(A: StateArray1600) {\r\n  const _A = createStateArray();\r\n  for (let x = 0; x < 5; x++) {\r\n    for (let y = 0; y < 5; y++) {\r\n      _A[x][y] = A[(x + 3 * y) % 5][x];\r\n    }\r\n  }\r\n  return _A;\r\n}\r\n\r\n/**\r\n * Combining π(ρ(A))\r\n *\r\n * 合并执行 π(ρ(A))\r\n */\r\nfunction rhoPi(A: StateArray1600) {\r\n  const _A = createStateArray();\r\n  for (let x = 0; x < 5; x++) {\r\n    for (let y = 0; y < 5; y++) {\r\n      _A[y][(2 * x + 3 * y) % 5] = rotateL64(A[x][y], R[x][y]);\r\n    }\r\n  }\r\n  return _A;\r\n}\r\n\r\n/** Algorithm 4: χ(A) */\r\nfunction chi(A: StateArray1600) {\r\n  const _A = createStateArray();\r\n  for (let x = 0; x < 5; x++) {\r\n    for (let y = 0; y < 5; y++) {\r\n      _A[x][y] = A[x][y] ^ (~A[(x + 1) % 5][y] & A[(x + 2) % 5][y]);\r\n    }\r\n  }\r\n  return _A;\r\n}\r\n\r\n/** Algorithm 6: ι(A, ir) */\r\nfunction iota(A: StateArray1600, RC: bigint) {\r\n  A[0][0] = A[0][0] ^ RC;\r\n  return A;\r\n}\r\n\r\n// * Keccak-p[1600]\r\n\r\n/**\r\n * `Keccak-p` 置换函数 / Permutate Function\r\n */\r\nexport interface Keccak_p {\r\n  /**\r\n   * @param {Uint8Array} S - 状态 / State\r\n   */\r\n  (S: Uint8Array): Uint8Array;\r\n}\r\n\r\n/**\r\n * `Keccak-p[1600, nr]` 置换函数 / Permutate Function\r\n *\r\n * @param {number} [nr] - 轮数 / Rounds (default: 24)\r\n */\r\nexport function keccak_p_1600(nr = 24): Keccak_p {\r\n  // b = 1600\r\n  const bByte = 200;\r\n  const l = 6;\r\n\r\n  // 当轮数非默认的情况下，重新生成 RC\r\n  let RC: bigint[];\r\n  if (nr === 12) {\r\n    RC = RC12;\r\n  } else if (nr === 24) {\r\n    RC = RC24;\r\n  } else {\r\n    RC = RCGen(l, nr);\r\n  }\r\n\r\n  return (S: Uint8Array) => {\r\n    if (S.byteLength !== bByte) {\r\n      throw new KitError('Invalid state size');\r\n    }\r\n\r\n    let A = toStateArray(S);\r\n    for (let i = 0; i < nr; i++) {\r\n      A = iota(chi(rhoPi(theta(A))), RC[i]);\r\n    }\r\n    return new U8(toState(A));\r\n  };\r\n}\r\n\r\n// * Sponge Construction\r\n\r\n/**\r\n * `SPONGE` 填充函数 / Padding Function\r\n */\r\nexport interface SpongePadding {\r\n  /**\r\n   * @param {Uint8Array} M - 消息 / Message\r\n   */\r\n  (M: Uint8Array): U8;\r\n}\r\n\r\n/**\r\n * `SPONGE` & `Keccak-p[1600]`\r\n *\r\n * @param {number} r_byte - 处理速率 / Rate\r\n * @param {number} d_byte - 输出长度 / Digest Size\r\n * @param {SpongePadding} pad - 填充函数 / Padding Function\r\n * @param {Keccak_p} f - Keccak-p 置换函数 / Permutate Function\r\n */\r\nexport function sponge_1600(\r\n  r_byte: number,\r\n  d_byte: number,\r\n  pad: SpongePadding,\r\n  f: Keccak_p = keccak_p_1600(),\r\n) {\r\n  return (M: Uint8Array) => {\r\n    // * 填充\r\n    const P = pad(M);\r\n    // * 吸收\r\n    let S: Uint8Array = new Uint8Array(200);\r\n    let i = 0;\r\n    while (i < P.byteLength) {\r\n      const end = i + r_byte;\r\n      const Pi = P.slice(i, end);\r\n      S.forEach((byte, index) => {\r\n        S[index] = byte ^ Pi[index];\r\n      });\r\n      S = f(S);\r\n      i = end;\r\n    }\r\n    // * 挤出\r\n    const z = [S.slice(0, r_byte)];\r\n    let z_byte = r_byte;\r\n    while (z_byte < d_byte) {\r\n      S = f(S);\r\n      z.push(S.slice(0, r_byte));\r\n      z_byte += r_byte;\r\n    }\r\n    // * 截断输出\r\n    return joinBuffer(...z).slice(0, d_byte);\r\n  };\r\n}\r\n","import { createHash } from '../core/hash';\r\nimport { U8 } from '../core/utils';\r\nimport { sponge_1600 } from './keccak1600';\r\n\r\n// * SHA3 Padding Function\r\n\r\n/**\r\n * `SHA3` 填充函数 / Padding Function\r\n */\r\nexport interface Sha3Padding {\r\n  /**\r\n   * @param {number} r_byte - 处理速率 / Rate\r\n   */\r\n  (\r\n    r_byte: number,\r\n  ): {\r\n    /**\r\n     * @param {Uint8Array} M - 消息 / Message\r\n     */\r\n    (M: Uint8Array): U8;\r\n  };\r\n}\r\n\r\n/**\r\n * `SHA3` 填充函数 / Padding Function\r\n *\r\n * ```ts\r\n * M || 01 || 10*1\r\n * ```\r\n *\r\n * @param {number} r_byte - 处理速率 / Rate\r\n */\r\nconst sha3Padding: Sha3Padding = (r_byte: number) => {\r\n  return (M: Uint8Array) => {\r\n    const sig_byte = M.length;\r\n    const pad_byte = r_byte - (sig_byte % r_byte);\r\n    const P = new U8(sig_byte + pad_byte);\r\n    P.set(M);\r\n    if (pad_byte === 1) {\r\n      P[sig_byte] = 0x86;\r\n    }\r\n    P[sig_byte] = 0x06;\r\n    P[P.length - 1] |= 0x80;\r\n    return P;\r\n  };\r\n};\r\n\r\n/**\r\n * `SHAKE` 填充函数 / Padding Function\r\n *\r\n * ```ts\r\n * M || 1111 || 10*1\r\n * ```\r\n *\r\n * @param {number} r_byte - 处理速率 / Rate\r\n */\r\nconst shakePadding: Sha3Padding = (r_byte: number) => {\r\n  return (M: Uint8Array) => {\r\n    const sig_byte = M.length;\r\n    const pad_byte = r_byte - (sig_byte % r_byte);\r\n    const P = new U8(sig_byte + pad_byte);\r\n    P.set(M);\r\n    if (pad_byte === 1) {\r\n      P[sig_byte] = 0x9f;\r\n    }\r\n    P[sig_byte] = 0x1f;\r\n    P[P.length - 1] |= 0x80;\r\n    return P;\r\n  };\r\n};\r\n\r\n// * SHA3 Function Specification\r\n\r\n/**\r\n * @param {number} c - 安全容量 / Capacity (bit)\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Sha3Padding} padding - 填充函数 / Padding Function\r\n */\r\nexport function Keccak_c(c: number, d: number, padding: Sha3Padding) {\r\n  const r = 1600 - c;\r\n  const rByte = r >> 3;\r\n  const pad = padding(rByte);\r\n  return (M: Uint8Array) => sponge_1600(rByte, d >> 3, pad)(M);\r\n}\r\n\r\nexport const sha3_224 = createHash((M: Uint8Array) => Keccak_c(448, 224, sha3Padding)(M), {\r\n  ALGORITHM: 'SHA3-224',\r\n  BLOCK_SIZE: 144,\r\n  DIGEST_SIZE: 28,\r\n  OID: '2.16.840.1.101.3.4.2.7',\r\n});\r\n\r\nexport const sha3_256 = createHash((M: Uint8Array) => Keccak_c(512, 256, sha3Padding)(M), {\r\n  ALGORITHM: 'SHA3-256',\r\n  BLOCK_SIZE: 136,\r\n  DIGEST_SIZE: 32,\r\n  OID: '2.16.840.1.101.3.4.2.8',\r\n});\r\n\r\nexport const sha3_384 = createHash((M: Uint8Array) => Keccak_c(768, 384, sha3Padding)(M), {\r\n  ALGORITHM: 'SHA3-384',\r\n  BLOCK_SIZE: 104,\r\n  DIGEST_SIZE: 48,\r\n  OID: '2.16.840.1.101.3.4.2.9',\r\n});\r\n\r\nexport const sha3_512 = createHash((M: Uint8Array) => Keccak_c(1024, 512, sha3Padding)(M), {\r\n  ALGORITHM: 'SHA3-512',\r\n  BLOCK_SIZE: 72,\r\n  DIGEST_SIZE: 64,\r\n  OID: '2.16.840.1.101.3.4.2.10',\r\n});\r\n\r\n/**\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n */\r\nexport function shake128(d: number) {\r\n  return createHash((M: Uint8Array) => Keccak_c(256, d, shakePadding)(M), {\r\n    ALGORITHM: `SHAKE128/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n */\r\nexport function shake256(d: number) {\r\n  return createHash((M: Uint8Array) => Keccak_c(512, d, shakePadding)(M), {\r\n    ALGORITHM: `SHAKE256/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n","import { UTF8 } from '../core/codec';\r\nimport type { Hash, KeyHash } from '../core/hash';\r\nimport { createHash, createKeyHash, createTupleHash } from '../core/hash';\r\nimport { joinBuffer, KitError, U8, u8 } from '../core/utils';\r\nimport type { Sha3Padding } from './sha3';\r\nimport { Keccak_c, shake128, shake256 } from './sha3';\r\n\r\n// * Encode and Padding Function\r\n\r\n/**\r\n * SP.800-185 2.3.1:\r\n *\r\n * 左侧整数编码 / left_encode\r\n *\r\n * Inspired by https://github.com/paulmillr/noble-hashes\r\n *\r\n * ```ts\r\n * leftEncode(0) // Uint8Array(2) [ 1, 0 ]\r\n * leftEncode(18446744073709551615n) // Uint8Array(9) [ 8, 255, 255, 255, 255, 255, 255, 255, 255 ]\r\n * ```\r\n *\r\n * @param {number} x - 输入 / input\r\n */\r\nfunction leftEncode(x: number): Uint8Array {\r\n  const result = [];\r\n  do {\r\n    result.unshift(x & 0xff);\r\n    x = x >> 8;\r\n  } while (x > 0);\r\n  result.unshift(result.length);\r\n  return Uint8Array.from(result);\r\n}\r\n\r\n/**\r\n * SP.800-185 2.3.1:\r\n *\r\n * 右侧整数编码 / right_encode\r\n *\r\n * Inspired by https://github.com/paulmillr/noble-hashes\r\n *\r\n * ```ts\r\n * rightEncode(0) // Uint8Array(2) [ 0, 1 ]\r\n * rightEncode(18446744073709551615n) // Uint8Array(9) [ 255, 255, 255, 255, 255, 255, 255, 255, 8 ]\r\n * ```\r\n *\r\n * @param {number | bigint} x - 输入 / input\r\n */\r\nfunction rightEncode(x: number): Uint8Array {\r\n  const result = [];\r\n  do {\r\n    result.unshift(x & 0xff);\r\n    x = x >> 8;\r\n  } while (x > 0);\r\n  result.push(result.length);\r\n  return Uint8Array.from(result);\r\n}\r\n\r\n/**\r\n * SP.800-185 2.3.2:\r\n *\r\n * 字符编码 / encode_string\r\n *\r\n * 与规范文档不同, 这个实现不会进行串接操作, 而是返回一个数组, 串接操作在外部进行. 详细见 `bytepad` 函数.\r\n *\r\n * Unlike the specification document, this implementation does not perform concatenation operations, but returns an array, and the concatenation operation is performed externally. See `bytepad` function for details.\r\n *\r\n * ```ts\r\n * encodeString(K) // [left_encode(len(K)), K]\r\n * ```\r\n *\r\n * @param {string | Uint8Array} input - 输入 / input\r\n */\r\nfunction encodeString(input: string | Uint8Array) {\r\n  input = typeof input === 'string' ? UTF8(input) : input;\r\n  return [leftEncode(input.byteLength << 3), input];\r\n}\r\n\r\n/**\r\n * SP.800-185 2.3.3:\r\n *\r\n * 在算法中 `bytepad` 涉及很多串接操作, 但对 `Javascript` 实现来说, 每次串接都意味着创建 `Uint8Array` 进行合并. 频繁地创建 `Uint8Array` 有可能导致性能问题.\r\n * 这是一个优化后的实现. 将输入 `X` 改为数组, 最后也返回数组, 将合并操作移动到外部.\r\n *\r\n * The `bytepad` is used by many algorithms which involves many concatenation operations, but for `Javascript` implementation, each concatenation means creating a `Uint8Array` for merging. Frequent creation of `Uint8Array` may cause performance issues.\r\n * This is an optimized implementation. The input `X` is changed to an array, and the final return is also an array. The merge operation is moved to the outside.\r\n *\r\n *\r\n * ```ts\r\n * bytepad(X, w) = left_encode(w) || X0 || ... || Xn || 0^z\r\n * ```\r\n *\r\n * @param {Uint8Array} X - 输入数组 / input array\r\n * @param {number} w - 字节倍数 / byte multiple\r\n */\r\nfunction bytepad(X: Uint8Array[], w: number): Uint8Array[] {\r\n  if (w <= 0) {\r\n    throw new KitError('w must be greater than 0');\r\n  }\r\n\r\n  // 使用 leftEncode 函数编码 w\r\n  const left_encoded_w = leftEncode(w);\r\n\r\n  // z = left_encode(w) || X0 || ... || Xn\r\n\r\n  // 计算 z 的有效字节长度总和, 用于计算填充零字节的数量\r\n  let z_byte = left_encoded_w.length;\r\n  X.forEach((x) => {\r\n    z_byte += x.length;\r\n  });\r\n\r\n  // 计算需要填充的零字节的数量\r\n  const zero_byte = w - (z_byte % w);\r\n\r\n  X.unshift(left_encoded_w);\r\n  X.push(new Uint8Array(zero_byte));\r\n\r\n  return X;\r\n}\r\n\r\n/**\r\n * `cSHAKE` 填充函数 / Padding Function\r\n *\r\n * ```ts\r\n * M || 00 || 10*1\r\n * ```\r\n *\r\n * @param {number} r_byte - 处理速率 / Rate\r\n */\r\nconst cshakePadding: Sha3Padding = (r_byte: number) => {\r\n  return (M: Uint8Array) => {\r\n    const sig_byte = M.length;\r\n    const pad_byte = r_byte - (sig_byte % r_byte);\r\n    const P = new U8(sig_byte + pad_byte);\r\n    P.set(M);\r\n    if (pad_byte === 1) {\r\n      P[sig_byte] = 0x84;\r\n    }\r\n    P[sig_byte] = 0x04;\r\n    P[P.length - 1] |= 0x80;\r\n    return P;\r\n  };\r\n};\r\n\r\n// * cSHAKE\r\n\r\n/**\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} N - 函数名 / Function name\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} c - 安全容量 / capacity (bit)\r\n * @param {number} r_byte - 处理速率 / Rate (byte)\r\n * @param {Hash} SHAKE - SHAKE 函数\r\n */\r\nfunction cshake(d: number, N: Uint8Array, S: Uint8Array, c: number, r_byte: number, SHAKE: typeof shake128) {\r\n  if (N.byteLength === 0 && S.byteLength === 0) {\r\n    return (M: Uint8Array) => SHAKE(d)(M);\r\n  }\r\n  return (M: Uint8Array) => {\r\n    const P = bytepad([...encodeString(N), ...encodeString(S)], r_byte);\r\n    P.push(M);\r\n    return Keccak_c(c, d, cshakePadding)(joinBuffer(...P));\r\n  };\r\n}\r\n\r\n/**\r\n * `cSHAKE128` 是 `SHAKE128` 的可定制变体\r\n *\r\n * `cSHAKE128` is a customizable variant of `SHAKE128`\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} [N] - 函数名 / Function name\r\n * @param {Uint8Array} [S] - 自定义参数 / Customization\r\n */\r\nexport function cshake128(d: number, N = new Uint8Array(), S = new Uint8Array()) {\r\n  return createHash(cshake(d, N, S, 256, 168, shake128), {\r\n    ALGORITHM: `cSHAKE128/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * `cSHAKE256` 是 `SHAKE256` 的可定制变体\r\n *\r\n * `cSHAKE256` is a customizable variant of `SHAKE256`\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} [N] - 函数名 / Function name\r\n * @param {Uint8Array} [S] - 自定义参数 / Customization\r\n */\r\nexport function cshake256(d: number, N = new Uint8Array(), S = new Uint8Array()) {\r\n  return createHash(cshake(d, N, S, 512, 136, shake256), {\r\n    ALGORITHM: `cSHAKE256/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n// * KMAC\r\n\r\n/**\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} c - 安全容量 / capacity (bit)\r\n * @param {number} r_byte - 处理速率 / Rate (byte)\r\n * @param {boolean} XOF - 是否为 XOF 模式 / XOF mode\r\n */\r\nfunction kmac(d: number, S: Uint8Array, c: number, r_byte: number, XOF: boolean) {\r\n  return (K: Uint8Array, M: Uint8Array) => {\r\n    const X = bytepad([...encodeString('KMAC'), ...encodeString(S)], r_byte);\r\n    X.push(...bytepad(encodeString(K), r_byte));\r\n    X.push(M);\r\n    X.push(rightEncode(XOF ? 0 : d));\r\n    return Keccak_c(c, d, cshakePadding)(joinBuffer(...X));\r\n  };\r\n}\r\n\r\n/**\r\n * Keccak 消息认证码 (KMAC) 算法\r\n * `KMAC128` 是 `KMAC` 的变体, 由 `cSHAKE128` 构建\r\n *\r\n * The Keccak Message Authentication Code (KMAC) algorithm\r\n * `KMAC128` is a variant of `KMAC`, build from `cSHAKE128`\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} k_size - 推荐密钥大小 / Recommended key size (bit)\r\n */\r\nexport function kmac128(d: number, S = new Uint8Array(0), k_size: number = 128): KeyHash {\r\n  return createKeyHash(kmac(d, S, 256, 168, false), {\r\n    ALGORITHM: `KMAC128/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n    KEY_SIZE: k_size >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * Keccak 消息认证码 (KMAC) 算法\r\n * `KMAC256` 是 `KMAC` 的变体, 由 `cSHAKE256` 构建\r\n *\r\n * The Keccak Message Authentication Code (KMAC) algorithm\r\n * `KMAC256` is a variant of `KMAC`, build from `cSHAKE256`\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} k_size - 推荐密钥大小 / Recommended key size (bit)\r\n */\r\nexport function kmac256(d: number, S = new Uint8Array(0), k_size: number = 256): KeyHash {\r\n  return createKeyHash(kmac(d, S, 512, 136, false), {\r\n    ALGORITHM: `KMAC256/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n    KEY_SIZE: k_size >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * 可变长度输出的 `KMAC`\r\n * `KMAC128XOF` 是 `KMAC128` 的 XOF 模式, 由 `cSHAKE128` 构建\r\n *\r\n * `KMAC` with Arbitrary-Length Output\r\n * `KMAC128XOF` is a XOF mode of `KMAC128`, build from `cSHAKE128`\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} k_size - 推荐密钥大小 / Recommended key size (bit)\r\n */\r\nexport function kmac128XOF(d: number, S = new Uint8Array(0), k_size: number = 128): KeyHash {\r\n  return createKeyHash(kmac(d, S, 256, 168, true), {\r\n    ALGORITHM: `KMAC128XOF/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n    KEY_SIZE: k_size >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * 可变长度输出的 `KMAC`\r\n * `KMAC256XOF` 是 `KMAC256` 的 XOF 模式, 由 `cSHAKE256` 构建\r\n *\r\n * `KMAC` with Arbitrary-Length Output\r\n * `KMAC256XOF` is a XOF mode of `KMAC256`, build from `cSHAKE256`\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} k_size - 推荐密钥大小 / recommended key size (bit)\r\n */\r\nexport function kmac256XOF(d: number, S = new Uint8Array(0), k_size: number = 256): KeyHash {\r\n  return createKeyHash(kmac(d, S, 512, 136, true), {\r\n    ALGORITHM: `KMAC256XOF/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n    KEY_SIZE: k_size >> 3,\r\n  });\r\n}\r\n\r\n// * TupleHash\r\n\r\n/**\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} c - 安全容量 / capacity (bit)\r\n * @param {number} r_byte - 处理速率 / Rate (byte)\r\n * @param {boolean} XOF - 是否为 XOF 模式 / XOF mode\r\n */\r\nfunction tuplehash(d: number, S: Uint8Array, c: number, r_byte: number, XOF: boolean) {\r\n  return (M: Uint8Array[]) => {\r\n    const X = bytepad([...encodeString('TupleHash'), ...encodeString(S)], r_byte);\r\n    M.forEach((m) => {\r\n      X.push(...encodeString(m));\r\n    });\r\n    X.push(rightEncode(XOF ? 0 : d));\r\n    return Keccak_c(c, d, cshakePadding)(joinBuffer(...X));\r\n  };\r\n}\r\n\r\n/**\r\n * `TupleHash` 是一个具有可变长度输出的 `SHA3` 派生散列函数, 旨在以一种明确的方式简单地散列输入字符串的元组, 这些字符串中的任何一个或全部都可以是空字符串.\r\n *\r\n * `TupleHash` is a `SHA3` derived hash function with variable-length output that is designed to simply hash a tuple of input strings, any or all of which may be empty strings, in an unambiguous way.\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function tuplehash128(d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createTupleHash(tuplehash(d, S, 256, 168, false), {\r\n    ALGORITHM: `TupleHash128/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * `TupleHash` 是一个具有可变长度输出的 `SHA3` 派生散列函数, 旨在以一种明确的方式简单地散列输入字符串的元组, 这些字符串中的任何一个或全部都可以是空字符串.\r\n *\r\n * `TupleHash` is a `SHA3` derived hash function with variable-length output that is designed to simply hash a tuple of input strings, any or all of which may be empty strings, in an unambiguous way.\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function tuplehash256(d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createTupleHash(tuplehash(d, S, 512, 136, false), {\r\n    ALGORITHM: `TupleHash256/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * 可变长度输出的 `TupleHash`\r\n *\r\n * `TupleHash` with Arbitrary-Length Output\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function tuplehash128XOF(d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createTupleHash(tuplehash(d, S, 256, 168, true), {\r\n    ALGORITHM: `TupleHash128XOF/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * 可变长度输出的 `TupleHash`\r\n *\r\n * `TupleHash` with Arbitrary-Length Output\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function tuplehash256XOF(d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createTupleHash(tuplehash(d, S, 512, 136, true), {\r\n    ALGORITHM: `TupleHash256XOF/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n// * ParallelHash\r\n\r\n// ! Note: This ParallelHash does not actually perform parallel computation, because writing multi-threaded in JavaScript is not easy.\r\n// ! 注意: 此 ParallelHash 实际上并不执行并行计算, 因为在 JavaScript 写多线程并不轻松.\r\n\r\n// TODO 计划引入 `multithreading` 依赖, 实现真正的并行计算\r\n\r\n/**\r\n * @param {number} b - 状态大小 / State size (bit)\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n * @param {number} c - 安全容量 / capacity (bit)\r\n * @param {number} r_byte - 处理速率 / Rate (byte)\r\n * @param {boolean} XOF - 是否为 XOF 模式 / XOF mode\r\n */\r\nfunction parallelhash(b: number, d: number, S: Uint8Array, c: number, r_byte: number, XOF: boolean, SHAKE: Hash) {\r\n  const bByte = b >> 3;\r\n  return (M: Uint8Array) => {\r\n    const n = Math.ceil(M.byteLength / bByte);\r\n    const X = bytepad([...encodeString('ParallelHash'), ...encodeString(S)], r_byte);\r\n    X.push(leftEncode(b));\r\n\r\n    for (let i = 0; i < n; i++) {\r\n      const B = u8(M).slice(i * (b << 3), (i + 1) * (b << 3));\r\n      X.push(SHAKE(B));\r\n    }\r\n\r\n    X.push(rightEncode(n));\r\n    X.push(rightEncode(XOF ? 0 : d));\r\n\r\n    return Keccak_c(c, d, cshakePadding)(joinBuffer(...X));\r\n  };\r\n}\r\n\r\n/**\r\n * `ParallelHash` 的目的是利用现代处理器中可用的并行性, 支持对非常长的字符串进行高效散列.\r\n *\r\n * The purpose of `ParallelHash` is to support the efficient hashing of very long strings, by taking advantage of the parallelism available in modern processors.\r\n *\r\n * @param {number} b - 状态大小 / State size (bit)\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function parallelhash128(b: number, d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createHash(parallelhash(b, d, S, 256, 168, false, shake128(256)), {\r\n    ALGORITHM: `ParallelHash128/${d}`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * `ParallelHash` 的目的是利用现代处理器中可用的并行性, 支持对非常长的字符串进行高效散列.\r\n *\r\n * The purpose of `ParallelHash` is to support the efficient hashing of very long strings, by taking advantage of the parallelism available in modern processors.\r\n *\r\n * @param {number} b - 状态大小 / State size (bit)\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function parallelhash256(b: number, d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createHash(parallelhash(b, d, S, 512, 136, false, shake256(512)), {\r\n    ALGORITHM: `ParallelHash256/${d}`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * 可变长度输出的 `ParallelHash`\r\n *\r\n * `ParallelHash` with Arbitrary-Length Output\r\n *\r\n * @param {number} b - 状态大小 / State size (bit)\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function parallelhash128XOF(b: number, d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createHash(parallelhash(b, d, S, 256, 168, true, shake128(256)), {\r\n    ALGORITHM: `ParallelHash128XOF`,\r\n    BLOCK_SIZE: 168,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * 可变长度输出的 `ParallelHash`\r\n *\r\n * `ParallelHash` with Arbitrary-Length Output\r\n *\r\n * @param {number} b - 状态大小 / State size (bit)\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} S - 自定义参数 / Customization\r\n */\r\nexport function parallelhash256XOF(b: number, d: number, S: Uint8Array = new Uint8Array()) {\r\n  return createHash(parallelhash(b, d, S, 512, 136, true, shake256(512)), {\r\n    ALGORITHM: `ParallelHash256XOF`,\r\n    BLOCK_SIZE: 136,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n","import { createHash } from '../core/hash';\r\nimport { KitError, U8 } from '../core/utils';\r\nimport type { SpongePadding } from './keccak1600';\r\nimport { keccak_p_1600, sponge_1600 } from './keccak1600';\r\n\r\n/**\r\n * turboSHAKE 填充函数 / Padding Function\r\n *\r\n * ```ts\r\n * M || D || 0x00*\r\n * ```\r\n *\r\n * @param {number} rByte - 处理速率 / Rate\r\n * @param {number} D - 域分隔符 / Domain Separator\r\n */\r\nfunction turboShakePadding(rByte: number, D: number): SpongePadding {\r\n  return (M: Uint8Array) => {\r\n    const sig_byte = M.length + 1;\r\n    const block = Math.ceil(sig_byte / rByte);\r\n    const P = new U8(block * rByte);\r\n    P.set(M);\r\n    P[M.length] = D;\r\n    P[P.length - 1] ^= 0x80;\r\n    return P;\r\n  };\r\n}\r\n\r\n/**\r\n * TurboSHAKE128\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {number} [D] - 域分隔符 / Domain Separator (range: 0x01 ~ 0x7F, default: 0x1F)\r\n */\r\nexport function turboshake128(d: number, D = 0x1f) {\r\n  if (D < 0x01 || D > 0x7f) {\r\n    throw new KitError('Invalid Domain Separator');\r\n  }\r\n  const d_byte = d >> 3;\r\n  const r_byte = 168;\r\n  const f = keccak_p_1600(12);\r\n  const pad = turboShakePadding(r_byte, D);\r\n  return createHash((M: Uint8Array) => sponge_1600(r_byte, d_byte, pad, f)(M), {\r\n    ALGORITHM: `TurboSHAKE128/${d}`,\r\n    BLOCK_SIZE: r_byte,\r\n    DIGEST_SIZE: d_byte,\r\n  });\r\n}\r\n\r\n/**\r\n * TurboSHAKE256\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {number} [D] - 域分隔符 / Domain Separator (range: 0x01 ~ 0x7F, default: 0x1F)\r\n */\r\nexport function turboshake256(d: number, D = 0x1f) {\r\n  if (D < 0x01 || D > 0x7f) {\r\n    throw new KitError('Invalid Domain Separator');\r\n  }\r\n  const d_byte = d >> 3;\r\n  const r_byte = 136;\r\n  const f = keccak_p_1600(12);\r\n  const pad = turboShakePadding(r_byte, D);\r\n  return createHash((M: Uint8Array) => sponge_1600(r_byte, d_byte, pad, f)(M), {\r\n    ALGORITHM: `TurboSHAKE256/${d}`,\r\n    BLOCK_SIZE: r_byte,\r\n    DIGEST_SIZE: d_byte,\r\n  });\r\n}\r\n","import { createHash } from '../core/hash';\r\nimport { joinBuffer } from '../core/utils';\r\nimport { turboshake128, turboshake256 } from './turboSHAKE';\r\n\r\nfunction lengthEncode(x: number): Uint8Array {\r\n  const S: number[] = [];\r\n  while (x > 0) {\r\n    S.unshift(x & 0xff);\r\n    x >>= 8;\r\n  }\r\n  S.push(S.length);\r\n  return new Uint8Array(S);\r\n}\r\n\r\n/**\r\n * KangarooTwelve\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} C - 自定义参数 / Customization\r\n * @param {typeof turboshake128} SHAKE - TurboSHAKE 函数 / Function\r\n * @param {number} cv - 中间压缩值长度 / Compressed Value Size (bit)\r\n */\r\nfunction kt(d: number, C: Uint8Array, SHAKE: typeof turboshake128, cv: number) {\r\n  return (M: Uint8Array) => {\r\n    const length_encode = lengthEncode(C.length);\r\n    const S = joinBuffer(M, C, length_encode);\r\n    if (S.length <= 8192) {\r\n      return SHAKE(d, 0x07)(S);\r\n    } else {\r\n      // KangarooTwelve hopping\r\n      const FinalNode: Uint8Array[] = [];\r\n      FinalNode.push(S.slice(0, 8192));\r\n      FinalNode.push(new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));\r\n      let offset = 8192;\r\n      let num_block = 0;\r\n      while (offset < S.length) {\r\n        const end = offset + 8192;\r\n        const CV = SHAKE(cv, 0x0b)(S.slice(offset, end));\r\n        FinalNode.push(CV);\r\n        offset = end;\r\n        num_block++;\r\n      }\r\n      FinalNode.push(lengthEncode(num_block));\r\n      FinalNode.push(new Uint8Array([0xff, 0xff]));\r\n      return SHAKE(d, 0x06)(joinBuffer(...FinalNode));\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * KangarooTwelve 128\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} [C] - 自定义参数 / Customization\r\n */\r\nexport function kt128(d: number, C = new Uint8Array()) {\r\n  return createHash(kt(d, C, turboshake128, 256), {\r\n    ALGORITHM: `KangarooTwelve128/${d}`,\r\n    BLOCK_SIZE: 8192,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n\r\n/**\r\n * KangarooTwelve 256\r\n *\r\n * @param {number} d - 输出长度 / Digest Size (bit)\r\n * @param {Uint8Array} [C] - 自定义参数 / Customization\r\n */\r\nexport function kt256(d: number, C = new Uint8Array()) {\r\n  return createHash(kt(d, C, turboshake256, 512), {\r\n    ALGORITHM: `KangarooTwelve256/${d}`,\r\n    BLOCK_SIZE: 8192,\r\n    DIGEST_SIZE: d >> 3,\r\n  });\r\n}\r\n","import type { Hash, KeyHash, KeyHashDescription } from '../core/hash';\r\nimport { createKeyHash } from '../core/hash';\r\nimport { joinBuffer } from '../core/utils';\r\n\r\nfunction _hmac(hash: Hash, K: Uint8Array, M: Uint8Array) {\r\n  const { BLOCK_SIZE } = hash;\r\n\r\n  const K0 = new Uint8Array(BLOCK_SIZE);\r\n  K0.set(K.length > BLOCK_SIZE ? hash(K) : K);\r\n  const iPad = K0.map((byte) => byte ^ 0x36);\r\n  const oPad = K0.map((byte) => byte ^ 0x5c);\r\n\r\n  const innerBuffer = hash(joinBuffer(iPad, M));\r\n  const outerBuffer = hash(joinBuffer(oPad, innerBuffer));\r\n\r\n  return outerBuffer;\r\n}\r\n\r\n/**\r\n * FIPS.198-1: 散列消息认证码 (HMAC).\r\n * 如果 `d_size` 大于散列算法的摘要大小, 则回退到散列算法的摘要大小.\r\n *\r\n * FIPS.198-1: The Keyed-Hash Message Authentication Code (HMAC).\r\n * If `d_size` is larger than the hash algorithm's digest size, fallback to the hash algorithm's digest size.\r\n *\r\n * @param {Hash} hash - 散列算法 / hash algorithm\r\n * @param {number} [d_size] - 摘要大小 (bit) / digest size (bit)\r\n * @param {number} [k_size] - 推荐密钥大小 (bit) / recommended key size (bit)\r\n */\r\nexport function hmac(hash: Hash, d_size?: number, k_size?: number): KeyHash {\r\n  const { ALGORITHM, BLOCK_SIZE, DIGEST_SIZE } = hash;\r\n  d_size = d_size ? Math.min(d_size >> 3, DIGEST_SIZE) : DIGEST_SIZE;\r\n  k_size = k_size ? k_size >> 3 : DIGEST_SIZE;\r\n  const description: KeyHashDescription = {\r\n    ALGORITHM: `HMAC-${ALGORITHM}-${d_size << 3}`,\r\n    BLOCK_SIZE,\r\n    DIGEST_SIZE: d_size,\r\n    KEY_SIZE: k_size,\r\n  };\r\n  return createKeyHash(\r\n    (K: Uint8Array, M: Uint8Array) => _hmac(hash, K, M).slice(0, d_size),\r\n    description,\r\n  );\r\n}\r\n","import type { KeyHash } from '../core/hash';\r\nimport { U8 } from '../core/utils';\r\nimport { hmac } from './hmac';\r\nimport { sha1 } from './sha1';\r\n\r\n/**\r\n * 生成 HOTP (基于计数的一次性密码)\r\n *\r\n * Generate HOTP (HMAC-based One-Time Password)\r\n *\r\n * @param {Uint8Array} secret - 密钥 / Secret key\r\n * @param {Uint8Array} counter - 计数器 / Counter\r\n * @param {KeyHash} mac - 带密钥的加密散列算法 / Keyed Hashing Algorithm (default: HMAC-SHA1)\r\n * @returns {U8} - 返回的 HOTP 字节数组 / HOTP byte array\r\n */\r\nfunction hotp(secret: Uint8Array, counter: Uint8Array, mac: KeyHash = hmac(sha1)): U8 {\r\n  const HS = mac(secret, counter);\r\n  const offset = HS[HS.length - 1] & 0x0f;\r\n  return HS.slice(offset, offset + 4);\r\n}\r\n\r\ninterface TOTP {\r\n  /**\r\n   * 生成 TOTP (时间同步的一次性密码)\r\n   *\r\n   * Generate TOTP (Time-based One-Time Password)\r\n   *\r\n   * @param {Uint8Array} secret - 密钥 / Secret key\r\n   * @returns {string} - 返回的 TOTP 字符串 / TOTP string\r\n   */\r\n  (secret: Uint8Array): string;\r\n}\r\n\r\ninterface TOTPParams {\r\n  /**\r\n   * 带密钥的加密散列算法 / Keyed Hashing Algorithm (default: HMAC-SHA1)\r\n   */\r\n  mac?: KeyHash;\r\n  /**\r\n   * 当前时间戳 / Current timestamp (default: Date.now() milliseconds)\r\n   *\r\n   * 指定此参数时，将不再从 `Date.now()` 获取当前时间戳.\r\n   *\r\n   * When this parameter is specified, the current timestamp will not be obtained from `Date.now()`.\r\n   */\r\n  current?: number;\r\n  /**\r\n   * 纪元时间戳 / Epoch timestamp (default: 0 milliseconds)\r\n   */\r\n  epoch?: number;\r\n  /**\r\n   * 时间步长 / Time step (default: 30000 milliseconds)\r\n   */\r\n  step?: number;\r\n  /**\r\n   * 计数器 / Counter\r\n   *\r\n   * `counter = (cuttent_time - epoch_time) / step`\r\n   *\r\n   * 指定此参数时，将不再从当前时间戳计算计数器.\r\n   *\r\n   * When this parameter is specified, the counter will not be calculated from the current timestamp.\r\n   */\r\n  counter?: number | bigint | Uint8Array;\r\n  /**\r\n   * 返回的数字位数 / Number of digits in the returned OTP (default: 6)\r\n   */\r\n  digits?: number;\r\n}\r\n\r\n/**\r\n * 生成 TOTP (时间同步的一次性密码)\r\n *\r\n * Generate TOTP (Time-based One-Time Password)\r\n *\r\n * @param {Uint8Array} secret - 密钥 / Secret key\r\n * @returns {string} - 返回的 TOTP 字符串 / TOTP string\r\n */\r\nexport function totp(secret: Uint8Array): string;\r\n/**\r\n * 创建 TOTP 函数 / Create a TOTP function\r\n *\r\n * @param {TOTPParams} params - TOTP 参数 / TOTP parameters\r\n * @returns {TOTP} - 返回的 TOTP 函数 / TOTP function\r\n */\r\nexport function totp(params: TOTPParams): TOTP;\r\nexport function totp(args: Uint8Array | TOTPParams) {\r\n  if (args instanceof Uint8Array) {\r\n    const K = args;\r\n    const C = U8.fromBI(BigInt(Math.floor(Date.now() / 30000)), 8, false);\r\n    const HS = hotp(K, C, hmac(sha1));\r\n    const OTP =\r\n      0 | ((HS[0] & 0x7f) << 24) | ((HS[1] & 0xff) << 16) | ((HS[2] & 0xff) << 8) | (HS[3] & 0xff);\r\n    return (OTP % 1_000_000).toString().padStart(6, '0');\r\n  }\r\n\r\n  return (secret: Uint8Array) => {\r\n    let {\r\n      mac = hmac(sha1),\r\n      current = Date.now(),\r\n      epoch = 0,\r\n      step = 30000,\r\n      counter = 0,\r\n      digits = 6,\r\n    } = args || {};\r\n\r\n    if (!counter) {\r\n      const T = BigInt(Math.floor((current - epoch) / step));\r\n      counter = U8.fromBI(T, 8, false);\r\n    }\r\n    if (!(counter instanceof Uint8Array)) {\r\n      counter = U8.fromBI(BigInt(counter), 8, false);\r\n    }\r\n\r\n    const BIN = hotp(secret, counter, mac);\r\n    const OTP =\r\n      0 |\r\n      ((BIN[0] & 0x7f) << 24) |\r\n      ((BIN[1] & 0xff) << 16) |\r\n      ((BIN[2] & 0xff) << 8) |\r\n      (BIN[3] & 0xff);\r\n    return (OTP % 10 ** digits).toString().padStart(digits, '0');\r\n  };\r\n}\r\n","import { Counter, joinBuffer, KitError, U8, u8, wrap } from './utils';\r\n\r\n// * 公共接口\r\n\r\nexport interface Cipherable {\r\n  /**\r\n   * @param {Uint8Array} plaintext - 明文 / plaintext\r\n   */\r\n  encrypt: (plaintext: Uint8Array) => U8;\r\n  /**\r\n   * @param {Uint8Array} ciphertext - 密文 / ciphertext\r\n   */\r\n  decrypt: (ciphertext: Uint8Array) => U8;\r\n}\r\n\r\nexport interface CipherInfo {\r\n  ALGORITHM: string;\r\n  /** 推荐的密钥大小 / Recommended key size (byte) */\r\n  KEY_SIZE: number;\r\n  /** 最小密钥大小 / Minimum key size (byte) */\r\n  MIN_KEY_SIZE: number;\r\n  /** 最大密钥大小 / Maximum key size (byte) */\r\n  MAX_KEY_SIZE: number;\r\n}\r\nexport interface IVCipherInfo extends CipherInfo {\r\n  /** 推荐的 IV 大小 / Recommended IV size (byte) */\r\n  IV_SIZE: number;\r\n  /** 最小 IV 大小 / Minimum IV size (byte) */\r\n  MIN_IV_SIZE: number;\r\n  /** 最大 IV 大小 / Maximum IV size (byte) */\r\n  MAX_IV_SIZE: number;\r\n}\r\nexport interface Cipher {\r\n  /**\r\n   * @param {Uint8Array} key - 密钥 / Key\r\n   */\r\n  (key: Uint8Array): Cipherable;\r\n}\r\nexport interface IVCipher {\r\n  /**\r\n   * @param {Uint8Array} key - 密钥 / Key\r\n   * @param {Uint8Array} iv - 初始化向量 / Initialization Vector\r\n   */\r\n  (key: Uint8Array, iv: Uint8Array): Cipherable;\r\n}\r\n\r\n// * 对称密钥算法包装器\r\n\r\nexport interface BlockCipherInfo extends CipherInfo {\r\n  /** 分组大小 / Block size (byte) */\r\n  BLOCK_SIZE: number;\r\n}\r\nexport interface BlockCipher extends BlockCipherInfo {\r\n  /**\r\n   * @param {Uint8Array} key - 密钥 / Key\r\n   */\r\n  (key: Uint8Array): Cipherable & BlockCipherInfo;\r\n}\r\nexport interface StreamCipherInfo extends CipherInfo {}\r\nexport interface StreamCipher extends StreamCipherInfo {\r\n  /**\r\n   * @param {Uint8Array} key - 密钥 / Key\r\n   */\r\n  (key: Uint8Array): Cipherable & StreamCipherInfo;\r\n}\r\nexport interface IVStreamCipherInfo extends IVCipherInfo {}\r\nexport interface IVStreamCipher extends IVStreamCipherInfo {\r\n  /**\r\n   * @param {Uint8Array} key - 密钥 / Key\r\n   * @param {Uint8Array} iv - 初始化向量 / Initialization Vector\r\n   */\r\n  (key: Uint8Array, iv: Uint8Array): Cipherable & IVStreamCipherInfo;\r\n}\r\n\r\nexport function createCipher(algorithm: Cipher, description: BlockCipherInfo): BlockCipher;\r\nexport function createCipher(algorithm: Cipher, description: StreamCipherInfo): StreamCipher;\r\nexport function createCipher(algorithm: IVCipher, description: IVStreamCipherInfo): IVStreamCipher;\r\nexport function createCipher(\r\n  algorithm: Cipher | IVCipher,\r\n  description: BlockCipherInfo | StreamCipherInfo | IVStreamCipherInfo,\r\n) {\r\n  return wrap((key: Uint8Array, iv: Uint8Array) => wrap(algorithm(key, iv), description), description);\r\n}\r\n\r\n// * 填充方案包装器\r\n\r\nexport interface DoPad {\r\n  /**\r\n   * 添加填充 / add padding\r\n   * @param {Uint8Array} M - 消息 / Message\r\n   * @param {number} BLOCK_SIZE - 分组大小 / Block size\r\n   */\r\n  (M: Uint8Array, BLOCK_SIZE: number): U8;\r\n}\r\nexport interface UnPad {\r\n  /**\r\n   * 移除填充 / remove padding\r\n   * @param {Uint8Array} P - 填充消息 / Padded message\r\n   */\r\n  (P: Uint8Array): U8;\r\n}\r\nexport interface PaddingInfo {\r\n  ALGORITHM: string;\r\n}\r\nexport interface Padding extends DoPad, UnPad, PaddingInfo {}\r\nexport function createPadding(doPad: DoPad, unPad: UnPad, description: PaddingInfo): Padding {\r\n  return wrap(\r\n    (M: Uint8Array, BLOCK_SIZE?: number) => (typeof BLOCK_SIZE === 'number' ? doPad(M, BLOCK_SIZE) : unPad(M)),\r\n    description,\r\n  );\r\n}\r\n\r\n// * 填充方案\r\n\r\n/** PKCS7 填充方案 / Padding Scheme */\r\nexport const PKCS7_PAD = createPadding(\r\n  (M: Uint8Array, BLOCK_SIZE: number) => {\r\n    const pad = BLOCK_SIZE - (M.length % BLOCK_SIZE);\r\n    return joinBuffer(M, new Uint8Array(pad).fill(pad));\r\n  },\r\n  (P: Uint8Array) => {\r\n    const pad = P[P.length - 1];\r\n    return new U8(P.slice(0, P.length - pad));\r\n  },\r\n  { ALGORITHM: 'PKCS#7' },\r\n);\r\n\r\n/** ISO/IEC 7816 填充方案 / Padding Scheme */\r\nexport const ISO7816_PAD = createPadding(\r\n  (M: Uint8Array, BLOCK_SIZE: number) => {\r\n    const BLOCK_TOTAL = Math.ceil((M.length + 1) / BLOCK_SIZE);\r\n    const P = new U8(BLOCK_TOTAL * BLOCK_SIZE);\r\n    P.set(M);\r\n    P[M.length] = 0x80;\r\n    return P;\r\n  },\r\n  (P: Uint8Array) => {\r\n    let i = P.length - 1;\r\n    while (P[i] === 0x80) {\r\n      i = i - 1;\r\n      if (i < 0) {\r\n        console.warn('This message may not be ISO/IEC 7816-4 padded');\r\n        return new U8();\r\n      }\r\n    }\r\n    return new U8(P.slice(0, i + 1));\r\n  },\r\n  { ALGORITHM: 'ISO/IEC 7816-4' },\r\n);\r\n\r\n/** ANSI X9.23 填充方案 / Padding Scheme */\r\nexport const X923_PAD = createPadding(\r\n  (M: Uint8Array, BLOCK_SIZE: number) => {\r\n    const BLOCK_TOTAL = Math.ceil((M.length + 1) / BLOCK_SIZE);\r\n    const P = new U8(BLOCK_TOTAL * BLOCK_SIZE);\r\n    P.set(M);\r\n    P[P.length - 1] = P.length - M.length;\r\n    return P;\r\n  },\r\n  (P: Uint8Array) => {\r\n    const pad = P[P.length - 1];\r\n    return new U8(P.slice(0, P.length - pad));\r\n  },\r\n  { ALGORITHM: 'ANSI X9.23' },\r\n);\r\n\r\n/** Zero 零填充方案 / Padding Scheme */\r\nexport const ZERO_PAD = createPadding(\r\n  (M: Uint8Array, BLOCK_SIZE: number) => {\r\n    const pad = BLOCK_SIZE - (M.length % BLOCK_SIZE);\r\n    return joinBuffer(M, new Uint8Array(pad));\r\n  },\r\n  (P: Uint8Array) => {\r\n    let i = P.length - 1;\r\n    while (P[i] === 0) {\r\n      i = i - 1;\r\n      if (i < 0) {\r\n        return new U8();\r\n      }\r\n    }\r\n    return new U8(P.slice(0, i + 1));\r\n  },\r\n  { ALGORITHM: 'Zero Padding' },\r\n);\r\n\r\n/** 无填充 / No Padding */\r\nexport const NO_PAD = createPadding(\r\n  (M: Uint8Array) => new U8(M.slice(0)),\r\n  (P: Uint8Array) => new U8(P.slice(0)),\r\n  { ALGORITHM: 'No Padding' },\r\n);\r\n\r\n// * 工作模式\r\n\r\nexport interface ModeBaseInfo {\r\n  ALGORITHM: string;\r\n}\r\nexport interface ModeInfo extends BlockCipherInfo {\r\n  /** 填充方案 / Padding Scheme */\r\n  PADDING: Padding;\r\n  /** 推荐的 IV 大小 / Recommended IV size (byte) */\r\n  IV_SIZE: number;\r\n  /** 最小 IV 大小 / Minimum IV size (byte) */\r\n  MIN_IV_SIZE: number;\r\n  /** 最大 IV 大小 / Maximum IV size (byte) */\r\n  MAX_IV_SIZE: number;\r\n}\r\nexport interface Mode extends ModeBaseInfo {\r\n  /**\r\n   * @param {BlockCipher} cipher - 分组加密算法 / Block cipher\r\n   * @param {Padding} padding - 填充方案 / Padding Scheme (default: PKCS7)\r\n   */\r\n  (\r\n    cipher: BlockCipher,\r\n    padding?: Padding,\r\n  ): {\r\n    /**\r\n     * @param {Uint8Array} key - 密钥 / Key\r\n     * @param {Uint8Array} iv - 初始化向量 / Initialization Vector\r\n     */\r\n    (key: Uint8Array, iv: Uint8Array): Cipherable & ModeInfo;\r\n  } & ModeInfo;\r\n}\r\n\r\nexport interface ECBMode extends ModeBaseInfo {\r\n  /**\r\n   * @param {BlockCipher} cipher - 分组加密算法 / Block cipher\r\n   * @param {Padding} padding - 填充方案 / Padding Scheme (default: PKCS7)\r\n   */\r\n  (\r\n    cipher: BlockCipher,\r\n    padding?: Padding,\r\n  ): {\r\n    /**\r\n     * ECB 不使用 IV, 如果提供 IV, 将被忽略. 仅为与其他模式兼容\r\n     *\r\n     * ECB do not use IV, if you provide IV, it will be ignored. It is only for compatibility with other Modes\r\n     *\r\n     * @param {Uint8Array} key - 密钥 / Key\r\n     * @param {Uint8Array} [iv] - 初始化向量 / Initialization Vector\r\n     */\r\n    (key: Uint8Array, iv?: Uint8Array): Cipherable & ModeInfo;\r\n  } & ModeInfo;\r\n}\r\n/** 电子密码本模式 / Electronic Code Book Mode */\r\nexport const ecb = wrap<ECBMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD) => {\r\n    const info: ModeInfo = {\r\n      ALGORITHM: `ECB-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: 0,\r\n      MIN_IV_SIZE: 0,\r\n      MAX_IV_SIZE: 0,\r\n    };\r\n    const suite = (K: Uint8Array) => {\r\n      K = u8(K);\r\n      const { BLOCK_SIZE } = cipher;\r\n      const c = cipher(K);\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        const C = new U8(P.length);\r\n        for (let start = 0, end = BLOCK_SIZE; start < P.length; ) {\r\n          const B = P.subarray(start, end);\r\n          C.set(c.encrypt(B), start);\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return C;\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        if (C.length % BLOCK_SIZE !== 0) {\r\n          throw new KitError('Decryption error');\r\n        }\r\n        const P = new U8(C.length);\r\n        for (let start = 0, end = BLOCK_SIZE; start < C.length; ) {\r\n          const B = C.subarray(start, end);\r\n          P.set(c.decrypt(B), start);\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return padding(P);\r\n      };\r\n      return wrap({ encrypt, decrypt }, info);\r\n    };\r\n    return wrap(suite, info);\r\n  },\r\n  { ALGORITHM: 'ECB' },\r\n);\r\n\r\nexport interface CBCMode extends Mode {}\r\n/** 密码块链接模式 / Cipher Block Chaining Mode */\r\nexport const cbc = wrap<CBCMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD) => {\r\n    const info: ModeInfo = {\r\n      ALGORITHM: `CBC-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: cipher.BLOCK_SIZE,\r\n      MIN_IV_SIZE: cipher.BLOCK_SIZE,\r\n      MAX_IV_SIZE: cipher.BLOCK_SIZE,\r\n    };\r\n    const suite = (K: Uint8Array, iv: Uint8Array) => {\r\n      K = u8(K);\r\n      iv = u8(iv);\r\n      // iv 检查\r\n      const { BLOCK_SIZE } = cipher;\r\n      if (iv.length !== BLOCK_SIZE) {\r\n        throw new KitError(`${info.ALGORITHM} iv must be ${BLOCK_SIZE} byte`);\r\n      }\r\n      const c = cipher(K);\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        const C = new U8(P.length);\r\n        let prev = iv.slice(0);\r\n        for (let start = 0, end = BLOCK_SIZE; start < P.length; ) {\r\n          const B = P.subarray(start, end);\r\n          prev.forEach((_, i) => {\r\n            prev[i] ^= B[i];\r\n          });\r\n          prev = c.encrypt(prev);\r\n          C.set(prev, start);\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return C;\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        if (C.length % BLOCK_SIZE !== 0) {\r\n          throw new KitError('Decryption error');\r\n        }\r\n        const P = new U8(C.length);\r\n        let prev = iv.slice(0);\r\n        for (let start = 0, end = BLOCK_SIZE; start < C.length; ) {\r\n          const B = C.slice(start, end);\r\n          c.decrypt(B).forEach((_, i) => {\r\n            prev[i] ^= _;\r\n          });\r\n          P.set(prev, start);\r\n          prev = B;\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return padding(P);\r\n      };\r\n      return wrap({ encrypt, decrypt }, info);\r\n    };\r\n\r\n    return wrap(suite, info);\r\n  },\r\n  { ALGORITHM: 'CBC' },\r\n);\r\n\r\nexport interface PCBCMode extends Mode {}\r\n/** 传播密码块链接模式 / Propagating Cipher Block Chaining Mode */\r\nexport const pcbc = wrap<PCBCMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD) => {\r\n    const info: ModeInfo = {\r\n      ALGORITHM: `PCBC-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: cipher.BLOCK_SIZE,\r\n      MIN_IV_SIZE: cipher.BLOCK_SIZE,\r\n      MAX_IV_SIZE: cipher.BLOCK_SIZE,\r\n    };\r\n    const suite = (K: Uint8Array, IV: Uint8Array) => {\r\n      K = u8(K);\r\n      IV = u8(IV);\r\n      // iv 检查\r\n      const { BLOCK_SIZE } = cipher;\r\n      if (IV.length !== BLOCK_SIZE) {\r\n        throw new KitError(`${info.ALGORITHM} iv must be ${BLOCK_SIZE} byte`);\r\n      }\r\n      const c = cipher(K);\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        const C = new U8(P.length);\r\n        const prev = IV.slice(0);\r\n        for (let start = 0, end = BLOCK_SIZE; start < P.length; ) {\r\n          const B = P.subarray(start, end);\r\n          prev.forEach((_, i) => {\r\n            prev[i] ^= B[i];\r\n          });\r\n          const _C = c.encrypt(prev);\r\n          C.set(_C, start);\r\n          prev.forEach((_, i) => {\r\n            prev[i] = _C[i] ^ B[i];\r\n          });\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return C;\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        if (C.length % BLOCK_SIZE !== 0) {\r\n          throw new KitError('Decryption error');\r\n        }\r\n        const P = new U8(C.length);\r\n        const prev = IV.slice(0);\r\n        for (let start = 0, end = BLOCK_SIZE; start < C.length; ) {\r\n          const B = C.slice(start, end);\r\n          const _P = c.decrypt(B);\r\n          _P.forEach((_, i) => {\r\n            _P[i] ^= prev[i];\r\n          });\r\n          P.set(_P, start);\r\n          B.forEach((_, i) => {\r\n            prev[i] = B[i] ^ _P[i];\r\n          });\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return padding(P);\r\n      };\r\n      return wrap({ encrypt, decrypt }, info);\r\n    };\r\n    return wrap(suite, info);\r\n  },\r\n  { ALGORITHM: 'PCBC' },\r\n);\r\n\r\nexport interface CFBMode extends Mode {}\r\n/** 密码反馈模式 / Cipher Feedback Mode */\r\nexport const cfb = wrap<CFBMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD) => {\r\n    const info: ModeInfo = {\r\n      ALGORITHM: `CFB-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: cipher.BLOCK_SIZE,\r\n      MIN_IV_SIZE: cipher.BLOCK_SIZE,\r\n      MAX_IV_SIZE: cipher.BLOCK_SIZE,\r\n    };\r\n    const suite = (K: Uint8Array, iv: Uint8Array) => {\r\n      K = u8(K);\r\n      iv = u8(iv);\r\n      // iv 检查\r\n      const { BLOCK_SIZE } = cipher;\r\n      if (iv.length !== BLOCK_SIZE) {\r\n        throw new KitError(`${info.ALGORITHM} iv must be ${BLOCK_SIZE} byte`);\r\n      }\r\n      const c = cipher(K);\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        const C = new U8(P.length);\r\n        let prev = iv.slice(0);\r\n        for (let start = 0, end = BLOCK_SIZE; start < P.length; ) {\r\n          const B = P.subarray(start, end);\r\n          prev = c.encrypt(prev);\r\n          prev.forEach((_, i) => {\r\n            prev[i] ^= B[i];\r\n          });\r\n          C.set(prev.subarray(0, B.length), start);\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return C;\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        const P = new U8(C.length);\r\n        let prev = iv.slice(0);\r\n        for (let start = 0, end = BLOCK_SIZE; start < C.length; ) {\r\n          const B = C.subarray(start, end);\r\n          prev = c.encrypt(prev);\r\n          B.forEach((_, i) => {\r\n            prev[i] ^= B[i];\r\n          });\r\n          P.set(prev.subarray(0, B.length), start);\r\n          prev = U8.from(B);\r\n          start = end;\r\n          end += BLOCK_SIZE;\r\n        }\r\n        return padding(P);\r\n      };\r\n      return wrap({ encrypt, decrypt }, info);\r\n    };\r\n    return wrap(suite, info);\r\n  },\r\n  { ALGORITHM: 'CFB' },\r\n);\r\n\r\nexport interface OFBMode extends Mode {}\r\n/** 输出反馈模式 / Output Feedback Mode */\r\nexport const ofb = wrap<OFBMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD) => {\r\n    const info: ModeInfo = {\r\n      ALGORITHM: `OFB-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: cipher.BLOCK_SIZE,\r\n      MIN_IV_SIZE: cipher.BLOCK_SIZE,\r\n      MAX_IV_SIZE: cipher.BLOCK_SIZE,\r\n    };\r\n    const suite = (K: Uint8Array, iv: Uint8Array) => {\r\n      K = u8(K);\r\n      iv = u8(iv);\r\n      // iv 检查\r\n      const { BLOCK_SIZE } = cipher;\r\n      if (iv.length !== BLOCK_SIZE) {\r\n        throw new KitError(`${info.ALGORITHM} iv must be ${BLOCK_SIZE} byte`);\r\n      }\r\n      const c = cipher(K);\r\n      let prev = c.encrypt(iv);\r\n      let S = prev;\r\n      let SByte = BLOCK_SIZE;\r\n      const squeeze = (TByte: number) => {\r\n        if (SByte > TByte) return S;\r\n        const buffer = [S];\r\n        while (SByte < TByte) {\r\n          prev = c.encrypt(prev);\r\n          buffer.push(prev);\r\n          SByte += BLOCK_SIZE;\r\n        }\r\n        S = joinBuffer(...buffer);\r\n        return S;\r\n      };\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        S = squeeze(P.length);\r\n        return P.map((_, i) => _ ^ S[i]);\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        S = squeeze(C.length);\r\n        return padding(C.map((_, i) => _ ^ S[i]));\r\n      };\r\n      return wrap({ encrypt, decrypt }, info);\r\n    };\r\n    return wrap(suite, info);\r\n  },\r\n  { ALGORITHM: 'OFB' },\r\n);\r\n\r\nexport interface CTRMode extends Mode {}\r\n/** 计数器模式 / Counter Mode */\r\nexport const ctr = wrap<CTRMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD) => {\r\n    const info: ModeInfo = {\r\n      ALGORITHM: `CTR-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: cipher.BLOCK_SIZE,\r\n      MIN_IV_SIZE: cipher.BLOCK_SIZE,\r\n      MAX_IV_SIZE: cipher.BLOCK_SIZE,\r\n    };\r\n    const suite = (K: Uint8Array, iv: Uint8Array) => {\r\n      K = u8(K);\r\n      iv = u8(iv);\r\n      // iv 检查\r\n      const { BLOCK_SIZE } = cipher;\r\n      if (iv.length !== BLOCK_SIZE) {\r\n        throw new KitError(`{info.ALGORITHM} iv must be ${BLOCK_SIZE} byte`);\r\n      }\r\n      const c = cipher(K);\r\n      const counter = new Counter(iv.slice(0));\r\n      let S = new U8();\r\n      let SByte = 0;\r\n      const squeeze = (TByte: number) => {\r\n        if (SByte > TByte) return S;\r\n        const buffer = [S];\r\n        while (SByte < TByte) {\r\n          buffer.push(c.encrypt(counter));\r\n          counter.inc();\r\n          SByte += BLOCK_SIZE;\r\n        }\r\n        S = joinBuffer(...buffer);\r\n        return S;\r\n      };\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        S = squeeze(P.length);\r\n        return P.map((_, i) => _ ^ S[i]);\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        S = squeeze(C.length);\r\n        return padding(C.map((_, i) => _ ^ S[i]));\r\n      };\r\n      return wrap({ encrypt, decrypt }, info);\r\n    };\r\n    return wrap(suite, info);\r\n  },\r\n  { ALGORITHM: 'CTR' },\r\n);\r\n\r\nexport interface GCMVerifiable {\r\n  /**\r\n   * @param {Uint8Array} cipherText - 密文 / ciphertext\r\n   * @param {Uint8Array} additional_data - 附加数据 / Additional data\r\n   * @returns {Uint8Array} - 认证标签 / Authentication tag\r\n   */\r\n  sign: (cipherText: Uint8Array, additional_data?: Uint8Array) => U8;\r\n  /**\r\n   * @param {Uint8Array} auth_tag - 认证标签 / Authentication tag\r\n   * @param {Uint8Array} ciphertext - 密文 / ciphertext\r\n   * @param {Uint8Array} additional_data - 附加数据 / Additional data\r\n   */\r\n  verify: (auth_tag: Uint8Array, ciphertext: Uint8Array, additional_data?: Uint8Array) => boolean;\r\n}\r\nexport interface GCMModeInfo extends ModeInfo {\r\n  /**\r\n   * 认证标签大小 / Authentication tag size (byte)\r\n   *\r\n   * @default 16\r\n   */\r\n  AUTH_TAG_SIZE: number;\r\n}\r\nexport interface GCMMode extends ModeBaseInfo {\r\n  /**\r\n   * @param {BlockCipher} cipher - 分组加密算法 / Block cipher\r\n   * @param {Padding} padding - 填充方案 / Padding Scheme (default: PKCS7)\r\n   * @param {number} tag_size - 标签大小 / Authentication tag size (default: 16)\r\n   */\r\n  (\r\n    cipher: BlockCipher,\r\n    padding?: Padding,\r\n    tag_size?: number,\r\n  ): {\r\n    /**\r\n     * @param {Uint8Array} key - 密钥 / Key\r\n     * @param {Uint8Array} iv - 初始化向量 / Initialization Vector\r\n     */\r\n    (key: Uint8Array, iv: Uint8Array): Cipherable & GCMVerifiable & GCMModeInfo;\r\n  } & GCMModeInfo;\r\n}\r\nfunction GF128Mul(X: Uint8Array, Y: Uint8Array) {\r\n  // R: E1000000000000000000000000000000\r\n  const RH = 0xe1n << 56n;\r\n\r\n  const YView = new DataView(Y.buffer, Y.byteOffset, Y.byteLength);\r\n  let VH = YView.getBigUint64(0, false);\r\n  let VL = YView.getBigUint64(8, false);\r\n  let ZH = 0n;\r\n  let ZL = 0n;\r\n\r\n  for (let i = 0; i < 16; i++) {\r\n    const x = X[i];\r\n    for (let j = 7; j >= 0; j--) {\r\n      if ((x >> j) & 1) {\r\n        ZH ^= VH;\r\n        ZL ^= VL;\r\n      }\r\n      const carry = VL & 1n;\r\n      VL = (VH << 63n) | (VL >> 1n);\r\n      VL = VL & 0xffffffffffffffffn;\r\n      VH = VH >> 1n;\r\n      if (carry) VH ^= RH;\r\n    }\r\n  }\r\n\r\n  const Z = new U8(16);\r\n  const ZView = new DataView(Z.buffer, Z.byteOffset, Z.byteLength);\r\n  ZView.setBigUint64(0, ZH, false);\r\n  ZView.setBigUint64(8, ZL, false);\r\n  return Z;\r\n}\r\nfunction GHASH(H: Uint8Array, A: Uint8Array, C: Uint8Array) {\r\n  const A_BLOCK_TOTAL = Math.ceil(A.length / 16);\r\n  const C_BLOCK_TOTAL = Math.ceil(C.length / 16);\r\n  const D = new Uint8Array((A_BLOCK_TOTAL + C_BLOCK_TOTAL + 1) * 16);\r\n  const view = new DataView(D.buffer, D.byteOffset, D.byteLength);\r\n  D.set(A);\r\n  D.set(C, A_BLOCK_TOTAL * 16);\r\n  view.setBigUint64(D.length - 16, BigInt(A.length << 3), false);\r\n  view.setBigUint64(D.length - 8, BigInt(C.length << 3), false);\r\n  let X = new U8(16);\r\n  for (let i = 0; i < D.length; i += 16) {\r\n    const B = D.subarray(i, i + 16);\r\n    X.forEach((_, i) => {\r\n      X[i] ^= B[i];\r\n    });\r\n    X = GF128Mul(H, X);\r\n  }\r\n  return X;\r\n}\r\n/** 伽罗瓦计数器模式 / Galois Counter Mode */\r\nexport const gcm = wrap<GCMMode>(\r\n  (cipher: BlockCipher, padding: Padding = PKCS7_PAD, tag_size: number = 16) => {\r\n    const { BLOCK_SIZE } = cipher;\r\n    if (BLOCK_SIZE !== 16) {\r\n      throw new KitError('GCM cipher block must be 128 bit');\r\n    }\r\n    const info: GCMModeInfo = {\r\n      ALGORITHM: `GCM-${cipher.ALGORITHM}`,\r\n      PADDING: padding,\r\n      BLOCK_SIZE: cipher.BLOCK_SIZE,\r\n      KEY_SIZE: cipher.KEY_SIZE,\r\n      MIN_KEY_SIZE: cipher.MIN_KEY_SIZE,\r\n      MAX_KEY_SIZE: cipher.MAX_KEY_SIZE,\r\n      IV_SIZE: 12,\r\n      MIN_IV_SIZE: 0,\r\n      MAX_IV_SIZE: Infinity,\r\n      AUTH_TAG_SIZE: tag_size,\r\n    };\r\n    const suite = (K: Uint8Array, iv: Uint8Array) => {\r\n      K = u8(K);\r\n      iv = u8(iv);\r\n      const c = cipher(K);\r\n      const H = c.encrypt(new Uint8Array(BLOCK_SIZE));\r\n      let IV = new Counter(16);\r\n      if (iv.length === 12) {\r\n        IV.set(iv);\r\n        IV[15] = 1;\r\n      } else {\r\n        IV = new Counter(GHASH(H, new Uint8Array(), iv.slice(0)));\r\n      }\r\n      let S = c.encrypt(IV);\r\n      let SByte = 0;\r\n      const squeeze = (TByte: number) => {\r\n        if (SByte > TByte) return S;\r\n        const buffer = [S];\r\n        while (SByte < TByte) {\r\n          IV.inc();\r\n          buffer.push(c.encrypt(IV));\r\n          SByte += BLOCK_SIZE;\r\n        }\r\n        S = joinBuffer(...buffer);\r\n        return S;\r\n      };\r\n      const encrypt = (M: Uint8Array) => {\r\n        M = u8(M);\r\n        const P = padding(M, BLOCK_SIZE);\r\n        S = squeeze(P.length);\r\n        return P.map((_, i) => _ ^ S[i + BLOCK_SIZE]);\r\n      };\r\n      const decrypt = (C: Uint8Array) => {\r\n        C = u8(C);\r\n        S = squeeze(C.length);\r\n        return padding(C.map((_, i) => _ ^ S[i + BLOCK_SIZE]));\r\n      };\r\n      const sign = (C: Uint8Array, A: Uint8Array = new Uint8Array()) => {\r\n        C = u8(C);\r\n        A = u8(A);\r\n        const T = GHASH(H, A, C);\r\n        T.forEach((_, i) => {\r\n          T[i] ^= S[i];\r\n        });\r\n        return T.slice(0, tag_size);\r\n      };\r\n      const verify = (T: Uint8Array, C: Uint8Array, A?: Uint8Array) => {\r\n        T = u8(T);\r\n        C = u8(C);\r\n        A = A ? u8(A) : undefined;\r\n        if (T.length !== tag_size) return false;\r\n        const T1 = sign(C, A);\r\n        return T.every((_, i) => _ === T1[i]);\r\n      };\r\n      return wrap({ encrypt, decrypt, sign, verify }, info);\r\n    };\r\n    return wrap(suite, info);\r\n  },\r\n  {\r\n    ALGORITHM: 'GCM',\r\n    IV_SIZE: 12,\r\n  },\r\n);\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, U8 } from '../../core/utils';\r\n\r\n// * Functions\r\n\r\nfunction KSA(K: Uint8Array) {\r\n  const SBox = new Uint8Array(256);\r\n  SBox.forEach((_, i) => {\r\n    SBox[i] = i;\r\n  });\r\n\r\n  let j = 0;\r\n  for (let i = 0; i < 256; i++) {\r\n    j = (j + SBox[i] + K[i % K.byteLength]) % 256;\r\n    [SBox[i], SBox[j]] = [SBox[j], SBox[i]];\r\n  }\r\n\r\n  return SBox;\r\n}\r\n\r\n// * RC4 Algorithm\r\n\r\nfunction cipher(M: Uint8Array, SBox: Uint8Array) {\r\n  SBox = SBox.slice(0);\r\n  const result = new U8(M.byteLength);\r\n  let i = 0;\r\n  let j = 0;\r\n  M.forEach((_, k) => {\r\n    i = (i + 1) % 256;\r\n    j = (j + SBox[i]) % 256;\r\n    [SBox[i], SBox[j]] = [SBox[j], SBox[i]];\r\n    result[k] = M[k] ^ SBox[(SBox[i] + SBox[j]) % 256];\r\n  });\r\n  return result;\r\n}\r\n\r\nfunction _arc4(K: Uint8Array) {\r\n  if (K.byteLength < 5 || K.byteLength > 256) {\r\n    throw new KitError(`RC4 key must be between 5 and 256 byte`);\r\n  }\r\n  const SBox = KSA(K);\r\n  return {\r\n    encrypt: (M: Uint8Array) => cipher(M, SBox),\r\n    decrypt: (M: Uint8Array) => cipher(M, SBox),\r\n  };\r\n}\r\n\r\n/**\r\n * ARC4 流密码 / stream cipher\r\n */\r\nexport const arc4 = createCipher(_arc4, {\r\n  ALGORITHM: `ARC4`,\r\n  KEY_SIZE: 16,\r\n  MIN_KEY_SIZE: 5,\r\n  MAX_KEY_SIZE: 256,\r\n});\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, resizeBuffer, rotateL32, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst A = new Uint32Array([\r\n  0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3, 0x34d34d34, 0x4d34d34d, 0xd34d34d3,\r\n]);\r\n\r\n// * Rabbit Algorithm\r\n\r\nfunction _rabbit(key: Uint8Array, iv: Uint8Array) {\r\n  if (key.length !== 16) {\r\n    throw new KitError('Rabbit key must be 16 byte');\r\n  }\r\n\r\n  // 内部状态\r\n  let carry = 0;\r\n  const X = new Uint8Array(32);\r\n  const C = new Uint8Array(32);\r\n  const X32 = new Uint32Array(X.buffer);\r\n  const C32 = new Uint32Array(C.buffer);\r\n  const nextState = (skipExtract: boolean = false): Uint8Array => {\r\n    // Counter System\r\n    for (let i = 0; i < 8; i++) {\r\n      const T = C32[i] + A[i] + carry;\r\n      C32[i] = T | 0;\r\n      carry = T > 0xffffffff ? 1 : 0;\r\n    }\r\n\r\n    // G\r\n    const G = new Uint32Array(8);\r\n    for (let i = 0; i < 8; i++) {\r\n      const T = (BigInt(X32[i]) + BigInt(C32[i])) & 0xffffffffn;\r\n      const S = T * T;\r\n      G[i] = Number((S ^ (S >> 32n)) & 0xffffffffn);\r\n    }\r\n\r\n    // Next State\r\n    X32[0] = 0xffffffff & (G[0] + rotateL32(G[7], 16) + rotateL32(G[6], 16));\r\n    X32[1] = 0xffffffff & (G[1] + rotateL32(G[0], 8) + G[7]);\r\n    X32[2] = 0xffffffff & (G[2] + rotateL32(G[1], 16) + rotateL32(G[0], 16));\r\n    X32[3] = 0xffffffff & (G[3] + rotateL32(G[2], 8) + G[1]);\r\n    X32[4] = 0xffffffff & (G[4] + rotateL32(G[3], 16) + rotateL32(G[2], 16));\r\n    X32[5] = 0xffffffff & (G[5] + rotateL32(G[4], 8) + G[3]);\r\n    X32[6] = 0xffffffff & (G[6] + rotateL32(G[5], 16) + rotateL32(G[4], 16));\r\n    X32[7] = 0xffffffff & (G[7] + rotateL32(G[6], 8) + G[5]);\r\n\r\n    if (skipExtract) {\r\n      return new Uint8Array();\r\n    }\r\n\r\n    // Extract Output\r\n    const S = new Uint32Array(4);\r\n    S[0] = X32[0] ^ (X32[5] >>> 16) ^ (X32[3] << 16);\r\n    S[1] = X32[2] ^ (X32[7] >>> 16) ^ (X32[5] << 16);\r\n    S[2] = X32[4] ^ (X32[1] >>> 16) ^ (X32[7] << 16);\r\n    S[3] = X32[6] ^ (X32[3] >>> 16) ^ (X32[1] << 16);\r\n    return new Uint8Array(S.buffer, S.byteOffset, 16);\r\n  };\r\n\r\n  // 初始化\r\n  (() => {\r\n    // 配置密钥\r\n    const K16 = new Uint16Array(key.buffer, key.byteOffset, key.byteLength >> 1);\r\n    for (let i = 0; i < 8; i++) {\r\n      if ((i & 1) === 0) {\r\n        const KH = K16[(i + 1) % 8];\r\n        const KL = K16[i];\r\n        X32[i] = (KH << 16) | KL;\r\n        const CH = K16[(i + 4) % 8];\r\n        const CL = K16[(i + 5) % 8];\r\n        C32[i] = (CH << 16) | CL;\r\n      } else {\r\n        const KH = K16[(i + 5) % 8];\r\n        const KL = K16[(i + 4) % 8];\r\n        X32[i] = (KH << 16) | KL;\r\n        const CH = K16[i];\r\n        const CL = K16[(i + 1) % 8];\r\n        C32[i] = (CH << 16) | CL;\r\n      }\r\n    }\r\n    for (let i = 0; i < 4; i++) {\r\n      nextState(true);\r\n    }\r\n    for (let i = 0; i < 8; i++) {\r\n      C32[i] ^= X32[(i + 4) % 8];\r\n    }\r\n\r\n    // 配置 IV\r\n    if (iv.length === 8) {\r\n      const iv32 = new Uint32Array(iv.buffer, iv.byteOffset, iv.byteLength >> 2);\r\n      const iv16 = new Uint16Array(iv.buffer, iv.byteOffset, iv.byteLength >> 1);\r\n      C32[0] ^= iv32[0];\r\n      C32[1] ^= (iv16[3] << 16) | iv16[1];\r\n      C32[2] ^= iv32[1];\r\n      C32[3] ^= (iv16[2] << 16) | iv16[0];\r\n      C32[4] ^= iv32[0];\r\n      C32[5] ^= (iv16[3] << 16) | iv16[1];\r\n      C32[6] ^= iv32[1];\r\n      C32[7] ^= (iv16[2] << 16) | iv16[0];\r\n      for (let i = 0; i < 4; i++) {\r\n        nextState(true);\r\n      }\r\n    } else if (iv.length !== 0 && iv.length !== 8) {\r\n      throw new KitError('Rabbit iv must be 8 byte');\r\n    }\r\n  })();\r\n\r\n  // 密钥流\r\n  let S = nextState();\r\n  let current = 1;\r\n  const squeeze = (count: number) => {\r\n    if (current >= count) return S;\r\n    S = resizeBuffer(S, count << 4);\r\n    while (current < count) {\r\n      S.set(nextState(), current << 4);\r\n      current++;\r\n    }\r\n    return S;\r\n  };\r\n  const cipher = (M: Uint8Array) => {\r\n    const BLOCK_TOTAL = Math.ceil(M.length >> 4) || 1;\r\n    S = squeeze(BLOCK_TOTAL);\r\n    return U8.from(M).map((_, i) => _ ^ S[i]);\r\n  };\r\n\r\n  return {\r\n    encrypt: (M: Uint8Array) => cipher(M),\r\n    decrypt: (C: Uint8Array) => cipher(C),\r\n  };\r\n}\r\n\r\n/**\r\n * Rabbit 流密码 / stream cipher\r\n */\r\nexport const rabbit = createCipher(_rabbit, {\r\n  ALGORITHM: 'rabbit',\r\n  KEY_SIZE: 16,\r\n  MIN_KEY_SIZE: 16,\r\n  MAX_KEY_SIZE: 16,\r\n  IV_SIZE: 8,\r\n  MIN_IV_SIZE: 0,\r\n  MAX_IV_SIZE: 8,\r\n});\r\n","import { createCipher } from '../../core/cipher';\r\nimport { Counter, KitError, resizeBuffer, rotateL32, u8, u32 } from '../../core/utils';\r\n\r\n// * Functions\r\n\r\n// biome-ignore lint/correctness/noUnusedVariables: <tips>\r\nfunction QR(a: number, b: number, c: number, d: number) {\r\n  b ^= rotateL32(a + d, 7);\r\n  c ^= rotateL32(b + a, 9);\r\n  d ^= rotateL32(c + b, 13);\r\n  a ^= rotateL32(d + c, 18);\r\n  return [a, b, c, d];\r\n}\r\n\r\nfunction hash(x: Uint8Array, rounds: number = 20) {\r\n  // to word\r\n  const X = u32(x);\r\n  const W = X.slice(0);\r\n  // main loop\r\n  for (let i = 0; i < rounds; i += 2) {\r\n    // ODD Rounds\r\n    // [W[0],  W[4],  W[8],  W[12]] = QR(W[0],  W[4],  W[8],  W[12]);\r\n    // [W[5],  W[9],  W[13], W[1]]  = QR(W[5],  W[9],  W[13], W[1]);\r\n    // [W[10], W[14], W[2],  W[6]]  = QR(W[10], W[14], W[2],  W[6]);\r\n    // [W[15], W[3],  W[7],  W[11]] = QR(W[15], W[3],  W[7],  W[11]);\r\n    // EVEN Rounds\r\n    // [W[0],  W[1],  W[2],  W[3]]  = QR(W[0],  W[1],  W[2],  W[3]);\r\n    // [W[5],  W[6],  W[7],  W[4]]  = QR(W[5],  W[6],  W[7],  W[4]);\r\n    // [W[10], W[11], W[8],  W[9]]  = QR(W[10], W[11], W[8],  W[9]);\r\n    // [W[15], W[12], W[13], W[14]] = QR(W[15], W[12], W[13], W[14])\r\n    W[4] ^= rotateL32(W[0] + W[12], 7);\r\n    W[8] ^= rotateL32(W[4] + W[0], 9);\r\n    W[12] ^= rotateL32(W[8] + W[4], 13);\r\n    W[0] ^= rotateL32(W[12] + W[8], 18);\r\n    W[9] ^= rotateL32(W[5] + W[1], 7);\r\n    W[13] ^= rotateL32(W[9] + W[5], 9);\r\n    W[1] ^= rotateL32(W[13] + W[9], 13);\r\n    W[5] ^= rotateL32(W[1] + W[13], 18);\r\n    W[14] ^= rotateL32(W[10] + W[6], 7);\r\n    W[2] ^= rotateL32(W[14] + W[10], 9);\r\n    W[6] ^= rotateL32(W[2] + W[14], 13);\r\n    W[10] ^= rotateL32(W[6] + W[2], 18);\r\n    W[3] ^= rotateL32(W[15] + W[11], 7);\r\n    W[7] ^= rotateL32(W[3] + W[15], 9);\r\n    W[11] ^= rotateL32(W[7] + W[3], 13);\r\n    W[15] ^= rotateL32(W[11] + W[7], 18);\r\n    W[1] ^= rotateL32(W[0] + W[3], 7);\r\n    W[2] ^= rotateL32(W[1] + W[0], 9);\r\n    W[3] ^= rotateL32(W[2] + W[1], 13);\r\n    W[0] ^= rotateL32(W[3] + W[2], 18);\r\n    W[6] ^= rotateL32(W[5] + W[4], 7);\r\n    W[7] ^= rotateL32(W[6] + W[5], 9);\r\n    W[4] ^= rotateL32(W[7] + W[6], 13);\r\n    W[5] ^= rotateL32(W[4] + W[7], 18);\r\n    W[11] ^= rotateL32(W[10] + W[9], 7);\r\n    W[8] ^= rotateL32(W[11] + W[10], 9);\r\n    W[9] ^= rotateL32(W[8] + W[11], 13);\r\n    W[10] ^= rotateL32(W[9] + W[8], 18);\r\n    W[12] ^= rotateL32(W[15] + W[14], 7);\r\n    W[13] ^= rotateL32(W[12] + W[15], 9);\r\n    W[14] ^= rotateL32(W[13] + W[12], 13);\r\n    W[15] ^= rotateL32(W[14] + W[13], 18);\r\n  }\r\n  // mix\r\n  for (let i = 0; i < 16; i++) {\r\n    W[i] += X[i];\r\n  }\r\n  return u8(W);\r\n}\r\n\r\nfunction expand(K: Uint8Array, iv: Uint8Array) {\r\n  if (iv.byteLength !== 8) {\r\n    throw new KitError(`Salsa20 iv must be 8 byte`);\r\n  }\r\n\r\n  const S = new Counter(64);\r\n  const S32 = u32(S);\r\n  const K32 = u32(K);\r\n  const N32 = u32(iv);\r\n  switch (K.byteLength) {\r\n    case 16: // use tau\r\n      S32[0] = 0x61707865;\r\n      S32[1] = K32[0];\r\n      S32[2] = K32[1];\r\n      S32[3] = K32[2];\r\n      S32[4] = K32[3];\r\n      S32[5] = 0x3120646e;\r\n      S32[6] = N32[0];\r\n      S32[7] = N32[1];\r\n      S32[10] = 0x79622d36;\r\n      S32[11] = K32[0];\r\n      S32[12] = K32[1];\r\n      S32[13] = K32[2];\r\n      S32[14] = K32[3];\r\n      S32[15] = 0x6b206574;\r\n      break;\r\n    case 32: // use sigma\r\n      S32[0] = 0x61707865;\r\n      S32[1] = K32[0];\r\n      S32[2] = K32[1];\r\n      S32[3] = K32[2];\r\n      S32[4] = K32[3];\r\n      S32[5] = 0x3320646e;\r\n      S32[6] = N32[0];\r\n      S32[7] = N32[1];\r\n      S32[10] = 0x79622d32;\r\n      S32[11] = K32[4];\r\n      S32[12] = K32[5];\r\n      S32[13] = K32[6];\r\n      S32[14] = K32[7];\r\n      S32[15] = 0x6b206574;\r\n      break;\r\n    default:\r\n      throw new KitError(`Salsa20 key must be 16 or 32 byte`);\r\n  }\r\n\r\n  return S;\r\n}\r\n\r\n// * Salsa20 Algorithm\r\n\r\nfunction _salsa20(key: Uint8Array, iv: Uint8Array) {\r\n  /** Counter Block */\r\n  const E = expand(key, iv);\r\n  /** Pseudo Random Byte Stream */\r\n  let S = hash(E);\r\n  let current = 1;\r\n\r\n  const cipher = (M: Uint8Array) => {\r\n    const BLOCK_TOTAL = (M.length >> 6) + 1;\r\n    if (current > BLOCK_TOTAL) {\r\n      return u8(M).map((byte, i) => byte ^ S[i]);\r\n    }\r\n    // Squeeze\r\n    S = resizeBuffer(S, BLOCK_TOTAL << 6);\r\n    while (BLOCK_TOTAL > current) {\r\n      E.inc(32, 8, true);\r\n      S.set(hash(E), current << 6);\r\n      current++;\r\n    }\r\n    return u8(M).map((byte, i) => byte ^ S[i]);\r\n  };\r\n  return {\r\n    encrypt: (M: Uint8Array) => cipher(M),\r\n    decrypt: (C: Uint8Array) => cipher(C),\r\n  };\r\n}\r\n\r\n/**\r\n * Salsa20 流密码 / Stream Cipher\r\n */\r\nexport const salsa20 = createCipher(_salsa20, {\r\n  ALGORITHM: 'Salsa20',\r\n  KEY_SIZE: 32,\r\n  MIN_KEY_SIZE: 16,\r\n  MAX_KEY_SIZE: 32,\r\n  IV_SIZE: 8,\r\n  MIN_IV_SIZE: 8,\r\n  MAX_IV_SIZE: 8,\r\n});\r\n","import { KitError, rotateL32, U8, wrap } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst S0 = new Uint8Array([\r\n  0x3e, 0x72, 0x5b, 0x47, 0xca, 0xe0, 0x00, 0x33, 0x04, 0xd1, 0x54, 0x98, 0x09, 0xb9, 0x6d, 0xcb,\r\n  0x7b, 0x1b, 0xf9, 0x32, 0xaf, 0x9d, 0x6a, 0xa5, 0xb8, 0x2d, 0xfc, 0x1d, 0x08, 0x53, 0x03, 0x90,\r\n  0x4d, 0x4e, 0x84, 0x99, 0xe4, 0xce, 0xd9, 0x91, 0xdd, 0xb6, 0x85, 0x48, 0x8b, 0x29, 0x6e, 0xac,\r\n  0xcd, 0xc1, 0xf8, 0x1e, 0x73, 0x43, 0x69, 0xc6, 0xb5, 0xbd, 0xfd, 0x39, 0x63, 0x20, 0xd4, 0x38,\r\n  0x76, 0x7d, 0xb2, 0xa7, 0xcf, 0xed, 0x57, 0xc5, 0xf3, 0x2c, 0xbb, 0x14, 0x21, 0x06, 0x55, 0x9b,\r\n  0xe3, 0xef, 0x5e, 0x31, 0x4f, 0x7f, 0x5a, 0xa4, 0x0d, 0x82, 0x51, 0x49, 0x5f, 0xba, 0x58, 0x1c,\r\n  0x4a, 0x16, 0xd5, 0x17, 0xa8, 0x92, 0x24, 0x1f, 0x8c, 0xff, 0xd8, 0xae, 0x2e, 0x01, 0xd3, 0xad,\r\n  0x3b, 0x4b, 0xda, 0x46, 0xeb, 0xc9, 0xde, 0x9a, 0x8f, 0x87, 0xd7, 0x3a, 0x80, 0x6f, 0x2f, 0xc8,\r\n  0xb1, 0xb4, 0x37, 0xf7, 0x0a, 0x22, 0x13, 0x28, 0x7c, 0xcc, 0x3c, 0x89, 0xc7, 0xc3, 0x96, 0x56,\r\n  0x07, 0xbf, 0x7e, 0xf0, 0x0b, 0x2b, 0x97, 0x52, 0x35, 0x41, 0x79, 0x61, 0xa6, 0x4c, 0x10, 0xfe,\r\n  0xbc, 0x26, 0x95, 0x88, 0x8a, 0xb0, 0xa3, 0xfb, 0xc0, 0x18, 0x94, 0xf2, 0xe1, 0xe5, 0xe9, 0x5d,\r\n  0xd0, 0xdc, 0x11, 0x66, 0x64, 0x5c, 0xec, 0x59, 0x42, 0x75, 0x12, 0xf5, 0x74, 0x9c, 0xaa, 0x23,\r\n  0x0e, 0x86, 0xab, 0xbe, 0x2a, 0x02, 0xe7, 0x67, 0xe6, 0x44, 0xa2, 0x6c, 0xc2, 0x93, 0x9f, 0xf1,\r\n  0xf6, 0xfa, 0x36, 0xd2, 0x50, 0x68, 0x9e, 0x62, 0x71, 0x15, 0x3d, 0xd6, 0x40, 0xc4, 0xe2, 0x0f,\r\n  0x8e, 0x83, 0x77, 0x6b, 0x25, 0x05, 0x3f, 0x0c, 0x30, 0xea, 0x70, 0xb7, 0xa1, 0xe8, 0xa9, 0x65,\r\n  0x8d, 0x27, 0x1a, 0xdb, 0x81, 0xb3, 0xa0, 0xf4, 0x45, 0x7a, 0x19, 0xdf, 0xee, 0x78, 0x34, 0x60,\r\n]);\r\nconst S1 = new Uint8Array([\r\n  0x55, 0xc2, 0x63, 0x71, 0x3b, 0xc8, 0x47, 0x86, 0x9f, 0x3c, 0xda, 0x5b, 0x29, 0xaa, 0xfd, 0x77,\r\n  0x8c, 0xc5, 0x94, 0x0c, 0xa6, 0x1a, 0x13, 0x00, 0xe3, 0xa8, 0x16, 0x72, 0x40, 0xf9, 0xf8, 0x42,\r\n  0x44, 0x26, 0x68, 0x96, 0x81, 0xd9, 0x45, 0x3e, 0x10, 0x76, 0xc6, 0xa7, 0x8b, 0x39, 0x43, 0xe1,\r\n  0x3a, 0xb5, 0x56, 0x2a, 0xc0, 0x6d, 0xb3, 0x05, 0x22, 0x66, 0xbf, 0xdc, 0x0b, 0xfa, 0x62, 0x48,\r\n  0xdd, 0x20, 0x11, 0x06, 0x36, 0xc9, 0xc1, 0xcf, 0xf6, 0x27, 0x52, 0xbb, 0x69, 0xf5, 0xd4, 0x87,\r\n  0x7f, 0x84, 0x4c, 0xd2, 0x9c, 0x57, 0xa4, 0xbc, 0x4f, 0x9a, 0xdf, 0xfe, 0xd6, 0x8d, 0x7a, 0xeb,\r\n  0x2b, 0x53, 0xd8, 0x5c, 0xa1, 0x14, 0x17, 0xfb, 0x23, 0xd5, 0x7d, 0x30, 0x67, 0x73, 0x08, 0x09,\r\n  0xee, 0xb7, 0x70, 0x3f, 0x61, 0xb2, 0x19, 0x8e, 0x4e, 0xe5, 0x4b, 0x93, 0x8f, 0x5d, 0xdb, 0xa9,\r\n  0xad, 0xf1, 0xae, 0x2e, 0xcb, 0x0d, 0xfc, 0xf4, 0x2d, 0x46, 0x6e, 0x1d, 0x97, 0xe8, 0xd1, 0xe9,\r\n  0x4d, 0x37, 0xa5, 0x75, 0x5e, 0x83, 0x9e, 0xab, 0x82, 0x9d, 0xb9, 0x1c, 0xe0, 0xcd, 0x49, 0x89,\r\n  0x01, 0xb6, 0xbd, 0x58, 0x24, 0xa2, 0x5f, 0x38, 0x78, 0x99, 0x15, 0x90, 0x50, 0xb8, 0x95, 0xe4,\r\n  0xd0, 0x91, 0xc7, 0xce, 0xed, 0x0f, 0xb4, 0x6f, 0xa0, 0xcc, 0xf0, 0x02, 0x4a, 0x79, 0xc3, 0xde,\r\n  0xa3, 0xef, 0xea, 0x51, 0xe6, 0x6b, 0x18, 0xec, 0x1b, 0x2c, 0x80, 0xf7, 0x74, 0xe7, 0xff, 0x21,\r\n  0x5a, 0x6a, 0x54, 0x1e, 0x41, 0x31, 0x92, 0x35, 0xc4, 0x33, 0x07, 0x0a, 0xba, 0x7e, 0x0e, 0x34,\r\n  0x88, 0xb1, 0x98, 0x7c, 0xf3, 0x3d, 0x60, 0x6c, 0x7b, 0xca, 0xd3, 0x1f, 0x32, 0x65, 0x04, 0x28,\r\n  0x64, 0xbe, 0x85, 0x9b, 0x2f, 0x59, 0x8a, 0xd7, 0xb0, 0x25, 0xac, 0xaf, 0x12, 0x03, 0xe2, 0xf2,\r\n]);\r\nconst D = new Uint16Array([\r\n  0x44d7, 0x26bc, 0x626b, 0x135e, 0x5789, 0x35e2, 0x7135, 0x09af, 0x4d78, 0x2f13, 0x6bc4, 0x1af1,\r\n  0x5e26, 0x3c4d, 0x789a, 0x47ac,\r\n]);\r\n\r\n// * Functions\r\n\r\nfunction mulPow2n(v: number, n: number) {\r\n  return ((v << n) | (v >>> (31 - n))) & 0x7fffffff;\r\n}\r\nfunction addMod31(a: number, b: number) {\r\n  const c = a + b;\r\n  return (c & 0x7fffffff) + (c >>> 31);\r\n}\r\n\r\nconst L1 = (X: number) =>\r\n  X ^ rotateL32(X, 2) ^ rotateL32(X, 10) ^ rotateL32(X, 18) ^ rotateL32(X, 24);\r\nconst L2 = (X: number) =>\r\n  X ^ rotateL32(X, 8) ^ rotateL32(X, 14) ^ rotateL32(X, 22) ^ rotateL32(X, 30);\r\nfunction BR(S: Uint32Array, X: Uint32Array) {\r\n  X[0] = ((S[15] & 0x7fff8000) << 1) | (S[14] & 0xffff);\r\n  X[1] = ((S[11] & 0x0000ffff) << 16) | (S[9] >>> 15);\r\n  X[2] = ((S[7] & 0x0000ffff) << 16) | (S[5] >>> 15);\r\n  X[3] = ((S[2] & 0x0000ffff) << 16) | (S[0] >>> 15);\r\n}\r\nfunction F(X0: number, X1: number, X2: number, R: Uint32Array) {\r\n  const W = (X0 ^ R[0]) + R[1];\r\n  const W1 = (R[0] + X1) & 0xffffffff;\r\n  const W2 = R[1] ^ X2;\r\n  const r0 = L1((W1 << 16) | (W2 >>> 16));\r\n  R[0] =\r\n    (S0[r0 >>> 24] << 24) |\r\n    (S1[(r0 >>> 16) & 0xff] << 16) |\r\n    (S0[(r0 >>> 8) & 0xff] << 8) |\r\n    S1[r0 & 0xff];\r\n  const r1 = L2((W2 << 16) | (W1 >>> 16));\r\n  R[1] =\r\n    (S0[r1 >>> 24] << 24) |\r\n    (S1[(r1 >>> 16) & 0xff] << 16) |\r\n    (S0[(r1 >>> 8) & 0xff] << 8) |\r\n    S1[r1 & 0xff];\r\n  return W;\r\n}\r\n/**\r\n * 线性反馈移位寄存器有两种运行模式：初始化模式和工作模式，当输入 `u` 时为初始化模式，否则为工作模式\r\n *\r\n * @param {Uint32Array} S - 线性反馈移位寄存器(LFSR)\r\n * @param {number} u - 初始化模式下的输入\r\n */\r\nfunction next(S: Uint32Array, u?: number) {\r\n  let s16: number, v: number;\r\n  s16 = S[0];\r\n  v = mulPow2n(S[0], 8);\r\n  s16 = addMod31(s16, v);\r\n  v = mulPow2n(S[4], 20);\r\n  s16 = addMod31(s16, v);\r\n  v = mulPow2n(S[10], 21);\r\n  s16 = addMod31(s16, v);\r\n  v = mulPow2n(S[13], 17);\r\n  s16 = addMod31(s16, v);\r\n  v = mulPow2n(S[15], 15);\r\n  s16 = addMod31(s16, v);\r\n\r\n  s16 = u ? addMod31(s16, u) : s16;\r\n  s16 = s16 || 0x7fffffff;\r\n  for (let i = 0; i < 15; i++) {\r\n    S[i] = S[i + 1];\r\n  }\r\n  S[15] = s16;\r\n}\r\n\r\n// * ZUC Algorithm (presudo-random generator)\r\n\r\n/**\r\n * 3GPP ZUC 算法用于生成密钥流，每次调用返回一个 32 位的密钥流.\r\n *\r\n * 3GPP ZUC algorithm is used to generate a key stream, each call returns a 32-bit key stream.\r\n *\r\n * ```ts\r\n * const K = new Uint8Array(16)\r\n * const iv = new Uint8Array(16)\r\n * const prg = zuc(K, iv)\r\n * prg() // 32-bit number\r\n * ```\r\n */\r\nexport function zuc(K: Uint8Array, iv: Uint8Array) {\r\n  if (K.byteLength !== 16) {\r\n    throw new KitError('ZUC requires a key of 16 bytes');\r\n  }\r\n  if (iv.byteLength !== 16) {\r\n    throw new KitError('ZUC requires an IV of 16 bytes');\r\n  }\r\n  const LFSR = new Uint32Array(16);\r\n  const X = new Uint32Array(4);\r\n  const R = new Uint32Array(2);\r\n  (function init() {\r\n    for (let i = 0; i < 16; i++) {\r\n      LFSR[i] = (K[i] << 23) | (D[i] << 8) | iv[i];\r\n    }\r\n    for (let i = 0; i < 32; i++) {\r\n      BR(LFSR, X);\r\n      const W = F(X[0], X[1], X[2], R);\r\n      next(LFSR, W >>> 1);\r\n    }\r\n    BR(LFSR, X);\r\n    F(X[0], X[1], X[2], R);\r\n    next(LFSR);\r\n  })();\r\n\r\n  return () => {\r\n    BR(LFSR, X);\r\n    const W = F(X[0], X[1], X[2], R) ^ X[3];\r\n    next(LFSR);\r\n    return W;\r\n  };\r\n}\r\n\r\n// * EEA3 & EIA3\r\n\r\nfunction createEEA_IV(count: Uint8Array, bearer: number, direction: 0 | 1) {\r\n  const iv = new Uint8Array(16);\r\n  iv.set(count, 0);\r\n  iv[4] = (bearer << 3) | (direction << 2);\r\n  iv.set(iv.subarray(0, 5), 8);\r\n  return iv;\r\n}\r\nfunction createEIA_IV(count: Uint8Array, bearer: number, direction: 0 | 1) {\r\n  const iv = new Uint8Array(16);\r\n  iv.set(count, 0);\r\n  iv[4] = bearer << 3;\r\n  iv.set(iv.subarray(0, 5), 8);\r\n  iv[8] ^= direction << 7;\r\n  iv[14] ^= direction << 7;\r\n  return iv;\r\n}\r\nfunction getWord(Z: DataView, bit_offset: number) {\r\n  const ti = bit_offset % 8;\r\n  const byte_offset = bit_offset >>> 3;\r\n  const W =\r\n    ti === 0\r\n      ? Z.getUint32(byte_offset, false)\r\n      : (Z.getUint32(byte_offset, false) << ti) |\r\n        (Z.getUint32(byte_offset + 4, false) >>> (32 - ti));\r\n  return W & 0xffffffff;\r\n}\r\n\r\nexport interface ZUCParams {\r\n  /**\r\n   * 32-bit counter\r\n   *\r\n   * if `counter` is `number` type, convert to `Uint8Array` type in little-endian.\r\n   *\r\n   * 如果 `counter` 为 `number` 类型，则转换为小端存储的 `Uint8Array` 类型.\r\n   */\r\n  COUNTER: Uint8Array | number;\r\n  /**\r\n   * 5-bit bearer\r\n   */\r\n  BEARER: number;\r\n  /**\r\n   * 1-bit direction\r\n   */\r\n  DIRECTION: 0 | 1;\r\n  /**\r\n   * 128-bit key\r\n   */\r\n  KEY: Uint8Array;\r\n  /**\r\n   * 32-bit length\r\n   */\r\n  LENGTH: number;\r\n  M: Uint8Array;\r\n}\r\nexport interface ZUC3GPP {\r\n  (param: ZUCParams): U8;\r\n}\r\n/**\r\n * 3GPP ZUC 加密算法 / Encryption algorithm\r\n */\r\nexport const eea3 = wrap<ZUC3GPP>(\r\n  (param: ZUCParams) => {\r\n    const { BEARER, DIRECTION, KEY, M } = param;\r\n    let { COUNTER, LENGTH } = param;\r\n\r\n    // 转换参数\r\n    COUNTER =\r\n      typeof COUNTER === 'number'\r\n        ? new Uint8Array([COUNTER >> 24, COUNTER >> 16, COUNTER >> 8, COUNTER])\r\n        : COUNTER;\r\n\r\n    // 生成密钥流\r\n    LENGTH = M.byteLength << 3;\r\n    const WORD_COUNT = (LENGTH + 31) >> 5;\r\n    const EEA_KeyStream = new Uint8Array(WORD_COUNT << 2);\r\n    const KSView = new DataView(\r\n      EEA_KeyStream.buffer,\r\n      EEA_KeyStream.byteOffset,\r\n      EEA_KeyStream.byteLength,\r\n    );\r\n    const EEA_IV = createEEA_IV(COUNTER, BEARER, DIRECTION);\r\n    const prg = zuc(KEY, EEA_IV);\r\n    for (let i = 0; i < WORD_COUNT; i++) {\r\n      KSView.setUint32(i << 2, prg(), false);\r\n    }\r\n\r\n    // 加密\r\n    return new U8(M.map((_, i) => _ ^ EEA_KeyStream[i]));\r\n  },\r\n  {\r\n    ALGORITHM: 'ZUC-EEA3',\r\n    KEY_SIZE: 16,\r\n  },\r\n);\r\n/**\r\n * 3GPP ZUC 完整性算法 / Integrity algorithm\r\n */\r\nexport const eia3 = wrap<ZUC3GPP>(\r\n  (param: ZUCParams) => {\r\n    const { BEARER, DIRECTION, KEY, M } = param;\r\n    let { COUNTER, LENGTH } = param;\r\n\r\n    // 转换参数\r\n    COUNTER =\r\n      typeof COUNTER === 'number'\r\n        ? new Uint8Array([COUNTER >> 24, COUNTER >> 16, COUNTER >> 8, COUNTER])\r\n        : COUNTER;\r\n\r\n    // 生成密钥流\r\n    const N = LENGTH + 64;\r\n    const WORD_COUNT = (N + 31) >> 5;\r\n    const EIA_KeyStream = new Uint8Array(WORD_COUNT << 2);\r\n    const KSView = new DataView(\r\n      EIA_KeyStream.buffer,\r\n      EIA_KeyStream.byteOffset,\r\n      EIA_KeyStream.byteLength,\r\n    );\r\n    const EIA_IV = createEIA_IV(COUNTER, BEARER, DIRECTION);\r\n    const prg = zuc(KEY, EIA_IV);\r\n    for (let i = 0; i < WORD_COUNT; i++) {\r\n      KSView.setUint32(i << 2, prg(), false);\r\n    }\r\n\r\n    // 计算 MAC\r\n    let t = 0;\r\n    for (let i = 0; i < LENGTH; i++) {\r\n      const bit = M[i >>> 3] & (1 << (7 - (i % 8)));\r\n      if (bit) {\r\n        t ^= getWord(KSView, i);\r\n      }\r\n    }\r\n    t ^= getWord(KSView, LENGTH);\r\n    t ^= KSView.getUint32(EIA_KeyStream.byteLength - 4);\r\n    return new U8([t >> 24, t >> 16, t >> 8, t]);\r\n  },\r\n  {\r\n    ALGORITHM: 'ZUC-EIA3',\r\n    KEY_SIZE: 16,\r\n  },\r\n);\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst SBox = new Uint8Array([\r\n  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9,\r\n  0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f,\r\n  0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07,\r\n  0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3,\r\n  0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58,\r\n  0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3,\r\n  0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f,\r\n  0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\r\n  0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac,\r\n  0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a,\r\n  0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70,\r\n  0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,\r\n  0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42,\r\n  0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,\r\n]);\r\nconst InvSBox = new Uint8Array([\r\n  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39,\r\n  0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2,\r\n  0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76,\r\n  0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc,\r\n  0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d,\r\n  0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c,\r\n  0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f,\r\n  0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,\r\n  0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62,\r\n  0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd,\r\n  0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60,\r\n  0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,\r\n  0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6,\r\n  0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d,\r\n]);\r\nconst ROUND = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\r\n\r\n// * Functions\r\n\r\nfunction GFMultiply(a: number, b: number): number {\r\n  let p = 0;\r\n  if (b === 1) return a;\r\n  for (let i = 0; i < 8; i++) {\r\n    if (b & 1) p ^= a;\r\n    const carry = a & 0x80;\r\n    a <<= 1;\r\n    // 0x1B 是不可约多项式 x^8 + x^4 + x^3 + x + 1 的低 8 位\r\n    if (carry) a ^= 0x1b;\r\n    b >>= 1;\r\n  }\r\n  return p & 0xff;\r\n}\r\n\r\nfunction KeyExpansion(K: Uint8Array, Nr: 10 | 12 | 14) {\r\n  const Nk = K.byteLength >> 2;\r\n  const W = new Uint8Array((Nr + 1) << 4);\r\n  W.set(K);\r\n  let current = 0;\r\n  for (let i = Nk; i < (Nr + 1) << 2; i++) {\r\n    const i_1 = (i - 1) << 2;\r\n    const temp = W.slice(i_1, i_1 + 4);\r\n    if (i % Nk === 0) {\r\n      const t0 = temp[0];\r\n      temp[0] = SBox[temp[1]] ^ ROUND[current];\r\n      temp[1] = SBox[temp[2]];\r\n      temp[2] = SBox[temp[3]];\r\n      temp[3] = SBox[t0];\r\n\r\n      current++;\r\n    } else if (Nk > 6 && i % Nk === 4) {\r\n      temp[0] = SBox[temp[0]];\r\n      temp[1] = SBox[temp[1]];\r\n      temp[2] = SBox[temp[2]];\r\n      temp[3] = SBox[temp[3]];\r\n    }\r\n    const i_Nk = (i - Nk) << 2;\r\n    const Wi_NK = W.subarray(i_Nk, i_Nk + 4);\r\n    for (let j = 0; j < 4; j++) {\r\n      temp[j] ^= Wi_NK[j];\r\n    }\r\n    W.set(temp, i << 2);\r\n  }\r\n  return W;\r\n}\r\n\r\n// * AES Algorithm\r\n\r\nfunction Cipher(M: Uint8Array, W: Uint8Array, Nr: 10 | 12 | 14) {\r\n  if (M.byteLength !== 16) {\r\n    throw new KitError(`AES block must be 16 byte`);\r\n  }\r\n  const S = U8.from(M);\r\n\r\n  const AddRoundKey = (W: Uint8Array) => {\r\n    for (let i = 0; i < S.byteLength; i++) {\r\n      S[i] ^= W[i];\r\n    }\r\n  };\r\n  const SubBytes = () => {\r\n    for (let i = 0; i < S.byteLength; i++) {\r\n      S[i] = SBox[S[i]];\r\n    }\r\n  };\r\n  const ShiftRows = () => {\r\n    const S1 = S[1];\r\n    S[1] = S[5];\r\n    S[5] = S[9];\r\n    S[9] = S[13];\r\n    S[13] = S1;\r\n\r\n    const S2 = S[2];\r\n    const S6 = S[6];\r\n    S[2] = S[10];\r\n    S[6] = S[14];\r\n    S[10] = S2;\r\n    S[14] = S6;\r\n\r\n    const S15 = S[15];\r\n    S[15] = S[11];\r\n    S[11] = S[7];\r\n    S[7] = S[3];\r\n    S[3] = S15;\r\n  };\r\n  const MixColumn = () => {\r\n    for (let i = 0; i < 4; i++) {\r\n      const s0 = S[i << 2];\r\n      const s1 = S[(i << 2) + 1];\r\n      const s2 = S[(i << 2) + 2];\r\n      const s3 = S[(i << 2) + 3];\r\n\r\n      const t0 = GFMultiply(s0, 0x02) ^ GFMultiply(s1, 0x03) ^ GFMultiply(s2, 0x01) ^ GFMultiply(s3, 0x01);\r\n      const t1 = GFMultiply(s0, 0x01) ^ GFMultiply(s1, 0x02) ^ GFMultiply(s2, 0x03) ^ GFMultiply(s3, 0x01);\r\n      const t2 = GFMultiply(s0, 0x01) ^ GFMultiply(s1, 0x01) ^ GFMultiply(s2, 0x02) ^ GFMultiply(s3, 0x03);\r\n      const t3 = GFMultiply(s0, 0x03) ^ GFMultiply(s1, 0x01) ^ GFMultiply(s2, 0x01) ^ GFMultiply(s3, 0x02);\r\n\r\n      S[i << 2] = t0;\r\n      S[(i << 2) + 1] = t1;\r\n      S[(i << 2) + 2] = t2;\r\n      S[(i << 2) + 3] = t3;\r\n    }\r\n  };\r\n\r\n  AddRoundKey(W.subarray(0, 16));\r\n  for (let i = 1; i < Nr; i++) {\r\n    SubBytes();\r\n    ShiftRows();\r\n    MixColumn();\r\n    AddRoundKey(W.subarray(i << 4, (i + 1) << 4));\r\n  }\r\n  SubBytes();\r\n  ShiftRows();\r\n  AddRoundKey(W.subarray(W.length - 16, W.length));\r\n\r\n  return S;\r\n}\r\n\r\nfunction InvCipher(M: Uint8Array, W: Uint8Array, Nr: 10 | 12 | 14) {\r\n  if (M.byteLength !== 16) {\r\n    throw new KitError(`AES block must be 16 byte`);\r\n  }\r\n  const S = new U8(M.slice(0));\r\n\r\n  const AddRoundKey = (W: Uint8Array) => {\r\n    for (let i = 0; i < S.byteLength; i++) {\r\n      S[i] ^= W[i];\r\n    }\r\n  };\r\n  const InvSubBytes = () => {\r\n    for (let i = 0; i < S.byteLength; i++) {\r\n      S[i] = InvSBox[S[i]];\r\n    }\r\n  };\r\n  const InvShiftRows = () => {\r\n    const S13 = S[13];\r\n    S[13] = S[9];\r\n    S[9] = S[5];\r\n    S[5] = S[1];\r\n    S[1] = S13;\r\n\r\n    const S2 = S[2];\r\n    const S6 = S[6];\r\n    S[2] = S[10];\r\n    S[6] = S[14];\r\n    S[10] = S2;\r\n    S[14] = S6;\r\n\r\n    const S3 = S[3];\r\n    S[3] = S[7];\r\n    S[7] = S[11];\r\n    S[11] = S[15];\r\n    S[15] = S3;\r\n  };\r\n  const InvMixColumn = () => {\r\n    for (let i = 0; i < 4; i++) {\r\n      const s0 = S[i << 2];\r\n      const s1 = S[(i << 2) + 1];\r\n      const s2 = S[(i << 2) + 2];\r\n      const s3 = S[(i << 2) + 3];\r\n\r\n      const t0 = GFMultiply(s0, 0x0e) ^ GFMultiply(s1, 0x0b) ^ GFMultiply(s2, 0x0d) ^ GFMultiply(s3, 0x09);\r\n      const t1 = GFMultiply(s0, 0x09) ^ GFMultiply(s1, 0x0e) ^ GFMultiply(s2, 0x0b) ^ GFMultiply(s3, 0x0d);\r\n      const t2 = GFMultiply(s0, 0x0d) ^ GFMultiply(s1, 0x09) ^ GFMultiply(s2, 0x0e) ^ GFMultiply(s3, 0x0b);\r\n      const t3 = GFMultiply(s0, 0x0b) ^ GFMultiply(s1, 0x0d) ^ GFMultiply(s2, 0x09) ^ GFMultiply(s3, 0x0e);\r\n\r\n      S[i << 2] = t0;\r\n      S[(i << 2) + 1] = t1;\r\n      S[(i << 2) + 2] = t2;\r\n      S[(i << 2) + 3] = t3;\r\n    }\r\n  };\r\n\r\n  AddRoundKey(W.subarray(W.length - 16, W.length));\r\n  for (let i = Nr - 1; i > 0; i--) {\r\n    InvShiftRows();\r\n    InvSubBytes();\r\n    AddRoundKey(W.subarray(i << 4, (i + 1) << 4));\r\n    InvMixColumn();\r\n  }\r\n  InvShiftRows();\r\n  InvSubBytes();\r\n  AddRoundKey(W.subarray(0, 16));\r\n\r\n  return S;\r\n}\r\n\r\nfunction _aes(K: Uint8Array, b: 128 | 192 | 256) {\r\n  if (K.byteLength !== b >> 3) {\r\n    throw new KitError(`AES key must be ${b >> 3} byte`);\r\n  }\r\n  const Nr = b === 128 ? 10 : b === 192 ? 12 : 14;\r\n  const W = KeyExpansion(K, Nr);\r\n\r\n  return {\r\n    encrypt: (M: Uint8Array) => Cipher(M, W, Nr),\r\n    decrypt: (C: Uint8Array) => InvCipher(C, W, Nr),\r\n  };\r\n}\r\n\r\n/**\r\n * 高级加密标准 (AES) 分组密码算法\r\n *\r\n * Advanced Encryption Standard (AES) block cipher algorithm\r\n *\r\n * @param {128 | 192 | 256} b - 密钥长度 / Key size (bit)\r\n */\r\nexport function aes(b: 128 | 192 | 256) {\r\n  return createCipher((K: Uint8Array) => _aes(K, b), {\r\n    ALGORITHM: `AES-${b}`,\r\n    BLOCK_SIZE: 16,\r\n    KEY_SIZE: b >> 3,\r\n    MIN_KEY_SIZE: b >> 3,\r\n    MAX_KEY_SIZE: b >> 3,\r\n  });\r\n}\r\n","import { createCipher } from '../../core/cipher';\r\nimport { genBitMask, KitError, resizeBuffer, rotateL, rotateR, U8 } from '../../core/utils';\r\n\r\n// const Eul = [0xB7, 0xE1, 0x51, 0x62, 0x8A, 0xED, 0x2A, 0x6A, 0xBF, 0x71, 0x58, 0x80, 0x9C, 0xF4, 0xF3, 0xC7, 0x62, 0xE7, 0x16, 0x0F, 0x38, 0xB4, 0xDA, 0x56, 0xA7, 0x84, 0xD9, 0x04, 0x51, 0x90, 0xCF, 0xEF]\r\n// const Phi = [0x9E, 0x37, 0x79, 0xB9, 0x7F, 0x4A, 0x7C, 0x15, 0xF3, 0x9C, 0xC0, 0x60, 0x5C, 0xED, 0xC8, 0x34, 0x10, 0x82, 0x27, 0x6B, 0xF3, 0xA2, 0x72, 0x51, 0xF8, 0x6C, 0x6A, 0x11, 0xD0, 0xC1, 0x8E, 0x95]\r\n// const P = Eul{0,...,w-1} - 2) | 1\r\n// const Q = Phi{0,...,w-1} - 2) | 1\r\n\r\n// * Functions\r\n\r\nfunction _setup(key: Uint8Array, word_size: number, round: number, mask: bigint) {\r\n  const word_bit = BigInt(word_size);\r\n  const word_byte = word_size >> 3;\r\n  const P = (0xb7e151628aed2a6abf7158809cf4f3c7n >> (128n - word_bit)) | 1n;\r\n  const Q = (0x9e3779b97f4a7c15f39cc0605cedc835n >> (128n - word_bit)) | 1n;\r\n  // Break the key into w-bit words\r\n  const c = Math.ceil((key.length || 1) / word_byte);\r\n  const L = resizeBuffer(key, c * word_byte);\r\n  const LV = L.view(word_byte);\r\n  // Initialize key-independent pseudorandom S array\r\n  const t = (round + 1) << 1;\r\n  const S = new U8(t * word_byte);\r\n  const SV = S.view(word_byte);\r\n  // S[0] = P\r\n  let prv = P;\r\n  SV.set(0, prv, true);\r\n  for (let i = 1; i < t; i++) {\r\n    // S[i] = S[i-1] + Q\r\n    prv = (prv + Q) & mask;\r\n    SV.set(i, prv, true);\r\n  }\r\n  // The main key scheduling loop\r\n  let i = 0;\r\n  let j = 0;\r\n  let A = 0n;\r\n  let B = 0n;\r\n  const v = 3 * Math.max(c, t);\r\n  for (let k = 0; k < v; k++) {\r\n    // A = S[i] = (S[i] + A + B) <<< 3\r\n    const S = SV.get(i, true);\r\n    A = rotateL(word_bit, S + A + B, 3n, mask);\r\n    SV.set(i, A, true);\r\n    // B = L[j] = (L[j] + A + B) <<< (A + B)\r\n    const L = LV.get(j, true);\r\n    B = rotateL(word_bit, L + A + B, A + B, mask);\r\n    LV.set(j, B, true);\r\n    // i = (i + 1) mod t\r\n    i = (i + 1) % t;\r\n    // j = (j + 1) mod c\r\n    j = (j + 1) % c;\r\n  }\r\n  return S;\r\n}\r\nfunction _encrypt(M: Uint8Array, S: Uint8Array, word_size: number, round: number, mask: bigint) {\r\n  if (M.byteLength !== word_size >> 2) {\r\n    throw new KitError(`ARC5-${word_size}/${round} block must be ${word_size >> 3} byte`);\r\n  }\r\n  const word_bit = BigInt(word_size);\r\n  const word_byte = word_size >> 3;\r\n  const MV = U8.from(M).view(word_byte);\r\n  const SV = U8.from(S).view(word_byte);\r\n  // A = M[0] + S[0], B = M[1] + S[1]\r\n  let A = MV.get(0, true) + SV.get(0, true);\r\n  let B = MV.get(1, true) + SV.get(1, true);\r\n  A &= mask;\r\n  B &= mask;\r\n  for (let i = 1; i <= round; i++) {\r\n    // A = ((A ^ B) <<< B) + S[2 * i]\r\n    A = rotateL(word_bit, A ^ B, B, mask);\r\n    A += SV.get(i << 1, true);\r\n    A &= mask;\r\n    // B = ((B ^ A) <<< A) + S[2 * i + 1]\r\n    B = rotateL(word_bit, B ^ A, A, mask);\r\n    B += SV.get((i << 1) + 1, true);\r\n    B &= mask;\r\n  }\r\n  return U8.fromBI((B << word_bit) | A, word_byte << 1, true);\r\n}\r\nfunction _decrypt(C: Uint8Array, S: Uint8Array, word_size: number, round: number, mask: bigint) {\r\n  if (C.byteLength !== word_size >> 2) {\r\n    throw new KitError(`ARC5-${word_size}/${round} block must be ${word_size >> 3} byte`);\r\n  }\r\n  const word_bit = BigInt(word_size);\r\n  const word_byte = word_size >> 3;\r\n  const CV = U8.from(C).view(word_byte);\r\n  const SV = U8.from(S).view(word_byte);\r\n  // A = C[0], B = C[1]\r\n  let A = CV.get(0, true);\r\n  let B = CV.get(1, true);\r\n  for (let i = round; i > 0; i--) {\r\n    // B = ((B - S[2 * i + 1]) >>> A) ^ A\r\n    const S1 = SV.get((i << 1) + 1, true);\r\n    B = rotateR(word_bit, B - S1, A, mask);\r\n    B = B ^ A;\r\n    B &= mask;\r\n    // A = ((A - S[2 * i]) >>> B) ^ B\r\n    const S0 = SV.get(i << 1, true);\r\n    A = rotateR(word_bit, A - S0, B, mask);\r\n    A = A ^ B;\r\n    A &= mask;\r\n  }\r\n  // A = A - S[0], B = B - S[1]\r\n  A = A - SV.get(0, true);\r\n  A &= mask;\r\n  B = B - SV.get(1, true);\r\n  B &= mask;\r\n  return U8.fromBI((B << word_bit) | A, word_byte << 1, true);\r\n}\r\n\r\n// * ARC5 Algorithm\r\n\r\nfunction _arc5(K: Uint8Array, WORD_SIZE: 8 | 16 | 32 | 64 | 128, round: number) {\r\n  const mask = genBitMask(WORD_SIZE);\r\n  const S = _setup(K, WORD_SIZE, round, mask);\r\n  const encrypt = (M: Uint8Array) => _encrypt(M, S, WORD_SIZE, round, mask);\r\n  const decrypt = (C: Uint8Array) => _decrypt(C, S, WORD_SIZE, round, mask);\r\n  return { encrypt, decrypt };\r\n}\r\n\r\n/**\r\n * ARC5 分组加密算法 / block cipher algorithm\r\n *\r\n * ```ts\r\n * const spec8 = arc5(8, 8) // ARC5-8/8\r\n * const spec16 = arc5(16, 12) // ARC5-16/12\r\n * const spec32 = arc5(32, 16) // ARC5-32/16 (default)\r\n * const spec64 = arc5(64, 20) // ARC5-64/20\r\n * const spec128 = arc5(128, 24) // ARC5-128/24\r\n * ```\r\n *\r\n * @param {16 | 32 | 64} WORD_SIZE - 工作字长 / Word size (default: 32 bit)\r\n * @param {number} round - 轮数 / Rounds (default: 16)\r\n */\r\nexport function arc5(WORD_SIZE: 8 | 16 | 32 | 64 | 128 = 32, round: number = 16) {\r\n  if (round <= 0 || round > 255) {\r\n    throw new KitError('ARC5 round must be between 1 and 255');\r\n  }\r\n  return createCipher((K: Uint8Array) => _arc5(K, WORD_SIZE, round), {\r\n    ALGORITHM: `ARC5-${WORD_SIZE}/${round}`,\r\n    BLOCK_SIZE: WORD_SIZE >> 2,\r\n    KEY_SIZE: 16,\r\n    MIN_KEY_SIZE: 1,\r\n    MAX_KEY_SIZE: 255,\r\n  });\r\n}\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst SBox1 = new Uint8Array([\r\n  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9,\r\n  0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f,\r\n  0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07,\r\n  0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3,\r\n  0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58,\r\n  0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3,\r\n  0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f,\r\n  0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\r\n  0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac,\r\n  0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a,\r\n  0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70,\r\n  0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,\r\n  0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42,\r\n  0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,\r\n]);\r\nconst SBox2 = new Uint8Array([\r\n  0xe2, 0x4e, 0x54, 0xfc, 0x94, 0xc2, 0x4a, 0xcc, 0x62, 0x0d, 0x6a, 0x46, 0x3c, 0x4d, 0x8b, 0xd1, 0x5e, 0xfa, 0x64,\r\n  0xcb, 0xb4, 0x97, 0xbe, 0x2b, 0xbc, 0x77, 0x2e, 0x03, 0xd3, 0x19, 0x59, 0xc1, 0x1d, 0x06, 0x41, 0x6b, 0x55, 0xf0,\r\n  0x99, 0x69, 0xea, 0x9c, 0x18, 0xae, 0x63, 0xdf, 0xe7, 0xbb, 0x00, 0x73, 0x66, 0xfb, 0x96, 0x4c, 0x85, 0xe4, 0x3a,\r\n  0x09, 0x45, 0xaa, 0x0f, 0xee, 0x10, 0xeb, 0x2d, 0x7f, 0xf4, 0x29, 0xac, 0xcf, 0xad, 0x91, 0x8d, 0x78, 0xc8, 0x95,\r\n  0xf9, 0x2f, 0xce, 0xcd, 0x08, 0x7a, 0x88, 0x38, 0x5c, 0x83, 0x2a, 0x28, 0x47, 0xdb, 0xb8, 0xc7, 0x93, 0xa4, 0x12,\r\n  0x53, 0xff, 0x87, 0x0e, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8e, 0x37, 0x74, 0x32, 0xca, 0xe9, 0xb1, 0xb7, 0xab,\r\n  0x0c, 0xd7, 0xc4, 0x56, 0x42, 0x26, 0x07, 0x98, 0x60, 0xd9, 0xb6, 0xb9, 0x11, 0x40, 0xec, 0x20, 0x8c, 0xbd, 0xa0,\r\n  0xc9, 0x84, 0x04, 0x49, 0x23, 0xf1, 0x4f, 0x50, 0x1f, 0x13, 0xdc, 0xd8, 0xc0, 0x9e, 0x57, 0xe3, 0xc3, 0x7b, 0x65,\r\n  0x3b, 0x02, 0x8f, 0x3e, 0xe8, 0x25, 0x92, 0xe5, 0x15, 0xdd, 0xfd, 0x17, 0xa9, 0xbf, 0xd4, 0x9a, 0x7e, 0xc5, 0x39,\r\n  0x67, 0xfe, 0x76, 0x9d, 0x43, 0xa7, 0xe1, 0xd0, 0xf5, 0x68, 0xf2, 0x1b, 0x34, 0x70, 0x05, 0xa3, 0x8a, 0xd5, 0x79,\r\n  0x86, 0xa8, 0x30, 0xc6, 0x51, 0x4b, 0x1e, 0xa6, 0x27, 0xf6, 0x35, 0xd2, 0x6e, 0x24, 0x16, 0x82, 0x5f, 0xda, 0xe6,\r\n  0x75, 0xa2, 0xef, 0x2c, 0xb2, 0x1c, 0x9f, 0x5d, 0x6f, 0x80, 0x0a, 0x72, 0x44, 0x9b, 0x6c, 0x90, 0x0b, 0x5b, 0x33,\r\n  0x7d, 0x5a, 0x52, 0xf3, 0x61, 0xa1, 0xf7, 0xb0, 0xd6, 0x3f, 0x7c, 0x6d, 0xed, 0x14, 0xe0, 0xa5, 0x3d, 0x22, 0xb3,\r\n  0xf8, 0x89, 0xde, 0x71, 0x1a, 0xaf, 0xba, 0xb5, 0x81,\r\n]);\r\nconst SBox3 = new Uint8Array([\r\n  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39,\r\n  0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2,\r\n  0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76,\r\n  0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc,\r\n  0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d,\r\n  0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c,\r\n  0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f,\r\n  0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,\r\n  0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62,\r\n  0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd,\r\n  0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60,\r\n  0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,\r\n  0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6,\r\n  0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d,\r\n]);\r\nconst SBox4 = new Uint8Array([\r\n  0x30, 0x68, 0x99, 0x1b, 0x87, 0xb9, 0x21, 0x78, 0x50, 0x39, 0xdb, 0xe1, 0x72, 0x09, 0x62, 0x3c, 0x3e, 0x7e, 0x5e,\r\n  0x8e, 0xf1, 0xa0, 0xcc, 0xa3, 0x2a, 0x1d, 0xfb, 0xb6, 0xd6, 0x20, 0xc4, 0x8d, 0x81, 0x65, 0xf5, 0x89, 0xcb, 0x9d,\r\n  0x77, 0xc6, 0x57, 0x43, 0x56, 0x17, 0xd4, 0x40, 0x1a, 0x4d, 0xc0, 0x63, 0x6c, 0xe3, 0xb7, 0xc8, 0x64, 0x6a, 0x53,\r\n  0xaa, 0x38, 0x98, 0x0c, 0xf4, 0x9b, 0xed, 0x7f, 0x22, 0x76, 0xaf, 0xdd, 0x3a, 0x0b, 0x58, 0x67, 0x88, 0x06, 0xc3,\r\n  0x35, 0x0d, 0x01, 0x8b, 0x8c, 0xc2, 0xe6, 0x5f, 0x02, 0x24, 0x75, 0x93, 0x66, 0x1e, 0xe5, 0xe2, 0x54, 0xd8, 0x10,\r\n  0xce, 0x7a, 0xe8, 0x08, 0x2c, 0x12, 0x97, 0x32, 0xab, 0xb4, 0x27, 0x0a, 0x23, 0xdf, 0xef, 0xca, 0xd9, 0xb8, 0xfa,\r\n  0xdc, 0x31, 0x6b, 0xd1, 0xad, 0x19, 0x49, 0xbd, 0x51, 0x96, 0xee, 0xe4, 0xa8, 0x41, 0xda, 0xff, 0xcd, 0x55, 0x86,\r\n  0x36, 0xbe, 0x61, 0x52, 0xf8, 0xbb, 0x0e, 0x82, 0x48, 0x69, 0x9a, 0xe0, 0x47, 0x9e, 0x5c, 0x04, 0x4b, 0x34, 0x15,\r\n  0x79, 0x26, 0xa7, 0xde, 0x29, 0xae, 0x92, 0xd7, 0x84, 0xe9, 0xd2, 0xba, 0x5d, 0xf3, 0xc5, 0xb0, 0xbf, 0xa4, 0x3b,\r\n  0x71, 0x44, 0x46, 0x2b, 0xfc, 0xeb, 0x6f, 0xd5, 0xf6, 0x14, 0xfe, 0x7c, 0x70, 0x5a, 0x7d, 0xfd, 0x2f, 0x18, 0x83,\r\n  0x16, 0xa5, 0x91, 0x1f, 0x05, 0x95, 0x74, 0xa9, 0xc1, 0x5b, 0x4a, 0x85, 0x6d, 0x13, 0x07, 0x4f, 0x4e, 0x45, 0xb2,\r\n  0x0f, 0xc9, 0x1c, 0xa6, 0xbc, 0xec, 0x73, 0x90, 0x7b, 0xcf, 0x59, 0x8f, 0xa1, 0xf9, 0x2d, 0xf2, 0xb1, 0x00, 0x94,\r\n  0x37, 0x9f, 0xd0, 0x2e, 0x9c, 0x6e, 0x28, 0x3f, 0x80, 0xf0, 0x3d, 0xd3, 0x25, 0x8a, 0xb5, 0xe7, 0x42, 0xb3, 0xc7,\r\n  0xea, 0xf7, 0x4c, 0x11, 0x33, 0x03, 0xa2, 0xac, 0x60,\r\n]);\r\n\r\nconst C1 = new Uint8Array([\r\n  0x51, 0x7c, 0xc1, 0xb7, 0x27, 0x22, 0x0a, 0x94, 0xfe, 0x13, 0xab, 0xe8, 0xfa, 0x9a, 0x6e, 0xe0,\r\n]);\r\nconst C2 = new Uint8Array([\r\n  0x6d, 0xb1, 0x4a, 0xcc, 0x9e, 0x21, 0xc8, 0x20, 0xff, 0x28, 0xb1, 0xd5, 0xef, 0x5d, 0xe2, 0xb0,\r\n]);\r\nconst C3 = new Uint8Array([\r\n  0xdb, 0x92, 0x37, 0x1d, 0x21, 0x26, 0xe9, 0x70, 0x03, 0x24, 0x97, 0x75, 0x04, 0xe8, 0xc9, 0x0e,\r\n]);\r\n\r\n// * Functions\r\n\r\nfunction RL128(x: Uint8Array, n: number) {\r\n  const x_byte = x.length;\r\n  const x_bit = x_byte << 3;\r\n\r\n  // 规范化移位数\r\n  const shift = n % x_bit;\r\n  if (shift === 0) return U8.from(x);\r\n\r\n  // 计算字节和位移\r\n  const byte_shift = shift >> 3;\r\n  const bit_shift = shift % 8;\r\n\r\n  const result = new U8(x.length);\r\n  for (let i = 0; i < x_byte; i++) {\r\n    const current = x[i];\r\n    const next = x[(i + 1) % x_byte];\r\n\r\n    result[i] = (current << bit_shift) | (next >> (8 - bit_shift));\r\n  }\r\n\r\n  // 处理字节移位\r\n  if (byte_shift > 0) {\r\n    const temp = new Uint8Array(result);\r\n    for (let i = 0; i < x_byte; i++) {\r\n      result[i] = temp[(i + byte_shift) % x_byte];\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\nfunction RR128(x: Uint8Array, n: number) {\r\n  const x_byte = x.length;\r\n  const x_bit = x_byte << 3;\r\n\r\n  // 规范化移位数\r\n  const shift = n % x_bit;\r\n  if (shift === 0) U8.from(x);\r\n\r\n  // 计算字节和位移\r\n  const byte_shift = shift >> 3;\r\n  const bit_shift = shift % 8;\r\n\r\n  const result = new U8(x.length);\r\n  for (let i = 0; i < x_byte; i++) {\r\n    const current = x[i];\r\n    const next = x[(i - 1 + x_byte) % x_byte];\r\n\r\n    result[i] = (current >> bit_shift) | (next << (8 - bit_shift));\r\n  }\r\n\r\n  // 处理字节移位\r\n  if (byte_shift > 0) {\r\n    const temp = new Uint8Array(result);\r\n    for (let i = 0; i < x_byte; i++) {\r\n      result[i] = temp[(i - byte_shift + x_byte) % x_byte];\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\nfunction XOR(x: Uint8Array, y: Uint8Array) {\r\n  return x.map((_, i) => x[i] ^ y[i]);\r\n}\r\n\r\nfunction FO(D: Uint8Array, RK: Uint8Array) {\r\n  return A(SL1(XOR(D, RK)));\r\n}\r\nfunction FE(D: Uint8Array, RK: Uint8Array) {\r\n  return A(SL2(XOR(D, RK)));\r\n}\r\nfunction SL1(x: Uint8Array) {\r\n  const y = new Uint8Array(16);\r\n  // y0  = SB1(x0),  y1  = SB2(x1),  y2  = SB3(x2),  y3  = SB4(x3),\r\n  // y4  = SB1(x4),  y5  = SB2(x5),  y6  = SB3(x6),  y7  = SB4(x7),\r\n  // y8  = SB1(x8),  y9  = SB2(x9),  y10 = SB3(x10), y11 = SB4(x11),\r\n  // y12 = SB1(x12), y13 = SB2(x13), y14 = SB3(x14), y15 = SB4(x15).\r\n  y[0] = SBox1[x[0]];\r\n  y[1] = SBox2[x[1]];\r\n  y[2] = SBox3[x[2]];\r\n  y[3] = SBox4[x[3]];\r\n  y[4] = SBox1[x[4]];\r\n  y[5] = SBox2[x[5]];\r\n  y[6] = SBox3[x[6]];\r\n  y[7] = SBox4[x[7]];\r\n  y[8] = SBox1[x[8]];\r\n  y[9] = SBox2[x[9]];\r\n  y[10] = SBox3[x[10]];\r\n  y[11] = SBox4[x[11]];\r\n  y[12] = SBox1[x[12]];\r\n  y[13] = SBox2[x[13]];\r\n  y[14] = SBox3[x[14]];\r\n  y[15] = SBox4[x[15]];\r\n  return y;\r\n}\r\nfunction SL2(x: Uint8Array) {\r\n  const y = new Uint8Array(16);\r\n  // y0  = SB3(x0),  y1  = SB4(x1),  y2  = SB1(x2),  y3  = SB2(x3),\r\n  // y4  = SB3(x4),  y5  = SB4(x5),  y6  = SB1(x6),  y7  = SB2(x7),\r\n  // y8  = SB3(x8),  y9  = SB4(x9),  y10 = SB1(x10), y11 = SB2(x11),\r\n  // y12 = SB3(x12), y13 = SB4(x13), y14 = SB1(x14), y15 = SB2(x15).\r\n  y[0] = SBox3[x[0]];\r\n  y[1] = SBox4[x[1]];\r\n  y[2] = SBox1[x[2]];\r\n  y[3] = SBox2[x[3]];\r\n  y[4] = SBox3[x[4]];\r\n  y[5] = SBox4[x[5]];\r\n  y[6] = SBox1[x[6]];\r\n  y[7] = SBox2[x[7]];\r\n  y[8] = SBox3[x[8]];\r\n  y[9] = SBox4[x[9]];\r\n  y[10] = SBox1[x[10]];\r\n  y[11] = SBox2[x[11]];\r\n  y[12] = SBox3[x[12]];\r\n  y[13] = SBox4[x[13]];\r\n  y[14] = SBox1[x[14]];\r\n  y[15] = SBox2[x[15]];\r\n  return y;\r\n}\r\nfunction A(x: Uint8Array) {\r\n  const y = new Uint8Array(16);\r\n  // y0  = x3 ^ x4 ^ x6 ^ x8  ^ x9  ^ x13 ^ x14\r\n  // y1  = x2 ^ x5 ^ x7 ^ x8  ^ x9  ^ x12 ^ x15\r\n  // y2  = x1 ^ x4 ^ x6 ^ x10 ^ x11 ^ x12 ^ x15\r\n  // y3  = x0 ^ x5 ^ x7 ^ x10 ^ x11 ^ x13 ^ x14\r\n  // y4  = x0 ^ x2 ^ x5 ^ x8  ^ x11 ^ x14 ^ x15\r\n  // y5  = x1 ^ x3 ^ x4 ^ x9  ^ x10 ^ x14 ^ x15\r\n  // y6  = x0 ^ x2 ^ x7 ^ x9  ^ x10 ^ x12 ^ x13\r\n  // y7  = x1 ^ x3 ^ x6 ^ x8  ^ x11 ^ x12 ^ x13\r\n  // y8  = x0 ^ x1 ^ x4 ^ x7  ^ x10 ^ x13 ^ x15\r\n  // y9  = x0 ^ x1 ^ x5 ^ x6  ^ x11 ^ x12 ^ x14\r\n  // y10 = x2 ^ x3 ^ x5 ^ x6  ^ x8  ^ x13 ^ x15\r\n  // y11 = x2 ^ x3 ^ x4 ^ x7  ^ x9  ^ x12 ^ x14\r\n  // y12 = x1 ^ x2 ^ x6 ^ x7  ^ x9  ^ x11 ^ x12\r\n  // y13 = x0 ^ x3 ^ x6 ^ x7  ^ x8  ^ x10 ^ x13\r\n  // y14 = x0 ^ x3 ^ x4 ^ x5  ^ x9  ^ x11 ^ x14\r\n  // y15 = x1 ^ x2 ^ x4 ^ x5  ^ x8  ^ x10 ^ x15\r\n  y[0] = x[3] ^ x[4] ^ x[6] ^ x[8] ^ x[9] ^ x[13] ^ x[14];\r\n  y[1] = x[2] ^ x[5] ^ x[7] ^ x[8] ^ x[9] ^ x[12] ^ x[15];\r\n  y[2] = x[1] ^ x[4] ^ x[6] ^ x[10] ^ x[11] ^ x[12] ^ x[15];\r\n  y[3] = x[0] ^ x[5] ^ x[7] ^ x[10] ^ x[11] ^ x[13] ^ x[14];\r\n  y[4] = x[0] ^ x[2] ^ x[5] ^ x[8] ^ x[11] ^ x[14] ^ x[15];\r\n  y[5] = x[1] ^ x[3] ^ x[4] ^ x[9] ^ x[10] ^ x[14] ^ x[15];\r\n  y[6] = x[0] ^ x[2] ^ x[7] ^ x[9] ^ x[10] ^ x[12] ^ x[13];\r\n  y[7] = x[1] ^ x[3] ^ x[6] ^ x[8] ^ x[11] ^ x[12] ^ x[13];\r\n  y[8] = x[0] ^ x[1] ^ x[4] ^ x[7] ^ x[10] ^ x[13] ^ x[15];\r\n  y[9] = x[0] ^ x[1] ^ x[5] ^ x[6] ^ x[11] ^ x[12] ^ x[14];\r\n  y[10] = x[2] ^ x[3] ^ x[5] ^ x[6] ^ x[8] ^ x[13] ^ x[15];\r\n  y[11] = x[2] ^ x[3] ^ x[4] ^ x[7] ^ x[9] ^ x[12] ^ x[14];\r\n  y[12] = x[1] ^ x[2] ^ x[6] ^ x[7] ^ x[9] ^ x[11] ^ x[12];\r\n  y[13] = x[0] ^ x[3] ^ x[6] ^ x[7] ^ x[8] ^ x[10] ^ x[13];\r\n  y[14] = x[0] ^ x[3] ^ x[4] ^ x[5] ^ x[9] ^ x[11] ^ x[14];\r\n  y[15] = x[1] ^ x[2] ^ x[4] ^ x[5] ^ x[8] ^ x[10] ^ x[15];\r\n  return y;\r\n}\r\n\r\nfunction KeyScheduling(K: Uint8Array, round: 12 | 14 | 16) {\r\n  const _K = new Uint8Array(32);\r\n  _K.set(K);\r\n  K = _K;\r\n  const KL = K.subarray(0, 16);\r\n  const KR = K.subarray(16, 32);\r\n\r\n  let CK1: Uint8Array, CK2: Uint8Array, CK3: Uint8Array;\r\n  switch (round) {\r\n    case 12:\r\n      CK1 = C1;\r\n      CK2 = C2;\r\n      CK3 = C3;\r\n      break;\r\n    case 14:\r\n      CK1 = C2;\r\n      CK2 = C3;\r\n      CK3 = C1;\r\n      break;\r\n    case 16:\r\n      CK1 = C3;\r\n      CK2 = C1;\r\n      CK3 = C2;\r\n      break;\r\n  }\r\n\r\n  const W0 = new Uint8Array(16);\r\n  const W1 = new Uint8Array(16);\r\n  const W2 = new Uint8Array(16);\r\n  const W3 = new Uint8Array(16);\r\n  W0.set(KL);\r\n  W1.set(FO(W0, CK1));\r\n  W1.forEach((_, i) => {\r\n    W1[i] ^= KR[i];\r\n  });\r\n  W2.set(FE(W1, CK2));\r\n  W2.forEach((_, i) => {\r\n    W2[i] ^= W0[i];\r\n  });\r\n  W3.set(FO(W2, CK3));\r\n  W3.forEach((_, i) => {\r\n    W3[i] ^= W1[i];\r\n  });\r\n  const EK = computeEK([W0, W1, W2, W3], round);\r\n  const DK = computeDK(EK, round);\r\n\r\n  return { EK, DK };\r\n}\r\nfunction computeEK(W: Uint8Array[], round: 12 | 14 | 16) {\r\n  const [W0, W1, W2, W3] = W;\r\n  // ek1  = W0 ^ (W1 >>> 19)\r\n  // ek2  = W1 ^ (W2 >>> 19)\r\n  // ek3  = W2 ^ (W3 >>> 19)\r\n  // ek4  = W3 ^ (W0 >>> 19)\r\n  // ek5  = W0 ^ (W1 >>> 31)\r\n  // ek6  = W1 ^ (W2 >>> 31)\r\n  // ek7  = W2 ^ (W3 >>> 31)\r\n  // ek8  = W3 ^ (W0 >>> 31)\r\n  // ek9  = W0 ^ (W1 <<< 61)\r\n  // ek10 = W1 ^ (W2 <<< 61)\r\n  // ek11 = W2 ^ (W3 <<< 61)\r\n  // ek12 = W3 ^ (W0 <<< 61)\r\n  // ek13 = W0 ^ (W1 <<< 31)\r\n  // ek14 = W1 ^ (W2 <<< 31)\r\n  // ek15 = W2 ^ (W3 <<< 31)\r\n  // ek16 = W3 ^ (W0 <<< 31)\r\n  // ek17 = W0 ^ (W1 <<< 19)\r\n  const ek01 = XOR(RR128(W1, 19), W0);\r\n  const ek02 = XOR(RR128(W2, 19), W1);\r\n  const ek03 = XOR(RR128(W3, 19), W2);\r\n  const ek04 = XOR(RR128(W0, 19), W3);\r\n  const ek05 = XOR(RR128(W1, 31), W0);\r\n  const ek06 = XOR(RR128(W2, 31), W1);\r\n  const ek07 = XOR(RR128(W3, 31), W2);\r\n  const ek08 = XOR(RR128(W0, 31), W3);\r\n  const ek09 = XOR(RL128(W1, 61), W0);\r\n  const ek10 = XOR(RL128(W2, 61), W1);\r\n  const ek11 = XOR(RL128(W3, 61), W2);\r\n  const ek12 = XOR(RL128(W0, 61), W3);\r\n  const ek13 = XOR(RL128(W1, 31), W0);\r\n  if (round === 12) {\r\n    return [ek01, ek02, ek03, ek04, ek05, ek06, ek07, ek08, ek09, ek10, ek11, ek12, ek13];\r\n  }\r\n  const ek14 = XOR(RL128(W2, 31), W1);\r\n  const ek15 = XOR(RL128(W3, 31), W2);\r\n  if (round === 14) {\r\n    return [ek01, ek02, ek03, ek04, ek05, ek06, ek07, ek08, ek09, ek10, ek11, ek12, ek13, ek14, ek15];\r\n  }\r\n  const ek16 = XOR(RL128(W0, 31), W3);\r\n  const ek17 = XOR(RL128(W1, 19), W0);\r\n  return [ek01, ek02, ek03, ek04, ek05, ek06, ek07, ek08, ek09, ek10, ek11, ek12, ek13, ek14, ek15, ek16, ek17];\r\n}\r\nfunction computeDK(EK: Uint8Array[], round: 12 | 14 | 16) {\r\n  const DK = Array.from<Uint8Array>({ length: EK.length });\r\n  // dk1 = ek{ n + 1 },\r\n  // dk2 = A(ek{ n }),\r\n  // dk3 = A(ek{ n- 1}),\r\n  // ...,\r\n  // dk{ n }= A(ek2),\r\n  // dk{ n + 1 }= ek1.\r\n  DK[0] = EK[round];\r\n  let j = round - 1;\r\n  for (let i = 1; i < round; i++) {\r\n    DK[i] = A(EK[j--]);\r\n  }\r\n  DK[round] = EK[0];\r\n  return DK;\r\n}\r\n\r\n// * ARIA Algorithm\r\n\r\nfunction _aria(K: Uint8Array, b: 128 | 192 | 256) {\r\n  if (K.byteLength !== b >> 3) {\r\n    throw new KitError(`Aria-${b} key must be ${b >> 3} byte`);\r\n  }\r\n  /**\r\n   * - 128-bit key: 12 rounds\r\n   * - 192-bit key: 14 rounds\r\n   * - 256-bit key: 16 rounds\r\n   */\r\n  const round = b === 128 ? 12 : b === 192 ? 14 : 16;\r\n  const { EK, DK } = KeyScheduling(K, round);\r\n  const cipher = (M: Uint8Array, RK: Uint8Array[]) => {\r\n    if (M.byteLength !== 16) {\r\n      throw new KitError('ARIA block must be 16 byte');\r\n    }\r\n    let P = M;\r\n    let i = 0;\r\n    while (i < round - 2) {\r\n      P = FO(P, RK[i++]);\r\n      P = FE(P, RK[i++]);\r\n    }\r\n    P = FO(P, RK[i++]);\r\n    P = SL2(XOR(P, RK[i++]));\r\n    P = XOR(P, RK[i++]);\r\n    return new U8(P);\r\n  };\r\n  return {\r\n    encrypt: (M: Uint8Array) => cipher(M, EK),\r\n    decrypt: (C: Uint8Array) => cipher(C, DK),\r\n  };\r\n}\r\n\r\n/**\r\n * ARIA 分组密码算法 / block cipher algorithm\r\n *\r\n * @param {128 | 192 | 256} b - 密钥长度 / Key size (bit)\r\n */\r\nexport function aria(b: 128 | 192 | 256) {\r\n  return createCipher((K: Uint8Array) => _aria(K, b), {\r\n    ALGORITHM: `ARIA-${b}`,\r\n    BLOCK_SIZE: 16,\r\n    KEY_SIZE: b >> 3,\r\n    MIN_KEY_SIZE: 16,\r\n    MAX_KEY_SIZE: 32,\r\n  });\r\n}\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, U8 } from '../../core/utils';\r\n\r\n// * Blowfish Algorithm\r\n\r\nfunction _blowfish(key: Uint8Array) {\r\n  if (key.length < 4 || key.length > 56) {\r\n    throw new KitError(`Blowfish key must be between 4 and 56 byte`);\r\n  }\r\n  const P = new Uint32Array([\r\n    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6,\r\n    0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b,\r\n  ]);\r\n  const S = [\r\n    new Uint32Array([\r\n      0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947,\r\n      0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,\r\n      0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918,\r\n      0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\r\n      0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af,\r\n      0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,\r\n      0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60,\r\n      0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\r\n      0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2,\r\n      0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,\r\n      0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f,\r\n      0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\r\n      0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6,\r\n      0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,\r\n      0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39,\r\n      0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\r\n      0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb,\r\n      0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,\r\n      0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc,\r\n      0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\r\n      0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb,\r\n      0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,\r\n      0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81,\r\n      0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\r\n      0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b,\r\n      0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,\r\n      0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476,\r\n      0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\r\n      0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,\r\n    ]),\r\n    new Uint32Array([\r\n      0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71,\r\n      0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65,\r\n      0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6,\r\n      0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\r\n      0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a,\r\n      0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc,\r\n      0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1,\r\n      0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\r\n      0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718,\r\n      0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908,\r\n      0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6,\r\n      0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\r\n      0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6,\r\n      0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d,\r\n      0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1,\r\n      0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\r\n      0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90,\r\n      0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca,\r\n      0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e,\r\n      0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\r\n      0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef,\r\n      0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea,\r\n      0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a,\r\n      0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\r\n      0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092,\r\n      0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e,\r\n      0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705,\r\n      0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\r\n      0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,\r\n    ]),\r\n    new Uint32Array([\r\n      0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471,\r\n      0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af,\r\n      0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6,\r\n      0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\r\n      0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35,\r\n      0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332,\r\n      0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7,\r\n      0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\r\n      0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee,\r\n      0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60,\r\n      0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62,\r\n      0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\r\n      0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60,\r\n      0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3,\r\n      0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf,\r\n      0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\r\n      0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659,\r\n      0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086,\r\n      0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187,\r\n      0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\r\n      0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e,\r\n      0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09,\r\n      0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f,\r\n      0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\r\n      0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7,\r\n      0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188,\r\n      0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3,\r\n      0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\r\n      0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,\r\n    ]),\r\n    new Uint32Array([\r\n      0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d,\r\n      0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,\r\n      0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8,\r\n      0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\r\n      0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3,\r\n      0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,\r\n      0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472,\r\n      0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\r\n      0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15,\r\n      0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,\r\n      0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862,\r\n      0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\r\n      0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd,\r\n      0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,\r\n      0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671,\r\n      0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\r\n      0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1,\r\n      0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,\r\n      0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff,\r\n      0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\r\n      0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532,\r\n      0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,\r\n      0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5,\r\n      0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\r\n      0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd,\r\n      0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,\r\n      0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0,\r\n      0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\r\n      0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,\r\n    ]),\r\n  ];\r\n  function F(x: number) {\r\n    let r = 0;\r\n    r += S[0][(x >>> 24) & 0xff];\r\n    r += S[1][(x >>> 16) & 0xff];\r\n    r ^= S[2][(x >>> 8) & 0xff];\r\n    r += S[3][(x >>> 0) & 0xff];\r\n    return r;\r\n  }\r\n  const _encrypt = (l: number, r: number) => {\r\n    for (let i = 0; i < 16; i++) {\r\n      l ^= P[i];\r\n      r ^= F(l);\r\n      [l, r] = [r, l];\r\n    }\r\n    l ^= P[16];\r\n    r ^= P[17];\r\n    return [r, l];\r\n  };\r\n  const _decrypt = (l: number, r: number) => {\r\n    for (let i = 17; i > 1; i--) {\r\n      l ^= P[i];\r\n      r ^= F(l);\r\n      [l, r] = [r, l];\r\n    }\r\n    l ^= P[1];\r\n    r ^= P[0];\r\n    return [r, l];\r\n  };\r\n\r\n  // init\r\n  (() => {\r\n    let p = 0;\r\n    for (let i = 0; i < 18; i++) {\r\n      let k = 0;\r\n      for (let j = 0; j < 4; j++) {\r\n        k = (k << 8) | key[p];\r\n        p = (p + 1) % key.length;\r\n      }\r\n      P[i] ^= k;\r\n    }\r\n    let l = 0;\r\n    let r = 0;\r\n    for (let i = 0; i < 18; i += 2) {\r\n      [l, r] = _encrypt(l, r);\r\n      P[i] = l;\r\n      P[i + 1] = r;\r\n    }\r\n    for (let i = 0; i < 4; i++) {\r\n      for (let j = 0; j < 256; j += 2) {\r\n        [l, r] = _encrypt(l, r);\r\n        S[i][j] = l;\r\n        S[i][j + 1] = r;\r\n      }\r\n    }\r\n  })();\r\n\r\n  return {\r\n    encrypt: (plaintext: Uint8Array) => {\r\n      if (plaintext.length !== 8) {\r\n        throw new KitError(`Blowfish block must be 8 byte`);\r\n      }\r\n      const c = U8.from(plaintext);\r\n      const c_view = new DataView(c.buffer, c.byteOffset, c.byteLength);\r\n      let c0 = c_view.getUint32(0, false);\r\n      let c1 = c_view.getUint32(4, false);\r\n      [c0, c1] = _encrypt(c0, c1);\r\n      c_view.setUint32(0, c0, false);\r\n      c_view.setUint32(4, c1, false);\r\n      return c;\r\n    },\r\n    decrypt: (ciphertext: Uint8Array) => {\r\n      if (ciphertext.length !== 8) {\r\n        throw new KitError(`Blowfish block must be 8 byte`);\r\n      }\r\n      const p = U8.from(ciphertext);\r\n      const p_view = new DataView(p.buffer, p.byteOffset, p.byteLength);\r\n      let p0 = p_view.getUint32(0, false);\r\n      let p1 = p_view.getUint32(4, false);\r\n      [p0, p1] = _decrypt(p0, p1);\r\n      p_view.setUint32(0, p0, false);\r\n      p_view.setUint32(4, p1, false);\r\n      return p;\r\n    },\r\n  };\r\n}\r\n\r\n/**\r\n * Blowfish 分组密码算法 / block cipher algorithm\r\n */\r\nexport const blowfish = createCipher(_blowfish, {\r\n  ALGORITHM: 'Blowfish',\r\n  BLOCK_SIZE: 8,\r\n  KEY_SIZE: 16,\r\n  MIN_KEY_SIZE: 4,\r\n  MAX_KEY_SIZE: 56,\r\n});\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, rotateL32, rotateR32, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst SBox1_1110 = new Uint32Array([\r\n  0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500, 0xe4e4e400,\r\n  0x85858500, 0x57575700, 0x35353500, 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00,\r\n  0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100, 0xededed00, 0x0e0e0e00, 0x4f4f4f00,\r\n  0x4e4e4e00, 0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,\r\n  0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00,\r\n  0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00, 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700,\r\n  0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600, 0x51515100, 0x56565600, 0x6c6c6c00,\r\n  0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,\r\n  0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900, 0xdfdfdf00,\r\n  0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200, 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700,\r\n  0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700, 0x14141400, 0x58585800, 0x3a3a3a00,\r\n  0x61616100, 0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,\r\n  0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200, 0xc3c3c300,\r\n  0xb5b5b500, 0x7a7a7a00, 0x91919100, 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00,\r\n  0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00, 0xa1a1a100, 0x89898900, 0x62626200,\r\n  0x97979700, 0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,\r\n  0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00, 0x8a8a8a00,\r\n  0x03030300, 0xe6e6e600, 0xdadada00, 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00,\r\n  0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300, 0x73737300, 0x67676700, 0xf6f6f600,\r\n  0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,\r\n  0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00, 0x13131300,\r\n  0xbebebe00, 0x63636300, 0x2e2e2e00, 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00,\r\n  0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600, 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400,\r\n  0x59595900, 0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,\r\n  0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00, 0x72727200,\r\n  0x07070700, 0xb9b9b900, 0x55555500, 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900,\r\n  0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400, 0x40404000, 0x28282800, 0xd3d3d300,\r\n  0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,\r\n  0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00,\r\n]);\r\nconst SBox4_4404 = new Uint32Array([\r\n  0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae, 0x23230023,\r\n  0x6b6b006b, 0x45450045, 0xa5a500a5, 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af,\r\n  0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b, 0xa6a600a6, 0x39390039, 0xd5d500d5,\r\n  0x5d5d005d, 0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,\r\n  0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076, 0x6d6d006d,\r\n  0xa9a900a9, 0xd1d100d1, 0x04040004, 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c,\r\n  0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a, 0x24240024, 0xe8e800e8, 0x60600060,\r\n  0x69690069, 0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,\r\n  0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd, 0x87870087,\r\n  0x83830083, 0xcdcd00cd, 0x90900090, 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8,\r\n  0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063, 0xe9e900e9, 0xa7a700a7, 0x9f9f009f,\r\n  0xbcbc00bc, 0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,\r\n  0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac, 0x36360036,\r\n  0x2a2a002a, 0x3c3c003c, 0xf1f100f1, 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad,\r\n  0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5, 0x85850085, 0x35350035, 0x0c0c000c,\r\n  0x41410041, 0xefef00ef, 0x93930093, 0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,\r\n  0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a, 0xe1e100e1,\r\n  0xcaca00ca, 0x47470047, 0x3d3d003d, 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066,\r\n  0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099, 0x4c4c004c, 0xc2c200c2, 0x7e7e007e,\r\n  0x05050005, 0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,\r\n  0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091, 0x08080008,\r\n  0xa8a800a8, 0xfcfc00fc, 0x50500050, 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095,\r\n  0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db, 0x03030003, 0xdada00da, 0x3f3f003f,\r\n  0x94940094, 0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,\r\n  0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e, 0x79790079,\r\n  0x8c8c008c, 0x6e6e006e, 0x8e8e008e, 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a,\r\n  0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa, 0x07070007, 0x55550055, 0xeeee00ee,\r\n  0x0a0a000a, 0x49490049, 0x68680068, 0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,\r\n  0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e,\r\n]);\r\nconst SBox2_0222 = new Uint32Array([\r\n  0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb, 0x00c9c9c9,\r\n  0x000b0b0b, 0x00aeaeae, 0x006a6a6a, 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf,\r\n  0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242, 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e,\r\n  0x009c9c9c, 0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,\r\n  0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe, 0x00bcbcbc,\r\n  0x008b8b8b, 0x00161616, 0x00343434, 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e,\r\n  0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad, 0x00a2a2a2, 0x00acacac, 0x00d8d8d8,\r\n  0x009a9a9a, 0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,\r\n  0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333, 0x00bfbfbf,\r\n  0x00989898, 0x00979797, 0x00858585, 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f,\r\n  0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf, 0x00282828, 0x00b0b0b0, 0x00747474,\r\n  0x00c2c2c2, 0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,\r\n  0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565, 0x00878787,\r\n  0x006b6b6b, 0x00f4f4f4, 0x00232323, 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9,\r\n  0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa, 0x00434343, 0x00131313, 0x00c4c4c4,\r\n  0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,\r\n  0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7, 0x00151515,\r\n  0x00060606, 0x00cdcdcd, 0x00b5b5b5, 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8,\r\n  0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666, 0x00e6e6e6, 0x00cecece, 0x00ededed,\r\n  0x00e7e7e7, 0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,\r\n  0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696, 0x00262626,\r\n  0x007d7d7d, 0x00c6c6c6, 0x005c5c5c, 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc,\r\n  0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d, 0x005e5e5e, 0x00fbfbfb, 0x00696969,\r\n  0x00b2b2b2, 0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,\r\n  0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4,\r\n  0x000e0e0e, 0x00737373, 0x00aaaaaa, 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292,\r\n  0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949, 0x00808080, 0x00505050, 0x00a7a7a7,\r\n  0x00f6f6f6, 0x00777777, 0x00939393, 0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,\r\n  0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d,\r\n]);\r\nconst SBox3_3033 = new Uint32Array([\r\n  0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2, 0x72007272,\r\n  0xc200c2c2, 0xab00abab, 0x9a009a9a, 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7,\r\n  0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090, 0xf600f6f6, 0x07000707, 0xa700a7a7,\r\n  0x27002727, 0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,\r\n  0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf, 0x2f002f2f,\r\n  0xe200e2e2, 0x85008585, 0x0d000d0d, 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3,\r\n  0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b, 0xa800a8a8, 0x2b002b2b, 0x36003636,\r\n  0xa600a6a6, 0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,\r\n  0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc, 0xef00efef,\r\n  0x26002626, 0xe500e5e5, 0x61006161, 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb,\r\n  0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb, 0x0a000a0a, 0x2c002c2c, 0x1d001d1d,\r\n  0xb000b0b0, 0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,\r\n  0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959, 0xe100e1e1,\r\n  0xda00dada, 0x3d003d3d, 0xc800c8c8, 0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e,\r\n  0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe, 0xd000d0d0, 0xc400c4c4, 0x31003131,\r\n  0xcb00cbcb, 0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,\r\n  0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded, 0x45004545,\r\n  0x81008181, 0x73007373, 0x6d006d6d, 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e,\r\n  0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999, 0xb900b9b9, 0xb300b3b3, 0x7b007b7b,\r\n  0xf900f9f9, 0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,\r\n  0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5, 0x89008989,\r\n  0x5f005f5f, 0xb100b1b1, 0x17001717, 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737,\r\n  0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b, 0x97009797, 0xfe00fefe, 0x5a005a5a,\r\n  0xac00acac, 0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,\r\n  0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d, 0x39003939,\r\n  0x83008383, 0xdc00dcdc, 0xaa00aaaa, 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4,\r\n  0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252, 0x20002020, 0x14001414, 0xe900e9e9,\r\n  0xbd00bdbd, 0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,\r\n  0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f,\r\n]);\r\n\r\nconst SIGMA = new Uint32Array([\r\n  0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c, 0x10e527fa,\r\n  0xde682d1d, 0xb05688c2, 0xb3e6c1fd,\r\n]);\r\n\r\n// * Functions\r\n\r\nfunction ROTL128(s: Uint32Array, bit: number) {\r\n  const n = 32 - bit;\r\n  const t = (s[3] << bit) | (s[0] >>> n);\r\n  s[0] = (s[0] << bit) | (s[1] >>> n);\r\n  s[1] = (s[1] << bit) | (s[2] >>> n);\r\n  s[2] = (s[2] << bit) | (s[3] >>> n);\r\n  s[3] = t;\r\n}\r\n\r\nfunction Camellia_Feistel(sh: Uint32Array, sl: Uint32Array, kh: number, kl: number) {\r\n  const t0 = sh[0] ^ kh;\r\n  const t1 = sh[1] ^ kl;\r\n  const t3 =\r\n    SBox1_1110[0xff & (t0 >> 24)] ^\r\n    SBox2_0222[0xff & (t0 >> 16)] ^\r\n    SBox3_3033[0xff & (t0 >> 8)] ^\r\n    SBox4_4404[0xff & t0];\r\n  const t2 =\r\n    t3 ^\r\n    SBox1_1110[0xff & t1] ^\r\n    SBox4_4404[0xff & (t1 >> 8)] ^\r\n    SBox3_3033[0xff & (t1 >> 16)] ^\r\n    SBox2_0222[0xff & (t1 >> 24)];\r\n  sl[0] ^= t2;\r\n  sl[1] ^= t2 ^ rotateR32(t3, 8);\r\n}\r\n\r\n// * Camellia Algorithm\r\n\r\nfunction KeySchedule(K: Uint8Array) {\r\n  const KView = new DataView(K.buffer, K.byteOffset, K.byteLength);\r\n  const k = K.length === 16 ? new Uint32Array(52) : new Uint32Array(68);\r\n  const s = new Uint32Array(4);\r\n  const sh = s.subarray(0, 2);\r\n  const sl = s.subarray(2, 4);\r\n\r\n  /* Map the key to the keyTable */\r\n  switch (K.length) {\r\n    case 16:\r\n      mapKey128(KView, s, k);\r\n      break;\r\n    case 24:\r\n      mapKey192(KView, s, k);\r\n      break;\r\n    case 32:\r\n      mapKey256(KView, s, k);\r\n      break;\r\n  }\r\n\r\n  /* Use the Feistel routine to scramble the key material */\r\n  Camellia_Feistel(sh, sl, SIGMA[0], SIGMA[1]);\r\n  Camellia_Feistel(sl, sh, SIGMA[2], SIGMA[3]);\r\n\r\n  s[0] ^= k[0];\r\n  s[1] ^= k[1];\r\n  s[2] ^= k[2];\r\n  s[3] ^= k[3];\r\n  Camellia_Feistel(sh, sl, SIGMA[4], SIGMA[5]);\r\n  Camellia_Feistel(sl, sh, SIGMA[6], SIGMA[7]);\r\n\r\n  /* Fill the keyTable. Requires many block rotations. */\r\n  switch (K.length) {\r\n    case 16:\r\n      setup128(s, k);\r\n      break;\r\n    case 24:\r\n    case 32:\r\n      setup256(s, k);\r\n      break;\r\n  }\r\n\r\n  return k;\r\n}\r\nfunction mapKey128(KView: DataView, s: Uint32Array, k: Uint32Array) {\r\n  s[0] = k[0] = KView.getUint32(0, false);\r\n  s[1] = k[1] = KView.getUint32(4, false);\r\n  s[2] = k[2] = KView.getUint32(8, false);\r\n  s[3] = k[3] = KView.getUint32(12, false);\r\n}\r\nfunction mapKey192(KView: DataView, s: Uint32Array, k: Uint32Array) {\r\n  mapKey128(KView, s, k);\r\n  s[0] = k[8] = KView.getUint32(16, false);\r\n  s[1] = k[9] = KView.getUint32(20, false);\r\n  s[2] = k[10] = ~s[0];\r\n  s[3] = k[11] = ~s[1];\r\n  s[0] ^= k[0];\r\n  s[1] ^= k[1];\r\n  s[2] ^= k[2];\r\n  s[3] ^= k[3];\r\n}\r\nfunction mapKey256(KView: DataView, s: Uint32Array, k: Uint32Array) {\r\n  mapKey192(KView, s, k);\r\n  s[0] = k[8] = KView.getUint32(16, false);\r\n  s[1] = k[9] = KView.getUint32(20, false);\r\n  s[2] = k[10] = KView.getUint32(24, false);\r\n  s[3] = k[11] = KView.getUint32(28, false);\r\n  s[0] ^= k[0];\r\n  s[1] ^= k[1];\r\n  s[2] ^= k[2];\r\n  s[3] ^= k[3];\r\n}\r\nfunction setup128(s: Uint32Array, k: Uint32Array) {\r\n  k[4] = s[0];\r\n  k[5] = s[1];\r\n  k[6] = s[2];\r\n  k[7] = s[3];\r\n  ROTL128(s, 15); /* KA <<< 15 */\r\n  k[12] = s[0];\r\n  k[13] = s[1];\r\n  k[14] = s[2];\r\n  k[15] = s[3];\r\n  ROTL128(s, 15); /* KA <<< 30 */\r\n  k[16] = s[0];\r\n  k[17] = s[1];\r\n  k[18] = s[2];\r\n  k[19] = s[3];\r\n  ROTL128(s, 15); /* KA <<< 45 */\r\n  k[24] = s[0];\r\n  k[25] = s[1];\r\n  ROTL128(s, 15); /* KA <<< 60 */\r\n  k[28] = s[0];\r\n  k[29] = s[1];\r\n  k[30] = s[2];\r\n  k[31] = s[3];\r\n  [s[0], s[1], s[2], s[3]] = [s[1], s[2], s[3], s[0]];\r\n  ROTL128(s, 2); /* KA <<< 94 */\r\n  k[40] = s[0];\r\n  k[41] = s[1];\r\n  k[42] = s[2];\r\n  k[43] = s[3];\r\n  ROTL128(s, 17); /* KA <<<111 */\r\n  k[48] = s[0];\r\n  k[49] = s[1];\r\n  k[50] = s[2];\r\n  k[51] = s[3];\r\n\r\n  s[0] = k[0];\r\n  s[1] = k[1];\r\n  s[2] = k[2];\r\n  s[3] = k[3];\r\n  ROTL128(s, 15); /* KL <<< 15 */\r\n  k[8] = s[0];\r\n  k[9] = s[1];\r\n  k[10] = s[2];\r\n  k[11] = s[3];\r\n  ROTL128(s, 30); /* KL <<< 45 */\r\n  k[20] = s[0];\r\n  k[21] = s[1];\r\n  k[22] = s[2];\r\n  k[23] = s[3];\r\n  ROTL128(s, 15); /* KL <<< 60 */\r\n  k[26] = s[2];\r\n  k[27] = s[3];\r\n  ROTL128(s, 17); /* KL <<< 77 */\r\n  k[32] = s[0];\r\n  k[33] = s[1];\r\n  k[34] = s[2];\r\n  k[35] = s[3];\r\n  ROTL128(s, 17); /* KL <<< 94 */\r\n  k[36] = s[0];\r\n  k[37] = s[1];\r\n  k[38] = s[2];\r\n  k[39] = s[3];\r\n  ROTL128(s, 17); /* KL <<<111 */\r\n  k[44] = s[0];\r\n  k[45] = s[1];\r\n  k[46] = s[2];\r\n  k[47] = s[3];\r\n}\r\nfunction setup256(s: Uint32Array, k: Uint32Array) {\r\n  const sh = s.subarray(0, 2);\r\n  const sl = s.subarray(2, 4);\r\n  k[12] = s[0];\r\n  k[13] = s[1];\r\n  k[14] = s[2];\r\n  k[15] = s[3];\r\n  s[0] ^= k[8];\r\n  s[1] ^= k[9];\r\n  s[2] ^= k[10];\r\n  s[3] ^= k[11];\r\n  Camellia_Feistel(sh, sl, SIGMA[8], SIGMA[9]);\r\n  Camellia_Feistel(sl, sh, SIGMA[10], SIGMA[11]);\r\n\r\n  k[4] = s[0];\r\n  k[5] = s[1];\r\n  k[6] = s[2];\r\n  k[7] = s[3];\r\n  ROTL128(s, 30); /* KB <<< 30 */\r\n  k[20] = s[0];\r\n  k[21] = s[1];\r\n  k[22] = s[2];\r\n  k[23] = s[3];\r\n  ROTL128(s, 30); /* KB <<< 60 */\r\n  k[40] = s[0];\r\n  k[41] = s[1];\r\n  k[42] = s[2];\r\n  k[43] = s[3];\r\n  [s[0], s[1], s[2], s[3]] = [s[1], s[2], s[3], s[0]];\r\n  ROTL128(s, 19); /* KB <<<111 */\r\n  k[64] = s[0];\r\n  k[65] = s[1];\r\n  k[66] = s[2];\r\n  k[67] = s[3];\r\n\r\n  s[0] = k[8];\r\n  s[1] = k[9];\r\n  s[2] = k[10];\r\n  s[3] = k[11];\r\n  ROTL128(s, 15); /* KR <<< 15 */\r\n  k[8] = s[0];\r\n  k[9] = s[1];\r\n  k[10] = s[2];\r\n  k[11] = s[3];\r\n  ROTL128(s, 15); /* KR <<< 30 */\r\n  k[16] = s[0];\r\n  k[17] = s[1];\r\n  k[18] = s[2];\r\n  k[19] = s[3];\r\n  ROTL128(s, 30); /* KR <<< 60 */\r\n  k[36] = s[0];\r\n  k[37] = s[1];\r\n  k[38] = s[2];\r\n  k[39] = s[3];\r\n  [s[0], s[1], s[2], s[3]] = [s[1], s[2], s[3], s[0]];\r\n  ROTL128(s, 2); /* KR <<< 94 */\r\n  k[52] = s[0];\r\n  k[53] = s[1];\r\n  k[54] = s[2];\r\n  k[55] = s[3];\r\n\r\n  s[0] = k[12];\r\n  s[1] = k[13];\r\n  s[2] = k[14];\r\n  s[3] = k[15];\r\n  ROTL128(s, 15); /* KA <<< 15 */\r\n  k[12] = s[0];\r\n  k[13] = s[1];\r\n  k[14] = s[2];\r\n  k[15] = s[3];\r\n  ROTL128(s, 30); /* KA <<< 45 */\r\n  k[28] = s[0];\r\n  k[29] = s[1];\r\n  k[30] = s[2];\r\n  k[31] = s[3];\r\n  /* KA <<< 77 */\r\n  k[48] = s[1];\r\n  k[49] = s[2];\r\n  k[50] = s[3];\r\n  k[51] = s[0];\r\n  [s[0], s[1], s[2], s[3]] = [s[1], s[2], s[3], s[0]];\r\n  ROTL128(s, 17); /* KA <<< 94 */\r\n  k[56] = s[0];\r\n  k[57] = s[1];\r\n  k[58] = s[2];\r\n  k[59] = s[3];\r\n\r\n  s[0] = k[0];\r\n  s[1] = k[1];\r\n  s[2] = k[2];\r\n  s[3] = k[3];\r\n  [s[0], s[1], s[2], s[3]] = [s[1], s[2], s[3], s[0]];\r\n  ROTL128(s, 13); /* KL <<< 45 */\r\n  k[24] = s[0];\r\n  k[25] = s[1];\r\n  k[26] = s[2];\r\n  k[27] = s[3];\r\n  ROTL128(s, 15); /* KL <<< 60 */\r\n  k[32] = s[0];\r\n  k[33] = s[1];\r\n  k[34] = s[2];\r\n  k[35] = s[3];\r\n  ROTL128(s, 17); /* KL <<< 77 */\r\n  k[44] = s[0];\r\n  k[45] = s[1];\r\n  k[46] = s[2];\r\n  k[47] = s[3];\r\n  [s[0], s[1], s[2], s[3]] = [s[1], s[2], s[3], s[0]];\r\n  ROTL128(s, 2); /* KL <<<111 */\r\n  k[60] = s[0];\r\n  k[61] = s[1];\r\n  k[62] = s[2];\r\n  k[63] = s[3];\r\n}\r\n\r\nfunction _encrypt128(M: Uint8Array, k: Uint32Array) {\r\n  const C = U8.from(M);\r\n  const CView = new DataView(C.buffer, C.byteOffset, C.byteLength);\r\n  const s = new Uint32Array(4);\r\n  const sh = s.subarray(0, 2);\r\n  const sl = s.subarray(2, 4);\r\n  s[0] = k[0] ^ CView.getUint32(0, false);\r\n  s[1] = k[1] ^ CView.getUint32(4, false);\r\n  s[2] = k[2] ^ CView.getUint32(8, false);\r\n  s[3] = k[3] ^ CView.getUint32(12, false);\r\n\r\n  // GR 1\r\n  Camellia_Feistel(sh, sl, k[4], k[5]);\r\n  Camellia_Feistel(sl, sh, k[6], k[7]);\r\n  Camellia_Feistel(sh, sl, k[8], k[9]);\r\n  Camellia_Feistel(sl, sh, k[10], k[11]);\r\n  Camellia_Feistel(sh, sl, k[12], k[13]);\r\n  Camellia_Feistel(sl, sh, k[14], k[15]);\r\n  s[1] ^= rotateL32(s[0] & k[16], 1);\r\n  s[2] ^= s[3] | k[19];\r\n  s[0] ^= s[1] | k[17];\r\n  s[3] ^= rotateL32(s[2] & k[18], 1);\r\n  // GR 2\r\n  Camellia_Feistel(sh, sl, k[20], k[21]);\r\n  Camellia_Feistel(sl, sh, k[22], k[23]);\r\n  Camellia_Feistel(sh, sl, k[24], k[25]);\r\n  Camellia_Feistel(sl, sh, k[26], k[27]);\r\n  Camellia_Feistel(sh, sl, k[28], k[29]);\r\n  Camellia_Feistel(sl, sh, k[30], k[31]);\r\n  s[1] ^= rotateL32(s[0] & k[32], 1);\r\n  s[2] ^= s[3] | k[35];\r\n  s[0] ^= s[1] | k[33];\r\n  s[3] ^= rotateL32(s[2] & k[34], 1);\r\n  // GR 3\r\n  Camellia_Feistel(sh, sl, k[36], k[37]);\r\n  Camellia_Feistel(sl, sh, k[38], k[39]);\r\n  Camellia_Feistel(sh, sl, k[40], k[41]);\r\n  Camellia_Feistel(sl, sh, k[42], k[43]);\r\n  Camellia_Feistel(sh, sl, k[44], k[45]);\r\n  Camellia_Feistel(sl, sh, k[46], k[47]);\r\n  s[2] ^= k[48];\r\n  s[3] ^= k[49];\r\n  s[0] ^= k[50];\r\n  s[1] ^= k[51];\r\n\r\n  CView.setUint32(0, s[2], false);\r\n  CView.setUint32(4, s[3], false);\r\n  CView.setUint32(8, s[0], false);\r\n  CView.setUint32(12, s[1], false);\r\n  return C;\r\n}\r\nfunction _encrypt256(M: Uint8Array, k: Uint32Array) {\r\n  const C = U8.from(M);\r\n  const CView = new DataView(C.buffer, C.byteOffset, C.byteLength);\r\n  const s = new Uint32Array(4);\r\n  const sh = s.subarray(0, 2);\r\n  const sl = s.subarray(2, 4);\r\n  s[0] = k[0] ^ CView.getUint32(0, false);\r\n  s[1] = k[1] ^ CView.getUint32(4, false);\r\n  s[2] = k[2] ^ CView.getUint32(8, false);\r\n  s[3] = k[3] ^ CView.getUint32(12, false);\r\n\r\n  // GR 1\r\n  Camellia_Feistel(sh, sl, k[4], k[5]);\r\n  Camellia_Feistel(sl, sh, k[6], k[7]);\r\n  Camellia_Feistel(sh, sl, k[8], k[9]);\r\n  Camellia_Feistel(sl, sh, k[10], k[11]);\r\n  Camellia_Feistel(sh, sl, k[12], k[13]);\r\n  Camellia_Feistel(sl, sh, k[14], k[15]);\r\n  s[1] ^= rotateL32(s[0] & k[16], 1);\r\n  s[2] ^= s[3] | k[19];\r\n  s[0] ^= s[1] | k[17];\r\n  s[3] ^= rotateL32(s[2] & k[18], 1);\r\n  // GR 2\r\n  Camellia_Feistel(sh, sl, k[20], k[21]);\r\n  Camellia_Feistel(sl, sh, k[22], k[23]);\r\n  Camellia_Feistel(sh, sl, k[24], k[25]);\r\n  Camellia_Feistel(sl, sh, k[26], k[27]);\r\n  Camellia_Feistel(sh, sl, k[28], k[29]);\r\n  Camellia_Feistel(sl, sh, k[30], k[31]);\r\n  s[1] ^= rotateL32(s[0] & k[32], 1);\r\n  s[2] ^= s[3] | k[35];\r\n  s[0] ^= s[1] | k[33];\r\n  s[3] ^= rotateL32(s[2] & k[34], 1);\r\n  // GR 3\r\n  Camellia_Feistel(sh, sl, k[36], k[37]);\r\n  Camellia_Feistel(sl, sh, k[38], k[39]);\r\n  Camellia_Feistel(sh, sl, k[40], k[41]);\r\n  Camellia_Feistel(sl, sh, k[42], k[43]);\r\n  Camellia_Feistel(sh, sl, k[44], k[45]);\r\n  Camellia_Feistel(sl, sh, k[46], k[47]);\r\n  s[1] ^= rotateL32(s[0] & k[48], 1);\r\n  s[2] ^= s[3] | k[51];\r\n  s[0] ^= s[1] | k[49];\r\n  s[3] ^= rotateL32(s[2] & k[50], 1);\r\n  // GR 4\r\n  Camellia_Feistel(sh, sl, k[52], k[53]);\r\n  Camellia_Feistel(sl, sh, k[54], k[55]);\r\n  Camellia_Feistel(sh, sl, k[56], k[57]);\r\n  Camellia_Feistel(sl, sh, k[58], k[59]);\r\n  Camellia_Feistel(sh, sl, k[60], k[61]);\r\n  Camellia_Feistel(sl, sh, k[62], k[63]);\r\n  s[2] ^= k[64];\r\n  s[3] ^= k[65];\r\n  s[0] ^= k[66];\r\n  s[1] ^= k[67];\r\n\r\n  CView.setUint32(0, s[2], false);\r\n  CView.setUint32(4, s[3], false);\r\n  CView.setUint32(8, s[0], false);\r\n  CView.setUint32(12, s[1], false);\r\n  return C;\r\n}\r\n\r\nfunction _decrypt128(C: Uint8Array, k: Uint32Array) {\r\n  const M = U8.from(C);\r\n  const MView = new DataView(M.buffer, M.byteOffset, M.byteLength);\r\n  const s = new Uint32Array(4);\r\n  const sh = s.subarray(0, 2);\r\n  const sl = s.subarray(2, 4);\r\n\r\n  s[0] = k[48] ^ MView.getUint32(0, false);\r\n  s[1] = k[49] ^ MView.getUint32(4, false);\r\n  s[2] = k[50] ^ MView.getUint32(8, false);\r\n  s[3] = k[51] ^ MView.getUint32(12, false);\r\n\r\n  // GR1\r\n  Camellia_Feistel(sh, sl, k[46], k[47]);\r\n  Camellia_Feistel(sl, sh, k[44], k[45]);\r\n  Camellia_Feistel(sh, sl, k[42], k[43]);\r\n  Camellia_Feistel(sl, sh, k[40], k[41]);\r\n  Camellia_Feistel(sh, sl, k[38], k[39]);\r\n  Camellia_Feistel(sl, sh, k[36], k[37]);\r\n  s[1] ^= rotateL32(s[0] & k[34], 1);\r\n  s[2] ^= s[3] | k[33];\r\n  s[0] ^= s[1] | k[35];\r\n  s[3] ^= rotateL32(s[2] & k[32], 1);\r\n\r\n  // GR2\r\n  Camellia_Feistel(sh, sl, k[30], k[31]);\r\n  Camellia_Feistel(sl, sh, k[28], k[29]);\r\n  Camellia_Feistel(sh, sl, k[26], k[27]);\r\n  Camellia_Feistel(sl, sh, k[24], k[25]);\r\n  Camellia_Feistel(sh, sl, k[22], k[23]);\r\n  Camellia_Feistel(sl, sh, k[20], k[21]);\r\n  s[1] ^= rotateL32(s[0] & k[18], 1);\r\n  s[2] ^= s[3] | k[17];\r\n  s[0] ^= s[1] | k[19];\r\n  s[3] ^= rotateL32(s[2] & k[16], 1);\r\n\r\n  // GR3\r\n  Camellia_Feistel(sh, sl, k[14], k[15]);\r\n  Camellia_Feistel(sl, sh, k[12], k[13]);\r\n  Camellia_Feistel(sh, sl, k[10], k[11]);\r\n  Camellia_Feistel(sl, sh, k[8], k[9]);\r\n  Camellia_Feistel(sh, sl, k[6], k[7]);\r\n  Camellia_Feistel(sl, sh, k[4], k[5]);\r\n  s[2] ^= k[0];\r\n  s[3] ^= k[1];\r\n  s[0] ^= k[2];\r\n  s[1] ^= k[3];\r\n\r\n  MView.setUint32(0, s[2], false);\r\n  MView.setUint32(4, s[3], false);\r\n  MView.setUint32(8, s[0], false);\r\n  MView.setUint32(12, s[1], false);\r\n  return M;\r\n}\r\nfunction _decrypt256(C: Uint8Array, k: Uint32Array) {\r\n  const M = U8.from(C);\r\n  const MView = new DataView(M.buffer, M.byteOffset, M.byteLength);\r\n  const s = new Uint32Array(4);\r\n  const sh = s.subarray(0, 2);\r\n  const sl = s.subarray(2, 4);\r\n\r\n  s[0] = k[64] ^ MView.getUint32(0, false);\r\n  s[1] = k[65] ^ MView.getUint32(4, false);\r\n  s[2] = k[66] ^ MView.getUint32(8, false);\r\n  s[3] = k[67] ^ MView.getUint32(12, false);\r\n\r\n  // GR1\r\n  Camellia_Feistel(sh, sl, k[62], k[63]);\r\n  Camellia_Feistel(sl, sh, k[60], k[61]);\r\n  Camellia_Feistel(sh, sl, k[58], k[59]);\r\n  Camellia_Feistel(sl, sh, k[56], k[57]);\r\n  Camellia_Feistel(sh, sl, k[54], k[55]);\r\n  Camellia_Feistel(sl, sh, k[52], k[53]);\r\n  s[1] ^= rotateL32(s[0] & k[50], 1);\r\n  s[2] ^= s[3] | k[49];\r\n  s[0] ^= s[1] | k[51];\r\n  s[3] ^= rotateL32(s[2] & k[48], 1);\r\n\r\n  // GR2\r\n  Camellia_Feistel(sh, sl, k[46], k[47]);\r\n  Camellia_Feistel(sl, sh, k[44], k[45]);\r\n  Camellia_Feistel(sh, sl, k[42], k[43]);\r\n  Camellia_Feistel(sl, sh, k[40], k[41]);\r\n  Camellia_Feistel(sh, sl, k[38], k[39]);\r\n  Camellia_Feistel(sl, sh, k[36], k[37]);\r\n  s[1] ^= rotateL32(s[0] & k[34], 1);\r\n  s[2] ^= s[3] | k[33];\r\n  s[0] ^= s[1] | k[35];\r\n  s[3] ^= rotateL32(s[2] & k[32], 1);\r\n\r\n  // GR3\r\n  Camellia_Feistel(sh, sl, k[30], k[31]);\r\n  Camellia_Feistel(sl, sh, k[28], k[29]);\r\n  Camellia_Feistel(sh, sl, k[26], k[27]);\r\n  Camellia_Feistel(sl, sh, k[24], k[25]);\r\n  Camellia_Feistel(sh, sl, k[22], k[23]);\r\n  Camellia_Feistel(sl, sh, k[20], k[21]);\r\n  s[1] ^= rotateL32(s[0] & k[18], 1);\r\n  s[2] ^= s[3] | k[17];\r\n  s[0] ^= s[1] | k[19];\r\n  s[3] ^= rotateL32(s[2] & k[16], 1);\r\n\r\n  // GR4\r\n  Camellia_Feistel(sh, sl, k[14], k[15]);\r\n  Camellia_Feistel(sl, sh, k[12], k[13]);\r\n  Camellia_Feistel(sh, sl, k[10], k[11]);\r\n  Camellia_Feistel(sl, sh, k[8], k[9]);\r\n  Camellia_Feistel(sh, sl, k[6], k[7]);\r\n  Camellia_Feistel(sl, sh, k[4], k[5]);\r\n  s[2] ^= k[0];\r\n  s[3] ^= k[1];\r\n  s[0] ^= k[2];\r\n  s[1] ^= k[3];\r\n\r\n  MView.setUint32(0, s[2], false);\r\n  MView.setUint32(4, s[3], false);\r\n  MView.setUint32(8, s[0], false);\r\n  MView.setUint32(12, s[1], false);\r\n  return M;\r\n}\r\n\r\nfunction cipher(M: Uint8Array, k: Uint32Array, _cipher: typeof _encrypt128) {\r\n  if (M.length !== 16) {\r\n    throw new KitError('Camellia block must be 16 byte');\r\n  }\r\n  return new U8(_cipher(M, k));\r\n}\r\n\r\nfunction _camellia(key: Uint8Array, b: 128 | 192 | 256) {\r\n  if (key.length !== b >>> 3) {\r\n    throw new KitError(`Camellia-${b} key must be ${b >>> 3} byte`);\r\n  }\r\n  const K = KeySchedule(key);\r\n  const encrypt =\r\n    b === 128 ? (M: Uint8Array) => cipher(M, K, _encrypt128) : (M: Uint8Array) => cipher(M, K, _encrypt256);\r\n  const decrypt =\r\n    b === 128 ? (C: Uint8Array) => cipher(C, K, _decrypt128) : (C: Uint8Array) => cipher(C, K, _decrypt256);\r\n  return { encrypt, decrypt };\r\n}\r\n\r\n/**\r\n * Camellia 分组密码算法 / block cipher algorithm\r\n *\r\n * @param {128 | 192 | 256} b - 密钥长度 / Key size (bit)\r\n */\r\nexport function camellia(b: 128 | 192 | 256) {\r\n  return createCipher((K: Uint8Array) => _camellia(K, b), {\r\n    ALGORITHM: `Camellia-${b}`,\r\n    BLOCK_SIZE: 16,\r\n    KEY_SIZE: b >>> 3,\r\n    MIN_KEY_SIZE: b >>> 3,\r\n    MAX_KEY_SIZE: b >>> 3,\r\n  });\r\n}\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst IP = [\r\n  58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24,\r\n  16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31,\r\n  23, 15, 7,\r\n].map((value) => 64 - value);\r\nconst FP = [\r\n  40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21,\r\n  61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49,\r\n  17, 57, 25,\r\n].map((value) => 64 - value);\r\nconst E = [\r\n  32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22,\r\n  23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1,\r\n].map((value) => 32 - value);\r\nconst PC1 = [\r\n  57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55,\r\n  47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4,\r\n].map((value) => 64 - value);\r\nconst PC2 = [\r\n  14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30,\r\n  40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32,\r\n].map((value) => 56 - value);\r\nconst P = [\r\n  16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25,\r\n].map((value) => 32 - value);\r\nconst KEY_SHIFT = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];\r\n\r\nconst S1 = [\r\n  14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14,\r\n  8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,\r\n];\r\nconst S2 = [\r\n  15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7,\r\n  11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,\r\n];\r\nconst S3 = [\r\n  10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4,\r\n  9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,\r\n];\r\nconst S4 = [\r\n  7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9,\r\n  0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,\r\n];\r\nconst S5 = [\r\n  2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1,\r\n  11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,\r\n];\r\nconst S6 = [\r\n  12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15,\r\n  5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,\r\n];\r\nconst S7 = [\r\n  4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11,\r\n  13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,\r\n];\r\nconst S8 = [\r\n  13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4,\r\n  1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,\r\n];\r\n\r\n// * Functions\r\n\r\nfunction permute(input: bigint, table: number[]) {\r\n  let output = 0n;\r\n  for (let i = 0; i < table.length; i++) {\r\n    output = output << 1n;\r\n    output |= (input >> BigInt(table[i])) & 0x1n;\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction substitute(input: bigint) {\r\n  const s = [S1, S2, S3, S4, S5, S6, S7, S8];\r\n\r\n  let output = 0n;\r\n  for (let i = 0; i < 8; i++) {\r\n    const word = Number((input >> BigInt(6 * (7 - i))) & 0x3fn);\r\n    const x = (word >> 1) & 0xf;\r\n    const y = ((word >> 4) & 0b10) | (word & 0b1);\r\n    const offset = x + (y << 4);\r\n    output = (output << 4n) | BigInt(s[i][offset]);\r\n  }\r\n\r\n  return output;\r\n}\r\n\r\nfunction generateKeys(key: Uint8Array) {\r\n  const k = permute(\r\n    key.reduce((acc, cur) => (acc << 8n) | BigInt(cur), 0n),\r\n    PC1,\r\n  );\r\n  const key_set = new Uint8Array(16 * 6);\r\n\r\n  let l = 0xfffffffn & (k >> 28n);\r\n  let r = 0xfffffffn & k;\r\n  for (let i = 0; i < 16; i++) {\r\n    l = ((l << BigInt(KEY_SHIFT[i])) | (l >> (28n - BigInt(KEY_SHIFT[i])))) & 0xfffffffn;\r\n    r = ((r << BigInt(KEY_SHIFT[i])) | (r >> (28n - BigInt(KEY_SHIFT[i])))) & 0xfffffffn;\r\n    const kr = permute((l << 28n) | r, PC2);\r\n    const offset = i * 6;\r\n    key_set[offset + 0] = Number(0xffn & (kr >> 40n));\r\n    key_set[offset + 1] = Number(0xffn & (kr >> 32n));\r\n    key_set[offset + 2] = Number(0xffn & (kr >> 24n));\r\n    key_set[offset + 3] = Number(0xffn & (kr >> 16n));\r\n    key_set[offset + 4] = Number(0xffn & (kr >> 8n));\r\n    key_set[offset + 5] = Number(0xffn & kr);\r\n  }\r\n\r\n  return key_set;\r\n}\r\n\r\nfunction reverseKeys(keys: Uint8Array) {\r\n  const key_set = new Uint8Array(keys.byteLength);\r\n  for (let i = 0; i < 16; i++) {\r\n    const offset = keys.byteLength - i * 6;\r\n    key_set.set(keys.subarray(offset - 6, offset), i * 6);\r\n  }\r\n  return key_set;\r\n}\r\n\r\nfunction isEqual(a: Uint8Array, b: Uint8Array) {\r\n  return a.byteLength === b.byteLength && a.every((value, index) => value === b[index]);\r\n}\r\n\r\n// * DES\r\n\r\nfunction Cipher(M: Uint8Array, K: Uint8Array) {\r\n  const m = permute(\r\n    M.reduce((acc, cur) => (acc << 8n) | BigInt(cur), 0n),\r\n    IP,\r\n  );\r\n  let l = 0xffffffffn & (m >> 32n);\r\n  let r = 0xffffffffn & m;\r\n\r\n  for (let i = 0; i < 16; i++) {\r\n    const offset = i * 6;\r\n    const k = K.subarray(offset, offset + 6).reduce((acc, cur) => (acc << 8n) | BigInt(cur), 0n);\r\n    const l_next = r;\r\n    r = permute(r, E) ^ k;\r\n    r = substitute(r);\r\n    r = permute(r, P) ^ l;\r\n    l = l_next;\r\n  }\r\n\r\n  return permute((r << 32n) | l, FP);\r\n}\r\n\r\nfunction _des(K: Uint8Array) {\r\n  const key_set = generateKeys(K);\r\n  const inv_key_set = reverseKeys(key_set);\r\n  return {\r\n    encrypt: (M: Uint8Array) => {\r\n      const C = new U8(8);\r\n      const view = new DataView(C.buffer, C.byteOffset, C.byteLength);\r\n      view.setBigUint64(0, Cipher(M, key_set), false);\r\n      return C;\r\n    },\r\n    decrypt: (C: Uint8Array) => {\r\n      const M = new U8(8);\r\n      const view = new DataView(M.buffer, M.byteOffset, M.byteLength);\r\n      view.setBigUint64(0, Cipher(C, inv_key_set), false);\r\n      return M;\r\n    },\r\n  };\r\n}\r\n\r\nfunction _t_des(K: Uint8Array, l: number) {\r\n  if (K.byteLength !== l >> 3) {\r\n    throw new KitError(`3DES key must be ${l >> 3} byte`);\r\n  }\r\n  const K1 = K.subarray(0, 8);\r\n  const K2 = K.subarray(8, 16);\r\n  const K3 = l === 128 ? K1 : K.subarray(16, 24);\r\n  if (isEqual(K1, K2) || (l === 192 && (isEqual(K1, K3) || isEqual(K2, K3)))) {\r\n    console.warn('mima-kit: Weak key detected in 3DES');\r\n  }\r\n\r\n  const d1 = _des(K1);\r\n  const d2 = _des(K2);\r\n  const d3 = _des(K3);\r\n  return {\r\n    encrypt: (M: Uint8Array) => d3.encrypt(d2.decrypt(d1.encrypt(M))),\r\n    decrypt: (C: Uint8Array) => d1.decrypt(d2.encrypt(d3.decrypt(C))),\r\n  };\r\n}\r\n\r\n/**\r\n * Data Encryption Standard (DES) block cipher algorithm\r\n *\r\n * 数据加密标准（DES）分组密码算法\r\n */\r\nexport const des = createCipher(_des, {\r\n  ALGORITHM: 'DES',\r\n  BLOCK_SIZE: 8,\r\n  KEY_SIZE: 8,\r\n  MIN_KEY_SIZE: 8,\r\n  MAX_KEY_SIZE: 8,\r\n});\r\n\r\n/**\r\n * Triple Data Encryption Standard (3DES) block cipher algorithm\r\n *\r\n * 三重数据加密标准（3DES）分组密码算法\r\n *\r\n * @param {128 | 192} l - 密钥长度 / Key Size (bit)\r\n */\r\nexport function t_des(l: 128 | 192) {\r\n  return createCipher((K: Uint8Array) => _t_des(K, l), {\r\n    ALGORITHM: '3DES',\r\n    BLOCK_SIZE: 8,\r\n    KEY_SIZE: l >> 3,\r\n    MIN_KEY_SIZE: l >> 3,\r\n    MAX_KEY_SIZE: l >> 3,\r\n  });\r\n}\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, rotateL32, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst SBox = new Uint8Array([\r\n  0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, 0x2b, 0x67, 0x9a,\r\n  0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef,\r\n  0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80,\r\n  0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19,\r\n  0xe6, 0x85, 0x4f, 0xa8, 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d,\r\n  0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, 0xd4, 0x00,\r\n  0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, 0xea, 0xbf, 0x8a, 0xd2, 0x40,\r\n  0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55,\r\n  0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23,\r\n  0xab, 0x0d, 0x53, 0x4e, 0x6f, 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c,\r\n  0x5b, 0x51, 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, 0x0a,\r\n  0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, 0x89, 0x69, 0x97, 0x4a,\r\n  0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d,\r\n  0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,\r\n]);\r\n\r\nconst CK = new Uint32Array([\r\n  0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, 0xe0e7eef5,\r\n  0xfc030a11, 0x181f262d, 0x343b4249, 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, 0xc0c7ced5, 0xdce3eaf1,\r\n  0xf8ff060d, 0x141b2229, 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed,\r\n  0xf4fb0209, 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279,\r\n]);\r\n\r\n// * Functions\r\n\r\n/**\r\n * 非线性变换函数 `τ`.\r\n *\r\n * Nonlinear transformation function `τ`.\r\n *\r\n * @param {number} A - 工作字 / word\r\n */\r\nfunction tau(A: number): number {\r\n  return (\r\n    (SBox[(A >> 24) & 0xff] << 24) | (SBox[(A >> 16) & 0xff] << 16) | (SBox[(A >> 8) & 0xff] << 8) | SBox[A & 0xff]\r\n  );\r\n}\r\n\r\n/**\r\n * 合成置换函数 `T`, 由非线性变换函数 `τ` 和线性变换函数 `L` 组成.\r\n *\r\n * Synthetic permutation function `T`, composed of function `τ` and function `L`.\r\n *\r\n * @param {number} A - 工作字 / word\r\n */\r\nfunction T(A: number) {\r\n  const B = tau(A);\r\n  return B ^ rotateL32(B, 2) ^ rotateL32(B, 10) ^ rotateL32(B, 18) ^ rotateL32(B, 24);\r\n}\r\n\r\n/**\r\n * 合成置换函数 `T1`, 由非线性变换函数 `τ` 和线性变换函数 `L1` 组成.\r\n *\r\n * Synthetic permutation function `T1`, composed of function `τ` and function `L1`.\r\n *\r\n * @param {number} A - 工作字 / word\r\n */\r\nfunction T1(A: number) {\r\n  const B = tau(A);\r\n  return B ^ rotateL32(B, 13) ^ rotateL32(B, 23);\r\n}\r\n\r\n/**\r\n * 密钥扩展函数 / Key expansion function\r\n */\r\nfunction expandKey(key: Uint8Array) {\r\n  if (key.length !== 16) {\r\n    throw new KitError('SM4 key must be 16 byte');\r\n  }\r\n\r\n  const KView = new DataView(key.buffer, key.byteOffset, key.byteLength);\r\n  let K0 = 0xa3b1bac6 ^ KView.getUint32(0, false);\r\n  let K1 = 0x56aa3350 ^ KView.getUint32(4, false);\r\n  let K2 = 0x677d9197 ^ KView.getUint32(8, false);\r\n  let K3 = 0xb27022dc ^ KView.getUint32(12, false);\r\n\r\n  const rk = new Uint32Array(32);\r\n  for (let i = 0; i < 32; i++) {\r\n    rk[i] = K0 ^ T1(K1 ^ K2 ^ K3 ^ CK[i]);\r\n    K0 = K1;\r\n    K1 = K2;\r\n    K2 = K3;\r\n    K3 = rk[i];\r\n  }\r\n\r\n  return rk;\r\n}\r\n\r\n/**\r\n * 轮函数 `F` / Round function `F`\r\n *\r\n * @param {number} X0 - 工作字 / word\r\n * @param {number} X1 - 工作字 / word\r\n * @param {number} X2 - 工作字 / word\r\n * @param {number} X3 - 工作字 / word\r\n * @param {number} rk - 轮密钥 / round key\r\n */\r\nfunction F(X0: number, X1: number, X2: number, X3: number, rk: number) {\r\n  return X0 ^ T(X1 ^ X2 ^ X3 ^ rk);\r\n}\r\n\r\n// * SM4 Algorithm\r\n\r\n/**\r\n * @param {Uint8Array} M - 输入块 / input block\r\n * @param {Uint32Array} rk - 轮密钥 / round keys\r\n */\r\nfunction cipher(M: Uint8Array, rk: Uint32Array) {\r\n  if (M.length !== 16) {\r\n    throw new KitError('SM4 block must be 16 byte');\r\n  }\r\n\r\n  const MView = new DataView(M.buffer, M.byteOffset, M.byteLength);\r\n  let X0 = MView.getUint32(0, false);\r\n  let X1 = MView.getUint32(4, false);\r\n  let X2 = MView.getUint32(8, false);\r\n  let X3 = MView.getUint32(12, false);\r\n\r\n  let X_: number;\r\n  for (let i = 0; i < 32; i++) {\r\n    X_ = F(X0, X1, X2, X3, rk[i]);\r\n    X0 = X1;\r\n    X1 = X2;\r\n    X2 = X3;\r\n    X3 = X_;\r\n  }\r\n\r\n  const R = new U8(16);\r\n  const RView = new DataView(R.buffer, R.byteOffset, R.byteLength);\r\n  RView.setUint32(0, X3, false);\r\n  RView.setUint32(4, X2, false);\r\n  RView.setUint32(8, X1, false);\r\n  RView.setUint32(12, X0, false);\r\n  return R;\r\n}\r\n\r\nfunction _sm4(K: Uint8Array) {\r\n  const rk = expandKey(K);\r\n  const rkReversed = rk.toReversed();\r\n  return {\r\n    encrypt: (M: Uint8Array) => cipher(M, rk),\r\n    decrypt: (M: Uint8Array) => cipher(M, rkReversed),\r\n  };\r\n}\r\n\r\n/**\r\n * SM4 分组密码算法 / block cipher algorithm\r\n */\r\nexport const sm4 = createCipher(_sm4, {\r\n  ALGORITHM: 'SM4',\r\n  BLOCK_SIZE: 16,\r\n  KEY_SIZE: 16,\r\n  MIN_KEY_SIZE: 16,\r\n  MAX_KEY_SIZE: 16,\r\n});\r\n","import type { Padding } from '../../core/cipher';\r\nimport { createCipher, PKCS7_PAD } from '../../core/cipher';\r\nimport { KitError, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst DELTA = 0x9e3779b9;\r\n\r\n// * Tiny Encryption Algorithm (TEA)\r\n\r\nfunction _tea(K: Uint8Array, round: number) {\r\n  if (K.length !== 16) {\r\n    throw new KitError('TEA key must be 16 byte');\r\n  }\r\n  const K32 = new Uint32Array(K.buffer, K.byteOffset, K.byteLength >> 2);\r\n  const sum_delta = (DELTA * round) & 0xffffffff;\r\n\r\n  const encrypt = (M: Uint8Array) => {\r\n    if (M.length !== 8) {\r\n      throw new KitError('TEA block must be 8 byte');\r\n    }\r\n    const C = U8.from(M);\r\n    const C32 = new Uint32Array(C.buffer, C.byteOffset, C.byteLength >> 2);\r\n    let sum = 0;\r\n    for (let i = 0; i < round; i++) {\r\n      sum += DELTA;\r\n      C32[0] += ((C32[1] << 4) + K32[0]) ^ (C32[1] + sum) ^ ((C32[1] >>> 5) + K32[1]);\r\n      C32[1] += ((C32[0] << 4) + K32[2]) ^ (C32[0] + sum) ^ ((C32[0] >>> 5) + K32[3]);\r\n    }\r\n    return C;\r\n  };\r\n  const decrypt = (C: Uint8Array) => {\r\n    if (C.length !== 8) {\r\n      throw new KitError('TEA block must be 8 byte');\r\n    }\r\n    const M = U8.from(C);\r\n    const M32 = new Uint32Array(M.buffer, M.byteOffset, M.byteLength >> 2);\r\n    let sum = sum_delta;\r\n    for (let i = 0; i < round; i++) {\r\n      M32[1] -= ((M32[0] << 4) + K32[2]) ^ (M32[0] + sum) ^ ((M32[0] >>> 5) + K32[3]);\r\n      M32[0] -= ((M32[1] << 4) + K32[0]) ^ (M32[1] + sum) ^ ((M32[1] >>> 5) + K32[1]);\r\n      sum -= DELTA;\r\n    }\r\n    return M;\r\n  };\r\n  return { encrypt, decrypt };\r\n}\r\n\r\nfunction _xtea(K: Uint8Array, round: number) {\r\n  if (K.length !== 16) {\r\n    throw new KitError('XTEA key must be 16 byte');\r\n  }\r\n  const K32 = new Uint32Array(K.buffer, K.byteOffset, K.byteLength >> 2);\r\n  const sum_delta = (DELTA * round) & 0xffffffff;\r\n\r\n  const encrypt = (M: Uint8Array) => {\r\n    if (M.length !== 8) {\r\n      throw new KitError('XTEA block must be 8 byte');\r\n    }\r\n    const C = U8.from(M);\r\n    const C32 = new Uint32Array(C.buffer, C.byteOffset, C.byteLength >> 2);\r\n    let sum = 0;\r\n    for (let i = 0; i < round; i++) {\r\n      C32[0] += (((C32[1] << 4) ^ (C32[1] >>> 5)) + C32[1]) ^ (sum + K32[sum & 3]);\r\n      sum += DELTA;\r\n      C32[1] += (((C32[0] << 4) ^ (C32[0] >>> 5)) + C32[0]) ^ (sum + K32[(sum >>> 11) & 3]);\r\n    }\r\n    return C;\r\n  };\r\n  const decrypt = (C: Uint8Array) => {\r\n    if (C.length !== 8) {\r\n      throw new KitError('XTEA block must be 8 byte');\r\n    }\r\n    const M = U8.from(C);\r\n    const M32 = new Uint32Array(M.buffer, M.byteOffset, M.byteLength >> 2);\r\n    let sum = sum_delta;\r\n    for (let i = 0; i < round; i++) {\r\n      M32[1] -= (((M32[0] << 4) ^ (M32[0] >>> 5)) + M32[0]) ^ (sum + K32[(sum >>> 11) & 3]);\r\n      sum -= DELTA;\r\n      M32[0] -= (((M32[1] << 4) ^ (M32[1] >>> 5)) + M32[1]) ^ (sum + K32[sum & 3]);\r\n    }\r\n    return M;\r\n  };\r\n  return { encrypt, decrypt };\r\n}\r\n\r\nfunction _xxtea(K: Uint8Array, padding: Padding, round?: number) {\r\n  if (K.length !== 16) {\r\n    throw new KitError('XXTEA key must be 16 byte');\r\n  }\r\n  const K32 = new Uint32Array(K.buffer, K.byteOffset, K.byteLength >> 2);\r\n\r\n  const encrypt = (M: Uint8Array) => {\r\n    const C = U8.from(padding(M, 4));\r\n    if (C.length < 8 || C.length % 4 !== 0) {\r\n      throw new KitError('XXTEA block must be a multiple of 4 byte (at least 8 byte)');\r\n    }\r\n    const C32 = new Uint32Array(C.buffer, C.byteOffset, C.byteLength >> 2);\r\n    const n = C32.length;\r\n    let _round = round || (6 + 52 / n) >>> 0;\r\n    let sum = 0;\r\n    let y: number;\r\n    let z = C32[n - 1];\r\n    let p: number;\r\n\r\n    while (_round-- > 0) {\r\n      sum += DELTA;\r\n      const e = (sum >>> 2) & 3;\r\n      for (p = 0; p < n - 1; p++) {\r\n        y = C32[p + 1];\r\n        z = C32[p] += (((z >>> 5) ^ (y << 2)) + ((y >>> 3) ^ (z << 4))) ^ ((sum ^ y) + (K32[(p & 3) ^ e] ^ z));\r\n      }\r\n      y = C32[0];\r\n      z = C32[n - 1] += (((z >>> 5) ^ (y << 2)) + ((y >>> 3) ^ (z << 4))) ^ ((sum ^ y) + (K32[(p & 3) ^ e] ^ z));\r\n    }\r\n    return C;\r\n  };\r\n  const decrypt = (C: Uint8Array) => {\r\n    if (C.length % 4 !== 0) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const M = U8.from(C);\r\n    const M32 = new Uint32Array(M.buffer, M.byteOffset, M.byteLength >> 2);\r\n    const n = M32.length;\r\n    let _round = round || (6 + 52 / n) >>> 0;\r\n    let sum = (DELTA * _round) & 0xffffffff;\r\n    let y = M32[0];\r\n    let z: number;\r\n    let p: number;\r\n    while (_round-- > 0) {\r\n      const e = (sum >>> 2) & 3;\r\n      for (p = n - 1; p > 0; p--) {\r\n        z = M32[p - 1];\r\n        y = M32[p] -= (((z >>> 5) ^ (y << 2)) + ((y >>> 3) ^ (z << 4))) ^ ((sum ^ y) + (K32[(p & 3) ^ e] ^ z));\r\n      }\r\n      z = M32[n - 1];\r\n      y = M32[0] -= (((z >>> 5) ^ (y << 2)) + ((y >>> 3) ^ (z << 4))) ^ ((sum ^ y) + (K32[(p & 3) ^ e] ^ z));\r\n      sum -= DELTA;\r\n    }\r\n    return padding(M);\r\n  };\r\n  return { encrypt, decrypt };\r\n}\r\n\r\n/**\r\n * 微型加密算法 (TEA) 分组密码算法\r\n *\r\n * Tiny Encryption Algorithm (TEA) block cipher algorithm\r\n *\r\n * @param {number} round - 轮数 / Rounds (default: 32)\r\n */\r\nexport function tea(round: number = 32) {\r\n  if (round <= 0) {\r\n    throw new KitError('TEA round must be a positive number');\r\n  }\r\n  return createCipher((K: Uint8Array) => _tea(K, round), {\r\n    ALGORITHM: 'TEA',\r\n    BLOCK_SIZE: 8,\r\n    KEY_SIZE: 16,\r\n    MIN_KEY_SIZE: 16,\r\n    MAX_KEY_SIZE: 16,\r\n  });\r\n}\r\n\r\n/**\r\n * 扩展微型加密算法 (XTEA) 分组密码算法\r\n *\r\n * eXtended Tiny Encryption Algorithm (XTEA) block cipher algorithm\r\n *\r\n * @param {number} round - 轮数 / Rounds (default: 32)\r\n */\r\nexport function xtea(round: number = 32) {\r\n  if (round <= 0) {\r\n    throw new KitError('XTEA round must be a positive number');\r\n  }\r\n  return createCipher((K: Uint8Array) => _xtea(K, round), {\r\n    ALGORITHM: 'XTEA',\r\n    BLOCK_SIZE: 8,\r\n    KEY_SIZE: 16,\r\n    MIN_KEY_SIZE: 16,\r\n    MAX_KEY_SIZE: 16,\r\n  });\r\n}\r\n\r\nexport interface XXTEAConfig {\r\n  /**\r\n   * 分组大小 / Block size (default: 16)\r\n   *\r\n   * `XXTEA` 本身设计用于加密任意数量的数据块。单独使用 `XXTEA` 时，该选项不起作用。\r\n   * 但是，如果需要将 `XXTEA` 用作分组密码和 `工作模式` 一起使用，则可以通过此选项设置分组大小。\r\n   *\r\n   * 注意: 这不是 `XXTEA` 的标准用法且缺乏相关的安全分析。\r\n   *\r\n   * `XXTEA` is natively designed to encrypt arbitrary amounts of data blocks.\r\n   * When used alone, this option does not take effect.\r\n   * However, if you need to use `XXTEA` as a block cipher and use it with `Operation Mode`,\r\n   * you can set the `BLOCK_SIZE` through this option.\r\n   *\r\n   * Note: This is not the standard usage of `XXTEA` and lacks relevant security analysis.\r\n   */\r\n  BLOCK_SIZE?: number;\r\n  /**\r\n   * 填充方式 / Padding method (default: PKCS7)\r\n   *\r\n   * 如果要像其他分组密码一样使用 `XXTEA`，例如使用 `CBC` 模式，\r\n   * 应该将 `padding` 设置为 `NO_PAD` 并让 `工作模式` 处理填充。\r\n   *\r\n   * If you want to use `XXTEA` like other block ciphers, such as with `CBC` mode,\r\n   * you should set the `padding` to `NO_PAD` and let the `Operation Mode` handle the padding.\r\n   */\r\n  padding?: Padding;\r\n  /**\r\n   * 轮数 / Rounds (default: undefined)\r\n   *\r\n   * `XXTEA` 的轮数可以通过这个选项设置，如果不设置则使用默认的轮数计算方式。\r\n   *\r\n   * The rounds of `XXTEA` can be set through this option,\r\n   * if not set, the default round calculation method will be used.\r\n   */\r\n  round?: number;\r\n}\r\n\r\n/**\r\n * 纠正块 TEA (XXTEA) 分组密码算法\r\n *\r\n * Corrected Block TEA (XXTEA) block cipher algorithm\r\n */\r\nexport function xxtea(config?: XXTEAConfig) {\r\n  const { BLOCK_SIZE = 16, padding = PKCS7_PAD, round } = config ?? {};\r\n  if (BLOCK_SIZE < 8 || BLOCK_SIZE % 4 !== 0) {\r\n    throw new KitError('XXTEA block size must be a multiple of 4 byte (at least 8 byte)');\r\n  }\r\n  return createCipher((K: Uint8Array) => _xxtea(K, padding, round), {\r\n    ALGORITHM: 'XXTEA',\r\n    BLOCK_SIZE,\r\n    KEY_SIZE: 16,\r\n    MIN_KEY_SIZE: 16,\r\n    MAX_KEY_SIZE: 16,\r\n  });\r\n}\r\n","import { createCipher } from '../../core/cipher';\r\nimport { KitError, rotateL32, rotateR32, U8 } from '../../core/utils';\r\n\r\n// * Constants\r\n\r\nconst P0 = new Uint8Array([\r\n  0xa9, 0x67, 0xb3, 0xe8, 0x04, 0xfd, 0xa3, 0x76, 0x9a, 0x92, 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, 0x0d, 0xc6, 0x35,\r\n  0x98, 0x18, 0xf7, 0xec, 0x6c, 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 0x94, 0x48, 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54,\r\n  0xdf, 0x23, 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, 0x63, 0x01, 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, 0xa6,\r\n  0xeb, 0xa5, 0xbe, 0x16, 0x0c, 0xe3, 0x61, 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 0x25, 0x0b, 0xbb, 0x4e, 0x89, 0x6b,\r\n  0x53, 0x6a, 0xb4, 0xf1, 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, 0xcc, 0x95, 0x03, 0x56, 0xd4, 0x1c, 0x1e,\r\n  0xd7, 0xfb, 0xc3, 0x8e, 0xb5, 0xe9, 0xcf, 0xbf, 0xba, 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 0x62, 0x71, 0x81, 0x79,\r\n  0x09, 0xad, 0x24, 0xcd, 0xf9, 0xd8, 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x08, 0x86, 0xe7, 0xa1, 0x1d, 0xaa, 0xed, 0x06,\r\n  0x70, 0xb2, 0xd2, 0x41, 0x7b, 0xa0, 0x11, 0x31, 0xc2, 0x27, 0x90, 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c, 0xb1, 0xab,\r\n  0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0x0a, 0xef, 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, 0x47, 0x87, 0x6d,\r\n  0x46, 0xd6, 0x3e, 0x69, 0x64, 0x2a, 0xce, 0xcb, 0x2f, 0xfc, 0x97, 0x05, 0x7a, 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0x0e,\r\n  0xa7, 0x5a, 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x02, 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, 0x57,\r\n  0xc7, 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, 0x7e, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6e, 0x50, 0xde, 0x68,\r\n  0x65, 0xbc, 0xdb, 0xf8, 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0x0f,\r\n  0x00, 0x6f, 0x9d, 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0,\r\n]);\r\nconst P1 = new Uint8Array([\r\n  0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, 0x4a, 0xd3, 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, 0xd6, 0x32, 0xd8,\r\n  0xfd, 0x37, 0x71, 0xf1, 0xe1, 0x30, 0x0f, 0xf8, 0x1b, 0x87, 0xfa, 0x06, 0x3f, 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x00,\r\n  0xbc, 0x9d, 0x6d, 0xc1, 0xb1, 0x0e, 0x80, 0x5d, 0xd2, 0xd5, 0xa0, 0x84, 0x07, 0x14, 0xb5, 0x90, 0x2c, 0xa3, 0xb2,\r\n  0x73, 0x4c, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 0x62, 0x96, 0x6c, 0x42, 0xf7, 0x10,\r\n  0x7c, 0x28, 0x27, 0x8c, 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, 0xca, 0xe3, 0x85, 0xcb, 0x11, 0xd0, 0x93,\r\n  0xb8, 0xa6, 0x83, 0x20, 0xff, 0x9f, 0x77, 0xc3, 0xcc, 0x03, 0x6f, 0x08, 0xbf, 0x40, 0xe7, 0x2b, 0xe2, 0x79, 0x0c,\r\n  0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, 0x66, 0x94, 0xa1, 0x1d, 0x3d,\r\n  0xf0, 0xde, 0xb3, 0x0b, 0x72, 0xa7, 0x1c, 0xef, 0xd1, 0x53, 0x3e, 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 0x2a, 0x49,\r\n  0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x01, 0x18, 0x23, 0xdd,\r\n  0x1f, 0x4e, 0x2d, 0xf9, 0x48, 0x4f, 0xf2, 0x65, 0x8e, 0x78, 0x5c, 0x58, 0x19, 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f,\r\n  0x05, 0x64, 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, 0x29,\r\n  0x2e, 0xac, 0x15, 0x59, 0xa8, 0x0a, 0x9e, 0x6e, 0x47, 0xdf, 0x34, 0x35, 0x6a, 0xcf, 0xdc, 0x22, 0xc9, 0xc0, 0x9b,\r\n  0x89, 0xd4, 0xed, 0xab, 0x12, 0xa2, 0x0d, 0x52, 0xbb, 0x02, 0x2f, 0xa9, 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x04, 0xf6,\r\n  0xc2, 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xbe, 0x91,\r\n]);\r\nconst P = [P0, P1];\r\nconst P_00 = 1;\r\nconst P_01 = 0;\r\nconst P_02 = 0;\r\nconst P_03 = P_01 ^ 1;\r\nconst P_04 = 1;\r\nconst P_10 = 0;\r\nconst P_11 = 0;\r\nconst P_12 = 1;\r\nconst P_13 = P_11 ^ 1;\r\nconst P_14 = 0;\r\nconst P_20 = 1;\r\nconst P_21 = 1;\r\nconst P_22 = 0;\r\nconst P_23 = P_21 ^ 1;\r\nconst P_24 = 0;\r\nconst P_30 = 0;\r\nconst P_31 = 1;\r\nconst P_32 = 1;\r\nconst P_33 = P_31 ^ 1;\r\nconst P_34 = 1;\r\nconst GF256_FDBK_2 = 0x169 >> 1;\r\nconst GF256_FDBK_4 = 0x169 >> 2;\r\nconst RS_GF_FDBK = 0x14d;\r\nconst MDS = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)];\r\n\r\n// * Functions\r\n\r\nconst LFSR1 = (x: number) => (x >> 1) ^ ((x & 0x01) !== 0 ? GF256_FDBK_2 : 0);\r\nconst LFSR2 = (x: number) => (x >> 2) ^ ((x & 0x02) !== 0 ? GF256_FDBK_2 : 0) ^ ((x & 0x01) !== 0 ? GF256_FDBK_4 : 0);\r\nconst Mx_X = (x: number) => x ^ LFSR2(x);\r\nconst Mx_Y = (x: number) => x ^ LFSR1(x) ^ LFSR2(x);\r\n(function initMDS() {\r\n  // precompute the MDS matrix\r\n  const m1 = new Uint32Array(2);\r\n  const mX = new Uint32Array(2);\r\n  const mY = new Uint32Array(2);\r\n  for (let i = 0; i < 256; i++) {\r\n    const j0 = P[0][i] & 0xff;\r\n    m1[0] = j0;\r\n    mX[0] = Mx_X(j0) & 0xff;\r\n    mY[0] = Mx_Y(j0) & 0xff;\r\n\r\n    const j1 = P[1][i] & 0xff;\r\n    m1[1] = j1;\r\n    mX[1] = Mx_X(j1) & 0xff;\r\n    mY[1] = Mx_Y(j1) & 0xff;\r\n\r\n    MDS[0][i] = (m1[P_00] << 0) | (mX[P_00] << 8) | (mY[P_00] << 16) | (mY[P_00] << 24);\r\n    MDS[1][i] = (mY[P_10] << 0) | (mY[P_10] << 8) | (mX[P_10] << 16) | (m1[P_10] << 24);\r\n    MDS[2][i] = (mX[P_20] << 0) | (mY[P_20] << 8) | (m1[P_20] << 16) | (mY[P_20] << 24);\r\n    MDS[3][i] = (mX[P_30] << 0) | (m1[P_30] << 8) | (mY[P_30] << 16) | (mX[P_30] << 24);\r\n  }\r\n})();\r\n\r\nconst b0 = (x: number) => x & 0xff;\r\nconst b1 = (x: number) => (x >>> 8) & 0xff;\r\nconst b2 = (x: number) => (x >>> 16) & 0xff;\r\nconst b3 = (x: number) => (x >>> 24) & 0xff;\r\nfunction chooseB(x: number, N: number) {\r\n  switch (N & 3) {\r\n    case 0:\r\n      return b0(x);\r\n    case 1:\r\n      return b1(x);\r\n    case 2:\r\n      return b2(x);\r\n    case 3:\r\n      return b3(x);\r\n    default:\r\n      return 0;\r\n  }\r\n}\r\nfunction RS_REM(x: number) {\r\n  const b = (x >>> 24) & 0xff;\r\n  const g2 = ((b << 1) ^ ((b & 0x80) !== 0 ? RS_GF_FDBK : 0)) & 0xff;\r\n  const g3 = (b >>> 1) ^ ((b & 0x01) !== 0 ? RS_GF_FDBK >>> 1 : 0) ^ g2;\r\n  return (x << 8) ^ (g3 << 24) ^ (g2 << 16) ^ (g3 << 8) ^ b;\r\n}\r\nfunction RS_MDS_Encode(k0: number, k1: number) {\r\n  for (let i = 0; i < 4; i++) {\r\n    k1 = RS_REM(k1);\r\n  }\r\n  k1 ^= k0;\r\n  for (let i = 0; i < 4; i++) {\r\n    k1 = RS_REM(k1);\r\n  }\r\n  return k1;\r\n}\r\nfunction F32(K64SigByte: number, x: number, k32: Uint32Array) {\r\n  let lB0 = b0(x);\r\n  let lB1 = b1(x);\r\n  let lB2 = b2(x);\r\n  let lB3 = b3(x);\r\n  const k0 = k32[0] || 0;\r\n  const k1 = k32[1] || 0;\r\n  const k2 = k32[2] || 0;\r\n  const k3 = k32[3] || 0;\r\n\r\n  let result = 0;\r\n  let K64LSB = K64SigByte & 0x3;\r\n  if (K64LSB === 1) {\r\n    result =\r\n      MDS[0][(P[P_01][lB0] & 0xff) ^ b0(k0)] ^\r\n      MDS[1][(P[P_11][lB1] & 0xff) ^ b1(k0)] ^\r\n      MDS[2][(P[P_21][lB2] & 0xff) ^ b2(k0)] ^\r\n      MDS[3][(P[P_31][lB3] & 0xff) ^ b3(k0)];\r\n    return result;\r\n  }\r\n\r\n  if (K64LSB === 0) {\r\n    lB0 = (P[P_04][lB0] & 0xff) ^ b0(k3);\r\n    lB1 = (P[P_14][lB1] & 0xff) ^ b1(k3);\r\n    lB2 = (P[P_24][lB2] & 0xff) ^ b2(k3);\r\n    lB3 = (P[P_34][lB3] & 0xff) ^ b3(k3);\r\n    K64LSB = 3;\r\n  }\r\n\r\n  if (K64LSB === 3) {\r\n    lB0 = (P[P_03][lB0] & 0xff) ^ b0(k2);\r\n    lB1 = (P[P_13][lB1] & 0xff) ^ b1(k2);\r\n    lB2 = (P[P_23][lB2] & 0xff) ^ b2(k2);\r\n    lB3 = (P[P_33][lB3] & 0xff) ^ b3(k2);\r\n    K64LSB = 2;\r\n  }\r\n\r\n  if (K64LSB === 2) {\r\n    result =\r\n      MDS[0][(P[P_01][(P[P_02][lB0] & 0xff) ^ b0(k1)] & 0xff) ^ b0(k0)] ^\r\n      MDS[1][(P[P_11][(P[P_12][lB1] & 0xff) ^ b1(k1)] & 0xff) ^ b1(k0)] ^\r\n      MDS[2][(P[P_21][(P[P_22][lB2] & 0xff) ^ b2(k1)] & 0xff) ^ b2(k0)] ^\r\n      MDS[3][(P[P_31][(P[P_32][lB3] & 0xff) ^ b3(k1)] & 0xff) ^ b3(k0)];\r\n    return result;\r\n  }\r\n\r\n  return 0;\r\n}\r\nfunction Fe32(SBox: Uint32Array, x: number, R: number) {\r\n  const result =\r\n    SBox[0x000 + 2 * chooseB(x, R + 0) + 0] ^\r\n    SBox[0x000 + 2 * chooseB(x, R + 1) + 1] ^\r\n    SBox[0x200 + 2 * chooseB(x, R + 2) + 0] ^\r\n    SBox[0x200 + 2 * chooseB(x, R + 3) + 1];\r\n  return result;\r\n}\r\n\r\n// * Blowfish Algorithm\r\n\r\nfunction initKeySchedule(K: Uint8Array) {\r\n  const K32 = new Uint32Array(K.buffer, K.byteOffset, K.length >> 2);\r\n  const K32e = new Uint32Array([K32[0], K32[2], K32[4], K32[6]]);\r\n  const K32o = new Uint32Array([K32[1], K32[3], K32[5], K32[7]]);\r\n  const K64Count = K32.length >> 1;\r\n\r\n  // compute S-box keys using (12, 8) Reed-Solomon code over GF(256)\r\n  const SBoxKeys = new Uint32Array(4);\r\n  for (let i = 0; i < 4; i++) {\r\n    const j = K64Count - 1 - i;\r\n    SBoxKeys[j] = RS_MDS_Encode(K32e[i], K32o[i]);\r\n  }\r\n\r\n  // compute the round decryption subkeys for PHT. these same subkeys\r\n  // will be used in encryption but will be applied in reverse order.\r\n  let q = 0;\r\n  const Subkeys = new Uint32Array(40);\r\n  for (let i = 0; i < 20; i++) {\r\n    let A = F32(K64Count, q, K32e);\r\n    let B = F32(K64Count, q + 0x01010101, K32o);\r\n    B = rotateL32(B, 8);\r\n    A += B;\r\n    Subkeys[2 * i] = A;\r\n    A += B;\r\n    Subkeys[2 * i + 1] = rotateL32(A, 9);\r\n    q += 0x02020202;\r\n  }\r\n\r\n  // fully expand the table for speed\r\n  const k0 = SBoxKeys[0];\r\n  const k1 = SBoxKeys[1];\r\n  const k2 = SBoxKeys[2];\r\n  const k3 = SBoxKeys[3];\r\n  const SBox = new Uint32Array(4 * 256);\r\n  for (let i = 0; i < 256; i++) {\r\n    let lb0 = i;\r\n    let lb1 = i;\r\n    let lb2 = i;\r\n    let lb3 = i;\r\n    let K64CountLSB = K64Count & 3;\r\n\r\n    if (K64CountLSB === 1) {\r\n      SBox[0x000 + 2 * i + 0] = MDS[0][(P[P_01][lb0] & 0xff) ^ b0(k0)];\r\n      SBox[0x000 + 2 * i + 1] = MDS[1][(P[P_11][lb1] & 0xff) ^ b1(k0)];\r\n      SBox[0x200 + 2 * i + 0] = MDS[2][(P[P_21][lb2] & 0xff) ^ b2(k0)];\r\n      SBox[0x200 + 2 * i + 1] = MDS[3][(P[P_31][lb3] & 0xff) ^ b3(k0)];\r\n      continue;\r\n    }\r\n\r\n    if (K64CountLSB === 0) {\r\n      lb0 = (P[P_04][lb0] & 0xff) ^ b0(k3);\r\n      lb1 = (P[P_14][lb1] & 0xff) ^ b1(k3);\r\n      lb2 = (P[P_24][lb2] & 0xff) ^ b2(k3);\r\n      lb3 = (P[P_34][lb3] & 0xff) ^ b3(k3);\r\n      K64CountLSB = 3;\r\n    }\r\n\r\n    if (K64CountLSB === 3) {\r\n      lb0 = (P[P_03][lb0] & 0xff) ^ b0(k2);\r\n      lb1 = (P[P_13][lb1] & 0xff) ^ b1(k2);\r\n      lb2 = (P[P_23][lb2] & 0xff) ^ b2(k2);\r\n      lb3 = (P[P_33][lb3] & 0xff) ^ b3(k2);\r\n      K64CountLSB = 2;\r\n    }\r\n\r\n    if (K64CountLSB === 2) {\r\n      SBox[0x000 + 2 * i + 0] = MDS[0][(P[P_01][(P[P_02][lb0] & 0xff) ^ b0(k1)] & 0xff) ^ b0(k0)];\r\n      SBox[0x000 + 2 * i + 1] = MDS[1][(P[P_11][(P[P_12][lb1] & 0xff) ^ b1(k1)] & 0xff) ^ b1(k0)];\r\n      SBox[0x200 + 2 * i + 0] = MDS[2][(P[P_21][(P[P_22][lb2] & 0xff) ^ b2(k1)] & 0xff) ^ b2(k0)];\r\n      SBox[0x200 + 2 * i + 1] = MDS[3][(P[P_31][(P[P_32][lb3] & 0xff) ^ b3(k1)] & 0xff) ^ b3(k0)];\r\n    }\r\n  }\r\n\r\n  return { Subkeys, SBox };\r\n}\r\n\r\nfunction _twofish(K: Uint8Array, b: 128 | 192 | 256) {\r\n  if (K.byteLength !== b >> 3) {\r\n    throw new KitError(`Twofish key must be ${b >> 3} byte`);\r\n  }\r\n  const { Subkeys, SBox } = initKeySchedule(K);\r\n\r\n  const encrypt = (M: Uint8Array) => {\r\n    if (M.byteLength !== 16) {\r\n      throw new KitError('Twofish block must be 16 byte');\r\n    }\r\n    const M32 = new Uint32Array(M.buffer, M.byteOffset, M.length >> 2);\r\n    // input whitening\r\n    let x0 = M32[0] ^ Subkeys[0];\r\n    let x1 = M32[1] ^ Subkeys[1];\r\n    let x2 = M32[2] ^ Subkeys[2];\r\n    let x3 = M32[3] ^ Subkeys[3];\r\n\r\n    let k = 8;\r\n    // 16 rounds of encryption\r\n    for (let i = 0; i < 16; i += 2) {\r\n      let t0 = Fe32(SBox, x0, 0);\r\n      let t1 = Fe32(SBox, x1, 3);\r\n      x2 ^= t0 + t1 + Subkeys[k++];\r\n      x2 = rotateR32(x2, 1);\r\n      x3 = rotateL32(x3, 1);\r\n      x3 ^= t0 + 2 * t1 + Subkeys[k++];\r\n\r\n      t0 = Fe32(SBox, x2, 0);\r\n      t1 = Fe32(SBox, x3, 3);\r\n      x0 ^= t0 + t1 + Subkeys[k++];\r\n      x0 = rotateR32(x0, 1);\r\n      x1 = rotateL32(x1, 1);\r\n      x1 ^= t0 + 2 * t1 + Subkeys[k++];\r\n    }\r\n\r\n    // output whitening\r\n    x2 ^= Subkeys[4];\r\n    x3 ^= Subkeys[5];\r\n    x0 ^= Subkeys[6];\r\n    x1 ^= Subkeys[7];\r\n\r\n    const _ = new Uint32Array([x2, x3, x0, x1]);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  };\r\n  const decrypt = (C: Uint8Array) => {\r\n    if (C.byteLength !== 16) {\r\n      throw new KitError('Twofish block must be 16 byte');\r\n    }\r\n    const M32 = new Uint32Array(C.buffer, C.byteOffset, C.length >> 2);\r\n    // input whitening\r\n    let x2 = M32[0] ^ Subkeys[4];\r\n    let x3 = M32[1] ^ Subkeys[5];\r\n    let x0 = M32[2] ^ Subkeys[6];\r\n    let x1 = M32[3] ^ Subkeys[7];\r\n\r\n    let k = 39;\r\n    // 16 rounds of decryption\r\n    for (let i = 0; i < 16; i += 2) {\r\n      let t0 = Fe32(SBox, x2, 0);\r\n      let t1 = Fe32(SBox, x3, 3);\r\n      x1 ^= t0 + 2 * t1 + Subkeys[k--];\r\n      x1 = rotateR32(x1, 1);\r\n      x0 = rotateL32(x0, 1);\r\n      x0 ^= t0 + t1 + Subkeys[k--];\r\n\r\n      t0 = Fe32(SBox, x0, 0);\r\n      t1 = Fe32(SBox, x1, 3);\r\n      x3 ^= t0 + 2 * t1 + Subkeys[k--];\r\n      x3 = rotateR32(x3, 1);\r\n      x2 = rotateL32(x2, 1);\r\n      x2 ^= t0 + t1 + Subkeys[k--];\r\n    }\r\n\r\n    // output whitening\r\n    x0 ^= Subkeys[0];\r\n    x1 ^= Subkeys[1];\r\n    x2 ^= Subkeys[2];\r\n    x3 ^= Subkeys[3];\r\n\r\n    const _ = new Uint32Array([x0, x1, x2, x3]);\r\n    return new U8(_.buffer, _.byteOffset, _.byteLength);\r\n  };\r\n  return { encrypt, decrypt };\r\n}\r\n\r\n/**\r\n * Twofish 分组密码算法 / block cipher algorithm\r\n *\r\n * @param {128 | 192 | 256} b - 密钥长度 / Key size (bit)\r\n */\r\nexport function twofish(b: 128 | 192 | 256) {\r\n  return createCipher((K: Uint8Array) => _twofish(K, b), {\r\n    ALGORITHM: 'Twofish',\r\n    BLOCK_SIZE: 16,\r\n    KEY_SIZE: b >> 3,\r\n    MIN_KEY_SIZE: b >> 3,\r\n    MAX_KEY_SIZE: b >> 3,\r\n  });\r\n}\r\n","import { U8 } from './utils';\r\n\r\nexport const ASN1 = {\r\n  // 0x04\r\n  OCTET_STRING: (value: Uint8Array) => {\r\n    const buffer = new U8(value.length + 2);\r\n    buffer.set([0x04, value.length], 0);\r\n    buffer.set(value, 2);\r\n    return buffer;\r\n  },\r\n  // 0x05\r\n  NULL: () => new U8([0x05, 0x00]),\r\n  // 0x06\r\n  OBJECT_IDENTIFIER: (id: string = '') => {\r\n    const node = id.split('.').map(Number);\r\n    const buffer: number[] = [];\r\n    buffer.push(node[0] * 40 + node[1]);\r\n    for (let i = 2; i < node.length; i++) {\r\n      let n = node[i];\r\n      if (n < 128) buffer.push(n);\r\n      else {\r\n        const bytes: number[] = [n & 0x7f];\r\n        n >>= 7;\r\n        while (n > 0) {\r\n          bytes.unshift((n & 0x7f) | 0x80);\r\n          n >>= 7;\r\n        }\r\n        buffer.push(...bytes);\r\n      }\r\n    }\r\n    return new U8([0x06, buffer.length, ...buffer]);\r\n  },\r\n  // 0x30\r\n  SEQUENCE: (value: Uint8Array[]) => {\r\n    const length = value.reduce((sum, v) => sum + v.length, 0);\r\n    const buffer = new U8(length + 2);\r\n    buffer.set([0x30, length], 0);\r\n    let offset = 2;\r\n    for (const v of value) {\r\n      buffer.set(v, offset);\r\n      offset += v.length;\r\n    }\r\n    return buffer;\r\n  },\r\n};\r\n","import type { RandomPrimeGenerator } from '../../core/prime';\r\nimport { genPrime } from '../../core/prime';\r\nimport { gcd, KitError, lcm, mod, modInverse, modPow, u8 } from '../../core/utils';\r\n\r\n// * Interfaces\r\n\r\nexport interface RSAPublicKey {\r\n  /** 模数 / Modulus */\r\n  n: bigint;\r\n  /** 公钥指数 / Public Exponent */\r\n  e: bigint;\r\n}\r\nexport interface RSAPrivateKey extends RSAPublicKey {\r\n  /** 模数 / Modulus */\r\n  n: bigint;\r\n  /** 公钥指数 / Public Exponent */\r\n  e: bigint;\r\n  /** 私钥指数 / Private Exponent */\r\n  d: bigint;\r\n  p: bigint;\r\n  q: bigint;\r\n  dP: bigint;\r\n  dQ: bigint;\r\n  qInv: bigint;\r\n}\r\n\r\nexport interface RSACipherable {\r\n  /**\r\n   * 使用 RSA 加密原语加密消息\r\n   *\r\n   * Encrypt message using RSA encryption primitive\r\n   */\r\n  encrypt: (M: Uint8Array) => bigint;\r\n  /**\r\n   * 使用 RSA 解密原语解密密文\r\n   *\r\n   * Decrypt ciphertext using RSA decryption primitive\r\n   */\r\n  decrypt: (C: Uint8Array) => bigint;\r\n}\r\nexport interface RSAVerifiable {\r\n  /**\r\n   * 使用 RSA 签名原语对消息签名\r\n   *\r\n   * Sign message using RSA signature primitive\r\n   */\r\n  sign: (M: Uint8Array) => bigint;\r\n  /**\r\n   * 使用 RSA 验证原语验证签名\r\n   *\r\n   * Verify signature using RSA verification primitive\r\n   */\r\n  verify: (S: Uint8Array) => bigint;\r\n}\r\n\r\n// * RSA Algorithm\r\n\r\n/**\r\n * RSA 加密原语\r\n *\r\n * RSA encryption primitive\r\n */\r\nfunction encryptionPrimitive(key: Partial<RSAPublicKey>, M: bigint | Uint8Array) {\r\n  const { n, e } = key;\r\n  if (e === undefined || n === undefined) {\r\n    throw new KitError('Invalid public key');\r\n  }\r\n  M = typeof M === 'bigint' ? M : u8(M).toBI();\r\n  if (M >= n) {\r\n    throw new KitError('Message representative out of range');\r\n  }\r\n  return modPow(M, e, n);\r\n}\r\n\r\n/**\r\n * RSA 解密原语\r\n *\r\n * RSA decryption primitive\r\n */\r\nfunction decryptionPrimitive(key: Partial<RSAPrivateKey>, C: bigint | Uint8Array) {\r\n  const { n, d } = key;\r\n  if (d === undefined || n === undefined) {\r\n    throw new KitError('Invalid private key');\r\n  }\r\n  C = typeof C === 'bigint' ? C : u8(C).toBI();\r\n  if (C >= n) {\r\n    throw new KitError('Ciphertext representative out of range');\r\n  }\r\n  return modPow(C, d, n);\r\n}\r\n\r\n/**\r\n * RSA 签名原语\r\n *\r\n * RSA signature primitive\r\n */\r\nfunction signaturePrimitive(key: Partial<RSAPrivateKey>, M: bigint | Uint8Array) {\r\n  const { n, d } = key;\r\n  if (d === undefined || n === undefined) {\r\n    throw new KitError('Invalid private key');\r\n  }\r\n  M = typeof M === 'bigint' ? M : u8(M).toBI();\r\n  if (M >= n) {\r\n    throw new KitError('Message representative out of range');\r\n  }\r\n  return modPow(M, d, n);\r\n}\r\n\r\n/**\r\n * RSA 验证原语\r\n *\r\n * RSA verification primitive\r\n */\r\nfunction verificationPrimitive(key: Partial<RSAPublicKey>, S: bigint | Uint8Array) {\r\n  const { n, e } = key;\r\n  if (e === undefined || n === undefined) {\r\n    throw new KitError('Invalid public key');\r\n  }\r\n  S = typeof S === 'bigint' ? S : u8(S).toBI();\r\n  if (S >= n) {\r\n    throw new KitError('Signature is too long');\r\n  }\r\n  return modPow(S, e, n);\r\n}\r\n\r\n/**\r\n * RSA 密钥生成\r\n *\r\n * RSA key generation\r\n *\r\n * @param {number} b - RSA 私钥长度 / RSA private key length (bit)\r\n * @param {RandomPrimeGenerator} rpg - 随机素数生成器 / Random prime generator\r\n */\r\nfunction genKey(b: number, rpg = genPrime): RSAPrivateKey {\r\n  const p = rpg(b >> 1);\r\n  const q = rpg(b >> 1);\r\n  const n = p * q;\r\n  const λ = lcm(p - 1n, q - 1n);\r\n\r\n  // public key\r\n  const e = 65537n;\r\n  if (gcd(e, λ) !== 1n) {\r\n    throw new KitError('Invalid public exponent');\r\n  }\r\n\r\n  // private key\r\n  const d = modInverse(e, λ);\r\n\r\n  const dP = mod(d, p - 1n);\r\n  const dQ = mod(d, q - 1n);\r\n  const qInv = modInverse(q, p);\r\n\r\n  const privateKey: RSAPrivateKey = { n, e, d, p, q, dP, dQ, qInv };\r\n\r\n  return privateKey;\r\n}\r\n\r\nfunction fromKey(key: Partial<RSAPrivateKey>): RSACipherable & RSAVerifiable {\r\n  const encrypt = (M: Uint8Array) => encryptionPrimitive(key, M);\r\n  const decrypt = (C: Uint8Array) => decryptionPrimitive(key, C);\r\n  const sign = (M: Uint8Array) => signaturePrimitive(key, M);\r\n  const verify = (S: Uint8Array) => verificationPrimitive(key, S);\r\n  return {\r\n    ...key,\r\n    encrypt,\r\n    decrypt,\r\n    sign,\r\n    verify,\r\n  };\r\n}\r\n\r\n/**\r\n * 根据 RSA 私钥长度生成 RSA 密钥对, 并返回 RSA 加密原语和签名原语\r\n *\r\n * Generate RSA key pair according to RSA private key length, and return RSA encryption primitive and signature primitive\r\n *\r\n * @param {number} b - RSA 私钥长度 / RSA private key length\r\n * @param {RandomPrimeGenerator} rpg - 随机素数生成器 / Random prime generator\r\n */\r\nexport function rsa(b: number, rpg?: RandomPrimeGenerator): RSACipherable & RSAVerifiable & RSAPrivateKey;\r\n/**\r\n * 根据 RSA 公钥或私钥生成 RSA 加密原语和验证原语\r\n *\r\n * Generate RSA encryption primitive and verification primitive according to RSA public or private key\r\n *\r\n * @param {RSAPrivateKey | RSAPublicKey} key - RSA 公钥或私钥 / RSA public or private key\r\n */\r\nexport function rsa<T extends RSAPrivateKey | RSAPublicKey>(key: T): RSACipherable & RSAVerifiable & T;\r\nexport function rsa(b: number | RSAPrivateKey | RSAPublicKey, rpg = genPrime) {\r\n  if (typeof b === 'number') {\r\n    return fromKey(genKey(b, rpg));\r\n  }\r\n  return fromKey(b);\r\n}\r\n","import { ASN1 } from '../../core/asn1';\r\nimport type { Hash } from '../../core/hash';\r\nimport { Counter, getBIBits, joinBuffer, KitError, U8 } from '../../core/utils';\r\nimport { sha256 } from '../../hash/sha256';\r\nimport type { RSAPrivateKey, RSAPublicKey } from './rsa';\r\nimport { rsa } from './rsa';\r\n\r\n// * MGF1\r\n\r\nexport interface MGF {\r\n  (mdfSeed: Uint8Array, maskLen: number): Uint8Array;\r\n}\r\n/**\r\n * PKCS#1 v2.2 的 掩码生成函数 MGF1\r\n *\r\n * Mask Generation Function MGF1 of PKCS#1 v2.2\r\n */\r\nexport function mgf1(hash: Hash): MGF {\r\n  return (mdfSeed: Uint8Array, maskLen: number) => {\r\n    const T: Uint8Array[] = [];\r\n    const _ = joinBuffer(mdfSeed, new Uint8Array(4));\r\n    const C = new Counter(_.buffer, _.byteOffset, _.byteLength);\r\n    for (let i = 0; i < maskLen; i += hash.DIGEST_SIZE) {\r\n      T.push(hash(C));\r\n      C.inc(mdfSeed.length);\r\n    }\r\n    return joinBuffer(...T).slice(0, maskLen);\r\n  };\r\n}\r\n\r\n// * Encryption Scheme\r\n\r\n/**\r\n * 最优非对称加密填充的 RSA 加密方案 (OAEP)\r\n *\r\n * RSA Encryption Scheme with Optimal Asymmetric Encryption Padding (OAEP)\r\n *\r\n * @param {RSAPublicKey | RSAPrivateKey} key - RSA 公钥或私钥 / RSA public or private key\r\n * @param {Hash} [hash] - 散列函数 / Hash function (default: SHA-256)\r\n * @param {MGF} [mgf] - 掩码生成函数 / Mask generation function (default: MGF1)\r\n * @param {Uint8Array} [label] - 标签 / Label (default: empty)\r\n */\r\nexport function pkcs1_es_oaep(\r\n  key: RSAPublicKey | RSAPrivateKey,\r\n  hash: Hash = sha256,\r\n  mgf = mgf1(hash),\r\n  label = new Uint8Array(),\r\n) {\r\n  const k = (getBIBits(key.n) + 7) >> 3;\r\n  const hLen = hash.DIGEST_SIZE;\r\n  const MAX_MESSAGE_LENGTH = k - 2 * hLen - 2;\r\n  if (MAX_MESSAGE_LENGTH <= 0) {\r\n    throw new KitError('Invalid key or hash function');\r\n  }\r\n  const _rsa = rsa(key);\r\n  const lHash = hash(label);\r\n  const encrypt = (M: Uint8Array) => {\r\n    const mLen = M.length;\r\n    if (mLen > MAX_MESSAGE_LENGTH) {\r\n      throw new KitError('Message too long');\r\n    }\r\n    // DB = lHash || PS || 0x01 || M\r\n    const PS = new U8(MAX_MESSAGE_LENGTH - mLen);\r\n    const DB = joinBuffer(lHash, PS, new U8([0x01]), M);\r\n    // EM = 0x00 || maskedSeed || maskedDB\r\n    const seed = new U8(hLen);\r\n    crypto.getRandomValues(seed);\r\n    const dbMask = mgf(seed, DB.length);\r\n    const maskedDB = DB.map((v, i) => v ^ dbMask[i]);\r\n    const seedMask = mgf(maskedDB, hLen);\r\n    const maskedSeed = seed.map((v, i) => v ^ seedMask[i]);\r\n    const EM = joinBuffer(new U8([0x00]), maskedSeed, maskedDB);\r\n    return U8.fromBI(_rsa.encrypt(EM), k);\r\n  };\r\n  const decrypt = (C: Uint8Array) => {\r\n    if (k !== C.length) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const EM = U8.fromBI(_rsa.decrypt(C), k);\r\n    if (EM[0] !== 0x00) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const maskedSeed = EM.subarray(1, hLen + 1);\r\n    const maskedDB = EM.subarray(hLen + 1);\r\n    const seedMask = mgf(maskedDB, hLen);\r\n    const seed = maskedSeed.map((v, i) => v ^ seedMask[i]);\r\n    const dbMask = mgf(seed, maskedDB.length);\r\n    const DB = maskedDB.map((v, i) => v ^ dbMask[i]);\r\n    const lHash_ = DB.subarray(0, hLen);\r\n    if (lHash.some((v, i) => v !== lHash_[i])) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const PS = DB.subarray(hLen);\r\n    const mOffset = PS.indexOf(0x01);\r\n    if (mOffset === -1) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    if (PS.subarray(0, mOffset).some((v) => v !== 0x00)) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const M = PS.slice(mOffset + 1);\r\n    return M;\r\n  };\r\n  return { encrypt, decrypt };\r\n}\r\n\r\n/**\r\n * RSA 加密方案 (PKCS#1 v1.5)\r\n *\r\n * RSA Encryption Scheme (PKCS#1 v1.5)\r\n *\r\n * @param {RSAPublicKey | RSAPrivateKey} key - RSA 公钥或私钥 / RSA public or private key\r\n */\r\nexport function pkcs1_es_1_5(key: RSAPublicKey | RSAPrivateKey) {\r\n  const k = (getBIBits(key.n) + 7) >> 3;\r\n  const MAX_MESSAGE_LENGTH = k - 11;\r\n  if (MAX_MESSAGE_LENGTH <= 0) {\r\n    throw new KitError('Invalid key');\r\n  }\r\n  const _rsa = rsa(key);\r\n  const encrypt = (M: Uint8Array) => {\r\n    if (M.length > MAX_MESSAGE_LENGTH) {\r\n      throw new KitError('Message is too long');\r\n    }\r\n    const PS = new Uint8Array(k - M.length - 3);\r\n    do {\r\n      crypto.getRandomValues(PS);\r\n    } while (PS.includes(0x00));\r\n    const EM = joinBuffer(new U8([0x00, 0x02]), PS, new U8([0x00]), M);\r\n    return U8.fromBI(_rsa.encrypt(EM), k);\r\n  };\r\n  const decrypt = (C: Uint8Array) => {\r\n    if (C.length !== k) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const EM = U8.fromBI(_rsa.decrypt(C), k);\r\n    if (EM[0] !== 0x00 || EM[1] !== 0x02) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const SeparatorIndex = EM.subarray(2).indexOf(0x00);\r\n    if (SeparatorIndex === -1) {\r\n      throw new KitError('Decryption error');\r\n    }\r\n    const M = EM.slice(SeparatorIndex + 3);\r\n    return M;\r\n  };\r\n  return { encrypt, decrypt };\r\n}\r\n\r\n// * Signature Scheme with Appendix\r\n\r\n/**\r\n * 基于 概率签名方案 的 RSA 附录签名方案 (PSS)\r\n *\r\n * RSA Signature Scheme with Appendix - Probabilistic Signature Scheme (PSS)\r\n *\r\n * @param {RSAPublicKey | RSAPrivateKey} key - RSA 公钥或私钥 / RSA public or private key\r\n * @param {Hash} [hash] - 散列函数 / Hash function (default: SHA-256)\r\n * @param {MGF} [mgf] - 掩码生成函数 / Mask generation function (default: MGF1)\r\n * @param {number} [sLen] - 盐长度 / Salt length (default: hash.DIGEST_SIZE)\r\n */\r\nexport function pkcs1_ssa_pss(\r\n  key: RSAPublicKey | RSAPrivateKey,\r\n  hash: Hash = sha256,\r\n  mgf = mgf1(hash),\r\n  sLen = hash.DIGEST_SIZE,\r\n) {\r\n  const modBits = getBIBits(key.n);\r\n  const k = (modBits + 7) >> 3;\r\n  const emLen = (modBits + 6) >> 3;\r\n  const emsa = emsa_pss(hash, mgf, sLen);\r\n  const _rsa = rsa(key);\r\n  const sign = (M: Uint8Array) => {\r\n    const EM = emsa.encode(M, modBits - 1);\r\n    const S = _rsa.sign(EM);\r\n    return U8.fromBI(S, k);\r\n  };\r\n  const verify = (M: Uint8Array, S: Uint8Array) => {\r\n    if (S.length !== k) {\r\n      return false;\r\n    }\r\n    const EM = U8.fromBI(_rsa.verify(S), emLen);\r\n    return emsa.verify(M, EM, modBits - 1);\r\n  };\r\n  return { sign, verify };\r\n}\r\n\r\n/**\r\n * RSA 附录签名方案 (PKCS#1 v1.5)\r\n *\r\n * RSA Signature Scheme with Appendix (PKCS#1 v1.5)\r\n *\r\n * @param {RSAPublicKey | RSAPrivateKey} key - RSA 公钥或私钥 / RSA public or private key\r\n * @param {Hash} [hash] - 散列函数 / Hash function (default: SHA-256)\r\n */\r\nexport function pkcs1_ssa_1_5(key: RSAPublicKey | RSAPrivateKey, hash: Hash = sha256) {\r\n  const modBits = getBIBits(key.n);\r\n  const k = (modBits + 7) >> 3;\r\n  const _rsa = rsa(key);\r\n  const sign = (M: Uint8Array) => {\r\n    const EM = emsa_1_5(M, k, hash);\r\n    const S = _rsa.sign(EM);\r\n    return U8.fromBI(S, k);\r\n  };\r\n  const verify = (M: Uint8Array, S: Uint8Array) => {\r\n    if (S.length !== k) {\r\n      return false;\r\n    }\r\n    const EM = U8.fromBI(_rsa.verify(S), k);\r\n    const EM2 = emsa_1_5(M, k, hash);\r\n    return EM.every((v, i) => v === EM2[i]);\r\n  };\r\n  return { sign, verify };\r\n}\r\n\r\n// * Encoding Method for Signatures with Appendix\r\n\r\nfunction emsa_pss(hash: Hash = sha256, mgf = mgf1(hash), sLen = hash.DIGEST_SIZE) {\r\n  const hLen = hash.DIGEST_SIZE;\r\n  const encode = (M: Uint8Array, emBits: number) => {\r\n    const mHash = hash(M);\r\n    const emLen = (emBits + 7) >> 3;\r\n    if (emLen < hLen + sLen + 2) {\r\n      throw new KitError('Encoding error');\r\n    }\r\n    const salt = new U8(sLen);\r\n    crypto.getRandomValues(salt);\r\n    const M2 = joinBuffer(new U8(8), mHash, salt);\r\n    const H = hash(M2);\r\n    const PS = new U8(emLen - sLen - hLen - 2);\r\n    const DB = joinBuffer(PS, new U8([0x01]), salt);\r\n    const dbMask = mgf(H, DB.length);\r\n    const maskedDB = DB.map((v, i) => v ^ dbMask[i]);\r\n    const bitMask = 0xff >> ((emLen << 3) - emBits);\r\n    maskedDB[0] &= bitMask;\r\n    const EM = joinBuffer(maskedDB, H, new U8([0xbc]));\r\n    return EM;\r\n  };\r\n  const verify = (M: Uint8Array, EM: Uint8Array, emBits: number) => {\r\n    const mHash = hash(M);\r\n    const emLen = (emBits + 7) >> 3;\r\n    if (emLen !== EM.length || emLen < hLen + sLen + 2) {\r\n      return false;\r\n    }\r\n    if (EM[emLen - 1] !== 0xbc) {\r\n      return false;\r\n    }\r\n    const maskedDB = EM.subarray(0, emLen - hLen - 1);\r\n    const H = EM.subarray(maskedDB.length, emLen - 1);\r\n    const bitMask = 0xff >> ((emLen << 3) - emBits);\r\n    if (maskedDB[0] > bitMask) {\r\n      return false;\r\n    }\r\n    const dbMask = mgf(H, maskedDB.length);\r\n    const DB = maskedDB.map((v, i) => v ^ dbMask[i]);\r\n    DB[0] &= bitMask;\r\n    const PS = DB.subarray(0, DB.length - sLen - 1);\r\n    if (PS.some((v) => v !== 0x00)) {\r\n      return false;\r\n    }\r\n    if (DB[PS.length] !== 0x01) {\r\n      return false;\r\n    }\r\n    const salt = DB.subarray(PS.length + 1);\r\n    const M2 = joinBuffer(new U8(8), mHash, salt);\r\n    const H2 = hash(M2);\r\n    return H2.every((v, i) => v === H[i]);\r\n  };\r\n  return { encode, verify };\r\n}\r\n\r\nfunction emsa_1_5(M: Uint8Array, emLen: number, hash: Hash = sha256) {\r\n  const H = hash(M);\r\n  const digestAlgorithm = ASN1.SEQUENCE([ASN1.OBJECT_IDENTIFIER(hash.OID), ASN1.NULL()]);\r\n  const digest = ASN1.OCTET_STRING(H);\r\n  const DigestInfo = ASN1.SEQUENCE([digestAlgorithm, digest]);\r\n  const T = DigestInfo;\r\n  const psLen = emLen - T.length - 3;\r\n  if (psLen < 8) {\r\n    throw new KitError('intended encoded message length too short');\r\n  }\r\n  const PS = new U8(psLen).fill(0xff);\r\n  const EM = joinBuffer(new U8([0x00, 0x01]), PS, new U8([0x00]), T);\r\n  return EM;\r\n}\r\n","import { hmac } from '../hash/hmac';\r\nimport { sha256 } from '../hash/sha256';\r\nimport type { Hash, KeyHash } from './hash';\r\nimport { Counter, joinBuffer, KitError, rotateL32, U8, u8, u32 } from './utils';\r\n\r\nexport interface KDF {\r\n  /**\r\n   * @param {number} k_byte - 期望的密钥长度 / output keying material length\r\n   * @param {Uint8Array} ikm - 输入密钥材料 / input keying material\r\n   * @param {Uint8Array} salt - 盐 / salt value\r\n   */\r\n  (k_byte: number, ikm: Uint8Array, salt?: Uint8Array): U8;\r\n}\r\n\r\n/**\r\n * ANSI-X9.63 Key Derivation Function\r\n *\r\n * ANSI-X9.63 密钥派生函数\r\n */\r\nexport function x963kdf(hash: Hash, info = new Uint8Array(0)): KDF {\r\n  const d_byte = hash.DIGEST_SIZE;\r\n  return (k_byte: number, ikm: Uint8Array) => {\r\n    /** Output Keying Material */\r\n    const okm: Uint8Array[] = [];\r\n\r\n    const counter = new Counter([0, 0, 0, 1]);\r\n    for (let okm_byte = 0; okm_byte < k_byte; okm_byte += d_byte) {\r\n      const data = joinBuffer(ikm, counter, info);\r\n      okm.push(hash(data));\r\n      counter.inc();\r\n    }\r\n\r\n    return joinBuffer(...okm).slice(0, k_byte);\r\n  };\r\n}\r\n\r\n/**\r\n * HMAC-based Key Derivation Function (HKDF), please combine `hmac` and `hash` externally to control the behavior of calling `hmac` inside the function.\r\n *\r\n * 基于 HMAC 的密钥派生函数 (HKDF), 请在外部组合 `hmac` 和 `hash` 函数, 以控制在函数内部调用 `hmac` 时的行为.\r\n */\r\nexport function hkdf(k_hash: KeyHash, info = new Uint8Array(0)): KDF {\r\n  const d_byte = k_hash.DIGEST_SIZE;\r\n  return (k_byte: number, ikm: Uint8Array, salt = new Uint8Array(0)) => {\r\n    ikm = u8(ikm);\r\n    salt = u8(salt);\r\n    /** Pseudo-Random Key */\r\n    const prk = k_hash(salt, ikm);\r\n    /** Output Keying Material */\r\n    const okm: Uint8Array[] = [];\r\n\r\n    const counter = new Uint8Array([1]);\r\n    let prv = new Uint8Array(0);\r\n    for (let okm_byte = 0; okm_byte < k_byte; okm_byte += d_byte) {\r\n      prv = k_hash(prk, joinBuffer(prv, info, counter));\r\n      okm.push(prv);\r\n      counter[0]++;\r\n    }\r\n\r\n    return joinBuffer(...okm).slice(0, k_byte);\r\n  };\r\n}\r\n\r\n/**\r\n * Password-Based Key Derivation Function 2 (PBKDF2), please combine `hmac` and `hash` externally to control the behavior of calling `hmac` inside the function.\r\n *\r\n * PBKDF2 密码基础密钥派生函数 (PBKDF2), 请在外部组合 `hmac` 和 `hash` 函数, 以控制在函数内部调用 `hmac` 时的行为.\r\n */\r\nexport function pbkdf2(k_hash: KeyHash, iterations = 1000): KDF {\r\n  const d_byte = k_hash.DIGEST_SIZE;\r\n  return (k_byte: number, ikm: Uint8Array, salt = new Uint8Array(0)) => {\r\n    ikm = u8(ikm);\r\n\r\n    /** Output Keying Material */\r\n    const okm = new U8(k_byte);\r\n\r\n    let T: Uint8Array;\r\n    let U: Uint8Array;\r\n    const counter = new Counter([0, 0, 0, 1]);\r\n    for (let okm_byte = 0; okm_byte < k_byte; okm_byte += d_byte) {\r\n      T = new Uint8Array(k_hash.DIGEST_SIZE);\r\n      U = joinBuffer(salt, counter);\r\n      for (let i = 0; i < iterations; i++) {\r\n        U = k_hash(ikm, U);\r\n        T.forEach((_, j) => {\r\n          T[j] ^= U[j];\r\n        });\r\n      }\r\n      okm.set(T, okm_byte);\r\n      counter.inc();\r\n    }\r\n\r\n    return okm;\r\n  };\r\n}\r\n\r\ninterface ScryptConfig {\r\n  /**\r\n   * 开销因子 / Cost factor (default: 16384)\r\n   *\r\n   * 必须是 2 的幂\r\n   *\r\n   * Must be a power of 2\r\n   */\r\n  N?: number;\r\n  /**\r\n   * 块数 / Block count (default: 8)\r\n   */\r\n  r?: number;\r\n  /**\r\n   * 并行因子 / Parallelization factor (default: 1)\r\n   */\r\n  p?: number;\r\n  /**\r\n   * 最大内存使用量 / Maximum memory usage\r\n   *\r\n   * 如果设置为 0，则不限制内存使用量\r\n   *\r\n   * If set to 0, there is no limit on memory usage\r\n   *\r\n   * (default: 0x40000400 bytes, 1GB + 1KB)\r\n   */\r\n  maxmem?: number;\r\n  /**\r\n   * 密钥派生函数 / Key Derivation Function\r\n   *\r\n   * scrypt 标准使用了 `PBKDF2-HMAC-SHA256` 作为 KDF。\r\n   * 该参数允许用户指定其他 KDF，改变 scrypt 的内部行为。\r\n   *\r\n   * 注意: 这不是 `scrypt` 的标准用法且缺乏相关的安全分析。\r\n   *\r\n   * The scrypt standard uses `PBKDF2-HMAC-SHA256` as the KDF.\r\n   * This parameter allows users to specify a different KDF, changing the internal behavior of scrypt.\r\n   *\r\n   * Note: This is not the standard usage of `scrypt` and lacks relevant security analysis.\r\n   *\r\n   * (default: pbkdf2(hmac(sha256), 1))\r\n   */\r\n  kdf?: KDF;\r\n}\r\n\r\n/**\r\n * Scrypt Key Derivation Function\r\n *\r\n * Scrypt 密钥派生函数\r\n *\r\n * Based on https://github.com/paulmillr/noble-hashes\r\n */\r\nexport function scrypt(config?: ScryptConfig): KDF {\r\n  const { N = 16384, r = 8, p = 1, maxmem = 0x40000400, kdf = pbkdf2(hmac(sha256), 1) } = config ?? {};\r\n\r\n  const BLOCK_SIZE = r << 7;\r\n  const BLOCK_SIZE_32 = r << 5;\r\n  const MAX_p = (0x1fffffffe0 / BLOCK_SIZE) >>> 0;\r\n  const MEM_COST = BLOCK_SIZE * (N + p);\r\n  const N_1 = N - 1;\r\n\r\n  if (N === 0 || (N & N_1) !== 0) throw new KitError(`N must be a power of 2`);\r\n  if (p < 1 || p > MAX_p) throw new KitError(`p must be in range [1, ${MAX_p}]`);\r\n  if (MEM_COST > maxmem) throw new KitError(`Memory cost exceeds maxmem: ${MEM_COST} > ${maxmem}`);\r\n\r\n  // 内联 rotateL32 (神秘的黑魔法)\r\n  const rotl = rotateL32;\r\n\r\n  function fast_xor_salsa_hash(\r\n    prev: Uint32Array,\r\n    pi: number,\r\n    input: Uint32Array,\r\n    ii: number,\r\n    output: Uint32Array,\r\n    oi: number,\r\n  ) {\r\n    const y00 = prev[pi++] ^ input[ii++];\r\n    const y01 = prev[pi++] ^ input[ii++];\r\n    const y02 = prev[pi++] ^ input[ii++];\r\n    const y03 = prev[pi++] ^ input[ii++];\r\n    const y04 = prev[pi++] ^ input[ii++];\r\n    const y05 = prev[pi++] ^ input[ii++];\r\n    const y06 = prev[pi++] ^ input[ii++];\r\n    const y07 = prev[pi++] ^ input[ii++];\r\n    const y08 = prev[pi++] ^ input[ii++];\r\n    const y09 = prev[pi++] ^ input[ii++];\r\n    const y10 = prev[pi++] ^ input[ii++];\r\n    const y11 = prev[pi++] ^ input[ii++];\r\n    const y12 = prev[pi++] ^ input[ii++];\r\n    const y13 = prev[pi++] ^ input[ii++];\r\n    const y14 = prev[pi++] ^ input[ii++];\r\n    const y15 = prev[pi++] ^ input[ii++];\r\n    // Save state to temporary variables (salsa)\r\n    let x00 = y00;\r\n    let x01 = y01;\r\n    let x02 = y02;\r\n    let x03 = y03;\r\n    let x04 = y04;\r\n    let x05 = y05;\r\n    let x06 = y06;\r\n    let x07 = y07;\r\n    let x08 = y08;\r\n    let x09 = y09;\r\n    let x10 = y10;\r\n    let x11 = y11;\r\n    let x12 = y12;\r\n    let x13 = y13;\r\n    let x14 = y14;\r\n    let x15 = y15;\r\n    // Main loop (salsa)\r\n    for (let i = 0; i < 8; i += 2) {\r\n      x04 ^= rotl((x00 + x12) | 0, 7);\r\n      x08 ^= rotl((x04 + x00) | 0, 9);\r\n      x12 ^= rotl((x08 + x04) | 0, 13);\r\n      x00 ^= rotl((x12 + x08) | 0, 18);\r\n      x09 ^= rotl((x05 + x01) | 0, 7);\r\n      x13 ^= rotl((x09 + x05) | 0, 9);\r\n      x01 ^= rotl((x13 + x09) | 0, 13);\r\n      x05 ^= rotl((x01 + x13) | 0, 18);\r\n      x14 ^= rotl((x10 + x06) | 0, 7);\r\n      x02 ^= rotl((x14 + x10) | 0, 9);\r\n      x06 ^= rotl((x02 + x14) | 0, 13);\r\n      x10 ^= rotl((x06 + x02) | 0, 18);\r\n      x03 ^= rotl((x15 + x11) | 0, 7);\r\n      x07 ^= rotl((x03 + x15) | 0, 9);\r\n      x11 ^= rotl((x07 + x03) | 0, 13);\r\n      x15 ^= rotl((x11 + x07) | 0, 18);\r\n      x01 ^= rotl((x00 + x03) | 0, 7);\r\n      x02 ^= rotl((x01 + x00) | 0, 9);\r\n      x03 ^= rotl((x02 + x01) | 0, 13);\r\n      x00 ^= rotl((x03 + x02) | 0, 18);\r\n      x06 ^= rotl((x05 + x04) | 0, 7);\r\n      x07 ^= rotl((x06 + x05) | 0, 9);\r\n      x04 ^= rotl((x07 + x06) | 0, 13);\r\n      x05 ^= rotl((x04 + x07) | 0, 18);\r\n      x11 ^= rotl((x10 + x09) | 0, 7);\r\n      x08 ^= rotl((x11 + x10) | 0, 9);\r\n      x09 ^= rotl((x08 + x11) | 0, 13);\r\n      x10 ^= rotl((x09 + x08) | 0, 18);\r\n      x12 ^= rotl((x15 + x14) | 0, 7);\r\n      x13 ^= rotl((x12 + x15) | 0, 9);\r\n      x14 ^= rotl((x13 + x12) | 0, 13);\r\n      x15 ^= rotl((x14 + x13) | 0, 18);\r\n    }\r\n    // Write output (salsa)\r\n    output[oi++] = (y00 + x00) | 0;\r\n    output[oi++] = (y01 + x01) | 0;\r\n    output[oi++] = (y02 + x02) | 0;\r\n    output[oi++] = (y03 + x03) | 0;\r\n    output[oi++] = (y04 + x04) | 0;\r\n    output[oi++] = (y05 + x05) | 0;\r\n    output[oi++] = (y06 + x06) | 0;\r\n    output[oi++] = (y07 + x07) | 0;\r\n    output[oi++] = (y08 + x08) | 0;\r\n    output[oi++] = (y09 + x09) | 0;\r\n    output[oi++] = (y10 + x10) | 0;\r\n    output[oi++] = (y11 + x11) | 0;\r\n    output[oi++] = (y12 + x12) | 0;\r\n    output[oi++] = (y13 + x13) | 0;\r\n    output[oi++] = (y14 + x14) | 0;\r\n    output[oi++] = (y15 + x15) | 0;\r\n  }\r\n  function block_mix(input: Uint32Array, input_index: number, output: Uint32Array, output_index: number, r: number) {\r\n    let head = output_index;\r\n    let tail = output_index + (r << 4);\r\n    const t = ((r << 1) - 1) << 4;\r\n    for (let i = 0; i < 16; i++) output[tail + i] = input[input_index + i + t];\r\n    for (let i = 0; i < r; i++) {\r\n      fast_xor_salsa_hash(output, tail, input, input_index, output, head);\r\n      if (i > 0) {\r\n        tail += 16;\r\n      }\r\n      input_index += 16;\r\n      fast_xor_salsa_hash(output, head, input, input_index, output, tail);\r\n      head += 16;\r\n      input_index += 16;\r\n    }\r\n  }\r\n\r\n  return (k_byte: number, ikm: Uint8Array, salt = new Uint8Array(0)) => {\r\n    ikm = u8(ikm);\r\n    salt = u8(salt);\r\n    const B = kdf(BLOCK_SIZE * p, ikm, salt);\r\n    const B32 = u32(B);\r\n\r\n    const V32 = u32(new Uint8Array(BLOCK_SIZE * N));\r\n    const tmp = u32(new Uint8Array(BLOCK_SIZE));\r\n\r\n    for (let pi = 0; pi < p; pi++) {\r\n      const PI = BLOCK_SIZE_32 * pi;\r\n      V32.set(B32.subarray(PI, PI + BLOCK_SIZE_32), 0);\r\n      let pos = 0;\r\n      for (let i = 0; i < N_1; i++) {\r\n        block_mix(V32, pos, V32, pos + BLOCK_SIZE_32, r);\r\n        pos += BLOCK_SIZE_32;\r\n      }\r\n      block_mix(V32, N_1 * BLOCK_SIZE_32, B32, PI, r);\r\n\r\n      for (let i = 0; i < N; i++) {\r\n        const j = B32[PI + BLOCK_SIZE_32 - 16] % N;\r\n        for (let k = 0; k < BLOCK_SIZE_32; k++) {\r\n          tmp[k] = B32[PI + k] ^ V32[j * BLOCK_SIZE_32 + k];\r\n        }\r\n        block_mix(tmp, 0, B32, PI, r);\r\n      }\r\n    }\r\n\r\n    return kdf(k_byte, ikm, B);\r\n  };\r\n}\r\n","import { KitError, mod, modInverse, modPow, modPrimeSquareRoot } from './utils';\r\n\r\n// * Interfaces\r\n\r\n/**\r\n * 伽罗瓦域运算接口\r\n *\r\n * Galois Field Operations Interface\r\n */\r\nexport interface GFUtils {\r\n  include: (a: bigint) => boolean;\r\n  add: (...args: bigint[]) => bigint;\r\n  sub: (a: bigint, ...args: bigint[]) => bigint;\r\n  mul: (...args: bigint[]) => bigint;\r\n  div: (a: bigint, b: bigint) => bigint;\r\n  mod: (a: bigint) => bigint;\r\n  inv: (a: bigint) => bigint;\r\n  pow: (a: bigint, b: bigint) => bigint;\r\n  squ: (a: bigint) => bigint;\r\n  root: (a: bigint) => bigint;\r\n}\r\n\r\n// * Galois Field\r\n\r\n/**\r\n * 素域\r\n *\r\n * Prime Field\r\n *\r\n * @param {bigint} p - 素数 / prime number\r\n */\r\nexport function GF(p: bigint): GFUtils {\r\n  const _mod = (a: bigint) => mod(a, p);\r\n\r\n  // 乘法逆元\r\n  const inv = (a: bigint) => modInverse(a, p);\r\n\r\n  // 指数运算\r\n  const pow = (a: bigint, b: bigint) => modPow(a, b, p);\r\n\r\n  // 模素平方根\r\n  const root = (a: bigint) => modPrimeSquareRoot(a, p);\r\n\r\n  // 素域加法\r\n  const add = (...args: bigint[]) => args.reduce((acc, cur) => _mod(acc + cur));\r\n\r\n  // 素域减法\r\n  const sub = (a: bigint, ...args: bigint[]) => {\r\n    const b: bigint[] = args.map((v) => _mod(p - v));\r\n    return add(a, ...b);\r\n  };\r\n\r\n  // 素域乘法\r\n  const mul = (...args: bigint[]) => args.reduce((acc, cur) => _mod(acc * cur));\r\n\r\n  // 素域除法\r\n  const div = (a: bigint, b: bigint) => mul(a, inv(b));\r\n\r\n  // 素域平方\r\n  const squ = (a: bigint) => _mod(a * a);\r\n\r\n  // 辅助：是否在域内\r\n  const include = (a: bigint) => a >= 0n && a < p;\r\n\r\n  return {\r\n    add,\r\n    sub,\r\n    mul,\r\n    div,\r\n    mod: _mod,\r\n    inv,\r\n    pow,\r\n    squ,\r\n    root,\r\n    include,\r\n  };\r\n}\r\n\r\n/**\r\n * 二元扩域\r\n *\r\n * Binary Field\r\n *\r\n * @param {number} m - 次数 / degree\r\n * @param {bigint} IP - 不可约多项式 / irreducible polynomial\r\n */\r\nexport function GF2(m: bigint, IP: bigint): GFUtils {\r\n  /** m - 1 */\r\n  const m_1 = Number(m - 1n);\r\n  /** 2^m */\r\n  const m_h = 1n << m;\r\n  /** 2^n - 1 */\r\n  const mask = m_h - 1n;\r\n\r\n  // 要求 IP 最高项为 x^m\r\n  if ((IP & m_h) === 0n) throw new KitError('Irreducible polynomial must have degree m (set bit at x^m)');\r\n\r\n  // 多项式加法与减法: a + b mod 2 = a ^ b\r\n  const add = (...args: bigint[]) => args.reduce((acc, cur) => acc ^ cur) & mask;\r\n  const sub = add;\r\n\r\n  // 约化: 按 IP 做多项式模约化\r\n  function reduce(poly: bigint): bigint {\r\n    let result = poly;\r\n    const irreducible_degree = Number(m);\r\n\r\n    // 计算多项式的最高位\r\n    let poly_degree = result.toString(2).length - 1;\r\n\r\n    // 当多项式度数 >= m 时进行约简\r\n    while (poly_degree >= irreducible_degree) {\r\n      const shift = poly_degree - irreducible_degree;\r\n      // 将不可约多项式左移 shift 位后异或到结果中\r\n      result ^= IP << BigInt(shift);\r\n\r\n      // 更新多项式度数（优化：直接跳过连续的0）\r\n      poly_degree = result.toString(2).length - 1;\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  // 乘法\r\n  const _mul = (a: bigint, b: bigint): bigint => {\r\n    if (a === 0n || b === 0n) return 0n;\r\n\r\n    let result = 0n;\r\n    let a_val = a & mask;\r\n    let b_val = b & mask;\r\n    const ipMask = IP & mask;\r\n\r\n    // 使用更高效的位运算优化\r\n    while (b_val) {\r\n      // 使用位运算优化：检查最低位\r\n      result ^= b_val & 1n ? a_val : 0n;\r\n      b_val >>= 1n;\r\n\r\n      // 优化进位处理\r\n      if (a_val & (1n << (m - 1n))) {\r\n        a_val = (a_val << 1n) & mask;\r\n        a_val ^= ipMask;\r\n      } else {\r\n        a_val = (a_val << 1n) & mask;\r\n      }\r\n    }\r\n\r\n    return result;\r\n  };\r\n  const mul = (...args: bigint[]) => args.reduce((acc, cur) => _mul(acc, cur));\r\n\r\n  // 专用平方\r\n  const squ = (a: bigint): bigint => {\r\n    if (a === 0n) return 0n;\r\n    if (a === 1n) return 1n;\r\n\r\n    let r = 0n;\r\n    for (let x = a & mask, i = 0n; x > 0n; x >>= 1n, i++) {\r\n      if (x & 1n) r |= 1n << (2n * i);\r\n    }\r\n\r\n    return reduce(r);\r\n  };\r\n\r\n  // Itoh–Tsujii 逆元: a^(2^m-2) = ∏_{i=1}^{m-1} a^{2^i}\r\n  const inv = (a: bigint): bigint => {\r\n    a &= mask;\r\n    if (a === 0n) throw new KitError('Division by zero');\r\n    let acc = 1n;\r\n    let t = a;\r\n    for (let i = 1; i <= m_1; i++) {\r\n      // t = a^{2^i}\r\n      t = _mul(t, t);\r\n      acc = _mul(acc, t);\r\n    }\r\n\r\n    // acc = a^{2^m-2}\r\n    return acc & mask;\r\n  };\r\n\r\n  // 除法\r\n  const div = (a: bigint, b: bigint): bigint => {\r\n    a &= mask;\r\n    b &= mask;\r\n    if (b === 0n) throw new KitError('Division by zero');\r\n    return mul(a, inv(b));\r\n  };\r\n\r\n  // 幂运算: 针对 2 的幂优化，否则通用平方-乘\r\n  const pow = (a: bigint, b: bigint): bigint => {\r\n    if (b === 0n) return 1n;\r\n    if (a === 0n) return 0n;\r\n    if (b < 0n) return inv(pow(a, -b));\r\n\r\n    // 如果 b 是 2 的幂，只需重复平方\r\n    if ((b & (b - 1n)) === 0n) {\r\n      let r = a & mask;\r\n      let e = b;\r\n      while (e > 1n) {\r\n        r = mul(r, r);\r\n        e >>= 1n;\r\n      }\r\n      return r;\r\n    }\r\n\r\n    // 通用：平方-乘\r\n    let result = 1n;\r\n    let base = a & mask;\r\n    let exp = b;\r\n    while (exp > 0n) {\r\n      if (exp & 1n) result = _mul(result, base);\r\n      base = _mul(base, base);\r\n      exp >>= 1n;\r\n    }\r\n    return result & mask;\r\n  };\r\n\r\n  // 平方根：重复平方 m-1 次 (a -> a^{2^(m-1)})\r\n  const root = (a: bigint): bigint => pow(a, 1n << BigInt(m_1));\r\n\r\n  // 辅助：是否在域内\r\n  const include = (a: bigint): boolean => a >= 0n && a <= mask;\r\n\r\n  const mod = (a: bigint) => reduce(a & (mask | m_h));\r\n\r\n  return {\r\n    add,\r\n    sub,\r\n    mul,\r\n    div,\r\n    mod,\r\n    inv,\r\n    pow,\r\n    squ,\r\n    root,\r\n    include,\r\n  };\r\n}\r\n","import type { GFUtils } from './galois_field';\r\nimport { KitError } from './utils';\r\n\r\n// * Interfaces\r\n\r\nexport type ECPoint = AffinePoint | JacobianPoint | LDPoint;\r\n\r\n/**\r\n * 仿射坐标系的点\r\n *\r\n * Affine Coordinate Point\r\n */\r\nexport interface AffinePoint {\r\n  type: 'affine';\r\n  isInfinity: boolean;\r\n  x: bigint;\r\n  y: bigint;\r\n}\r\n\r\n/**\r\n * 雅可比坐标系的点\r\n *\r\n * Jacobian Coordinate Point\r\n */\r\nexport interface JacobianPoint {\r\n  type: 'jacobian';\r\n  isInfinity: boolean;\r\n  x: bigint;\r\n  y: bigint;\r\n  z: bigint;\r\n}\r\n\r\n/**\r\n * 洛佩兹-达哈布坐标系的点\r\n *\r\n * López-Dahab Coordinate Point\r\n */\r\nexport interface LDPoint {\r\n  type: 'ld';\r\n  isInfinity: boolean;\r\n  x: bigint;\r\n  y: bigint;\r\n  z: bigint;\r\n}\r\n\r\n/**\r\n * 坐标系转换接口\r\n *\r\n * Coordinate System Conversion Interface\r\n */\r\nexport interface CSUtils {\r\n  /**\r\n   * 雅可比坐标系 -> 仿射坐标系\r\n   *\r\n   * Jacobian Coordinate System to Affine Coordinate System\r\n   */\r\n  toAffine: {\r\n    (P: ECPoint): AffinePoint;\r\n    (P: undefined): AffinePoint;\r\n  };\r\n  /**\r\n   * 仿射坐标系 -> 雅可比坐标系 (bigint)\r\n   *\r\n   * Affine Coordinate System to Jacobian Coordinate System (bigint)\r\n   */\r\n  toJacobian: {\r\n    (P: JacobianPoint): JacobianPoint;\r\n    (P: AffinePoint, Z?: bigint): JacobianPoint;\r\n    (P: undefined): JacobianPoint;\r\n  };\r\n  /**\r\n   * 洛佩兹-达哈布坐标系 -> 仿射坐标系\r\n   *\r\n   * López-Dahab Coordinate System to Affine Coordinate System\r\n   */\r\n  toLD: {\r\n    (P: LDPoint): LDPoint;\r\n    (P: AffinePoint, Z?: bigint): LDPoint;\r\n    (P: undefined): LDPoint;\r\n  };\r\n}\r\n\r\n// * Coordinate Systems\r\n\r\nexport function CoordinateSystem(field: GFUtils): CSUtils {\r\n  const { mul, inv, mod, squ } = field;\r\n\r\n  const toAffine: CSUtils['toAffine'] = (P?: ECPoint): AffinePoint => {\r\n    if (!P || P.isInfinity) return { type: 'affine', isInfinity: true, x: 0n, y: 0n };\r\n\r\n    if (P.type === 'affine') return P;\r\n\r\n    if (P.z === 0n) return { type: 'affine', isInfinity: true, x: 0n, y: 0n };\r\n    if (P.z === 1n) return { type: 'affine', isInfinity: false, x: mod(P.x), y: mod(P.y) };\r\n\r\n    if (P.type !== 'jacobian' && P.type !== 'ld') throw new KitError('Invalid point type');\r\n\r\n    let x = 0n;\r\n    let y = 0n;\r\n    const z_inv = inv(P.z);\r\n    const z_inv2 = squ(z_inv);\r\n    if (P.type === 'jacobian') {\r\n      const z_inv3 = mul(z_inv2, z_inv);\r\n      x = mul(P.x, z_inv2);\r\n      y = mul(P.y, z_inv3);\r\n    } else if (P.type === 'ld') {\r\n      x = mul(P.x, z_inv);\r\n      y = mul(P.y, z_inv2); // y = Y / Z^2\r\n    }\r\n\r\n    return { type: 'affine', isInfinity: false, x, y };\r\n  };\r\n\r\n  function toJacobian(P?: JacobianPoint | AffinePoint, Z = 1n): JacobianPoint {\r\n    if (!P || P.isInfinity || Z === 0n) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n    if (P.type === 'jacobian') return P;\r\n\r\n    let { x, y } = P;\r\n    if (Z === 1n) return { type: 'jacobian', isInfinity: false, x, y, z: Z };\r\n\r\n    const ZZ = squ(Z);\r\n    const ZZZ = mul(ZZ, Z);\r\n    x = mul(x, ZZ);\r\n    y = mul(y, ZZZ);\r\n\r\n    return { type: 'jacobian', isInfinity: false, x, y, z: Z };\r\n  }\r\n\r\n  function toLD(P?: LDPoint | AffinePoint, Z = 1n): LDPoint {\r\n    if (!P || P.isInfinity) return { type: 'ld', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n    if (P.type === 'ld') return P;\r\n\r\n    let { x, y } = P;\r\n    if (Z === 1n) return { type: 'ld', isInfinity: false, x, y, z: Z };\r\n\r\n    const ZZ = squ(Z);\r\n    x = mul(x, Z);\r\n    y = mul(y, ZZ);\r\n\r\n    return { type: 'ld', isInfinity: false, x, y, z: Z };\r\n  }\r\n\r\n  return {\r\n    toAffine,\r\n    toJacobian,\r\n    toLD,\r\n  };\r\n}\r\n","import type { AffinePoint, CSUtils, JacobianPoint, LDPoint } from './coordinate_system';\r\nimport { CoordinateSystem } from './coordinate_system';\r\nimport type { GFUtils } from './galois_field';\r\nimport { GF, GF2 } from './galois_field';\r\nimport { getBIBits, joinBuffer, KitError, U8, u8 } from './utils';\r\n\r\n/**\r\n * TODO: 修改曲线参数的接口\r\n *\r\n * 使用这个数据库的格式: https://neuromancer.sk/std/\r\n *\r\n * 1. 更加通用的接口\r\n * 2. 根据三项式基或五项式基优化二元扩域的运算和接口\r\n */\r\n\r\n// * Elliptic Curve Interfaces\r\n\r\ninterface PointAddition<P> {\r\n  /**\r\n   * 椭圆曲线点加法\r\n   *\r\n   * Elliptic Curve Point Addition\r\n   */\r\n  (A: P, B: P): P;\r\n}\r\ninterface PointMultiplication<P> {\r\n  /**\r\n   * 椭圆曲线点乘法\r\n   *\r\n   * Elliptic Curve Point Multiplication\r\n   */\r\n  (P: P, k: bigint | Uint8Array): P;\r\n}\r\n\r\ninterface ECBase {\r\n  /**\r\n   * 域运算\r\n   *\r\n   * Field Operations\r\n   */\r\n  field: GFUtils;\r\n  /**\r\n   * 坐标系工具\r\n   *\r\n   * Coordinate System Tools\r\n   */\r\n  cs: CSUtils;\r\n  /**\r\n   * 椭圆曲线点加法 (仿射坐标系)\r\n   *\r\n   * Elliptic Curve Point Addition (Affine Coordinate System)\r\n   */\r\n  _addPoint: (A: AffinePoint, B: AffinePoint) => AffinePoint;\r\n  /**\r\n   * 椭圆曲线点乘法 (仿射坐标系)\r\n   *\r\n   * Elliptic Curve Point Multiplication (Affine Coordinate System)\r\n   */\r\n  _mulPoint: (P: AffinePoint, k: bigint | Uint8Array) => AffinePoint;\r\n  /**\r\n   * 仿射点转换为字节串\r\n   *\r\n   * Convert Affine Point to Byte String\r\n   *\r\n   * @param {boolean} [compress=false] - 是否压缩 / Whether to compress\r\n   */\r\n  PointToU8: (point: AffinePoint, compress?: boolean) => U8;\r\n  /**\r\n   * 字节串转换为仿射点\r\n   *\r\n   * Convert Byte String to Point\r\n   */\r\n  U8ToPoint: (buffer: Uint8Array) => AffinePoint;\r\n  /**\r\n   * 判断公钥是否合法\r\n   *\r\n   * Determine if the public key is legal\r\n   */\r\n  isLegalPK: (Q: AffinePoint) => boolean;\r\n  /**\r\n   * 判断私钥是否合法\r\n   *\r\n   * Determine if the private key is legal\r\n   */\r\n  isLegalSK: (d: bigint | Uint8Array) => boolean;\r\n}\r\nexport interface ECJacobian extends ECBase {\r\n  catalyst: 'jacobian';\r\n  addPoint: PointAddition<JacobianPoint>;\r\n  mulPoint: PointMultiplication<JacobianPoint>;\r\n}\r\nexport interface ECLópezDahab extends ECBase {\r\n  catalyst: 'ld';\r\n  addPoint: PointAddition<LDPoint>;\r\n  mulPoint: PointMultiplication<LDPoint>;\r\n}\r\n\r\n// * Elliptic Curve Parameters Interfaces\r\n\r\n/**\r\n * 椭圆曲线参数\r\n *\r\n * Elliptic Curve Parameters\r\n */\r\ninterface ECParams {\r\n  /** Coefficient a */\r\n  readonly a: bigint;\r\n  /** Coefficient b */\r\n  readonly b: bigint;\r\n  /** Base point */\r\n  readonly G: Readonly<AffinePoint>;\r\n  /** Order */\r\n  readonly n: bigint;\r\n  /** co-factor */\r\n  readonly h: bigint;\r\n}\r\n\r\n/**\r\n * 素域椭圆曲线参数\r\n *\r\n * Prime Field Elliptic Curve Parameters\r\n */\r\ninterface FpECParams extends ECParams {\r\n  /** Prime */\r\n  readonly p: bigint;\r\n}\r\n\r\n/**\r\n * 素域 Weierstrass 椭圆曲线参数\r\n *\r\n * Prime Field Weierstrass Elliptic Curve Parameters\r\n *\r\n * y^2 = x^3 + ax + b\r\n */\r\nexport interface FpWECParams extends FpECParams {\r\n  type: 'Weierstrass';\r\n}\r\n\r\n/**\r\n * 素域 Montgomery 椭圆曲线参数\r\n *\r\n * Prime Field Montgomery Elliptic Curve Parameters\r\n *\r\n * b * y^2 = x^3 + a * x^2 + x\r\n */\r\nexport interface FpMECParams extends FpECParams {\r\n  type: 'Montgomery';\r\n}\r\n\r\n/**\r\n * 素域 Twisted Edwards 椭圆曲线参数\r\n *\r\n * Prime Field Twisted Edwards Elliptic Curve Parameters\r\n *\r\n * ax^2 + y^2 = 1 + dx^2y^2\r\n */\r\nexport interface FpTECParams extends FpECParams {\r\n  type: 'TwistedEdwards';\r\n}\r\n\r\n/**\r\n * 二元扩域椭圆曲线参数\r\n *\r\n * Binary Field Elliptic Curve Parameters\r\n */\r\ninterface FbECParams extends ECParams {\r\n  /** Degree of the reduction polynomial */\r\n  readonly m: bigint;\r\n  /** Irreducible polynomial */\r\n  readonly IP: bigint;\r\n}\r\n\r\n/**\r\n * 二元扩域 伪随机 椭圆曲线参数\r\n *\r\n * Binary Field Pseudo-Random Elliptic Curve Parameters\r\n *\r\n * y^2 + xy = x^3 + ax^2 + b\r\n */\r\nexport interface FbPECParams extends FbECParams {\r\n  type: 'Pseudo-Random';\r\n}\r\n\r\n/**\r\n * 二元扩域 Koblitz 椭圆曲线参数\r\n *\r\n * Binary Field Koblitz Elliptic Curve Parameters\r\n *\r\n * y^2 + xy = x^3 + ax^2 + b\r\n */\r\nexport interface FbKECParams extends FbECParams {\r\n  type: 'Koblitz';\r\n}\r\n\r\n// * Functions\r\n\r\nfunction LadderMultiply(add: PointAddition<AffinePoint>, P: AffinePoint, k: bigint | Uint8Array): AffinePoint;\r\nfunction LadderMultiply(add: PointAddition<JacobianPoint>, P: JacobianPoint, k: bigint | Uint8Array): JacobianPoint;\r\nfunction LadderMultiply(add: PointAddition<LDPoint>, P: LDPoint, k: bigint | Uint8Array): LDPoint;\r\nfunction LadderMultiply(add: PointAddition<any>, P: JacobianPoint | LDPoint | AffinePoint, k: bigint | Uint8Array) {\r\n  k = typeof k === 'bigint' ? k : u8(k).toBI();\r\n\r\n  let R0: any;\r\n  let R1: any;\r\n  switch (P.type) {\r\n    case 'affine':\r\n      R0 = { type: 'affine', isInfinity: true, x: 0n, y: 0n };\r\n      R1 = { type: 'affine', isInfinity: P.isInfinity, x: P.x, y: P.y };\r\n      break;\r\n    case 'jacobian':\r\n      R0 = { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n      R1 = { type: 'jacobian', isInfinity: P.isInfinity, x: P.x, y: P.y, z: P.z };\r\n      break;\r\n    case 'ld':\r\n      R0 = { type: 'ld', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n      R1 = { type: 'ld', isInfinity: P.isInfinity, x: P.x, y: P.y, z: P.z };\r\n      break;\r\n    default:\r\n      throw new KitError('unknown coordinate system');\r\n  }\r\n\r\n  // MSb -> LSb\r\n  const bit_array = k.toString(2);\r\n  for (const bit of bit_array) {\r\n    if (bit === '1') {\r\n      R0 = add(R0, R1);\r\n      R1 = add(R1, R1);\r\n    } else {\r\n      R1 = add(R0, R1);\r\n      R0 = add(R0, R0);\r\n    }\r\n  }\r\n  return R0;\r\n}\r\n\r\n// * FpEC Components\r\n\r\n/**\r\n * 素域 Weierstrass 椭圆曲线运算\r\n *\r\n * Prime Field Weierstrass Elliptic Curve Operations\r\n *\r\n * y^2 = x^3 + ax + b\r\n */\r\nexport function FpWEC(curve: FpWECParams): ECJacobian {\r\n  const { p, n, a, b, G } = curve;\r\n  const p_bit = getBIBits(p);\r\n  const p_byte = (p_bit + 7) >> 3;\r\n  const field = GF(p);\r\n  const cs = CoordinateSystem(field);\r\n\r\n  const { add, sub, mul, div, root, include } = field;\r\n  const { toAffine, toJacobian } = cs;\r\n\r\n  const _addPoint = (A: AffinePoint, B: AffinePoint): AffinePoint => {\r\n    // O + P = P\r\n    if (A.isInfinity) return B;\r\n    if (B.isInfinity) return A;\r\n\r\n    const { x: X1, y: Y1 } = A;\r\n    const { x: X2, y: Y2 } = B;\r\n\r\n    const U = sub(X1, X2) === 0n;\r\n\r\n    // P + (-P) = O\r\n    if (U && add(Y1, Y2) === 0n) return toAffine(undefined);\r\n    if (U && Y1 === 0n) return toAffine(undefined);\r\n\r\n    let λ = 0n;\r\n    // P1 + P1\r\n    if (U) {\r\n      // λ = (3 * x1 * x1 + a) / 2 * y1\r\n      const numerator = add(mul(3n, X1, X1), a);\r\n      const denominator = mul(2n, Y1);\r\n      λ = div(numerator, denominator);\r\n    }\r\n    // P1 + P2\r\n    else {\r\n      // λ = (y2 - y1) / (x2 - x1)\r\n      const numerator = sub(Y2, Y1);\r\n      const denominator = sub(X2, X1);\r\n      λ = div(numerator, denominator);\r\n    }\r\n\r\n    // x3 = λ * λ - x1 - x2\r\n    const x3 = sub(mul(λ, λ), X1, X2);\r\n    // y3 = λ * (x1 - x3) - y1\r\n    const y3 = sub(mul(λ, sub(X1, x3)), Y1);\r\n\r\n    return { type: 'affine', isInfinity: false, x: x3, y: y3 };\r\n  };\r\n\r\n  const addPoint = (A: JacobianPoint, B: JacobianPoint): JacobianPoint => {\r\n    // O + P = P\r\n    if (A.isInfinity) return B;\r\n    if (B.isInfinity) return A;\r\n\r\n    const [X1, Y1, Z1] = [A.x, A.y, A.z];\r\n    const [X2, Y2, Z2] = [B.x, B.y, B.z];\r\n\r\n    // 计算中间变量\r\n    const ZZ1 = mul(Z1, Z1);\r\n    const ZZ2 = mul(Z2, Z2);\r\n\r\n    const U1 = mul(X1, ZZ2);\r\n    const U2 = mul(X2, ZZ1);\r\n    const S1 = mul(Y1, ZZ2, Z2);\r\n    const S2 = mul(Y2, ZZ1, Z1);\r\n\r\n    // P + (-P) = O\r\n    if (U1 === U2 && S1 !== S2) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n    // P1 + P1\r\n    if (U1 === U2 && S1 === S2) {\r\n      const [X, Y, Z] = [X1, Y1, Z1];\r\n\r\n      // Z3 = 2 * Y1 * Z1\r\n      const Z3 = mul(2n, Y, Z);\r\n      if (Z3 === 0n) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n      const XX = mul(X, X);\r\n      const YY = mul(Y, Y);\r\n      const ZZ = ZZ1;\r\n      const S = mul(4n, X, YY);\r\n      // M = 3 * XX + a * ZZ^2\r\n      const M = add(mul(3n, XX), mul(a, ZZ, ZZ));\r\n\r\n      // X3 = M^2 - 2 * S\r\n      const X3 = sub(mul(M, M), mul(2n, S));\r\n      // Y3 = M * (S - X3) - 8 * YYYY\r\n      const Y3 = sub(mul(M, sub(S, X3)), mul(8n, YY, YY));\r\n\r\n      return { type: 'jacobian', isInfinity: false, x: X3, y: Y3, z: Z3 };\r\n    }\r\n    // P1 + P2\r\n    else {\r\n      const H = sub(U2, U1);\r\n\r\n      // Z3 = H * Z1 * Z2\r\n      const Z3 = mul(H, Z1, Z2);\r\n      if (Z3 === 0n) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n      const R = sub(S2, S1);\r\n      const HH = mul(H, H);\r\n      const HHH = mul(H, HH);\r\n      const U1HH = mul(U1, HH);\r\n\r\n      // X3 = R^2 - H^3 - 2 * U1 * H^2\r\n      const X3 = sub(mul(R, R), HHH, mul(2n, U1HH));\r\n      // Y3 = R * (U1 * H^2 - X3) - S1 * H^3\r\n      const Y3 = sub(mul(R, sub(U1HH, X3)), mul(S1, HHH));\r\n\r\n      return { type: 'jacobian', isInfinity: false, x: X3, y: Y3, z: Z3 };\r\n    }\r\n  };\r\n\r\n  const _mulPoint = (P: AffinePoint, k: bigint | Uint8Array): AffinePoint => LadderMultiply(_addPoint, P, k);\r\n\r\n  const mulPoint = (P: JacobianPoint, k: bigint | Uint8Array): JacobianPoint => LadderMultiply(addPoint, P, k);\r\n\r\n  const isLegalPK = (P: AffinePoint) => {\r\n    // P != O\r\n    if (P.isInfinity) return false;\r\n\r\n    // P(x, y) ∈ E\r\n    const { x, y } = toAffine(P);\r\n    if (!include(x) || !include(y)) return false;\r\n\r\n    // y^2 = x^3 + ax + b\r\n    const l = mul(y, y);\r\n    const r = add(mul(x, x, x), mul(a, x), b);\r\n    if (l !== r) return false;\r\n\r\n    // nP = O\r\n    const nP = mulPoint(toJacobian(P), n);\r\n    return nP.isInfinity;\r\n  };\r\n\r\n  const isLegalSK = (k: bigint | Uint8Array) => {\r\n    k = typeof k === 'bigint' ? k : u8(k).toBI();\r\n    if (k <= 0n || k >= n) return false;\r\n\r\n    return !mulPoint(toJacobian(G), k).isInfinity;\r\n  };\r\n\r\n  const PointToU8 = (point: AffinePoint, compress = false): U8 => {\r\n    if (point.isInfinity) return new U8([0x00]);\r\n\r\n    const { x, y } = point;\r\n    const sign_y = Number(y & 1n);\r\n    const PC = new U8([compress ? 0x02 | sign_y : 0x04]);\r\n    const X1 = U8.fromBI(x, p_byte);\r\n    const Y1 = compress ? new U8() : U8.fromBI(y, p_byte);\r\n\r\n    return joinBuffer(PC, X1, Y1);\r\n  };\r\n\r\n  const U8ToPoint = (buffer: Uint8Array): AffinePoint => {\r\n    const point_buffer = U8.from(buffer);\r\n    const PC = point_buffer[0];\r\n    if (PC !== 0x00 && PC !== 0x02 && PC !== 0x03 && PC !== 0x04) throw new KitError('Invalid Point');\r\n\r\n    // 无穷远点\r\n    if (PC === 0x00 && point_buffer.length === 1) return toAffine(undefined);\r\n\r\n    // 无压缩\r\n    if (PC === 0x04 && point_buffer.length === (p_byte << 1) + 1) {\r\n      const x = point_buffer.slice(1, p_byte + 1).toBI();\r\n      const y = point_buffer.slice(p_byte + 1).toBI();\r\n\r\n      return { type: 'affine', isInfinity: false, x, y };\r\n    }\r\n    // 解压缩\r\n    if ((PC === 0x02 || PC === 0x03) && point_buffer.length === p_byte + 1) {\r\n      const x_buffer = point_buffer.slice(1);\r\n      const x = x_buffer.toBI();\r\n      const sign_y = BigInt(PC & 1);\r\n\r\n      let y: bigint;\r\n      y = add(mul(x, x, x), mul(a, x), b);\r\n      y = root(y);\r\n      y = (y & 1n) === sign_y ? y : sub(p, y);\r\n\r\n      return { type: 'affine', isInfinity: false, x, y };\r\n    }\r\n\r\n    throw new KitError('Invalid Point');\r\n  };\r\n\r\n  return {\r\n    field,\r\n    cs,\r\n    catalyst: 'jacobian',\r\n    addPoint,\r\n    mulPoint,\r\n    _addPoint,\r\n    _mulPoint,\r\n    isLegalPK,\r\n    isLegalSK,\r\n    PointToU8,\r\n    U8ToPoint,\r\n  };\r\n}\r\n\r\n/**\r\n * 素域 Montgomery 椭圆曲线运算\r\n *\r\n * Prime Field Montgomery Elliptic Curve Operations\r\n *\r\n * b * y^2 = x^3 + a * x^2 + x\r\n */\r\nexport function FpMEC(curve: FpMECParams): ECJacobian {\r\n  const { p, n, a, b, G } = curve;\r\n  const p_bit = getBIBits(p);\r\n  const p_byte = (p_bit + 7) >> 3;\r\n  const field = GF(p);\r\n  const cs = CoordinateSystem(field);\r\n\r\n  const { add, sub, mul, div, root, include } = field;\r\n  const { toAffine, toJacobian } = cs;\r\n\r\n  const _addPoint = (A: AffinePoint, B: AffinePoint): AffinePoint => {\r\n    // O + P = P\r\n    if (A.isInfinity) return B;\r\n    if (B.isInfinity) return A;\r\n\r\n    const { x: X1, y: Y1 } = A;\r\n    const { x: X2, y: Y2 } = B;\r\n\r\n    const U = sub(X1, X2) === 0n;\r\n\r\n    // P + (-P) = O\r\n    if (U && add(Y1, Y2) === 0n) return toAffine(undefined);\r\n    if (U && Y1 === 0n) return toAffine(undefined);\r\n\r\n    let λ = 0n;\r\n    // P1 + P1\r\n    if (U) {\r\n      // λ = (3 * x1 * x1 + 2 * a * x1 + 1) / 2 * b * y1\r\n      const numerator = add(mul(3n, X1, X1), mul(2n, a, X1), 1n);\r\n      const denominator = mul(2n, b, Y1);\r\n      λ = div(numerator, denominator);\r\n    }\r\n    // P1 + P2\r\n    else {\r\n      // λ = (y2 - y1) / (x2 - x1)\r\n      const numerator = sub(Y2, Y1);\r\n      const denominator = sub(X2, X1);\r\n      λ = div(numerator, denominator);\r\n    }\r\n\r\n    // x3 = b * λ * λ - a - x1 - x2\r\n    const X3 = sub(mul(λ, λ, b), a, X1, X2);\r\n    // y3 = (2 x1 + x2 + a) * λ - b * λ * λ * λ - y1\r\n    const Y3 = sub(mul(2n * X1 + X2 + a, λ), mul(λ, λ, λ, b), Y1);\r\n\r\n    return { type: 'affine', isInfinity: false, x: X3, y: Y3 };\r\n  };\r\n\r\n  const addPoint = (A: JacobianPoint, B: JacobianPoint): JacobianPoint => {\r\n    // O + P = P\r\n    if (A.isInfinity) return B;\r\n    if (B.isInfinity) return A;\r\n\r\n    const [X1, Y1, Z1] = [A.x, A.y, A.z];\r\n    const [X2, Y2, Z2] = [B.x, B.y, B.z];\r\n\r\n    // 计算中间变量\r\n    const ZZ1 = mul(Z1, Z1); // Z1^2\r\n    const ZZ2 = mul(Z2, Z2); // Z2^2\r\n    const U1 = mul(X1, ZZ2);\r\n    const U2 = mul(X2, ZZ1);\r\n    const S1 = mul(Y1, ZZ2, Z2);\r\n    const S2 = mul(Y2, ZZ1, Z1);\r\n    const H = sub(U2, U1); // H = U2 - U1\r\n    const R = sub(S2, S1); // R = S2 - S1\r\n\r\n    // P + (-P) = O\r\n    if (H === 0n && R !== 0n) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n    // P1 + P1\r\n    if (H === 0n && R === 0n) {\r\n      const [X, Y, Z] = [X1, Y1, Z1];\r\n\r\n      // Z3 = 2 * b * Y1 * Z1 = λ 的分母\r\n      const Z3 = mul(2n, b, Y, Z);\r\n      if (Z3 === 0n) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n      const XX = mul(X, X);\r\n      const YY = mul(Y, Y);\r\n      const ZZ = ZZ1;\r\n      const ZZZZ = mul(ZZ, ZZ);\r\n      // N = 3 * X1^2 + 2 * a * X1 * Z1^2 + Z1^4 (λ 的分子，已清除分母)\r\n      const N = add(mul(3n, XX), mul(2n, a, X, ZZ), ZZZZ);\r\n      const NN = mul(N, N);\r\n\r\n      // X3 = b * N^2 - a * Z3^2 - 8 * b^2 * X1 * Y1^2\r\n      const X3 = sub(mul(b, NN), mul(a, Z3, Z3), mul(8n, b, b, X, YY));\r\n      // Y3 = 4 * b^2 * (3 * X1 + a * Z1^2) * N * Y1^2 - b * N^3 - 8 * b^3 * Y1^4\r\n      const Y3 = sub(mul(4n, b, b, add(mul(3n, X), mul(a, ZZ)), N, YY), mul(b, NN, N), mul(8n, b, b, b, YY, YY));\r\n\r\n      return { type: 'jacobian', isInfinity: false, x: X3, y: Y3, z: Z3 };\r\n    }\r\n    // P1 + P2\r\n    else {\r\n      const Z3 = mul(H, Z1, Z2);\r\n      if (Z3 === 0n) return { type: 'jacobian', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n      const HH = mul(H, H); // HH = H^2\r\n\r\n      const X3 = sub(mul(b, R, R), mul(a, ZZ1, ZZ2, HH), mul(add(U1, U2), HH));\r\n      const Y3 = sub(mul(R, sub(mul(U1, HH), X3)), mul(S1, HH, H));\r\n\r\n      return { type: 'jacobian', isInfinity: false, x: X3, y: Y3, z: Z3 };\r\n    }\r\n  };\r\n\r\n  const _mulPoint = (P: AffinePoint, k: bigint | Uint8Array): AffinePoint => LadderMultiply(_addPoint, P, k);\r\n\r\n  const mulPoint = (P: JacobianPoint, k: bigint | Uint8Array): JacobianPoint => LadderMultiply(addPoint, P, k);\r\n\r\n  const isLegalPK = (P: AffinePoint) => {\r\n    // P != O\r\n    if (P.isInfinity) return false;\r\n\r\n    // P(x, y) ∈ E\r\n    const { x, y } = toAffine(P);\r\n    if (!include(x) || !include(y)) return false;\r\n\r\n    // b * y^2 = x^3 + a * x^2 + x\r\n    const l = mul(b, y, y);\r\n    const r = add(mul(x, x, x), mul(a, x, x), x);\r\n    if (l !== r) return false;\r\n\r\n    // nP = O\r\n    const nP = mulPoint(toJacobian(P), n);\r\n    return nP.isInfinity;\r\n  };\r\n\r\n  const isLegalSK = (k: bigint | Uint8Array) => {\r\n    k = typeof k === 'bigint' ? k : u8(k).toBI();\r\n    if (k <= 0n || k >= n) return false;\r\n\r\n    return !mulPoint(toJacobian(G), k).isInfinity;\r\n  };\r\n\r\n  const PointToU8 = (point: AffinePoint, compress = false): U8 => {\r\n    if (point.isInfinity) return new U8([0x00]);\r\n\r\n    const { x, y } = point;\r\n    const sign_y = Number(y & 1n);\r\n    const PC = new U8([compress ? 0x02 | sign_y : 0x04]);\r\n    const X1 = U8.fromBI(x, p_byte);\r\n    const Y1 = compress ? new U8() : U8.fromBI(y, p_byte);\r\n\r\n    return joinBuffer(PC, X1, Y1);\r\n  };\r\n\r\n  const U8ToPoint = (buffer: Uint8Array): AffinePoint => {\r\n    const point_buffer = U8.from(buffer);\r\n    const PC = point_buffer[0];\r\n    if (PC !== 0x00 && PC !== 0x02 && PC !== 0x03 && PC !== 0x04) throw new KitError('Invalid Point');\r\n\r\n    // 无穷远点\r\n    if (PC === 0x00 && point_buffer.length === 1) return toAffine(undefined);\r\n\r\n    // 无压缩\r\n    if (PC === 0x04 && point_buffer.length === (p_byte << 1) + 1) {\r\n      const x = point_buffer.slice(1, p_byte + 1).toBI();\r\n      const y = point_buffer.slice(p_byte + 1).toBI();\r\n\r\n      return { type: 'affine', isInfinity: false, x, y };\r\n    }\r\n    // 解压缩\r\n    if ((PC === 0x02 || PC === 0x03) && point_buffer.length === p_byte + 1) {\r\n      const x_buffer = point_buffer.slice(1);\r\n      const x = x_buffer.toBI();\r\n      const sign_y = BigInt(PC & 1);\r\n\r\n      let y: bigint;\r\n      y = add(mul(x, x, x), mul(a, x, x), x);\r\n      y = div(y, b);\r\n      y = root(y);\r\n      y = (y & 1n) === sign_y ? y : sub(p, y);\r\n\r\n      return { type: 'affine', isInfinity: false, x, y };\r\n    }\r\n\r\n    throw new KitError('Invalid Point');\r\n  };\r\n\r\n  return {\r\n    field,\r\n    cs,\r\n    catalyst: 'jacobian',\r\n    addPoint,\r\n    mulPoint,\r\n    _addPoint,\r\n    _mulPoint,\r\n    isLegalPK,\r\n    isLegalSK,\r\n    PointToU8,\r\n    U8ToPoint,\r\n  };\r\n}\r\n\r\n// * FbEC Components\r\n\r\n/**\r\n * 二元扩域椭圆曲线运算\r\n *\r\n * Binary Field Elliptic Curve Operations\r\n *\r\n * y^2 + xy = x^3 + ax^2 + b\r\n */\r\nexport function FbEC(curve: FbKECParams | FbPECParams): ECLópezDahab {\r\n  const { m, IP, a, b, n, G } = curve;\r\n  const field = GF2(m, IP);\r\n  const cs = CoordinateSystem(field);\r\n  const m_byte = (Number(m) + 7) >> 3;\r\n\r\n  const { add, sub, mul, div, inv, include } = field;\r\n  const { toAffine, toLD } = cs;\r\n\r\n  const _addPoint = (A: AffinePoint, B: AffinePoint): AffinePoint => {\r\n    // O + P = P\r\n    if (A.isInfinity) return B;\r\n    if (B.isInfinity) return A;\r\n\r\n    const { x: X1, y: Y1 } = A;\r\n    const { x: X2, y: Y2 } = B;\r\n\r\n    // P + (-P) = O\r\n    const T = sub(X1, X2) === 0n;\r\n    if (T && add(X1, Y2) === Y1) return toAffine(undefined);\r\n    if (T && X1 === 0n)\r\n      // 若 x1 为 0，则切线斜率不存在，结果为无穷远点\r\n      return toAffine(undefined);\r\n\r\n    let λ = 0n;\r\n    // P1 + P1\r\n    if (T) {\r\n      // λ = x1 + y1 / x1\r\n      λ = add(X1, div(Y1, X1));\r\n    }\r\n    // P1 + P2\r\n    else {\r\n      // λ = (y2 + y1) / (x2 + x1)\r\n      const numerator = add(Y2, Y1);\r\n      const denominator = add(X2, X1);\r\n      λ = div(numerator, denominator);\r\n    }\r\n\r\n    // x3 = λ * λ + λ + a + x1 + x2\r\n    const x3 = add(mul(λ, λ), λ, a, X1, X2);\r\n    // y3 = λ * (x1 + x3) + x3 + y1\r\n    const y3 = add(mul(λ, add(X1, x3)), x3, Y1);\r\n\r\n    return { type: 'affine', isInfinity: false, x: x3, y: y3 };\r\n  };\r\n\r\n  const addPoint = (P: LDPoint, Q: LDPoint): LDPoint => {\r\n    // O + P = P\r\n    if (P.isInfinity) return Q;\r\n    if (Q.isInfinity) return P;\r\n\r\n    const [X1, Y1, Z1] = [P.x, P.y, P.z];\r\n    const [X2, Y2, Z2] = [Q.x, Q.y, Q.z];\r\n\r\n    // 计算中间变量\r\n    const A = add(mul(X1, Z2), mul(X2, Z1));\r\n    const B = add(mul(Y1, Z2, Z2), mul(Y2, Z1, Z1));\r\n\r\n    // P + (-P) = O\r\n    if (A === 0n && B !== 0n) return { type: 'ld', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n    if (A === 0n && B === 0n && X1 === 0n) return { type: 'ld', isInfinity: true, x: 1n, y: 1n, z: 0n };\r\n\r\n    // P1 + P1\r\n    if (A === 0n && B === 0n) {\r\n      const [X, Y, Z] = [X1, Y1, Z1];\r\n      const A = mul(X, X);\r\n      const B = mul(Z, Z);\r\n      const Z3 = mul(A, B);\r\n      const C = mul(A, A);\r\n      const D = mul(b, B, B);\r\n      const X3 = add(C, D);\r\n      const Y3 = add(mul(D, Z3), mul(X3, add(mul(a, Z3), mul(Y, Y), D)));\r\n\r\n      return { type: 'ld', isInfinity: false, x: X3, y: Y3, z: Z3 };\r\n    }\r\n    // P1 + P2\r\n    else {\r\n      const C = mul(Z1, A);\r\n      const D = mul(Z2, C);\r\n      const Z3 = mul(D, D);\r\n      const X3 = add(mul(D, add(mul(A, A), B)), mul(B, B), mul(a, Z3));\r\n      const E = mul(C, D);\r\n      const F = mul(E, E, Y2);\r\n      const G = add(X3, mul(X2, E));\r\n      const Y3 = add(mul(Z3, X3), F, mul(B, D, G));\r\n\r\n      return { type: 'ld', isInfinity: false, x: X3, y: Y3, z: Z3 };\r\n    }\r\n  };\r\n\r\n  const _mulPoint = (P: AffinePoint, k: bigint | Uint8Array): AffinePoint => LadderMultiply(_addPoint, P, k);\r\n\r\n  const mulPoint = (P: LDPoint, k: bigint | Uint8Array): LDPoint => LadderMultiply(addPoint, P, k);\r\n\r\n  const isLegalPK = (P: AffinePoint) => {\r\n    // P != O\r\n    if (P.isInfinity) return false;\r\n\r\n    // P(x, y) ∈ E\r\n    const { x, y } = toAffine(P);\r\n    if (!include(x) || !include(y)) return false;\r\n\r\n    // y^2 + xy = x^3 + ax^2 + b\r\n    const l = add(mul(y, y), mul(x, y));\r\n    const r = add(mul(x, x, x), mul(a, x, x), b);\r\n    if (l !== r) return false;\r\n\r\n    return mulPoint(toLD(P), n).isInfinity;\r\n  };\r\n\r\n  const isLegalSK = (k: bigint | Uint8Array) => {\r\n    k = typeof k === 'bigint' ? k : u8(k).toBI();\r\n    if (k <= 0n || k >= n - 2n) return false;\r\n\r\n    return !mulPoint(toLD(G), k).isInfinity;\r\n  };\r\n\r\n  // 半迹函数\r\n  function half_trace(d: bigint): bigint {\r\n    const k = (m - 1n) >> 1n;\r\n    let s = d;\r\n    let H = s;\r\n    for (let i = 1; i <= k; i++) {\r\n      s = mul(s, s, s, s); // s^4\r\n      H = add(H, s);\r\n    }\r\n    return H;\r\n  }\r\n\r\n  const PointToU8 = (point: AffinePoint, compress = false): U8 => {\r\n    if (point.isInfinity) return new U8([0x00]);\r\n\r\n    const { x, y } = toAffine(point);\r\n    const sign_y = Number(div(y, x) & 1n);\r\n    const PC = new U8([compress ? 0x02 | sign_y : 0x04]);\r\n    const X1 = U8.fromBI(x, m_byte);\r\n    const Y1 = compress ? new U8() : U8.fromBI(y, m_byte);\r\n\r\n    return joinBuffer(PC, X1, Y1);\r\n  };\r\n\r\n  const U8ToPoint = (buffer: Uint8Array): AffinePoint => {\r\n    const point_buffer = U8.from(buffer);\r\n    const PC = point_buffer[0];\r\n    if (PC !== 0x00 && PC !== 0x02 && PC !== 0x03 && PC !== 0x04) throw new KitError('Invalid Point');\r\n\r\n    // 无穷远点\r\n    if (PC === 0x00 && point_buffer.length === 1) return toAffine(undefined);\r\n\r\n    // 无压缩\r\n    if (PC === 0x04 && point_buffer.length === (m_byte << 1) + 1) {\r\n      const x = point_buffer.slice(1, m_byte + 1).toBI();\r\n      const y = point_buffer.slice(m_byte + 1).toBI();\r\n\r\n      return { type: 'affine', isInfinity: false, x, y };\r\n    }\r\n    // 解压缩\r\n    if ((PC === 0x02 || PC === 0x03) && point_buffer.length === m_byte + 1) {\r\n      const x_buffer = point_buffer.slice(1);\r\n      const x = x_buffer.toBI();\r\n\r\n      if (x === 0n && PC === 0x02) throw new KitError('Invalid Point');\r\n      if (x === 0n && PC === 0x03) return { type: 'affine', isInfinity: false, x: 0n, y: 1n };\r\n\r\n      const inv_x = inv(x);\r\n      const inv_x2 = mul(inv_x, inv_x);\r\n      const d = add(x, 1n, inv_x2);\r\n\r\n      // 计算半迹得到 z0\r\n      const z0 = half_trace(d);\r\n\r\n      // 计算 y0 = x * z0\r\n      const y0 = mul(x, z0);\r\n\r\n      // 获取 z0 的 LSB（常数项）\r\n      const z0_LSB = z0 & 1n;\r\n\r\n      // 根据前缀选择 y\r\n      const y = PC === 0x02 ? (z0_LSB === 0n ? y0 : add(y0, x)) : z0_LSB === 1n ? y0 : add(y0, x);\r\n\r\n      return { type: 'affine', isInfinity: false, x, y };\r\n    }\r\n\r\n    throw new KitError('Invalid Point');\r\n  };\r\n\r\n  return {\r\n    field,\r\n    cs,\r\n    catalyst: 'ld',\r\n    addPoint,\r\n    mulPoint,\r\n    _addPoint,\r\n    _mulPoint,\r\n    isLegalPK,\r\n    isLegalSK,\r\n    PointToU8,\r\n    U8ToPoint,\r\n  };\r\n}\r\n\r\n// * EC\r\n\r\n/**\r\n * 椭圆曲线运算\r\n *\r\n * Elliptic Curve Operations\r\n */\r\nexport function EC(curve: FpWECParams | FpMECParams): ECJacobian;\r\nexport function EC(curve: FbPECParams | FbKECParams): ECLópezDahab;\r\nexport function EC(curve: FpWECParams | FpMECParams | FbPECParams | FbKECParams) {\r\n  switch (curve.type) {\r\n    case 'Weierstrass':\r\n      return FpWEC(curve);\r\n    case 'Montgomery':\r\n      return FpMEC(curve);\r\n    case 'Pseudo-Random':\r\n    case 'Koblitz':\r\n      return FbEC(curve);\r\n    default:\r\n      throw new KitError('unknown curve type');\r\n  }\r\n}\r\n","import { aes } from '../../cipher/blockCipher/aes';\r\nimport type { BlockCipher, BlockCipherInfo } from '../../core/cipher';\r\nimport { cbc, createCipher } from '../../core/cipher';\r\nimport type { AffinePoint, CSUtils } from '../../core/coordinate_system';\r\nimport type { ECJacobian, ECLópezDahab, FbKECParams, FbPECParams, FpMECParams, FpWECParams } from '../../core/ec';\r\nimport { EC } from '../../core/ec';\r\nimport type { Digest, KeyHash } from '../../core/hash';\r\nimport type { KDF } from '../../core/kdf';\r\nimport { x963kdf } from '../../core/kdf';\r\nimport { genBitMask, genRandomBI, getBIBits, joinBuffer, KitError, mod, modInverse, U8 } from '../../core/utils';\r\nimport { hmac } from '../../hash/hmac';\r\nimport { sha256 } from '../../hash/sha256';\r\n\r\n// * Interfaces\r\n\r\nexport interface ECPublicKey {\r\n  /** 椭圆曲线公钥 / Elliptic Curve Public Key */\r\n  readonly Q: Readonly<AffinePoint>;\r\n}\r\nexport interface ECPrivateKey {\r\n  /** 椭圆曲线私钥 / Elliptic Curve Private Key */\r\n  readonly d: bigint;\r\n}\r\nexport interface ECKeyPair extends ECPrivateKey, ECPublicKey {}\r\n\r\nexport interface ECDH {\r\n  /**\r\n   * @param {ECPrivateKey} s_key - 己方私钥 / Self Private Key\r\n   * @param {ECPublicKey} p_key - 对方公钥 / Counterparty Public Key\r\n   */\r\n  (s_key: ECPrivateKey, p_key: ECPublicKey): AffinePoint;\r\n}\r\n\r\nexport interface ECMQV {\r\n  /**\r\n   * @param {ECKeyPair} u1 - 己方密钥对 / Self Key Pair\r\n   * @param {ECKeyPair} u2 - 己方临时密钥对 / Self Temporary Key Pair\r\n   * @param {ECPublicKey} v1 - 对方公钥 / Counterparty Public Key\r\n   * @param {ECPublicKey} v2 - 对方临时公钥 / Counterparty Temporary Public Key\r\n   */\r\n  (u1: ECKeyPair, u2: ECKeyPair, v1: ECPublicKey, v2: ECPublicKey): AffinePoint;\r\n}\r\n\r\nexport interface ECDSASignature {\r\n  /** 临时公钥 / Temporary Public Key */\r\n  r: bigint;\r\n  /** 签名值 / Signature Value */\r\n  s: bigint;\r\n}\r\nexport interface ECDSA {\r\n  /**\r\n   * @param {Digest} [hash=sha256] - 摘要函数 / Digest Function\r\n   */\r\n  (\r\n    hash?: Digest,\r\n  ): {\r\n    /**\r\n     * @param {ECPrivateKey} s_key - 签名方私钥 / Signer's Private Key\r\n     * @param {Uint8Array} M - 消息 / Message\r\n     */\r\n    sign: (s_key: ECPrivateKey, M: Uint8Array) => ECDSASignature;\r\n    /**\r\n     * @param {ECPublicKey} p_key - 签名方公钥 / Signer's Public Key\r\n     * @param {Uint8Array} M - 消息 / Message\r\n     */\r\n    verify: (p_key: ECPublicKey, M: Uint8Array, signature: ECDSASignature) => boolean;\r\n  };\r\n}\r\n\r\nexport interface IVBlockCipher extends BlockCipherInfo {\r\n  (K: Uint8Array, iv: Uint8Array): ReturnType<BlockCipher>;\r\n}\r\nexport interface ECIESConfig {\r\n  /** 分组密码算法 / Block Cipher Algorithm (default: AES-256-GCM) */\r\n  cipher?: IVBlockCipher;\r\n  /** 密钥哈希函数 / Key Hash Function (default: HMAC-SHA-256) */\r\n  mac?: KeyHash;\r\n  /** 密钥派生函数 / Key Derivation Function (default: ANSI-X9.63-KDF with SHA-256) */\r\n  kdf?: KDF;\r\n  /** 附加数据1 / Additional Data 1 (default: empty) */\r\n  S1?: Uint8Array;\r\n  /** 附加数据2 / Additional Data 2 (default: empty) */\r\n  S2?: Uint8Array;\r\n  /** 初始化向量 / Initialization Vector (default: Uint8Array(cipher.BLOCK_SIZE)) */\r\n  iv?: Uint8Array;\r\n}\r\nexport interface ECIESCiphertext {\r\n  /** 临时公钥 / Temporary Public Key */\r\n  R: ECPublicKey;\r\n  /** 密文 / Ciphertext */\r\n  C: Uint8Array;\r\n  /** 校验值 / Check Value */\r\n  D: Uint8Array;\r\n}\r\nexport interface ECIESEncrypt {\r\n  /**\r\n   * 椭圆曲线集成加密算法\r\n   *\r\n   * Elliptic Curve Integrated Encryption Scheme\r\n   *\r\n   * @param {ECPublicKey} p_key - 接收方公钥 / Recipient's Public Key\r\n   * @param {Uint8Array} M - 明文 / Plaintext\r\n   */\r\n  (p_key: ECPublicKey, M: Uint8Array): ECIESCiphertext;\r\n}\r\nexport interface ECIESDecrypt {\r\n  /**\r\n   * 椭圆曲线集成解密算法\r\n   *\r\n   * Elliptic Curve Integrated Decryption Scheme\r\n   *\r\n   * @param {ECPrivateKey} s_key - 接收方私钥 / Recipient's Private Key\r\n   * @param {ECIESCiphertext} C - 密文 / Ciphertext\r\n   */\r\n  (s_key: ECPrivateKey, C: ECIESCiphertext): U8;\r\n}\r\nexport interface ECIES {\r\n  /**\r\n   * @param {IVBlockCipher} [config.cipher] - 分组密码算法 / Block Cipher Algorithm (default: AES-256-GCM)\r\n   * @param {KeyHash} [config.mac] - 密钥哈希函数 / Key Hash Function (default: HMAC-SHA-256)\r\n   * @param {KDF} [config.kdf] - 密钥派生函数 / Key Derivation Function (default: ANSI-X9.63-KDF with SHA-256)\r\n   * @param {Uint8Array} [config.S1] - 附加数据1 / Additional Data 1 (default: empty)\r\n   * @param {Uint8Array} [config.S2] - 附加数据2 / Additional Data 2 (default: empty)\r\n   * @param {Uint8Array} [config.iv] - 初始化向量 / Initialization Vector (default: Uint8Array(cipher.BLOCK_SIZE))\r\n   */\r\n  (\r\n    config?: ECIESConfig,\r\n  ): {\r\n    encrypt: ECIESEncrypt;\r\n    decrypt: ECIESDecrypt;\r\n  };\r\n}\r\n\r\n/**\r\n * 椭圆曲线密码学\r\n *\r\n * Elliptic Curve Crypto\r\n *\r\n * @template P - 点类型 / Point Type\r\n * @template C - 曲线参数类型 / Curve Parameters Type\r\n */\r\nexport interface ECCBase {\r\n  /**\r\n   * 生成椭圆曲线密钥\r\n   *\r\n   * Generate Elliptic Curve Key\r\n   */\r\n  gen: {\r\n    /** 生成密钥对 / Generate Key Pair */\r\n    (type?: 'key_pair'): ECKeyPair;\r\n    /** 生成私钥 / Generate Private Key */\r\n    (type: 'private_key'): ECPrivateKey;\r\n    /** 生成公钥 / Generate Public Key */\r\n    (type: 'public_key', s_key: ECPrivateKey): ECKeyPair;\r\n  };\r\n  /**\r\n   * 椭圆曲线迪菲-赫尔曼, 密钥协商算法\r\n   *\r\n   * Elliptic Curve Diffie-Hellman Key Agreement Algorithm\r\n   */\r\n  dh: ECDH;\r\n  /**\r\n   * 椭圆曲线余因子迪菲-赫尔曼, 密钥协商算法\r\n   *\r\n   * Elliptic Curve Co-factor Diffie-Hellman Key Agreement Algorithm\r\n   */\r\n  cdh: ECDH;\r\n  /**\r\n   * 椭圆曲线梅内泽斯-奎-范斯通密钥协商算法\r\n   *\r\n   * Elliptic Curve Menezes-Qu-Vanstone Key Agreement Algorithm\r\n   */\r\n  mqv: ECMQV;\r\n  /**\r\n   * 椭圆曲线数字签名\r\n   *\r\n   * Elliptic Curve Digital Signature Algorithm\r\n   */\r\n  dsa: ECDSA;\r\n  /**\r\n   * 椭圆曲线集成加密算法\r\n   *\r\n   * Elliptic Curve Integrated Encryption Scheme\r\n   */\r\n  ies: ECIES;\r\n}\r\nexport interface ECCFpWeierstrass extends ECCBase {\r\n  parameters: FpWECParams;\r\n  utils: ECJacobian;\r\n}\r\nexport interface ECCFpMontgomery extends ECCBase {\r\n  parameters: FpMECParams;\r\n  utils: ECJacobian;\r\n}\r\nexport interface ECCFbPseudoRandom extends ECCBase {\r\n  parameters: FbPECParams;\r\n  utils: ECLópezDahab;\r\n}\r\nexport interface ECCFbKoblitz extends ECCBase {\r\n  parameters: FbKECParams;\r\n  utils: ECLópezDahab;\r\n}\r\n\r\n// * Functions\r\n\r\n/**\r\n * 定义 ECIES 配置\r\n *\r\n * Define ECIES Configuration\r\n */\r\nexport function defineECIES(config?: ECIESConfig) {\r\n  config = config ?? {};\r\n  const {\r\n    cipher = cbc(aes(256)),\r\n    mac = hmac(sha256),\r\n    kdf = x963kdf(sha256),\r\n    S1 = new Uint8Array(0),\r\n    S2 = new Uint8Array(0),\r\n    iv = new Uint8Array(cipher.BLOCK_SIZE),\r\n  } = config;\r\n\r\n  return { cipher, mac, kdf, S1, S2, iv };\r\n}\r\n\r\n// * ECC\r\n\r\nexport function ECC(curve: FpWECParams): ECCFpWeierstrass;\r\nexport function ECC(curve: FpMECParams): ECCFpMontgomery;\r\nexport function ECC(curve: FbPECParams): ECCFbPseudoRandom;\r\nexport function ECC(curve: FbKECParams): ECCFbKoblitz;\r\nexport function ECC(curve: FpWECParams | FpMECParams | FbPECParams | FbKECParams) {\r\n  let ec: ECJacobian | ECLópezDahab;\r\n  switch (curve.type) {\r\n    case 'Weierstrass':\r\n    case 'Montgomery':\r\n      ec = EC(curve);\r\n      break;\r\n    case 'Pseudo-Random':\r\n    case 'Koblitz':\r\n      ec = EC(curve);\r\n      break;\r\n    default:\r\n      throw new KitError('unsupported curve type');\r\n  }\r\n  let toCatalyst: CSUtils['toJacobian'] | CSUtils['toLD'];\r\n  switch (ec.catalyst) {\r\n    case 'jacobian':\r\n      toCatalyst = ec.cs.toJacobian;\r\n      break;\r\n    case 'ld':\r\n      toCatalyst = ec.cs.toLD;\r\n      break;\r\n    default:\r\n      throw new KitError('unsupported catalyst type');\r\n  }\r\n\r\n  const { G, n, h } = curve;\r\n  /** 优化基点 */\r\n  const CG = toCatalyst(G);\r\n  const n_bit = getBIBits(n);\r\n  const n_mask = genBitMask(n_bit);\r\n  const p = 'p' in curve ? curve.p : undefined;\r\n  const p_bit = p ? getBIBits(p) : undefined;\r\n  const p_byte = p ? (p_bit! + 7) >> 3 : undefined;\r\n  const m = 'm' in curve ? curve.m : undefined;\r\n  const m_bit = m ? getBIBits(m) : undefined;\r\n  const m_byte = m ? (m_bit! + 7) >> 3 : undefined;\r\n  const ele_byte = p_byte ?? m_byte!;\r\n\r\n  const { addPoint, mulPoint, isLegalSK, isLegalPK } = ec;\r\n  const toAffine = ec.cs.toAffine;\r\n\r\n  function gen(type?: 'key_pair'): ECKeyPair;\r\n  function gen(type: 'private_key'): ECPrivateKey;\r\n  function gen(type: 'public_key', s_key: ECPrivateKey): ECKeyPair;\r\n  function gen(type: 'key_pair' | 'private_key' | 'public_key' = 'key_pair', s_key?: ECPrivateKey) {\r\n    if (type === 'key_pair') {\r\n      // private key\r\n      const { result: d } = genRandomBI(n, ele_byte);\r\n      // public key\r\n      const _ = mulPoint(CG as any, d);\r\n      const Q = toAffine(_);\r\n\r\n      return { Q, d };\r\n    } else if (type === 'private_key') {\r\n      const { result: d } = genRandomBI(n, ele_byte);\r\n      return { d };\r\n    } else if (type === 'public_key') {\r\n      const d = s_key!.d;\r\n      if (d === 0n) throw new KitError('Invalid private key');\r\n\r\n      const _ = mulPoint(CG as any, d);\r\n      const Q = toAffine(_);\r\n\r\n      return { Q, d };\r\n    }\r\n    throw new KitError('Invalid type');\r\n  }\r\n\r\n  const dh: ECDH = (s_key: ECPrivateKey, p_key: ECPublicKey) => {\r\n    if (!isLegalPK(p_key.Q)) throw new KitError('Invalid public key');\r\n\r\n    if (!isLegalSK(s_key.d)) throw new KitError('Invalid private key');\r\n\r\n    const Q = toCatalyst(p_key.Q);\r\n    const d = s_key.d;\r\n    const S = mulPoint(Q as any, d);\r\n    if (S.isInfinity) throw new KitError('the result of ECDH is the point at infinity');\r\n\r\n    return toAffine(S);\r\n  };\r\n  const cdh: ECDH = (s_key: ECPrivateKey, p_key: ECPublicKey) => {\r\n    if (!isLegalPK(p_key.Q)) throw new KitError('Invalid public key');\r\n\r\n    if (!isLegalSK(s_key.d)) throw new KitError('Invalid private key');\r\n\r\n    const Q = toCatalyst(p_key.Q);\r\n    const d = s_key.d;\r\n    const S = mulPoint(Q as any, d * h);\r\n    if (S.isInfinity) throw new KitError('the result of ECDH is the point at infinity');\r\n\r\n    return toAffine(S);\r\n  };\r\n  const mqv: ECMQV = (u1: ECKeyPair, u2: ECKeyPair, v1: ECPublicKey, v2: ECPublicKey) => {\r\n    if (!isLegalPK(v1.Q) || !isLegalPK(v2.Q)) throw new KitError('Invalid public key');\r\n\r\n    const ceilLog2n = n_bit;\r\n    const L = 1n << BigInt(Math.ceil(ceilLog2n / 2));\r\n    const u1d = u1.d;\r\n    const u2d = u2.d;\r\n    const u2Qx = u2.Q.x;\r\n    const v2Qx = v2.Q.x;\r\n    const Q2u = mod(u2Qx, L) + L;\r\n    const Q2v = mod(v2Qx, L) + L;\r\n    const s = mod(u2d + Q2u * u1d, n);\r\n    const v2Q = toCatalyst(v2.Q);\r\n    const v1Q = toCatalyst(v1.Q);\r\n    const P = mulPoint(addPoint(v2Q as any, mulPoint(v1Q as any, Q2v) as any) as any, s * h);\r\n    if (P.isInfinity) throw new KitError('Public key not available');\r\n\r\n    return toAffine(P);\r\n  };\r\n  const dsa: ECDSA = (hash: Digest = sha256) => {\r\n    const sign = (s_key: ECPrivateKey, M: Uint8Array) => {\r\n      const d = s_key.d;\r\n      let r = 0n;\r\n      let s = 0n;\r\n      let z = hash(M).toBI();\r\n      while (z > n_mask) {\r\n        z = z >> 1n;\r\n      }\r\n      do {\r\n        const K = gen();\r\n        const k = K.d;\r\n        const x1 = K.Q.x;\r\n        r = mod(x1, n);\r\n        if (r === 0n) continue;\r\n\r\n        s = modInverse(k, n) * mod(z + r * d, n);\r\n        s = mod(s, n);\r\n      } while (s === 0n);\r\n\r\n      return { r, s };\r\n    };\r\n    const verify = (p_key: ECPublicKey, M: Uint8Array, signature: ECDSASignature) => {\r\n      const Q = toCatalyst(p_key.Q);\r\n      const r = signature.r;\r\n      const s = signature.s;\r\n      if (r <= 0n || r >= n || s <= 0n || s >= n) return false;\r\n\r\n      let z = hash(M).toBI();\r\n      while (z > n_mask) {\r\n        z = z >> 1n;\r\n      }\r\n      const w = modInverse(s, n);\r\n      const u1 = mod(z * w, n);\r\n      const u2 = mod(r * w, n);\r\n      const P_j = addPoint(mulPoint(CG as any, u1) as any, mulPoint(Q as any, u2) as any);\r\n      const P = toAffine(P_j);\r\n      const v = mod(P.x, n);\r\n\r\n      return v === r;\r\n    };\r\n\r\n    return { sign, verify };\r\n  };\r\n  const ies: ECIES = (config?: ECIESConfig) => {\r\n    const { cipher, mac, kdf, S1, S2, iv } = defineECIES(config);\r\n    const encrypt = (p_key: ECPublicKey, M: Uint8Array) => {\r\n      if (!isLegalPK(p_key.Q)) throw new KitError('Invalid public key');\r\n\r\n      let s_key: ECKeyPair;\r\n      let deriveShare: AffinePoint;\r\n      do {\r\n        s_key = gen();\r\n        deriveShare = dh(s_key, p_key);\r\n      } while (deriveShare.isInfinity);\r\n\r\n      const Z = U8.fromBI(deriveShare.x);\r\n      const K = kdf(cipher.KEY_SIZE + mac.KEY_SIZE, joinBuffer(Z, S1));\r\n      const KE = K.slice(0, cipher.KEY_SIZE);\r\n      const KM = K.slice(cipher.KEY_SIZE, cipher.KEY_SIZE + mac.KEY_SIZE);\r\n      const _cipher = cipher(KE, iv);\r\n      const R: ECPublicKey = { Q: s_key.Q };\r\n      const C = _cipher.encrypt(M);\r\n      const D = mac(KM, joinBuffer(C, S2));\r\n\r\n      return { R, C, D };\r\n    };\r\n    const decrypt = (s_key: ECPrivateKey, CT: ECIESCiphertext) => {\r\n      const { R, C, D } = CT;\r\n      // 密钥派生\r\n      const deriveShare = dh(s_key, R);\r\n      if (deriveShare.isInfinity) throw new KitError('ECIES Decryption failed');\r\n\r\n      const Z = U8.fromBI(deriveShare.x);\r\n      const K = kdf(cipher.KEY_SIZE + mac.KEY_SIZE, joinBuffer(Z, S1));\r\n      const KE = K.slice(0, cipher.KEY_SIZE);\r\n      const KM = K.slice(cipher.KEY_SIZE, cipher.KEY_SIZE + mac.KEY_SIZE);\r\n      const _cipher = cipher(KE, iv);\r\n      // 校验\r\n      if (mac(KM, joinBuffer(C, S2)).some((v, i) => v !== D[i])) throw new KitError('ECIES Decryption failed');\r\n\r\n      // 解密\r\n      const M = _cipher.decrypt(C);\r\n\r\n      return new U8(M);\r\n    };\r\n    return { encrypt, decrypt };\r\n  };\r\n\r\n  return {\r\n    parameters: curve,\r\n    utils: ec,\r\n    gen,\r\n    dh,\r\n    cdh,\r\n    mqv,\r\n    dsa,\r\n    ies,\r\n  };\r\n}\r\n\r\n// * Algorithms for Test\r\n\r\n/**\r\n * ! 此加密算法仅用于测试 ECIES\r\n * ! This encryption algorithm is only used for testing ECIES\r\n */\r\nexport const es_xor = createCipher(\r\n  (K: Uint8Array) => {\r\n    const encrypt = (M: Uint8Array) => new U8(M.map((v, i) => v ^ K[i]));\r\n    const decrypt = (C: Uint8Array) => new U8(C.map((v, i) => v ^ K[i]));\r\n    return { encrypt, decrypt };\r\n  },\r\n  {\r\n    ALGORITHM: 'ES-XOR',\r\n    BLOCK_SIZE: 20,\r\n    KEY_SIZE: 20,\r\n    MIN_KEY_SIZE: 20,\r\n    MAX_KEY_SIZE: 20,\r\n  },\r\n);\r\n","import type { FbKECParams, FbPECParams, FpMECParams, FpTECParams, FpWECParams } from './ec';\r\n\r\n// * SM2 Prime Curve\r\n\r\n/**\r\n * 256 位素域上的 SM2 曲线\r\n *\r\n * SM2 curve over a 256 bit prime field\r\n */\r\nexport const sm2p256v1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffeffffffffffffffffffffffffffffffff00000000ffffffffffffffffn,\r\n  a: 0xfffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffcn,\r\n  b: 0x28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7n,\r\n    y: 0xbc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0n,\r\n  },\r\n  n: 0xfffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123n,\r\n  h: 1n,\r\n});\r\n\r\n// * SEC-1 Prime Curves\r\n\r\n/**\r\n * 112 位素域上的 SECG/WTLS 曲线\r\n *\r\n * SECG/WTLS curve over a 112 bit prime field\r\n *\r\n * @alias secp112r1\r\n * @alias wtls6\r\n */\r\nexport const secp112r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xdb7c2abf62e35e668076bead208bn,\r\n  a: 0xdb7c2abf62e35e668076bead2088n,\r\n  b: 0x659ef8ba043916eede8911702b22n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x09487239995a5ee76b55f9c2f098n,\r\n    y: 0xa89ce5af8724c0a23e0e0ff77500n,\r\n  },\r\n  n: 0xdb7c2abf62e35e7628dfac6561c5n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 112 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 112 bit prime field\r\n */\r\nexport const secp112r2: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xdb7c2abf62e35e668076bead208bn,\r\n  a: 0x6127c24c05f38a0aaaf65c0ef02cn,\r\n  b: 0x51def1815db5ed74fcc34c85d709n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x4ba30ab5e892b4e1649dd0928643n,\r\n    y: 0xadcd46f5882e3747def36e956e97n,\r\n  },\r\n  n: 0x36df0aafd8b8d7597ca10520d04bn,\r\n  h: 4n,\r\n});\r\n\r\n/**\r\n * 128 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 128 bit prime field\r\n */\r\nexport const secp128r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffdffffffffffffffffffffffffn,\r\n  a: 0xfffffffdfffffffffffffffffffffffcn,\r\n  b: 0xe87579c11079f43dd824993c2cee5ed3n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x161ff7528b899b2d0c28607ca52c5b86n,\r\n    y: 0xcf5ac8395bafeb13c02da292dded7a83n,\r\n  },\r\n  n: 0xfffffffe0000000075a30d1b9038a115n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 128 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 128 bit prime field\r\n */\r\nexport const secp128r2: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffdffffffffffffffffffffffffn,\r\n  a: 0xd6031998d1b3bbfebf59cc9bbff9aee1n,\r\n  b: 0x5eeefca380d02919dc2c6558bb6d8a5dn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x7b6aa5d85e572983e6fb32a7cdebc140n,\r\n    y: 0x27b6916a894d3aee7106fe805fc34b44n,\r\n  },\r\n  n: 0x3fffffff7fffffffbe0024720613b5a3n,\r\n  h: 4n,\r\n});\r\n\r\n/**\r\n * 160 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 160 bit prime field\r\n */\r\nexport const secp160k1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffeffffac73n,\r\n  a: 0n,\r\n  b: 7n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x3b4c382ce37aa192a4019e763036f4f5dd4d7ebbn,\r\n    y: 0x938cf935318fdced6bc28286531733c3f03c4feen,\r\n  },\r\n  n: 0x0100000000000000000001b8fa16dfab9aca16b6b3n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 160 位素域上的 SECG/WTLS 曲线\r\n *\r\n * SECG/WTLS curve over a 160 bit prime field\r\n *\r\n * @alias secp160r1\r\n * @alias wtls7\r\n */\r\nexport const secp160r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xffffffffffffffffffffffffffffffff7fffffffn,\r\n  a: 0xffffffffffffffffffffffffffffffff7ffffffcn,\r\n  b: 0x1c97befc54bd7a8b65acf89f81d4d4adc565fa45n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x4a96b5688ef573284664698968c38bb913cbfc82n,\r\n    y: 0x23a628553168947d59dcc912042351377ac5fb32n,\r\n  },\r\n  n: 0x0100000000000000000001f4c8f927aed3ca752257n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 160 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 160 bit prime field\r\n */\r\nexport const secp160r2: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xffffffffffffffffffffffffffffffff7fffffffn,\r\n  a: 0xffffffffffffffffffffffffffffffff7ffffffcn,\r\n  b: 0xb4e134d3fb59eb8bab57274904664d5af50388ban,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x52dcb034293a117e1f4ff11b30f7199d3144ce6dn,\r\n    y: 0xfeaffef2e331f296e071fa0df9982cfea7d43f2en,\r\n  },\r\n  n: 0x0100000000000000000000351ee786a818f3a1a16bn,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 192 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 192 bit prime field\r\n */\r\nexport const secp192k1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffeffffee37n,\r\n  a: 0x000000000000000000000000000000000000000000000000n,\r\n  b: 0x000000000000000000000000000000000000000000000003n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xdb4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7dn,\r\n    y: 0x9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9dn,\r\n  },\r\n  n: 0xfffffffffffffffffffffffe26f2fc170f69466a74defd8dn,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 192 位素域上的 NIST/X9.62/SECG 曲线\r\n *\r\n * NIST/X9.62/SECG curve over a 192 bit prime field\r\n *\r\n * @alias p192\r\n * @alias prime192v1\r\n * @alias secp192r1\r\n */\r\nexport const secp192r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffeffffffffffffffffn,\r\n  a: 0xfffffffffffffffffffffffffffffffefffffffffffffffcn,\r\n  b: 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012n,\r\n    y: 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811n,\r\n  },\r\n  n: 0xffffffffffffffffffffffff99def836146bc9b1b4d22831n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 224 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 224 bit prime field\r\n */\r\nexport const secp224k1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffffffffffeffffe56dn,\r\n  a: 0x00000000000000000000000000000000000000000000000000000000n,\r\n  b: 0x00000000000000000000000000000000000000000000000000000005n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xa1455b334df099df30fc28a169a467e9e47075a90f7e650eb6b7a45cn,\r\n    y: 0x7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5n,\r\n  },\r\n  n: 0x010000000000000000000000000001dce8d2ec6184caf0a971769fb1f7n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 224 位素域上的 NIST/SECG 曲线\r\n *\r\n * NIST/SECG curve over a 224 bit prime field\r\n *\r\n * @alias p224\r\n * @alias secp224r1\r\n */\r\nexport const secp224r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xffffffffffffffffffffffffffffffff000000000000000000000001n,\r\n  a: 0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffen,\r\n  b: 0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21n,\r\n    y: 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34n,\r\n  },\r\n  n: 0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3dn,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 256 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 256 bit prime field\r\n */\r\nexport const secp256k1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,\r\n  a: 0x0000000000000000000000000000000000000000000000000000000000000000n,\r\n  b: 0x0000000000000000000000000000000000000000000000000000000000000007n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,\r\n    y: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,\r\n  },\r\n  n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 256 位素域上的 NIST/X9.62/SECG 曲线\r\n *\r\n * NIST/X9.62/SECG curve over a 256 bit prime field\r\n *\r\n * @alias p256\r\n * @alias prime256v1\r\n * @alias secp256r1\r\n */\r\nexport const secp256r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffffn,\r\n  a: 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffcn,\r\n  b: 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604bn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296n,\r\n    y: 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5n,\r\n  },\r\n  n: 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 384 位素域上的 NIST/SECG 曲线\r\n *\r\n * NIST/SECG curve over a 384 bit prime field\r\n *\r\n * @alias p384\r\n * @alias secp384r1\r\n */\r\nexport const secp384r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffn,\r\n  a: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffcn,\r\n  b: 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aefn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7n,\r\n    y: 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5fn,\r\n  },\r\n  n: 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 521 位素域上的 NIST/SECG 曲线\r\n *\r\n * NIST/SECG curve over a 521 bit prime field\r\n *\r\n * @alias p521\r\n * @alias secp521r1\r\n */\r\nexport const secp521r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,\r\n  a: 0x01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcn,\r\n  b: 0x0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66n,\r\n    y: 0x011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650n,\r\n  },\r\n  n: 0x01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409n,\r\n  h: 1n,\r\n});\r\n\r\n// * SEC-1 Binary Curves\r\n\r\nexport const sect163k1: FbKECParams = Object.freeze({\r\n  type: 'Koblitz',\r\n  m: 163n,\r\n  IP: (1n << 163n) + (1n << 7n) + (1n << 6n) + (1n << 3n) + 1n,\r\n  a: 0x1n,\r\n  b: 0x1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x02fe13c0537bbc11acaa07d793de4e6d5e5c94eee8n,\r\n    y: 0x0289070fb05d38ff58321f2e800536d538ccdaa3d9n,\r\n  },\r\n  n: 0x04000000000000000000020108a2e0cc0d99f8a5efn,\r\n  h: 2n,\r\n});\r\n\r\nexport const sect163r1: FbPECParams = Object.freeze({\r\n  type: 'Pseudo-Random',\r\n  m: 163n,\r\n  IP: (1n << 163n) + (1n << 7n) + (1n << 6n) + (1n << 3n) + 1n,\r\n  a: 0x07b6882caaefa84f9554ff8428bd88e246d2782ae2n,\r\n  b: 0x0713612dcddcb40aab946bda29ca91f73af958afd9n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x0369979697ab43897789566789567f787a7876a654n,\r\n    y: 0x00435edb42efafb2989d51fefce3c80988f41ff883n,\r\n  },\r\n  n: 0x03ffffffffffffffffffff48aab689c29ca710279bn,\r\n  h: 2n,\r\n});\r\n\r\nexport const sect163r2: FbPECParams = Object.freeze({\r\n  type: 'Pseudo-Random',\r\n  m: 163n,\r\n  IP: (1n << 163n) + (1n << 7n) + (1n << 6n) + (1n << 3n) + 1n,\r\n  a: 0x01n,\r\n  b: 0x020a601907b8c953ca1481eb10512f78744a3205fdn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x03f0eba16286a2d57ea0991168d4994637e8343e36n,\r\n    y: 0x00d51fbc6c71a0094fa2cdd545b11c5c0c797324f1n,\r\n  },\r\n  n: 0x040000000000000000000292fe77e70c12a4234c33n,\r\n  h: 2n,\r\n});\r\n\r\nexport const sect233k1: FbKECParams = Object.freeze({\r\n  type: 'Koblitz',\r\n  m: 233n,\r\n  IP: (1n << 233n) + (1n << 74n) + 1n,\r\n  a: 0n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x017232ba853a7e731af129f22ff4149563a419c26bf50a4c9d6eefad6126n,\r\n    y: 0x01db537dece819b7f70f555a67c427a8cd9bf18aeb9b56e0c11056fae6a3n,\r\n  },\r\n  n: 0x8000000000000000000000000000069d5bb915bcd46efb1ad5f173abdfn,\r\n  h: 4n,\r\n});\r\n\r\nexport const sect233r1: FbPECParams = Object.freeze({\r\n  type: 'Pseudo-Random',\r\n  m: 233n,\r\n  IP: (1n << 233n) + (1n << 74n) + 1n,\r\n  a: 1n,\r\n  b: 0x0066647ede6c332c7f8c0923bb58213b333b20e9ce4281fe115f7d8f90adn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x00fac9dfcbac8313bb2139f1bb755fef65bc391f8b36f8f8eb7371fd558bn,\r\n    y: 0x01006a08a41903350678e58528bebf8a0beff867a7ca36716f7e01f81052n,\r\n  },\r\n  n: 0x01000000000000000000000000000013e974e72f8a6922031d2603cfe0d7n,\r\n  h: 2n,\r\n});\r\n\r\nexport const sect239k1: FbKECParams = Object.freeze({\r\n  type: 'Koblitz',\r\n  m: 239n,\r\n  IP: (1n << 239n) + (1n << 158n) + 1n,\r\n  a: 0n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x29a0b6a887a983e9730988a68727a8b2d126c44cc2cc7b2a6555193035dcn,\r\n    y: 0x76310804f12e549bdb011c103089e73510acb275fc312a5dc6b76553f0can,\r\n  },\r\n  n: 0x2000000000000000000000000000005a79fec67cb6e91f1c1da800e478a5n,\r\n  h: 4n,\r\n});\r\n\r\nexport const sect283k1: FbKECParams = Object.freeze({\r\n  type: 'Koblitz',\r\n  m: 283n,\r\n  IP: (1n << 283n) + (1n << 12n) + (1n << 7n) + (1n << 5n) + 1n,\r\n  a: 0n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x0503213f78ca44883f1a3b8162f188e553cd265f23c1567a16876913b0c2ac2458492836n,\r\n    y: 0x01ccda380f1c9e318d90f95d07e5426fe87e45c0e8184698e45962364e34116177dd2259n,\r\n  },\r\n  n: 0x01ffffffffffffffffffffffffffffffffffe9ae2ed07577265dff7f94451e061e163c61n,\r\n  h: 4n,\r\n});\r\n\r\nexport const sect283r1: FbPECParams = Object.freeze({\r\n  type: 'Pseudo-Random',\r\n  m: 283n,\r\n  IP: (1n << 283n) + (1n << 12n) + (1n << 7n) + (1n << 5n) + 1n,\r\n  a: 1n,\r\n  b: 0x027b680ac8b8596da5a4af8a19a0303fca97fd7645309fa2a581485af6263e313b79a2f5n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x05f939258db7dd90e1934f8c70b0dfec2eed25b8557eac9c80e2e198f8cdbecd86b12053n,\r\n    y: 0x03676854fe24141cb98fe6d4b20d02b4516ff702350eddb0826779c813f0df45be8112f4n,\r\n  },\r\n  n: 0x03ffffffffffffffffffffffffffffffffffef90399660fc938a90165b042a7cefadb307n,\r\n  h: 2n,\r\n});\r\n\r\nexport const sect409k1: FbKECParams = Object.freeze({\r\n  type: 'Koblitz',\r\n  m: 409n,\r\n  IP: (1n << 409n) + (1n << 87n) + 1n,\r\n  a: 0n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x0060f05f658f49c1ad3ab1890f7184210efd0987e307c84c27accfb8f9f67cc2c460189eb5aaaa62ee222eb1b35540cfe9023746n,\r\n    y: 0x01e369050b7c4e42acba1dacbf04299c3460782f918ea427e6325165e9ea10e3da5f6c42e9c55215aa9ca27a5863ec48d8e0286bn,\r\n  },\r\n  n: 0x7ffffffffffffffffffffffffffffffffffffffffffffffffffe5f83b2d4ea20400ec4557d5ed3e3e7ca5b4b5c83b8e01e5fcfn,\r\n  h: 4n,\r\n});\r\n\r\nexport const sect409r1: FbPECParams = Object.freeze({\r\n  type: 'Pseudo-Random',\r\n  m: 409n,\r\n  IP: (1n << 409n) + (1n << 87n) + 1n,\r\n  a: 1n,\r\n  b: 0x0021a5c2c8ee9feb5c4b9a753b7b476b7fd6422ef1f3dd674761fa99d6ac27c8a9a197b272822f6cd57a55aa4f50ae317b13545fn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x015d4860d088ddb3496b0c6064756260441cde4af1771d4db01ffe5b34e59703dc255a868a1180515603aeab60794e54bb7996a7n,\r\n    y: 0x0061b1cfab6be5f32bbfa78324ed106a7636b9c5a7bd198d0158aa4f5488d08f38514f1fdf4b4f40d2181b3681c364ba0273c706n,\r\n  },\r\n  n: 0x010000000000000000000000000000000000000000000000000001e2aad6a612f33307be5fa47c3c9e052f838164cd37d9a21173n,\r\n  h: 2n,\r\n});\r\n\r\nexport const sect571k1: FbKECParams = Object.freeze({\r\n  type: 'Koblitz',\r\n  m: 571n,\r\n  IP: (1n << 571n) + (1n << 10n) + (1n << 5n) + (1n << 2n) + 1n,\r\n  a: 0n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x026eb7a859923fbc82189631f8103fe4ac9ca2970012d5d46024804801841ca44370958493b205e647da304db4ceb08cbbd1ba39494776fb988b47174dca88c7e2945283a01c8972n,\r\n    y: 0x0349dc807f4fbf374f4aeade3bca95314dd58cec9f307a54ffc61efc006d8a2c9d4979c0ac44aea74fbebbb9f772aedcb620b01a7ba7af1b320430c8591984f601cd4c143ef1c7a3n,\r\n  },\r\n  n: 0x020000000000000000000000000000000000000000000000000000000000000000000000131850e1f19a63e4b391a8db917f4138b630d84be5d639381e91deb45cfe778f637c1001n,\r\n  h: 4n,\r\n});\r\n\r\nexport const sect571r1: FbPECParams = Object.freeze({\r\n  type: 'Pseudo-Random',\r\n  m: 571n,\r\n  IP: (1n << 571n) + (1n << 10n) + (1n << 5n) + (1n << 2n) + 1n,\r\n  a: 1n,\r\n  b: 0x02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727an,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x0303001d34b856296c16c0d40d3cd7750a93d1d2955fa80aa5f40fc8db7b2abdbde53950f4c0d293cdd711a35b67fb1499ae60038614f1394abfa3b4c850d927e1e7769c8eec2d19n,\r\n    y: 0x037bf27342da639b6dccfffeb73d69d78c6c27a6009cbbca1980f8533921e8a684423e43bab08a576291af8f461bb2a8b3531d2f0485c19b16e2f1516e23dd3c1a4827af1b8ac15bn,\r\n  },\r\n  n: 0x03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47n,\r\n  h: 2n,\r\n});\r\n\r\n// * X9.63 Prime Curves\r\n\r\n/**\r\n * 192 位素域上的 NIST/X9.62/SECG 曲线\r\n *\r\n * NIST/X9.62/SECG curve over a 192 bit prime field\r\n *\r\n * @alias p192\r\n * @alias prime192v1\r\n * @alias secp192r1\r\n */\r\nexport const prime192v1 = secp192r1;\r\n\r\n/**\r\n * 256 位素域上的 NIST/X9.62/SECG 曲线\r\n *\r\n * NIST/X9.62/SECG curve over a 256 bit prime field\r\n *\r\n * @alias p256\r\n * @alias prime256v1\r\n * @alias secp256r1\r\n */\r\nexport const prime256v1 = secp256r1;\r\n\r\n// * NIST Prime Curves\r\n\r\n/**\r\n * 192 位素域上的 NIST/X9.62/SECG 曲线\r\n *\r\n * NIST/X9.62/SECG curve over a 192 bit prime field\r\n *\r\n * @alias p192\r\n * @alias prime192v1\r\n * @alias secp192r1\r\n */\r\nexport const p192 = secp192r1;\r\n\r\n/**\r\n * 224 位素域上的 NIST/SECG 曲线\r\n *\r\n * NIST/SECG curve over a 224 bit prime field\r\n *\r\n * @alias p224\r\n * @alias secp224r1\r\n */\r\nexport const p224 = secp224r1;\r\n\r\n/**\r\n * 256 位素域上的 SECG 曲线\r\n *\r\n * SECG curve over a 256 bit prime field\r\n *\r\n * @alias p256\r\n * @alias prime256v1\r\n * @alias secp256r1\r\n */\r\nexport const p256 = secp256r1;\r\n\r\n/**\r\n * 384 位素域上的 NIST/SECG 曲线\r\n *\r\n * NIST/SECG curve over a 384 bit prime field\r\n *\r\n * @alias p384\r\n * @alias secp384r1\r\n */\r\nexport const p384 = secp384r1;\r\n\r\n/**\r\n * 521 位素域上的 NIST/SECG 曲线\r\n *\r\n * NIST/SECG curve over a 521 bit prime field\r\n *\r\n * @alias p521\r\n * @alias secp521r1\r\n */\r\nexport const p521 = secp521r1;\r\n\r\n/**\r\n * NIST W-25519 是与 Curve25519 同构的 Weierstrass 曲线\r\n *\r\n * NIST W-25519 is a Weierstrass curve isomorphic to Curve25519\r\n */\r\nexport const w25519: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\r\n  a: 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa984914a144n,\r\n  b: 0x7b425ed097b425ed097b425ed097b425ed097b425ed097b4260b5e9c7710c864n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad245an,\r\n    y: 0x5f51e65e475f794b1fe122d388b72eb36dc2b28192839e4dd6163a5d81312c14n,\r\n  },\r\n  n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\r\n  h: 8n,\r\n});\r\n\r\n/**\r\n * NIST W-448 是与 Curve448 同构的 Weierstrass 曲线\r\n *\r\n * NISt W-448 is a Weierstrass curve isomorphic to Curve448\r\n */\r\nexport const w448: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,\r\n  a: 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9fffffffffffffffffffffffffffffffffffffffffffffffe1a76d41fn,\r\n  b: 0x5ed097b425ed097b425ed097b425ed097b425ed097b425ed097b425e71c71c71c71c71c71c71c71c71c71c71c71c71c71c72c87b7cc69f70n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000000000cb91n,\r\n    y: 0x7d235d1295f5b1f66c98ab6e58326fcecbae5d34f55545d060f75dc28df3f6edb8027e2346430d211312c4b150677af76fd7223d457b5b1an,\r\n  },\r\n  n: 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3n,\r\n  h: 4n,\r\n});\r\n\r\n/**\r\n * 素域 p^255 - 19 上的 NIST Montgomery 曲线\r\n *\r\n * NIST Montgomery curve over a prime field p^255 - 19\r\n */\r\nexport const curve25519: FpMECParams = Object.freeze({\r\n  type: 'Montgomery',\r\n  p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\r\n  a: 486662n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 9n,\r\n    y: 0x20ae19a1b8a086b4e01edd2c7748d14c923d4d7e6d7c61b229e9c5a27eced3d9n,\r\n  },\r\n  n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\r\n  h: 8n,\r\n});\r\n\r\n/**\r\n * 素域 p^448 - 2^224 - 1 上的 NIST Montgomery 曲线\r\n *\r\n * NIST Montgomery curve over a prime field p^448 - 2^224 - 1\r\n */\r\nexport const curve448: FpMECParams = Object.freeze({\r\n  type: 'Montgomery',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,\r\n  a: 156326n,\r\n  b: 1n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 5n,\r\n    y: 0x7d235d1295f5b1f66c98ab6e58326fcecbae5d34f55545d060f75dc28df3f6edb8027e2346430d211312c4b150677af76fd7223d457b5b1an,\r\n  },\r\n  n: 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3n,\r\n  h: 4n,\r\n});\r\n\r\n/**\r\n * ed25519 是与 Curve25519 同构的 Twisted Edwards 曲线\r\n *\r\n * ed25519 is a Twisted Edwards curve isomorphic to Curve25519\r\n */\r\nexport const ed25519: FpTECParams = Object.freeze({\r\n  type: 'TwistedEdwards',\r\n  p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\r\n  a: -1n,\r\n  b: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\r\n    y: 0x6666666666666666666666666666666666666666666666666666666666666658n,\r\n  },\r\n  n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\r\n  h: 8n,\r\n});\r\n\r\n/**\r\n * ed448 是与 Curve448 同构的 Twisted Edwards 曲线\r\n *\r\n * ed448 is a Twisted Edwards curve isomorphic to Curve448\r\n */\r\nexport const ed448: FpTECParams = Object.freeze({\r\n  type: 'TwistedEdwards',\r\n  p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,\r\n  a: 1n,\r\n  b: -39081n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05en,\r\n    y: 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14n,\r\n  },\r\n  n: 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3n,\r\n  h: 4n,\r\n});\r\n\r\n// * Brainpool Prime Curves\r\n\r\n/**\r\n * 160 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 160 bit prime field\r\n */\r\nexport const bp160r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xe95e4a5f737059dc60dfc7ad95b3d8139515620fn,\r\n  a: 0x340e7be2a280eb74e2be61bada745d97e8f7c300n,\r\n  b: 0x1e589a8595423412134faa2dbdec95c8d8675e58n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xbed5af16ea3f6a4f62938c4631eb5af7bdbcdbc3n,\r\n    y: 0x1667cb477a1a8ec338f94741669c976316da6321n,\r\n  },\r\n  n: 0xe95e4a5f737059dc60df5991d45029409e60fc09n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 192 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 192 bit prime field\r\n */\r\nexport const bp192r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xc302f41d932a36cda7a3463093d18db78fce476de1a86297n,\r\n  a: 0x6a91174076b1e0e19c39c031fe8685c1cae040e5c69a28efn,\r\n  b: 0x469a28ef7c28cca3dc721d044f4496bcca7ef4146fbf25c9n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0xc0a0647eaab6a48753b033c56cb0f0900a2f5c4853375fd6n,\r\n    y: 0x14b690866abd5bb88b5f4828c1490002e6773fa2fa299b8fn,\r\n  },\r\n  n: 0xc302f41d932a36cda7a3462f9e9e916b5be8f1029ac4acc1n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 224 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 224 bit prime field\r\n */\r\nexport const bp224r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffn,\r\n  a: 0x68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43n,\r\n  b: 0x2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400bn,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07dn,\r\n    y: 0x58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cdn,\r\n  },\r\n  n: 0xd7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939fn,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 256 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 256 bit prime field\r\n */\r\nexport const bp256r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xa9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377n,\r\n  a: 0x7d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9n,\r\n  b: 0x26dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b6n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x8bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262n,\r\n    y: 0x547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997n,\r\n  },\r\n  n: 0xa9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 320 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 320 bit prime field\r\n */\r\nexport const bp320r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xd35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27n,\r\n  a: 0x3ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb4n,\r\n  b: 0x520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a6n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611n,\r\n    y: 0x14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1n,\r\n  },\r\n  n: 0xd35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 384 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 384 bit prime field\r\n */\r\nexport const bp384r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0x8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53n,\r\n  a: 0x7bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826n,\r\n  b: 0x04a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c11n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1en,\r\n    y: 0x8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315n,\r\n  },\r\n  n: 0x8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565n,\r\n  h: 1n,\r\n});\r\n\r\n/**\r\n * 512 位素域上的 RFC 5639 曲线\r\n *\r\n * RFC 5639 curve over a 512 bit prime field\r\n */\r\nexport const bp512r1: FpWECParams = Object.freeze({\r\n  type: 'Weierstrass',\r\n  p: 0xaadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3n,\r\n  a: 0x7830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94can,\r\n  b: 0x3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723n,\r\n  G: {\r\n    type: 'affine' as const,\r\n    isInfinity: false,\r\n    x: 0x81aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822n,\r\n    y: 0x7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892n,\r\n  },\r\n  n: 0xaadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069n,\r\n  h: 1n,\r\n});\r\n","import { curve448, curve25519 } from '../../core/ec_params';\r\nimport { GF } from '../../core/galois_field';\r\nimport { genRandomBI, getBIBits, KitError, U8, u8 } from '../../core/utils';\r\n\r\n// * Interfaces\r\n\r\nexport interface X25519PrivateKey<T = bigint | Uint8Array> {\r\n  /** 私钥 / Private Key */\r\n  d: T;\r\n}\r\nexport interface X25519PublicKey<T = bigint | Uint8Array> {\r\n  /** 公钥 / Public Key */\r\n  Q: T;\r\n}\r\nexport interface X25519KeyPair<T = bigint | Uint8Array> extends X25519PrivateKey<T>, X25519PublicKey<T> {}\r\n\r\nexport interface X448PrivateKey<T = bigint | Uint8Array> extends X25519PrivateKey<T> {}\r\nexport interface X448PublicKey<T = bigint | Uint8Array> extends X25519PublicKey<T> {}\r\nexport interface X448KeyPair<T = bigint | Uint8Array> extends X25519KeyPair<T> {}\r\n\r\nexport interface X25519 {\r\n  /**\r\n   * 生成 x25519 椭圆曲线密钥\r\n   *\r\n   * Generate x25519 Elliptic Curve Key\r\n   */\r\n  gen: {\r\n    /** 生成密钥对 / Generate Key Pair */\r\n    (type?: 'key_pair'): X25519KeyPair<U8>;\r\n    /** 生成私钥 / Generate Private Key */\r\n    (type: 'private_key'): X25519PrivateKey<U8>;\r\n    /** 生成公钥 / Generate Public Key */\r\n    (type: 'public_key', s_key: X25519PrivateKey): X25519KeyPair<U8>;\r\n  };\r\n  /**\r\n   * x25519 椭圆曲线密钥协商算法\r\n   *\r\n   * x25519 Elliptic Curve Diffie-Hellman Key Agreement Algorithm\r\n   */\r\n  dh: {\r\n    /**\r\n     * @param {X25519PrivateKey} s_key - 己方私钥 / Self Private Key\r\n     * @param {X25519PublicKey} p_key - 对方公钥 / Counterparty Public Key\r\n     */\r\n    (s_key: X25519PrivateKey, p_key: X25519PublicKey): U8;\r\n  };\r\n}\r\n\r\nexport interface X448 {\r\n  /**\r\n   * 生成 x448 椭圆曲线密钥\r\n   *\r\n   * Generate x448 Elliptic Curve Key\r\n   */\r\n  gen: {\r\n    /** 生成密钥对 / Generate Key Pair */\r\n    (type?: 'key_pair'): X448KeyPair<U8>;\r\n    /** 生成私钥 / Generate Private Key */\r\n    (type: 'private_key'): X448PrivateKey<U8>;\r\n    /** 生成公钥 / Generate Public Key */\r\n    (type: 'public_key', s_key: X448PrivateKey): X448KeyPair<U8>;\r\n  };\r\n  /**\r\n   * x448 椭圆曲线密钥协商算法\r\n   *\r\n   * x448 Elliptic Curve Diffie-Hellman Key Agreement Algorithm\r\n   */\r\n  dh: {\r\n    /**\r\n     * @param {X448PrivateKey} s_key - 己方私钥 / Self Private Key\r\n     * @param {X448PublicKey} p_key - 对方公钥 / Counterparty Public Key\r\n     */\r\n    (s_key: X448PrivateKey, p_key: X448PublicKey): U8;\r\n  };\r\n}\r\n\r\n// * X25519 & X448 Algorithms\r\n\r\nfunction cSwap(swap: bigint, x_2: bigint, x_3: bigint) {\r\n  const mask = -swap;\r\n  const dummy = mask & (x_2 ^ x_3);\r\n  x_2 ^= dummy;\r\n  x_3 ^= dummy;\r\n\r\n  return [x_2, x_3];\r\n}\r\n/** 蒙哥马利梯子算法 / Montgomery Ladder Algorithm */\r\nfunction ladder(k: bigint, u: bigint, p: bigint, a24: bigint, bit: number) {\r\n  const { add, sub, pow, mul } = GF(p);\r\n\r\n  let x_2 = 1n;\r\n  let z_2 = 0n;\r\n  let x_3 = u;\r\n  let z_3 = 1n;\r\n  let swap = 0n;\r\n\r\n  const bit_array = k.toString(2).padStart(bit, '0').split('').map(BigInt);\r\n  for (const bit of bit_array) {\r\n    swap ^= bit;\r\n    [x_2, x_3] = cSwap(swap, x_2, x_3);\r\n    [z_2, z_3] = cSwap(swap, z_2, z_3);\r\n    swap = bit;\r\n\r\n    const A = add(x_2, z_2);\r\n    const AA = pow(A, 2n);\r\n    const B = sub(x_2, z_2);\r\n    const BB = pow(B, 2n);\r\n    const E = sub(AA, BB);\r\n    const C = add(x_3, z_3);\r\n    const D = sub(x_3, z_3);\r\n    const DA = mul(D, A);\r\n    const CB = mul(C, B);\r\n    x_3 = pow(add(DA, CB), 2n);\r\n    z_3 = mul(u, pow(sub(DA, CB), 2n));\r\n    x_2 = mul(AA, BB);\r\n    z_2 = mul(E, add(AA, mul(E, a24)));\r\n  }\r\n\r\n  [x_2, x_3] = cSwap(swap, x_2, x_3);\r\n  [z_2, z_3] = cSwap(swap, z_2, z_3);\r\n\r\n  return mul(x_2, pow(z_2, p - 2n));\r\n}\r\n\r\n/** x25519 椭圆曲线算法 / Elliptic Curve Algorithm */\r\nexport const x25519: X25519 = (() => {\r\n  const { p, G, n } = curve25519;\r\n  const p_bit = getBIBits(p);\r\n  const p_byte = (p_bit + 7) >> 3;\r\n\r\n  const a24 = 121665n;\r\n  const Gx = typeof G.x === 'bigint' ? G.x : U8.from(G.x).toBI();\r\n\r\n  function clamp(d: bigint) {\r\n    d = d & 0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8n;\r\n    d = d | 0x4000000000000000000000000000000000000000000000000000000000000000n;\r\n\r\n    return d;\r\n  }\r\n\r\n  function gen(type?: 'key_pair'): X25519KeyPair<U8>;\r\n  function gen(type: 'private_key'): X25519PrivateKey<U8>;\r\n  function gen(type: 'public_key', s_key: X25519PrivateKey): X25519KeyPair<U8>;\r\n  function gen(type: 'key_pair' | 'private_key' | 'public_key' = 'key_pair', s_key?: X25519PrivateKey) {\r\n    if (type === 'key_pair') {\r\n      // private key\r\n      const t = genRandomBI(n, p_byte);\r\n      const d_buffer = t.buffer;\r\n      const d = t.result;\r\n      // public key\r\n      const x = ladder(clamp(d), Gx, p, a24, 255);\r\n      const Q = U8.fromBI(x, p_byte);\r\n\r\n      return { Q, d: d_buffer };\r\n    } else if (type === 'private_key') {\r\n      return { d: genRandomBI(n, p_byte).buffer };\r\n    } else if (type === 'public_key') {\r\n      const d_buffer = typeof s_key!.d === 'bigint' ? U8.fromBI(s_key!.d) : U8.from(s_key!.d);\r\n      const d = typeof s_key!.d === 'bigint' ? s_key!.d : d_buffer.toBI();\r\n      if (d === 0n) throw new KitError('Invalid private key');\r\n\r\n      const x = ladder(clamp(d), Gx, p, a24, 255);\r\n      const Q = U8.fromBI(x, p_byte);\r\n\r\n      return { Q, d: d_buffer };\r\n    }\r\n  }\r\n\r\n  const ecdh: X25519['dh'] = (s_key: X25519PrivateKey, p_key: X25519PublicKey): U8 => {\r\n    const u = typeof p_key.Q === 'bigint' ? p_key.Q : U8.from(p_key.Q).toBI();\r\n    const k = typeof s_key.d === 'bigint' ? s_key.d : U8.from(s_key.d).toBI();\r\n    const x = ladder(clamp(k), u, p, a24, 255);\r\n\r\n    return U8.fromBI(x, p_byte);\r\n  };\r\n\r\n  return { gen, dh: ecdh };\r\n})();\r\n\r\n/** x448 椭圆曲线算法 / Elliptic Curve Algorithm */\r\nexport const x448: X448 = (() => {\r\n  const { p, G, n } = curve448;\r\n  const p_bit = getBIBits(p);\r\n  const p_byte = (p_bit + 7) >> 3;\r\n\r\n  const a24 = 39081n;\r\n  const Gx = typeof G.x === 'bigint' ? G.x : U8.from(G.x).toBI();\r\n\r\n  function clamp(d: bigint) {\r\n    d &=\r\n      0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcn;\r\n    d |=\r\n      0x8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n;\r\n\r\n    return d;\r\n  }\r\n\r\n  function gen(type?: 'key_pair'): X448KeyPair<U8>;\r\n  function gen(type: 'private_key'): X448PrivateKey<U8>;\r\n  function gen(type: 'public_key', s_key: X448PrivateKey): X448KeyPair<U8>;\r\n  function gen(type: 'key_pair' | 'private_key' | 'public_key' = 'key_pair', s_key?: X448PrivateKey) {\r\n    if (type === 'key_pair') {\r\n      // private key\r\n      const t = genRandomBI(n, p_byte);\r\n      const d_buffer = t.buffer;\r\n      const d = t.result;\r\n      // public key\r\n      const x = ladder(clamp(d), Gx, p, a24, 448);\r\n      const Q = U8.fromBI(x, p_byte);\r\n\r\n      return { Q, d: d_buffer };\r\n    } else if (type === 'private_key') {\r\n      return { d: genRandomBI(n, p_byte).buffer };\r\n    } else if (type === 'public_key') {\r\n      const d_buffer = typeof s_key!.d === 'bigint' ? U8.fromBI(s_key!.d) : U8.from(s_key!.d);\r\n      const d = typeof s_key!.d === 'bigint' ? s_key!.d : d_buffer.toBI();\r\n      if (d === 0n) throw new KitError('Invalid private key');\r\n\r\n      const x = ladder(clamp(d), Gx, p, a24, 448);\r\n      const Q = U8.fromBI(x, p_byte);\r\n\r\n      return { Q, d: d_buffer };\r\n    }\r\n  }\r\n\r\n  const ecdh: X448['dh'] = (s_key: X448PrivateKey, p_key: X448PublicKey): U8 => {\r\n    const u = typeof p_key.Q === 'bigint' ? p_key.Q : u8(p_key.Q).toBI();\r\n    const k = typeof s_key.d === 'bigint' ? s_key.d : u8(s_key.d).toBI();\r\n    const x = ladder(clamp(k), u, p, a24, 448);\r\n\r\n    return U8.fromBI(x, p_byte);\r\n  };\r\n\r\n  return { gen, dh: ecdh };\r\n})();\r\n","import type { CSUtils } from '../../core/coordinate_system';\r\nimport type { ECJacobian, ECLópezDahab, FbKECParams, FbPECParams, FpMECParams, FpWECParams } from '../../core/ec';\r\nimport { sm2p256v1 } from '../../core/ec_params';\r\nimport type { Hash } from '../../core/hash';\r\nimport type { KDF } from '../../core/kdf';\r\nimport { x963kdf } from '../../core/kdf';\r\nimport { genBitMask, getBIBits, joinBuffer, KitError, mod, modInverse, U8 } from '../../core/utils';\r\nimport { sm3 } from '../../hash/sm3';\r\nimport type {\r\n  ECCBase,\r\n  ECCFbKoblitz,\r\n  ECCFbPseudoRandom,\r\n  ECCFpMontgomery,\r\n  ECCFpWeierstrass,\r\n  ECKeyPair,\r\n  ECPrivateKey,\r\n  ECPublicKey,\r\n} from './ecc';\r\nimport { ECC } from './ecc';\r\n\r\nexport interface SM2DI {\r\n  /**\r\n   * SM2 可辨别标识散列\r\n   *\r\n   * SM2 Distinguishable Identity Hash\r\n   *\r\n   * @param {Uint8Array} id - 用户标识 / User Identity\r\n   * @param {ECPublicKey} key - 公钥 / Public Key\r\n   * @param {Hash} hash - 哈希算法 / Hash Algorithm (default: SM3)\r\n   */\r\n  (id: Uint8Array, key: ECPublicKey, hash?: Hash): U8;\r\n}\r\n\r\nexport interface SM2DH {\r\n  /**\r\n   * SM2 椭圆曲线迪菲-赫尔曼, 密钥协商算法\r\n   *\r\n   * SM2 Elliptic Curve Diffie-Hellman Key Agreement Algorithm\r\n   *\r\n   * @param {ECKeyPair} KA - 己方密钥对 / Self Key Pair\r\n   * @param {ECPublicKey} KX - 己方临时密钥对 / Self Temporary Key Pair\r\n   * @param {ECPublicKey} KB - 对方公钥 / Opposite Public Key\r\n   * @param {ECPublicKey} KY - 对方临时公钥 / Opposite Temporary Public Key\r\n   * @param [Uint8Array] ZA - 发起方标识派生值 / Initiator Identity Derived Value\r\n   * @param [Uint8Array] ZB - 接收方标识派生值 / Receiver Identity Derived Value\r\n   * @returns {U8} - 密钥材料 / Keying Material\r\n   */\r\n  (KA: ECKeyPair, KX: ECKeyPair, KB: ECPublicKey, KY: ECPublicKey, ZA?: Uint8Array, ZB?: Uint8Array): U8;\r\n}\r\n\r\nexport interface SM2DSASignature {\r\n  r: bigint;\r\n  s: bigint;\r\n}\r\nexport interface SM2DSA {\r\n  /**\r\n   * SM2 椭圆曲线数字签名\r\n   *\r\n   * SM2 Elliptic Curve Digital Signature Algorithm\r\n   *\r\n   * @param {Hash} hash - 哈希算法 / Hash Algorithm (default: SM3)\r\n   */\r\n  (\r\n    hash?: Hash,\r\n  ): {\r\n    /**\r\n     * @param {Uint8Array} Z - 标识派生值 / Identity Derived Value\r\n     * @param {ECPrivateKey} key - 签名方私钥 / Signer Private Key\r\n     * @param {Uint8Array} M - 消息 / Message\r\n     */\r\n    sign: (Z: Uint8Array, key: ECPrivateKey, M: Uint8Array) => SM2DSASignature;\r\n    /**\r\n     * @param {Uint8Array} Z - 标识派生值 / Identity Derived Value\r\n     * @param {ECPublicKey} key - 签名方公钥 / Signer Public Key\r\n     * @param {Uint8Array} M - 消息 / Message\r\n     * @param {SM2DSASignature} S - 签名 / Signature\r\n     */\r\n    verify: (Z: Uint8Array, key: ECPublicKey, M: Uint8Array, S: SM2DSASignature) => boolean;\r\n  };\r\n}\r\n\r\nexport interface SM2Encrypt {\r\n  /**\r\n   * SM2 椭圆曲线加密\r\n   *\r\n   * SM2 Elliptic Curve Encryption\r\n   *\r\n   * @param {ECPublicKey} p_key - 接收方公钥 / Receiver Public Key\r\n   * @param {Uint8Array} M - 明文 / Plaintext\r\n   */\r\n  (p_key: ECPublicKey, M: Uint8Array): U8;\r\n}\r\nexport interface SM2Decrypt {\r\n  /**\r\n   * SM2 椭圆曲线解密\r\n   *\r\n   * SM2 Elliptic Curve Decryption\r\n   *\r\n   * @param {ECPrivateKey} s_key - 解密方私钥 / Decryptor Private Key\r\n   * @param {Uint8Array} C - 密文 / Ciphertext\r\n   */\r\n  (s_key: ECPrivateKey, C: Uint8Array): U8;\r\n}\r\nexport interface SM2EncryptionScheme {\r\n  /**\r\n   * SM2 椭圆曲线加密方案\r\n   *\r\n   * SM2 Elliptic Curve Encryption Scheme\r\n   *\r\n   * @param {Hash} hash - 哈希算法 / Hash Algorithm (default: SM3)\r\n   * @param {KDF} kdf - 密钥派生函数 / Key Derivation Function (default: X9.63 KDF with SM3)\r\n   * @param {'c1c2c3' | 'c1c3c2'} order - 密文分段顺序 / Ciphertext Segment Order (default: 'c1c3c2')\r\n   */\r\n  (\r\n    hash?: Hash,\r\n    kdf?: KDF,\r\n    order?: 'c1c2c3' | 'c1c3c2',\r\n  ): {\r\n    encrypt: SM2Encrypt;\r\n    decrypt: SM2Decrypt;\r\n  };\r\n}\r\n\r\nexport interface SM2Base {\r\n  /**\r\n   * 生成 SM2 椭圆曲线密钥\r\n   *\r\n   * Generate SM2 Elliptic Curve Key\r\n   */\r\n  gen: ECCBase['gen'];\r\n  /**\r\n   * SM2 可辨别标识散列\r\n   *\r\n   * SM2 Distinguishable Identity Hash\r\n   */\r\n  di: SM2DI;\r\n  /**\r\n   * SM2 椭圆曲线加密方案\r\n   *\r\n   * SM2 Elliptic Curve Encryption Scheme\r\n   */\r\n  es: SM2EncryptionScheme;\r\n  /**\r\n   * SM2 椭圆曲线迪菲-赫尔曼, 密钥协商算法\r\n   *\r\n   * SM2 Elliptic Curve Diffie-Hellman Key Agreement Algorithm\r\n   */\r\n  dh: SM2DH;\r\n  /**\r\n   * SM2 椭圆曲线数字签名\r\n   *\r\n   * SM2 Elliptic Curve Digital Signature Algorithm\r\n   */\r\n  dsa: SM2DSA;\r\n}\r\nexport interface SM2FpWeierstrass extends SM2Base {\r\n  parameters: FpWECParams;\r\n  utils: ECJacobian;\r\n}\r\nexport interface SM2FpMontgomery extends SM2Base {\r\n  parameters: FpMECParams;\r\n  utils: ECJacobian;\r\n}\r\nexport interface SM2FbPseudoRandom extends SM2Base {\r\n  parameters: FbPECParams;\r\n  utils: ECLópezDahab;\r\n}\r\nexport interface SM2FbKoblitz extends SM2Base {\r\n  parameters: FbKECParams;\r\n  utils: ECLópezDahab;\r\n}\r\n\r\n/**\r\n * SM2 椭圆曲线公钥密码算法\r\n *\r\n * Public Key Cryptography Algorithm SM2 Based on Elliptic Curves\r\n *\r\n * @param curve - 椭圆曲线参数 / Elliptic Curve Parameters (default: sm2p256v1)\r\n */\r\nexport function sm2(curve: undefined): SM2FpWeierstrass;\r\nexport function sm2(curve: FpWECParams): SM2FpWeierstrass;\r\nexport function sm2(curve: FpMECParams): SM2FpMontgomery;\r\nexport function sm2(curve: FbPECParams): SM2FbPseudoRandom;\r\nexport function sm2(curve: FbKECParams): SM2FbKoblitz;\r\nexport function sm2(curve: FpWECParams | FpMECParams | FbPECParams | FbKECParams = sm2p256v1) {\r\n  let ecc: ECCFpWeierstrass | ECCFpMontgomery | ECCFbPseudoRandom | ECCFbKoblitz;\r\n  switch (curve.type) {\r\n    case 'Weierstrass':\r\n      ecc = ECC(curve);\r\n      break;\r\n    case 'Montgomery':\r\n      ecc = ECC(curve);\r\n      break;\r\n    case 'Pseudo-Random':\r\n      ecc = ECC(curve);\r\n      break;\r\n    case 'Koblitz':\r\n      ecc = ECC(curve);\r\n      break;\r\n    default:\r\n      throw new KitError('unsupported curve type');\r\n  }\r\n  let toCatalyst: CSUtils['toJacobian'] | CSUtils['toLD'];\r\n  switch (ecc.utils.catalyst) {\r\n    case 'jacobian':\r\n      toCatalyst = ecc.utils.cs.toJacobian;\r\n      break;\r\n    case 'ld':\r\n      toCatalyst = ecc.utils.cs.toLD;\r\n      break;\r\n    default:\r\n      throw new KitError('unsupported catalyst type');\r\n  }\r\n\r\n  const { G, a, b, n, h } = curve;\r\n  /** 优化基点 */\r\n  const CG = toCatalyst(G);\r\n  const p = 'p' in curve ? curve.p : undefined;\r\n  const p_bit = p ? getBIBits(p) : undefined;\r\n  const p_byte = p ? (p_bit! + 7) >> 3 : undefined;\r\n  const m = 'm' in curve ? curve.m : undefined;\r\n  const m_bit = m ? getBIBits(m) : undefined;\r\n  const m_byte = m ? (m_bit! + 7) >> 3 : undefined;\r\n  const ele_byte = p_byte ?? m_byte!;\r\n\r\n  const { addPoint, mulPoint, isLegalPK } = ecc.utils;\r\n  const toAffine = ecc.utils.cs.toAffine;\r\n\r\n  const a_buffer = U8.fromBI(a);\r\n  const b_buffer = U8.fromBI(b);\r\n  const Gx_buffer = U8.fromBI(G.x);\r\n  const Gy_buffer = U8.fromBI(G.y);\r\n\r\n  const gen = ecc.gen;\r\n  const PointToU8 = ecc.utils.PointToU8;\r\n  const U8ToPoint = ecc.utils.U8ToPoint;\r\n  const di: SM2DI = (id: Uint8Array, key: ECPublicKey, hash: Hash = sm3) => {\r\n    const ent = id.length << 3;\r\n    if (ent > 0xffff) throw new KitError('ID长度超过了最大限制');\r\n\r\n    const ENT = new Uint8Array([ent >> 8, ent & 0xff]);\r\n    const a = a_buffer;\r\n    const b = b_buffer;\r\n    const Gx = Gx_buffer;\r\n    const Gy = Gy_buffer;\r\n    const Ax = typeof key.Q.x === 'bigint' ? U8.fromBI(key.Q.x) : U8.from(key.Q.x);\r\n    const Ay = typeof key.Q.y === 'bigint' ? U8.fromBI(key.Q.y) : U8.from(key.Q.y);\r\n    const ZA = hash(joinBuffer(ENT, id, a, b, Gx, Gy, Ax, Ay));\r\n\r\n    return ZA;\r\n  };\r\n  const w = Math.ceil(getBIBits(n) / 2) - 1;\r\n  const w_mask = genBitMask(w);\r\n  const dh: SM2DH = (\r\n    KA: ECKeyPair,\r\n    KX: ECKeyPair,\r\n    KB: ECPublicKey,\r\n    KY: ECPublicKey,\r\n    ZA = new Uint8Array(),\r\n    ZB = new Uint8Array(),\r\n  ) => {\r\n    if (isLegalPK(KB.Q) === false || isLegalPK(KY.Q) === false) throw new KitError('非法的公钥');\r\n\r\n    const KA_d = KA.d;\r\n    const KX_d = KX.d;\r\n    const KX_Q_x = KX.Q.x;\r\n    const KY_Q_x = KY.Q.x;\r\n    const x1 = (1n << BigInt(w)) + (KX_Q_x & w_mask);\r\n    const x2 = (1n << BigInt(w)) + (KY_Q_x & w_mask);\r\n\r\n    const t = mod(KA_d + KX_d * x1, n);\r\n    const KBQ = toCatalyst(KB.Q);\r\n    const KYQ = toCatalyst(KY.Q);\r\n    const V_j = mulPoint(addPoint(KBQ as any, mulPoint(KYQ as any, x2) as any) as any, h * t);\r\n    if (V_j.isInfinity) throw new KitError('协商失败');\r\n\r\n    const V = toAffine(V_j);\r\n    const xu = U8.fromBI(V.x);\r\n    const yu = U8.fromBI(V.y);\r\n\r\n    return joinBuffer(xu, yu, ZA, ZB);\r\n  };\r\n  const dsa: SM2DSA = (hash: Hash = sm3) => {\r\n    if (hash.DIGEST_SIZE !== 32) throw new KitError('不支持的哈希算法');\r\n\r\n    const sign = (Z: Uint8Array, key: ECPrivateKey, M: Uint8Array) => {\r\n      const dA = key.d;\r\n      let r = 0n;\r\n      let s = 0n;\r\n      const e = hash(joinBuffer(Z, M)).toBI();\r\n      do {\r\n        const k = gen('private_key').d;\r\n        const p = toAffine(mulPoint(CG as any, k));\r\n        r = mod(e + p.x, n);\r\n        if (r === 0n || r + k === n) continue;\r\n\r\n        const numerator = mod(k - r * dA, n);\r\n        const denominator = modInverse(1n + dA, n);\r\n        s = mod(numerator * denominator, n);\r\n        if (s === 0n) continue;\r\n        break;\r\n        // biome-ignore lint/correctness/noConstantCondition: <try not to throw an error when the probability event does not happen, just repeat the process>\r\n      } while (1);\r\n\r\n      return { r, s };\r\n    };\r\n    const verify = (Z: Uint8Array, key: ECPublicKey, M: Uint8Array, S: SM2DSASignature) => {\r\n      const PA = toCatalyst(key.Q);\r\n      const { r, s } = S;\r\n      if (r <= 0n || r >= n || s <= 0n || s >= n) return false;\r\n\r\n      const e = hash(joinBuffer(Z, M)).toBI();\r\n      const t = mod(r + s, n);\r\n      if (t === 0n) return false;\r\n\r\n      const p = toAffine(addPoint(mulPoint(CG as any, s) as any, mulPoint(PA as any, t) as any));\r\n      const R = mod(e + p.x, n);\r\n\r\n      return R === r;\r\n    };\r\n\r\n    return { sign, verify };\r\n  };\r\n  const es: SM2EncryptionScheme = (hash = sm3, kdf = x963kdf(sm3), order = 'c1c3c2') => {\r\n    const encrypt: SM2Encrypt = (p_key: ECPublicKey, M: Uint8Array) => {\r\n      const C1 = gen();\r\n      const Q = toCatalyst(p_key.Q);\r\n      const S = mulPoint(Q as any, h);\r\n      if (S.isInfinity) throw new KitError('加密失败');\r\n\r\n      const { x, y } = toAffine(mulPoint(Q as any, C1.d));\r\n      const x2 = U8.fromBI(x);\r\n      const y2 = U8.fromBI(y);\r\n      const ikm = joinBuffer(x2, y2);\r\n      const C2 = kdf(M.length, ikm);\r\n      C2.forEach((_, i) => {\r\n        C2[i] ^= M[i];\r\n      });\r\n      const C3 = hash(joinBuffer(x2, M, y2));\r\n\r\n      return order === 'c1c2c3' ? joinBuffer(PointToU8(C1.Q), C2, C3) : joinBuffer(PointToU8(C1.Q), C3, C2);\r\n    };\r\n    const decrypt: SM2Decrypt = (s_key: ECPrivateKey, C: Uint8Array) => {\r\n      const C1_Length = (ele_byte << 1) + 1;\r\n      const C3_Length = hash.DIGEST_SIZE;\r\n      const C2_Length = C.length - C1_Length - C3_Length;\r\n      const C1 = toCatalyst(U8ToPoint(C.subarray(0, C1_Length)));\r\n      const S = mulPoint(C1 as any, h);\r\n      if (S.isInfinity) throw new KitError('解密失败');\r\n\r\n      const { x, y } = toAffine(mulPoint(C1 as any, s_key.d));\r\n      const x2 = U8.fromBI(x);\r\n      const y2 = U8.fromBI(y);\r\n      const ikm = joinBuffer(x2, y2);\r\n      const t = kdf(C2_Length, ikm);\r\n      let C2: Uint8Array;\r\n      let C3: Uint8Array;\r\n      if (order === 'c1c2c3') {\r\n        C2 = C.subarray(C1_Length, C1_Length + C2_Length);\r\n        C3 = C.subarray(C1_Length + C2_Length);\r\n      } else {\r\n        C3 = C.subarray(C1_Length, C1_Length + C3_Length);\r\n        C2 = C.subarray(C1_Length + C3_Length);\r\n      }\r\n      const M = t.map((_, i) => t[i] ^ C2[i]);\r\n      const u = hash(joinBuffer(x2, M, y2));\r\n      const isEqual = u.length === C3.length && u.every((val, i) => val === C3[i]);\r\n      if (!isEqual) throw new KitError('解密失败');\r\n\r\n      return M;\r\n    };\r\n\r\n    return { encrypt, decrypt };\r\n  };\r\n\r\n  return {\r\n    utils: ecc.utils,\r\n    gen,\r\n    di,\r\n    es,\r\n    dh,\r\n    dsa,\r\n  };\r\n}\r\n"],"names":["rotateL32","x","n","rotateR32","rotateL","bit","mask","genBitMask","rotateR","genRandomBI","max","byte","max_attempts","KitError","buffer","U8","result","attempts","getBIBits","w","i","extendedEuclidean","a","b","s0","s1","t0","t1","r0","r1","q","legendreSymbol","p","modPow","tonelliShanks","s","mod","z","m","c","t","r","t2i","gcd","lcm","y","modInverse","_x","modPrimeSquareRoot","r2","word_size","index","little_endian","offset","word","length","codec","bigint","input","predicate","thisArg","_","items","array_like","mapfn","this_arg","callbackfn","start","end","begin","compareFn","value","u8","source","u32","joinBuffer","buffers","byte_total","acc","cur","resizeBuffer","size","Counter","trying","fn","error","wrap","args","message","T","LOW_PRIMES","LOW_PRIMES_LIMIT","MillerRabin","n_1","d","tested","base","StrongPseudoPrime","_isProbablePrime","j","genPrimeCandidate","n_mod_6","genPrime","isProbablePrime","createCodec","parse","stringify","format","UTF8ToU8","char_code","U8ToUTF8","str","byte1","byte2","byte3","byte4","UTF8","HEXToU8","arr","h","U8ToHEX","HEX","B64ToU8","B64CommonParse","U8ToB64","B64CommonStringify","B64","B64URLToU8","U8ToB64URL","B64URL","map","combined","url","TheB32Codec","RFC4648_B32_MAP","B32CommonParse","B32CommonStringify","variant","padding","B32HexToU8","RFC4648_B32_HEX_MAP","U8ToB32Hex","B32CrockfordToU8","RFC4648_B32_CROCKFORD_MAP","U8ToB32Crockford","B32","e","f","g","pad","E0","E1","E2","E3","E4","CSVToU8","coreValueMap","from","nibble","coreValues","l","count","isHigh","U8ToCSV","rand","CSV","createHash","digest","description","createTupleHash","createKeyHash","FF","X","Y","Z","GG","P0","P1","state","state_view","m_byte","m_bit","block_size","block_total","p_view","H0","H1","H2","H3","H4","H5","H6","H7","A","B","C","D","E","F","G","H","W","W1","SS1","SS2","TT1","TT2","sm3","K","k","HH","II","M","md5","Ch","Parity","Maj","ft","sha1","Sigma0","Sigma1","sigma0","sigma1","h0","h1","h2","h3","h4","h5","h6","h7","T1","T2","sha224Digest","sha256Digest","sha224","sha256","mask64","rotateR64","IVGen","sha384Digest","sha512Digest","sha384","sha512","sha512t","status","OID","R","RC12","RC24","rotateL64","RCGen","nr","RCTable","ir","RC","rc","createStateArray","toStateArray","S","view","toState","theta","rhoPi","_A","chi","iota","keccak_p_1600","sponge_1600","r_byte","d_byte","P","Pi","z_byte","sha3Padding","sig_byte","pad_byte","shakePadding","Keccak_c","rByte","sha3_224","sha3_256","sha3_384","sha3_512","shake128","shake256","leftEncode","rightEncode","encodeString","bytepad","left_encoded_w","zero_byte","cshakePadding","cshake","N","SHAKE","cshake128","cshake256","kmac","XOF","kmac128","k_size","kmac256","kmac128XOF","kmac256XOF","tuplehash","tuplehash128","tuplehash256","tuplehash128XOF","tuplehash256XOF","parallelhash","bByte","parallelhash128","parallelhash256","parallelhash128XOF","parallelhash256XOF","turboShakePadding","block","turboshake128","turboshake256","lengthEncode","kt","cv","length_encode","FinalNode","num_block","CV","kt128","kt256","_hmac","hash","BLOCK_SIZE","K0","iPad","oPad","innerBuffer","hmac","d_size","ALGORITHM","DIGEST_SIZE","hotp","secret","counter","mac","HS","totp","current","epoch","step","digits","BIN","createCipher","algorithm","key","iv","createPadding","doPad","unPad","PKCS7_PAD","ISO7816_PAD","BLOCK_TOTAL","X923_PAD","ZERO_PAD","NO_PAD","ecb","cipher","info","cbc","prev","pcbc","IV","_C","_P","cfb","ofb","SByte","squeeze","TByte","ctr","GF128Mul","RH","YView","VH","VL","ZH","ZL","carry","ZView","GHASH","A_BLOCK_TOTAL","C_BLOCK_TOTAL","gcm","tag_size","encrypt","decrypt","sign","KSA","SBox","_arc4","arc4","_rabbit","X32","C32","nextState","skipExtract","K16","KH","KL","CH","CL","iv32","iv16","rabbit","rounds","expand","S32","K32","N32","_salsa20","salsa20","S0","S1","mulPow2n","v","addMod31","L1","L2","BR","X0","X1","X2","W2","next","u","s16","zuc","LFSR","createEEA_IV","bearer","direction","createEIA_IV","getWord","bit_offset","ti","byte_offset","eea3","param","BEARER","DIRECTION","KEY","COUNTER","LENGTH","WORD_COUNT","EEA_KeyStream","KSView","EEA_IV","prg","eia3","EIA_KeyStream","EIA_IV","InvSBox","ROUND","GFMultiply","KeyExpansion","Nr","Nk","i_1","temp","i_Nk","Wi_NK","Cipher","AddRoundKey","SubBytes","ShiftRows","S2","S6","S15","MixColumn","s2","s3","t2","t3","InvCipher","InvSubBytes","InvShiftRows","S13","S3","InvMixColumn","_aes","aes","_setup","round","word_bit","word_byte","Q","LV","SV","prv","L","_encrypt","MV","_decrypt","_arc5","WORD_SIZE","arc5","SBox1","SBox2","SBox3","SBox4","C1","C2","C3","RL128","x_byte","x_bit","shift","byte_shift","bit_shift","RR128","XOR","FO","RK","SL1","FE","SL2","KeyScheduling","_K","KR","CK1","CK2","CK3","W0","W3","EK","computeEK","DK","computeDK","ek01","ek02","ek03","ek04","ek05","ek06","ek07","ek08","ek09","ek10","ek11","ek12","ek13","ek14","ek15","ek16","ek17","_aria","aria","_blowfish","plaintext","c_view","c0","c1","ciphertext","p0","p1","blowfish","SBox1_1110","SBox4_4404","SBox2_0222","SBox3_3033","SIGMA","ROTL128","Camellia_Feistel","sh","sl","kh","kl","KeySchedule","KView","mapKey128","mapKey192","mapKey256","setup128","setup256","_encrypt128","CView","_encrypt256","_decrypt128","MView","_decrypt256","_cipher","_camellia","camellia","IP","FP","PC1","PC2","KEY_SHIFT","S4","S5","S7","S8","permute","table","output","substitute","generateKeys","key_set","kr","reverseKeys","keys","isEqual","l_next","_des","inv_key_set","_t_des","K1","K2","K3","d1","d2","d3","des","t_des","CK","tau","expandKey","rk","X3","X_","RView","_sm4","rkReversed","sm4","DELTA","_tea","sum_delta","sum","M32","_xtea","_xxtea","_round","tea","xtea","xxtea","config","P_00","P_01","P_02","P_03","P_04","P_10","P_11","P_12","P_13","P_14","P_20","P_21","P_22","P_23","P_24","P_30","P_31","P_32","P_33","P_34","GF256_FDBK_2","GF256_FDBK_4","RS_GF_FDBK","MDS","LFSR1","LFSR2","Mx_X","Mx_Y","m1","mX","mY","j0","j1","b0","b1","b2","b3","chooseB","RS_REM","g2","g3","RS_MDS_Encode","k0","k1","F32","K64SigByte","k32","lB0","lB1","lB2","lB3","k2","k3","K64LSB","Fe32","initKeySchedule","K32e","K32o","K64Count","SBoxKeys","Subkeys","lb0","lb1","lb2","lb3","K64CountLSB","_twofish","x0","x1","x2","x3","twofish","ASN1","id","node","bytes","encryptionPrimitive","decryptionPrimitive","signaturePrimitive","verificationPrimitive","genKey","rpg","λ","dP","dQ","qInv","fromKey","rsa","mgf1","mdfSeed","maskLen","pkcs1_es_oaep","mgf","label","hLen","MAX_MESSAGE_LENGTH","_rsa","lHash","mLen","PS","DB","seed","dbMask","maskedDB","seedMask","maskedSeed","EM","lHash_","mOffset","pkcs1_es_1_5","SeparatorIndex","pkcs1_ssa_pss","sLen","modBits","emLen","emsa","emsa_pss","pkcs1_ssa_1_5","emsa_1_5","EM2","emBits","mHash","salt","M2","bitMask","digestAlgorithm","psLen","x963kdf","k_byte","ikm","okm","okm_byte","data","hkdf","k_hash","prk","pbkdf2","iterations","U","scrypt","maxmem","kdf","BLOCK_SIZE_32","MAX_p","MEM_COST","N_1","rotl","fast_xor_salsa_hash","pi","ii","oi","y00","y01","y02","y03","y04","y05","y06","y07","y08","y09","y10","y11","y12","y13","y14","y15","x00","x01","x02","x03","x04","x05","x06","x07","x08","x09","x10","x11","x12","x13","x14","x15","block_mix","input_index","output_index","head","tail","V32","tmp","PI","pos","GF","_mod","inv","pow","root","add","sub","mul","GF2","m_1","m_h","reduce","poly","irreducible_degree","poly_degree","_mul","a_val","b_val","ipMask","squ","div","exp","CoordinateSystem","field","toAffine","z_inv","z_inv2","z_inv3","toJacobian","ZZ","ZZZ","toLD","LadderMultiply","R0","R1","bit_array","FpWEC","curve","p_byte","cs","include","_addPoint","Y1","Y2","numerator","denominator","y3","addPoint","Z1","Z2","ZZ1","ZZ2","U1","U2","Z3","XX","YY","Y3","HHH","U1HH","_mulPoint","mulPoint","point","compress","sign_y","PC","point_buffer","FpMEC","ZZZZ","NN","FbEC","isLegalPK","isLegalSK","half_trace","inv_x","inv_x2","z0","y0","z0_LSB","EC","defineECIES","ECC","ec","toCatalyst","CG","n_bit","n_mask","p_bit","ele_byte","gen","type","s_key","dh","p_key","u1","u2","v1","v2","u1d","u2d","u2Qx","v2Qx","Q2u","Q2v","v2Q","v1Q","signature","P_j","deriveShare","KE","KM","CT","sm2p256v1","secp160k1","secp160r1","secp160r2","secp192k1","secp192r1","secp224k1","secp224r1","secp256k1","secp256r1","secp384r1","secp521r1","sect163k1","sect163r1","sect163r2","sect233k1","sect233r1","sect239k1","sect283k1","sect283r1","sect409k1","sect409r1","sect571k1","sect571r1","prime192v1","prime256v1","p192","p224","p256","p384","p521","w25519","w448","curve25519","curve448","bp192r1","bp224r1","bp256r1","bp320r1","bp384r1","bp512r1","cSwap","swap","x_2","x_3","dummy","ladder","a24","z_2","z_3","AA","BB","DA","CB","x25519","Gx","clamp","d_buffer","x448","sm2","ecc","a_buffer","b_buffer","Gx_buffer","Gy_buffer","PointToU8","U8ToPoint","di","ent","ENT","Gy","Ax","Ay","w_mask","KA","KX","KB","KY","ZA","ZB","KA_d","KX_d","KX_Q_x","KY_Q_x","KBQ","KYQ","V_j","V","xu","yu","dsa","dA","PA","es","order","y2","C1_Length","C3_Length","C2_Length","val"],"mappings":"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,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACF,EACMC,IAAoB,IAAM,KAAOD,GAAWA,GAAW,OAAS,CAAC,EAUvE,SAASE,GAAY1F,EAAWsC,EAAoB,CAClD,MAAMqD,EAAM3F,EAAI,GAChB,IAAIiC,EAAI,GACJ2D,EAAID,EACR,MAAQC,EAAI,MAAQ,IAClBA,IAAM,GACN3D,IAGFK,EAAKA,EAAI,GAAM,EACXA,EAAIkD,GAAW,SAAQlD,EAAIkD,GAAW,QAE1C,MAAMK,EAAmB,CAAC,EAAE,EAC5B,QAAS3E,EAAI,EAAGA,EAAIoB,EAAG,EAAEpB,EAAG,CAE1B,IAAI4E,EACJ,GACEA,EAAON,GAAW,KAAK,MAAM,KAAK,OAAA,EAAWA,GAAW,MAAM,CAAC,QACxDK,EAAO,SAASC,CAAI,GAE7B,GADAD,EAAO,KAAKC,CAAI,EACZC,GAAkB/F,EAAG2F,EAAK1D,EAAG2D,EAAGE,CAAI,IAAM,GAC5C,MAAO,EAEX,CACA,MAAO,EACT,CAeA,SAASC,GAAkB/F,EAAW2F,EAAa1D,EAAW2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EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,CAAC,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,CAAC,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,CAAC,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,CAAC,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,EAAE,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,EAAE,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,EAAE,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,EAAE,EAAI5C,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,EAAE,EAAIA,EAAE,EAAE,EACvD4C,EAAE,EAAE,EAAI5C,EAAE,CAAC,EAAI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Y,QAAY,QAAY,QAAY,SAAY,QAAY,SAChG,SAAY,QAAY,SAAY,QAAY,QAAY,OAAY,QAAY,QAAY,QAChG,SAAY,SAAY,QAAY,SAAY,QAAY,QAAY,SAAY,SAAY,SAChG,QAAY,QAAY,QAAY,QAAY,SAAY,QAAY,QAAY,SAAY,QAChG,SAAY,QAAY,SAAY,OAAY,SAAY,SAAY,SAAY,SAAY,SAChG,SAAY,QAAY,QAAY,QAAY,SAAY,SAAY,SAAY,QAAY,QAChG,SAAY,QAAY,QAAY,QAAY,SAAY,QAAY,OAAY,QAAY,SAChG,SAAY,QAAY,QAAY,QAAY,SAAY,SAAY,OAAY,SAAY,QAChG,QAAY,QAAY,SAAY,QAAY,OAAY,SAAY,QAAY,SAAY,QAChG,SAAY,SAAY,QAAY,QAAY,QAAY,QAAY,QAAY,QAAY,QAChG,SAAY,QAAY,SAAY,QAAY,SAAY,QAAY,SAAY,QAAY,QAChG,QAAY,SAAY,QAAY,QAAY,QAAY,SAAY,QAAY,SAAY,SAChG,SAAY,SAAY,QAAY,SAAY,QAAY,SAAY,QAAY,QAAY,SAChG,QAAY,SAAY,SAAY,QAAY,QAAY,SAAY,SAAY,SAAY,SAChG,QAAY,QAAY,EAAY,QAAY,QAAY,SAAY,SAAY,SAAY,QAChG,OAAY,SAAY,SAAY,QAAY,QAAY,SAAY,QAAY,OAAY,SAChG,OAAY,OAAY,SAAY,QAAY,QAAY,QAAY,SAAY,SAAY,SAChG,SAAY,QAAY,SAAY,QAAY,SAAY,SAAY,QAAY,SAAY,QAChG,QAAY,QAAY,QAAY,QAAY,OAAY,QAAY,SAAY,QAAY,QAChG,QAAY,SAAY,QAAY,SAAY,SAAY,QAAY,QAAY,QAAY,SAChG,QAAY,QAAY,QAAY,SAAY,SAAY,QAAY,QAAY,SAAY,QAChG,SAAY,SAAY,QAAY,OAAY,SAAY,SAAY,QAAY,SAAY,QAChG,SAAY,QAAY,QAAY,QAAY,QAAY,QAAY,QAAY,SAAY,SAChG,OAAY,QAAY,SAAY,SAAY,SAAY,QAAY,QAAY,QAAY,QAChG,QAAY,SAAY,QAAY,QAAY,SAAY,QAAY,QAAY,QAAY,SAChG,SAAY,QAAY,QAAY,QAAY,QAAY,QAAY,SAAY,QAAY,SAChG,SAAY,QAAY,MAAY,OA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"}