{"version":3,"sources":["../src/crypto/hash.ts"],"names":[],"mappings":"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","file":"chunk-LGEXW2O6.cjs","sourcesContent":["/**\n * 密码哈希工具\n *\n * 优先使用 Web Crypto API，非安全上下文（HTTP）自动降级为纯 JS 实现并输出警告\n */\n\n/** 字节数组转 Hex 字符串 */\nfunction bytesToHex(bytes: Uint8Array): string {\n  return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/** 纯 JS SHA-256 实现（非安全上下文降级用） */\nfunction sha256JS(data: Uint8Array): Uint8Array {\n  const K = [\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n    0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n    0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n  ];\n\n  const rotr = (n: number, x: number) => (x >>> n) | (x << (32 - n));\n  const ch = (x: number, y: number, z: number) => (x & y) ^ (~x & z);\n  const maj = (x: number, y: number, z: number) => (x & y) ^ (x & z) ^ (y & z);\n  const sigma0 = (x: number) => rotr(2, x) ^ rotr(13, x) ^ rotr(22, x);\n  const sigma1 = (x: number) => rotr(6, x) ^ rotr(11, x) ^ rotr(25, x);\n  const gamma0 = (x: number) => rotr(7, x) ^ rotr(18, x) ^ (x >>> 3);\n  const gamma1 = (x: number) => rotr(17, x) ^ rotr(19, x) ^ (x >>> 10);\n\n  const bitLen = data.length * 8;\n  const padded = new Uint8Array(Math.ceil((data.length + 9) / 64) * 64);\n  padded.set(data);\n  padded[data.length] = 0x80;\n  const view = new DataView(padded.buffer);\n  view.setUint32(padded.length - 4, bitLen, false);\n\n  let [h0, h1, h2, h3, h4, h5, h6, h7] = [\n    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,\n    0x1f83d9ab, 0x5be0cd19,\n  ];\n\n  for (let offset = 0; offset < padded.length; offset += 64) {\n    const W = new Array<number>(64);\n    for (let t = 0; t < 16; t++) W[t] = view.getUint32(offset + t * 4, false);\n    for (let t = 16; t < 64; t++)\n      W[t] = (gamma1(W[t - 2]) + W[t - 7] + gamma0(W[t - 15]) + W[t - 16]) | 0;\n\n    let [a, b, c, d, e, f, g, h] = [h0, h1, h2, h3, h4, h5, h6, h7];\n    for (let t = 0; t < 64; t++) {\n      const t1 = (h + sigma1(e) + ch(e, f, g) + K[t] + W[t]) | 0;\n      const t2 = (sigma0(a) + maj(a, b, c)) | 0;\n      h = g;\n      g = f;\n      f = e;\n      e = (d + t1) | 0;\n      d = c;\n      c = b;\n      b = a;\n      a = (t1 + t2) | 0;\n    }\n    h0 = (h0 + a) | 0;\n    h1 = (h1 + b) | 0;\n    h2 = (h2 + c) | 0;\n    h3 = (h3 + d) | 0;\n    h4 = (h4 + e) | 0;\n    h5 = (h5 + f) | 0;\n    h6 = (h6 + g) | 0;\n    h7 = (h7 + h) | 0;\n  }\n\n  const result = new Uint8Array(32);\n  const rv = new DataView(result.buffer);\n  [h0, h1, h2, h3, h4, h5, h6, h7].forEach((v, i) => {\n    rv.setUint32(i * 4, v, false);\n  });\n  return result;\n}\n\n/** 支持的哈希算法 */\nexport type HashAlgorithm = 'sha256';\n\n/** 是否已输出过降级警告 */\nlet fallbackWarned = false;\n\n/**\n * 对密码进行哈希处理（SHA-256）\n *\n * 优先使用 Web Crypto API，非安全上下文自动降级为纯 JS 实现并输出控制台警告\n *\n * @param password - 明文密码\n * @param algorithm - 哈希算法，默认 'sha256'\n * @returns 哈希后的字符串 (hex)\n */\nexport async function hashPassword(\n  password: string,\n  algorithm: HashAlgorithm = 'sha256',\n): Promise<string> {\n  if (!password) {\n    throw new Error('[Crypto] Password cannot be empty');\n  }\n\n  if (algorithm !== 'sha256') {\n    throw new Error(\n      `[Crypto] Unsupported hash algorithm: ${algorithm}. Only 'sha256' is supported.`,\n    );\n  }\n\n  const encoded = new TextEncoder().encode(password);\n\n  // 优先使用 Web Crypto API\n  const subtle = globalThis.crypto?.subtle;\n  if (subtle) {\n    const hashBuffer = await subtle.digest('SHA-256', encoded);\n    return bytesToHex(new Uint8Array(hashBuffer));\n  }\n\n  // 非安全上下文降级：输出警告 + 纯 JS 实现\n  if (!fallbackWarned) {\n    fallbackWarned = true;\n    console.error(\n      '[Crypto] Web Crypto API 不可用（非安全上下文），已降级为纯 JS SHA-256 实现，建议使用 HTTPS 访问',\n    );\n  }\n  return bytesToHex(sha256JS(encoded));\n}\n\n/**\n * 生成随机 hex 字符串\n *\n * @param length - 长度，默认 32\n * @returns 随机 hex 字符串\n */\nexport function generateRandomHex(length: number = 32): string {\n  const bytes = new Uint8Array(Math.ceil(length / 2));\n  crypto.getRandomValues(bytes);\n  return bytesToHex(bytes).slice(0, length);\n}\n"]}