{"version":3,"file":"pbkdf2.cjs","names":["sha256"],"sources":["../../src/utils/pbkdf2.ts"],"sourcesContent":["import { pbkdf2 } from '@noble/hashes/pbkdf2.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport type { EncryptAlgorithms } from '@/@types';\n\nexport const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\n\nexport const PBKDF2_SALT = 'encrypt-storage';\nconst SALT = encoder.encode(PBKDF2_SALT);\nconst PBKDF2_SYNC_ITERATIONS = 25_000;\nconst PBKDF2_ASYNC_ITERATIONS = 100_000;\nconst PBKDF2_KEY_LENGTH = 32;\n\nconst syncKeys = new Map<string, Uint8Array>();\nconst asyncKeys = new Map<string, CryptoKey>();\n\n/**\n * @description Derive key syncronously\n * @param {string} secret secret key to encrypt\n * @returns Uint8Array\n */\nexport function deriveSyncKey(secret: string): Uint8Array {\n  const cached = syncKeys.get(secret);\n\n  /* v8 ignore start -- @preserve */\n  if (cached) {\n    return cached;\n  }\n  /* v8 ignore stop -- @preserve */\n\n  const key = pbkdf2(sha256, encoder.encode(secret), SALT, {\n    c: PBKDF2_SYNC_ITERATIONS,\n    dkLen: PBKDF2_KEY_LENGTH,\n  });\n\n  syncKeys.set(secret, key);\n\n  return key;\n}\n\n/**\n * @description Derive key asyncronously\n * @param {string} secret secret key to encrypt\n * @param {EncryptAlgorithms} algorithm encryption algorithm\n * @returns {Promise<CryptoKey>} `Promise<CryptoKey>`\n */\nexport async function deriveAsyncKey(\n  secret: string,\n  algorithm: EncryptAlgorithms,\n): Promise<CryptoKey> {\n  const cacheKey = `${algorithm}:${secret}`;\n\n  const cached = asyncKeys.get(cacheKey);\n\n  /* v8 ignore start -- @preserve */\n  if (cached) {\n    return cached;\n  }\n  /* v8 ignore stop -- @preserve */\n\n  const keyMaterial = await crypto.subtle.importKey(\n    'raw',\n    encoder.encode(secret),\n    'PBKDF2',\n    false,\n    ['deriveKey'],\n  );\n\n  const cryptoKey = await crypto.subtle.deriveKey(\n    {\n      name: 'PBKDF2',\n      hash: 'SHA-256',\n      salt: SALT,\n      iterations: PBKDF2_ASYNC_ITERATIONS,\n    },\n    keyMaterial,\n    {\n      name: algorithm,\n      length: 256,\n    },\n    false,\n    ['encrypt', 'decrypt'],\n  );\n\n  asyncKeys.set(cacheKey, cryptoKey);\n\n  return cryptoKey;\n}\n"],"mappings":"4EAKA,MAAa,EAAU,IAAI,YACd,EAAU,IAAI,YAEd,EAAc,kBACrB,EAAO,EAAQ,OAAO,CAAW,EAKjC,EAAW,IAAI,IACf,EAAY,IAAI,IAOtB,SAAgB,EAAc,EAA4B,CACxD,IAAM,EAAS,EAAS,IAAI,CAAM,EAGlC,GAAI,EACF,OAAO,EAIT,IAAM,GAAA,EAAA,EAAA,OAAA,CAAaA,EAAAA,OAAQ,EAAQ,OAAO,CAAM,EAAG,EAAM,CACvD,EAAG,KACH,MAAO,EACT,CAAC,EAID,OAFA,EAAS,IAAI,EAAQ,CAAG,EAEjB,CACT,CAQA,eAAsB,EACpB,EACA,EACoB,CACpB,IAAM,EAAW,GAAG,EAAU,GAAG,IAE3B,EAAS,EAAU,IAAI,CAAQ,EAGrC,GAAI,EACF,OAAO,EAIT,IAAM,EAAc,MAAM,OAAO,OAAO,UACtC,MACA,EAAQ,OAAO,CAAM,EACrB,SACA,GACA,CAAC,WAAW,CACd,EAEM,EAAY,MAAM,OAAO,OAAO,UACpC,CACE,KAAM,SACN,KAAM,UACN,KAAM,EACN,WAAY,GACd,EACA,EACA,CACE,KAAM,EACN,OAAQ,GACV,EACA,GACA,CAAC,UAAW,SAAS,CACvB,EAIA,OAFA,EAAU,IAAI,EAAU,CAAS,EAE1B,CACT"}