{"version":3,"file":"evpkdf.cjs","sources":["../src/evpkdf.ts"],"sourcesContent":["import { concatBytes } from '@jscrypto/core';\nimport type { HashComponent, KdfComponent, PresetComponent } from '@jscrypto/core';\n\ndeclare const TextEncoder: {\n  new(): { encode(input: string): Uint8Array };\n};\n\nexport interface EvpKdfParams {\n  input: Uint8Array | string;\n  salt: Uint8Array | string;\n  iterations?: number;\n  length: number;\n  hash?: string;\n}\n\nexport interface DeriveEvpKdfParams extends Omit<EvpKdfParams, 'hash'> {\n  hash: HashComponent;\n}\n\nexport const evpKdf: KdfComponent<'EvpKDF'> = {\n  kind: 'kdf',\n  name: 'EvpKDF',\n  derive(params, context) {\n    const options = params as EvpKdfParams;\n    return deriveEvpKdf({\n      ...options,\n      hash: context.getHash(options.hash ?? 'MD5'),\n    });\n  },\n};\n\nexport const evpKdfPreset: PresetComponent<'evpkdf'> = {\n  kind: 'preset',\n  name: 'evpkdf',\n  components() {\n    return [evpKdf];\n  },\n};\n\nexport function deriveEvpKdf(params: DeriveEvpKdfParams): Uint8Array {\n  assertPositiveInteger(params.length, 'EvpKDF length');\n  if (params.iterations !== undefined) {\n    assertPositiveInteger(params.iterations, 'EvpKDF iterations');\n  }\n  if (params.input === undefined || params.input === null) {\n    throw new TypeError('EvpKDF requires input.');\n  }\n  if (params.salt === undefined || params.salt === null) {\n    throw new TypeError('EvpKDF requires salt.');\n  }\n\n  const password = toBytes(params.input);\n  const salt = toBytes(params.salt);\n  const blocks: Uint8Array[] = [];\n  let previous = new Uint8Array(0);\n  let length = 0;\n\n  while (length < params.length) {\n    let block = params.hash.hash(concatBytes(previous, password, salt));\n    for (let i = 1; i < (params.iterations ?? 1); i++) {\n      block = params.hash.hash(block);\n    }\n    blocks.push(block);\n    previous = new Uint8Array(block);\n    length += block.length;\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":";;;;;;;;;AAmBO,MAAM,MAAM,GAA2B;AAC5C,IAAA,IAAI,EAAE,KAAK;AACX,IAAA,IAAI,EAAE,QAAQ;IACd,MAAM,CAAC,MAAM,EAAE,OAAO,EAAA;QACpB,MAAM,OAAO,GAAG,MAAsB;AACtC,QAAA,OAAO,YAAY,CAAC;AAClB,YAAA,GAAG,OAAO;YACV,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;AAC7C,SAAA,CAAC;IACJ,CAAC;;AAGI,MAAM,YAAY,GAA8B;AACrD,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,QAAQ;IACd,UAAU,GAAA;QACR,OAAO,CAAC,MAAM,CAAC;IACjB,CAAC;;AAGG,SAAU,YAAY,CAAC,MAA0B,EAAA;AACrD,IAAA,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;AACrD,IAAA,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,QAAA,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC/D;AACA,IAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;AACvD,QAAA,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC;IAC/C;AACA,IAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;AACrD,QAAA,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC;IAC9C;IAEA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IACjC,MAAM,MAAM,GAAiB,EAAE;AAC/B,IAAA,IAAI,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC;AAEd,IAAA,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;AAC7B,QAAA,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAACA,gBAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACnE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC;AACA,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,QAAA,QAAQ,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;AAChC,QAAA,MAAM,IAAI,KAAK,CAAC,MAAM;IACxB;AAEA,IAAA,OAAOA,gBAAW,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;AACvD;AAEA,SAAS,OAAO,CAAC,KAA0B,EAAA;AACzC,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK;AAC5E;AAEA,SAAS,qBAAqB,CAAC,KAAa,EAAE,KAAa,EAAA;AACzD,IAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE;AAC1C,QAAA,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,CAAA,4BAAA,CAA8B,CAAC;IAC9D;AACF;;;;;;"}