{"version":3,"file":"pbkdf2.cjs","sources":["../src/hmac.ts","../src/pbkdf2.ts"],"sourcesContent":["import { concatBytes } from '@jscrypto/core';\nimport type { HashComponent } from '@jscrypto/core';\n\nexport function hmac(hash: HashComponent, key: Uint8Array, input: Uint8Array): Uint8Array {\n  const normalizedKey = key.length > hash.blockSize ? hash.hash(key) : key;\n  const innerKey = new Uint8Array(hash.blockSize);\n  const outerKey = new Uint8Array(hash.blockSize);\n  innerKey.set(normalizedKey);\n  outerKey.set(normalizedKey);\n\n  for (let i = 0; i < hash.blockSize; i++) {\n    innerKey[i] ^= 0x36;\n    outerKey[i] ^= 0x5c;\n  }\n\n  return hash.hash(concatBytes(outerKey, hash.hash(concatBytes(innerKey, input))));\n}\n","import { concatBytes } from '@jscrypto/core';\nimport type { HashComponent, KdfComponent, PresetComponent } from '@jscrypto/core';\nimport { hmac } from './hmac.js';\n\ndeclare const TextEncoder: {\n  new(): { encode(input: string): Uint8Array };\n};\n\nexport interface Pbkdf2Params {\n  input: Uint8Array | string;\n  salt: Uint8Array | string;\n  iterations: number;\n  length: number;\n  hash?: string;\n}\n\nexport interface DerivePbkdf2Params extends Omit<Pbkdf2Params, 'hash'> {\n  hash: HashComponent;\n}\n\nexport const pbkdf2: KdfComponent<'PBKDF2'> = {\n  kind: 'kdf',\n  name: 'PBKDF2',\n  derive(params, context) {\n    const options = params as Pbkdf2Params;\n    return derivePbkdf2({\n      ...options,\n      hash: context.getHash(options.hash ?? 'SHA256'),\n    });\n  },\n};\n\nexport const pbkdf2Preset: PresetComponent<'pbkdf2'> = {\n  kind: 'preset',\n  name: 'pbkdf2',\n  components() {\n    return [pbkdf2];\n  },\n};\n\nexport function derivePbkdf2(params: DerivePbkdf2Params): Uint8Array {\n  assertPositiveInteger(params.iterations, 'PBKDF2 iterations');\n  assertPositiveInteger(params.length, 'PBKDF2 length');\n  if (params.input === undefined || params.input === null) {\n    throw new TypeError('PBKDF2 requires input.');\n  }\n  if (params.salt === undefined || params.salt === null) {\n    throw new TypeError('PBKDF2 requires salt.');\n  }\n\n  const password = toBytes(params.input);\n  const salt = toBytes(params.salt);\n  const blocks: Uint8Array[] = [];\n  const blockCount = Math.ceil(params.length / params.hash.digestSize);\n\n  for (let index = 1; index <= blockCount; index++) {\n    const counter = new Uint8Array([\n      (index >>> 24) & 0xff,\n      (index >>> 16) & 0xff,\n      (index >>> 8) & 0xff,\n      index & 0xff,\n    ]);\n    let block = hmac(params.hash, password, concatBytes(salt, counter));\n    const result = block.slice();\n    for (let iteration = 1; iteration < params.iterations; iteration++) {\n      block = hmac(params.hash, password, block);\n      for (let i = 0; i < result.length; i++) {\n        result[i] ^= block[i];\n      }\n    }\n    blocks.push(result);\n  }\n\n  return concatBytes(...blocks).slice(0, params.length);\n}\n\nfunction toBytes(input: Uint8Array | string): Uint8Array {\n  return typeof input === 'string' ? new TextEncoder().encode(input) : input;\n}\n\nfunction assertPositiveInteger(value: number, label: string): void {\n  if (!Number.isInteger(value) || value <= 0) {\n    throw new RangeError(`${label} must be a positive integer.`);\n  }\n}\n"],"names":["concatBytes"],"mappings":"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"}