{"version":3,"file":"index.cjs","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":["x","n","bit","mask","max","byte","max_attempts","buffer","result","attempts","w","i","a","b","s0","s1","t0","t1","r0","r1","q","p","s","z","m","c","t","r","t2i","y","gcd","_x","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","source","buffers","byte_total","acc","cur","size","fn","error","args","message","T","LOW_PRIMES","LOW_PRIMES_LIMIT","MillerRabin","n_1","d","tested","base","StrongPseudoPrime","modPow","_isProbablePrime","j","genPrimeCandidate","n_mod_6","U8","createCodec","parse","stringify","format","wrap","UTF8ToU8","trying","u8","char_code","U8ToUTF8","str","byte1","byte2","byte3","byte4","HEXToU8","arr","h","U8ToHEX","B64ToU8","B64CommonParse","U8ToB64","B64CommonStringify","B64URLToU8","U8ToB64URL","map","combined","url","TheB32Codec","RFC4648_B32_MAP","B32CommonParse","B32CommonStringify","variant","padding","B32HexToU8","RFC4648_B32_HEX_MAP","U8ToB32Hex","B32CrockfordToU8","RFC4648_B32_CROCKFORD_MAP","U8ToB32Crockford","e","f","g","pad","E0","E1","E2","E3","E4","CSVToU8","coreValueMap","from","nibble","KitError","coreValues","l","count","isHigh","U8ToCSV","rand","digest","description","FF","X","Y","Z","GG","P0","rotateL32","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","createHash","K","k","HH","II","M","Ch","Parity","Maj","ft","Sigma0","rotateR32","Sigma1","sigma0","sigma1","h0","h1","h2","h3","h4","h5","h6","h7","T1","T2","sha224Digest","sha256Digest","mask64","genBitMask","rotateR64","rotateR","IVGen","UTF8","sha384Digest","sha512Digest","status","OID","R","RC12","RC24","rotateL64","rotateL","nr","RCTable","ir","RC","rc","createStateArray","toStateArray","S","view","toState","theta","rhoPi","_A","chi","iota","r_byte","d_byte","P","Pi","z_byte","joinBuffer","sha3Padding","sig_byte","pad_byte","shakePadding","rByte","sponge_1600","leftEncode","rightEncode","encodeString","bytepad","left_encoded_w","zero_byte","cshakePadding","cshake","N","SHAKE","Keccak_c","shake128","shake256","kmac","XOF","k_size","createKeyHash","tuplehash","createTupleHash","parallelhash","bByte","turboShakePadding","block","keccak_p_1600","lengthEncode","kt","cv","length_encode","FinalNode","num_block","CV","turboshake128","turboshake256","_hmac","hash","BLOCK_SIZE","K0","iPad","oPad","innerBuffer","d_size","ALGORITHM","DIGEST_SIZE","hotp","secret","counter","mac","hmac","sha1","HS","current","epoch","step","digits","BIN","algorithm","key","iv","doPad","unPad","BLOCK_TOTAL","cipher","info","prev","IV","_C","_P","SByte","squeeze","TByte","Counter","GF128Mul","RH","YView","VH","VL","ZH","ZL","carry","ZView","GHASH","A_BLOCK_TOTAL","C_BLOCK_TOTAL","tag_size","encrypt","decrypt","sign","KSA","SBox","_arc4","createCipher","_rabbit","X32","C32","nextState","skipExtract","K16","KH","KL","CH","CL","iv32","iv16","resizeBuffer","rounds","u32","expand","S32","K32","N32","_salsa20","S0","S1","mulPow2n","v","addMod31","L1","L2","BR","X0","X1","X2","W2","next","u","s16","LFSR","createEEA_IV","bearer","direction","createEIA_IV","getWord","bit_offset","ti","byte_offset","param","BEARER","DIRECTION","KEY","COUNTER","LENGTH","WORD_COUNT","EEA_KeyStream","KSView","EEA_IV","prg","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","_setup","round","word_bit","word_byte","Q","LV","SV","prv","L","_encrypt","MV","_decrypt","_arc5","WORD_SIZE","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","_blowfish","plaintext","c_view","c0","c1","ciphertext","p0","p1","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","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","CK","tau","expandKey","rk","X3","X_","RView","_sm4","rkReversed","DELTA","_tea","sum_delta","sum","M32","_xtea","_xxtea","_round","config","PKCS7_PAD","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","id","node","bytes","encryptionPrimitive","decryptionPrimitive","signaturePrimitive","verificationPrimitive","genKey","rpg","genPrime","λ","lcm","modInverse","dP","mod","dQ","qInv","fromKey","mdfSeed","maskLen","sha256","mgf","label","getBIBits","hLen","MAX_MESSAGE_LENGTH","_rsa","rsa","lHash","mLen","PS","DB","seed","dbMask","maskedDB","seedMask","maskedSeed","EM","lHash_","mOffset","SeparatorIndex","sLen","modBits","emLen","emsa","emsa_pss","emsa_1_5","EM2","emBits","mHash","salt","M2","bitMask","digestAlgorithm","ASN1","psLen","k_byte","ikm","okm","okm_byte","data","k_hash","prk","iterations","U","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","B32","V32","tmp","PI","pos","_mod","inv","pow","root","modPrimeSquareRoot","add","sub","mul","m_1","m_h","reduce","poly","irreducible_degree","poly_degree","_mul","a_val","b_val","ipMask","squ","div","exp","field","toAffine","z_inv","z_inv2","z_inv3","toJacobian","ZZ","ZZZ","toLD","LadderMultiply","R0","R1","bit_array","curve","p_byte","GF","cs","CoordinateSystem","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","ZZZZ","NN","GF2","isLegalPK","isLegalSK","half_trace","inv_x","inv_x2","z0","y0","z0_LSB","cbc","aes","x963kdf","ec","EC","toCatalyst","CG","n_bit","n_mask","p_bit","ele_byte","gen","type","s_key","genRandomBI","dh","p_key","u1","u2","v1","v2","u1d","u2d","u2Qx","v2Qx","Q2u","Q2v","v2Q","v1Q","signature","P_j","o","deriveShare","KE","KM","CT","cSwap","swap","x_2","x_3","dummy","ladder","a24","z_2","z_3","AA","BB","DA","CB","curve25519","Gx","clamp","d_buffer","curve448","sm2p256v1","ecc","ECC","a_buffer","b_buffer","Gx_buffer","Gy_buffer","PointToU8","U8ToPoint","di","sm3","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,IACF,EACMC,KAAoB,IAAM,KAAOD,IAAWA,IAAW,OAAS,CAAC,EAUvE,SAASE,EAAYnE,EAAWyB,EAAoB,CAClD,MAAM2C,GAAMpE,EAAI,GAChB,IAAIqB,GAAI,GACJgD,GAAID,GACR,MAAQC,GAAI,MAAQ,IAClBA,KAAM,GACNhD,KAGFI,EAAKA,EAAI,GAAM,EACXA,EAAIwC,IAAW,SAAQxC,EAAIwC,IAAW,QAE1C,MAAMK,GAAmB,CAAC,EAAE,EAC5B,QAAS5D,GAAI,EAAGA,GAAIe,EAAG,EAAEf,GAAG,CAE1B,IAAI6D,GACJ,GACEA,GAAON,IAAW,KAAK,MAAM,KAAK,OAAA,EAAWA,IAAW,MAAM,CAAC,QACxDK,GAAO,SAASC,EAAI,GAE7B,GADAD,GAAO,KAAKC,EAAI,EACZC,IAAkBxE,EAAGoE,GAAK/C,GAAGgD,GAAGE,EAAI,IAAM,GAC5C,MAAO,EAEX,CACA,MAAO,EACT,CAeA,SAASC,IAAkBxE,EAAWoE,EAAa/C,GAAWgD,GAAWE,GAAuB,CAC9F,IAAIxE,GAAI0E,OAAOF,GAAMF,GAAGrE,CAAC,EACzB,GAAID,KAAM,IAAMA,KAAMqE,EAAK,MAAO,GAElC,IAAIxC,GAAI,GACR,QAASlB,GAAI,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,WAAW,CAC3B,GAAM,EAAM,IAAM,IAAM,GAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC5G,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAC5G,GAAM,GAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,GAAM,EAAM,GAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAC5G,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAC5G,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAC5G,IAAM,IAAM,IAAM,IAAM,EAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,EAAM,IAAM,IAAM,GAAM,EAAM,IAAM,GAC5G,GAAM,IAAM,IAAM,GAAM,GAAM,EAAM,IAAM,IAAM,IAAM,EAAM,EAAM,GAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAC5G,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAC5G,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAC5G,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC5G,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,EAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAAM,GAAM,IAAM,IAAM,GAAM,GAC5G,GAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAM,GAC5G,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,G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Cd,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAChG,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,WAChG,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAChG,WAAY,UAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,UAAY,WAChG,UAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,UAChG,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAChG,WAAY,WAAY,UAAY,UAAY,WAAY,UAAY,WAAY,WAAY,WAChG,UAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,SAAY,WAChG,WAAY,WAAY,UAAY,WAAY,WAAY,UAAY,UAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAChG,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,UAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAChG,WAAY,UAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,UAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,UAChG,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,WAChG,WAAY,WAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAChG,WAAY,UAAY,WAAY,WAAY,UAAY,WAAY,WAAY,WAAY,WAChG,WAAY,WAAY,WAAY,WAAY,QAAY,UAAY,UAAY,WAAY,UAChG,WAAY,WAAY,WAAY,WAAY,WAAY,UAAY,SAAY,WAAY,WAChG,U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"}