{"version":3,"file":"index.cjs","sources":["../src/index.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 HkdfParams {\n  input: Uint8Array | string;\n  salt?: Uint8Array | string;\n  info?: Uint8Array | string;\n  hash: string;\n  length: number;\n}\n\nexport interface HkdfExtractParams {\n  input: Uint8Array | string;\n  salt?: Uint8Array | string;\n  hash: HashComponent;\n}\n\nexport interface HkdfExpandParams {\n  input: Uint8Array | string;\n  info?: Uint8Array | string;\n  hash: HashComponent;\n  length: number;\n}\n\nexport interface DeriveHkdfParams {\n  input: Uint8Array | string;\n  salt?: Uint8Array | string;\n  info?: Uint8Array | string;\n  hash: HashComponent;\n  length: number;\n}\n\nexport const hkdf: KdfComponent<'HKDF'> = {\n  kind: 'kdf',\n  name: 'HKDF',\n  derive(params, context) {\n    const options = params as HkdfParams;\n    return deriveHkdf({\n      ...options,\n      hash: resolveHash(options.hash, context, 'HKDF'),\n    });\n  },\n};\n\nexport const hkdfExtract: KdfComponent<'HKDF-Extract'> = {\n  kind: 'kdf',\n  name: 'HKDF-Extract',\n  derive(params, context) {\n    const options = params as {\n      input: Uint8Array | string;\n      salt?: Uint8Array | string;\n      hash: string;\n    };\n    return extractHkdf({\n      input: options.input,\n      salt: options.salt,\n      hash: resolveHash(options.hash, context, 'HKDF-Extract'),\n    });\n  },\n};\n\nexport const hkdfExpand: KdfComponent<'HKDF-Expand'> = {\n  kind: 'kdf',\n  name: 'HKDF-Expand',\n  derive(params, context) {\n    const options = params as {\n      input: Uint8Array | string;\n      info?: Uint8Array | string;\n      hash: string;\n      length: number;\n    };\n    return expandHkdf({\n      input: options.input,\n      info: options.info,\n      length: options.length,\n      hash: resolveHash(options.hash, context, 'HKDF-Expand'),\n    });\n  },\n};\n\nexport const hkdfPreset: PresetComponent<'hkdf'> = {\n  kind: 'preset',\n  name: 'hkdf',\n  components() {\n    return [hkdf, hkdfExtract, hkdfExpand];\n  },\n};\n\nexport function extractHkdf(params: HkdfExtractParams): Uint8Array {\n  requireInput(params.input, 'HKDF');\n  requireHash(params.hash, 'HKDF');\n  if (params.salt !== undefined) {\n    assertBytesOrString(params.salt, 'salt');\n  }\n\n  const hashLen = params.hash.digestSize;\n  return extract(params.hash, toBytes(params.input), normalizeSalt(params.salt, hashLen));\n}\n\nexport function expandHkdf(params: HkdfExpandParams): Uint8Array {\n  return expandFromParams(params, 'HKDF-Expand');\n}\n\nexport function deriveHkdf(params: DeriveHkdfParams): Uint8Array {\n  const prk = extractHkdf(params);\n  return expandFromParams({\n    input: prk,\n    info: params.info,\n    hash: params.hash,\n    length: params.length,\n  }, 'HKDF');\n}\n\nfunction resolveHash(\n  hash: string | undefined,\n  context: { getHash(name: string): HashComponent },\n  label: string,\n): HashComponent {\n  if (typeof hash !== 'string' || hash.length === 0) {\n    throw new TypeError(`${label} requires hash.`);\n  }\n  return context.getHash(hash);\n}\n\nfunction expandFromParams(params: HkdfExpandParams, label: string): Uint8Array {\n  requireInput(params.input, label);\n  requireHash(params.hash, label);\n  assertNonNegativeInteger(params.length, `${label} length`);\n\n  const hashLen = params.hash.digestSize;\n  const prk = toBytes(params.input);\n  if (prk.length < hashLen) {\n    throw new RangeError(`${label} input must be at least ${hashLen} bytes.`);\n  }\n\n  const maxLength = 255 * hashLen;\n  if (params.length > maxLength) {\n    throw new RangeError(`${label} length must be <= ${maxLength}.`);\n  }\n\n  if (params.info !== undefined) {\n    assertBytesOrString(params.info, 'info');\n  }\n\n  if (params.length === 0) {\n    return new Uint8Array(0);\n  }\n\n  const info = params.info === undefined ? new Uint8Array(0) : toBytes(params.info);\n  return expand(params.hash, prk, info, params.length);\n}\n\nfunction extract(hash: HashComponent, input: Uint8Array, salt: Uint8Array): Uint8Array {\n  return hmac(hash, salt, input);\n}\n\nfunction expand(\n  hash: HashComponent,\n  prk: Uint8Array,\n  info: Uint8Array,\n  length: number,\n): Uint8Array {\n  const hashLen = hash.digestSize;\n  const blockCount = Math.ceil(length / hashLen);\n  const blocks: Uint8Array[] = [];\n  let previous: Uint8Array = new Uint8Array(0);\n\n  for (let index = 1; index <= blockCount; index++) {\n    previous = hmac(hash, prk, concatBytes(previous, info, new Uint8Array([index])));\n    blocks.push(previous);\n  }\n\n  return concatBytes(...blocks).slice(0, length);\n}\n\nfunction 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] = (innerKey[i] as number) ^ 0x36;\n    outerKey[i] = (outerKey[i] as number) ^ 0x5c;\n  }\n\n  return hash.hash(concatBytes(outerKey, hash.hash(concatBytes(innerKey, input))));\n}\n\nfunction normalizeSalt(salt: Uint8Array | string | undefined, hashLen: number): Uint8Array {\n  if (salt === undefined) {\n    return new Uint8Array(hashLen);\n  }\n  const bytes = toBytes(salt);\n  return bytes.length === 0 ? new Uint8Array(hashLen) : bytes;\n}\n\nfunction toBytes(input: Uint8Array | string): Uint8Array {\n  return typeof input === 'string' ? new TextEncoder().encode(input) : input;\n}\n\nfunction requireInput(value: unknown, label: string): asserts value is Uint8Array | string {\n  if (value === undefined || value === null) {\n    throw new TypeError(`${label} requires input.`);\n  }\n  assertBytesOrString(value, 'input');\n}\n\nfunction requireHash(value: unknown, label: string): asserts value is HashComponent {\n  if (value === undefined || value === null) {\n    throw new TypeError(`${label} requires hash.`);\n  }\n}\n\nfunction assertBytesOrString(value: unknown, name: string): asserts value is Uint8Array | string {\n  if (typeof value === 'string') {\n    return;\n  }\n  if (value instanceof Uint8Array) {\n    return;\n  }\n  throw new TypeError(`HKDF ${name} must be a Uint8Array or string.`);\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n  if (!Number.isInteger(value) || value < 0) {\n    throw new RangeError(`${label} must be a non-negative integer.`);\n  }\n}\n"],"names":["concatBytes"],"mappings":"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"}