{"version":3,"sources":["jsdelivr-header.js","/npm/@metamask/browser-passworder@6.0.0/src/index.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,4aCNA,MAAA,QAAA,QAAA,mBAwCM,cAAgB,MAChB,mBAAqB,UACrB,gBAAkB,QAClB,sBAA8C,CAClD,UAAW,SACX,OAAQ,CACN,WAAY,MAGV,0BAAkD,CACtD,UAAW,SACX,OAAQ,CACN,WAAY,MAeT,eAAe,QACpB,EACA,EACA,EACA,EAAe,eACf,EAAuB,2BAEvB,MAAM,EACJ,SAAc,gBAAgB,EAAU,GAAM,EAAO,GACjD,QAAgB,eAAe,EAAW,GAEhD,OADA,EAAQ,KAAO,EACR,KAAK,UAAU,EACxB,CAYO,eAAe,kBACpB,EACA,EACA,EAAO,eACP,EAAuB,2BAEvB,MAAM,QAAY,gBAAgB,EAAU,GAAM,EAAM,GAClD,QAA0B,UAAU,GAG1C,MAAO,CACL,YAHkB,QAAQ,EAAU,EAAS,EAAK,GAIlD,oBAEJ,CAWO,eAAe,eACpB,EACA,GAEA,MAAM,EAAO,KAAK,UAAU,GACtB,EAAa,OAAO,KAAK,EA/ET,SAgFhB,EAAS,WAAW,OAAO,gBAAgB,IAAI,WAAW,KAC1D,EAAM,UAAU,GAEhB,QAAY,WAAW,OAAO,OAAO,QACzC,CACE,KAtFqB,UAuFrB,GAAI,GAEN,EACA,GAGI,EAAS,IAAI,WAAW,GACxB,EAAY,OAAO,KAAK,GAAQ,SAAS,UAEzC,EAAqC,CACzC,KAFe,OAAO,KAAK,GAAQ,SAAS,UAG5C,GAAI,GAON,OAJI,gBAAgB,KAClB,EAAiB,YAAc,EAAc,mBAGxC,CACT,CAWO,eAAe,QACpB,EACA,EACA,GAEA,MAAM,EAAU,KAAK,MAAM,IACrB,KAAE,EAAI,YAAE,GAAgB,EACxB,EAAY,UAChB,SACS,gBAAgB,EAAU,GAAM,EAAO,IAIlD,aADqB,eAAe,EAAW,EAEjD,CAUO,eAAe,kBACpB,EACA,GAEA,MAAM,EAAU,KAAK,MAAM,IACrB,KAAE,EAAI,YAAE,GAAgB,EACxB,QAAY,gBAAgB,EAAU,GAAM,EAAM,GAIxD,MAAO,CACL,wBAJ8B,UAAU,GAKxC,YAJkB,QAAQ,EAAU,EAAM,GAK1C,OAEJ,CAUO,eAAe,eACpB,EACA,GAEA,MAAM,EAAgB,OAAO,KAAK,EAAQ,KAAM,UAC1C,EAAS,OAAO,KAAK,EAAQ,GAAI,UACjC,EAAM,UAAU,GAEtB,IAAI,EACJ,IACE,MAAM,QAAe,OAAO,OAAO,QACjC,CAAE,KAjLmB,UAiLO,GAAI,GAChC,EACA,GAGI,EAAgB,IAAI,WAAW,GAC/B,EAAe,OAAO,KAAK,GAAe,SAtL5B,SAuLpB,EAAe,KAAK,MAAM,E,CAC1B,MAAO,GACP,MAAM,IAAI,MAAM,qB,CAGlB,OAAO,CACT,CAWO,eAAe,UACpB,GAEA,MAAM,EAAwB,KAAK,MAAM,GAEzC,OAAI,wBAAwB,GACnB,CACL,UAAW,WAAW,OAAO,OAAO,UAjNpB,MAmNd,EAAsB,IAlNH,WAoNnB,EACA,CAAC,UAAW,YAEd,kBAAmB,EAAsB,yBAIhC,WAAW,OAAO,OAAO,UA5NlB,MA8NlB,EA7NuB,WA+NvB,EACA,CAAC,UAAW,WAEhB,CASO,eAAe,UACpB,GAEA,OAAI,gBAAgB,GACX,KAAK,UAAU,CACpB,UAAW,WAAW,OAAO,OAAO,UAjPpB,MAmPd,EAAc,KAEhB,kBAAmB,EAAc,oBAI9B,KAAK,gBACJ,WAAW,OAAO,OAAO,UA1Pb,MA0PsC,GAE5D,CAiCO,eAAe,gBACpB,EACA,EACA,GAAa,EACb,EAA6B,uBAE7B,MAAM,EAAa,OAAO,KAAK,EAjST,SAkShB,EAAa,OAAO,KAAK,EAAM,UAE/B,QAAY,WAAW,OAAO,OAAO,UACzC,MACA,EACA,CAAE,KAAM,WACR,EACA,CAAC,aAAc,cAGX,QAAmB,WAAW,OAAO,OAAO,UAChD,CACE,KAAM,SACN,KAAM,EACN,WAAY,EAAK,OAAO,WACxB,KAAM,WAER,EACA,CAAE,KArTqB,UAqTK,OAAQ,KACpC,EACA,CAAC,UAAW,YAGd,OAAO,EACH,CACE,IAAK,EACL,kBAAmB,GAErB,CACN,CAQA,SAAgB,2BAA2B,GACzC,MAAM,EAA+B,OAApB,EAAI,MAAM,EAAG,GAAc,EAAI,MAAM,GAAK,EACrD,EAAM,IAAI,WAAW,EAAS,OAAS,GAC7C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,GAAK,EAAG,CAC3C,MAAM,EAAM,EAAS,OAAO,EAAG,GAC/B,EAAI,EAAI,GAAK,SAAS,EAAK,G,CAE7B,OAAO,CACT,CAQA,SAAgB,0BAA0B,GACxC,IAAI,EAAS,KAIb,OAHA,EAAO,SAAS,IACd,GAAU,cAAc,EAAM,IAEzB,CACT,CASA,SAAS,cAAc,GACrB,IAAI,EAAM,EAAI,SAAS,IACvB,KAAO,EAAI,OAAS,GAClB,EAAM,IAAI,IAEZ,OAAO,CACT,CAQA,SAAgB,aAAa,EAAY,IACvC,MAAM,EAAO,IAAI,WAAW,GAC5B,WAAW,OAAO,gBAAgB,GASlC,OAHmB,KACjB,OAAO,aAAa,MAAM,KAAM,GAGpC,CAcO,eAAe,YACpB,EACA,EACA,EAAyB,2BAEzB,OAAI,eAAe,EAAO,GACjB,EAGF,QACL,QACM,QAAQ,EAAU,QACxB,OACA,EACA,EAEJ,CAcO,eAAe,sBACpB,EACA,EACA,EAAyB,2BAEzB,OAAI,eAAe,EAAiB,MAAO,GAClC,EAGF,kBACL,QACM,QAAQ,EAAU,EAAiB,YACzC,EACA,EAEJ,CAQA,SAAS,gBACP,GAEA,OACE,EAAA,QAAA,eAAc,KACd,EAAA,QAAA,aAAY,EAAe,SAC3B,EAAA,QAAA,aAAY,EAAe,sBAC3B,EAAc,eAAe,WAC7B,uBAAuB,EAAc,kBAEzC,CAQA,SAAS,uBACP,GAEA,OACE,EAAA,QAAA,eAAc,KACd,EAAA,QAAA,aAAY,EAAmB,eAC/B,EAAA,QAAA,aAAY,EAAmB,SAEnC,CAQA,SAAS,wBACP,GAEA,OACE,EAAA,QAAA,eAAc,KACd,EAAA,QAAA,aAAY,EAAa,SACzB,EAAA,QAAA,aAAY,EAAa,sBACzB,uBAAuB,EAAY,kBAEvC,CASA,SAAS,UAAU,GACjB,OAAO,gBAAgB,GAAiB,EAAc,IAAM,CAC9D,CASA,SAAgB,eACd,EACA,EAAyB,2BAEzB,MAAM,YAAE,GAAgB,KAAK,MAAM,GACnC,OACE,uBAAuB,IACvB,EAAY,YAAc,EAAuB,WACjD,EAAY,OAAO,aAAe,EAAuB,OAAO,UAEpE,CAnfA,QAAA,gBAwBA,QAAA,oCAyBA,QAAA,8BA0CA,QAAA,gBAwBA,QAAA,oCAyBA,QAAA,8BAmCA,QAAA,oBAkCA,QAAA,oBAiDA,QAAA,gCA4CA,QAAA,sDAgBA,QAAA,oDA6BA,QAAA,0BA0BA,QAAA,wBA8BA,QAAA,4CAsFA,QAAA","file":"/npm/@metamask/browser-passworder@6.0.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@metamask/browser-passworder@6.0.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { hasProperty, isPlainObject } from '@metamask/utils';\n\nexport type DetailedEncryptionResult = {\n  vault: string;\n  exportedKeyString: string;\n};\n\nexport type PBKDF2Params = {\n  iterations: number;\n};\n\nexport type KeyDerivationOptions = {\n  algorithm: 'PBKDF2';\n  params: PBKDF2Params;\n};\n\nexport type EncryptionKey = {\n  key: CryptoKey;\n  derivationOptions: KeyDerivationOptions;\n};\n\nexport type ExportedEncryptionKey = {\n  key: JsonWebKey;\n  derivationOptions: KeyDerivationOptions;\n};\n\nexport type EncryptionResult = {\n  data: string;\n  iv: string;\n  salt?: string;\n  // old encryption results will not have this\n  keyMetadata?: KeyDerivationOptions;\n};\n\nexport type DetailedDecryptResult = {\n  exportedKeyString: string;\n  vault: unknown;\n  salt: string;\n};\n\nconst EXPORT_FORMAT = 'jwk';\nconst DERIVED_KEY_FORMAT = 'AES-GCM';\nconst STRING_ENCODING = 'utf-8';\nconst OLD_DERIVATION_PARAMS: KeyDerivationOptions = {\n  algorithm: 'PBKDF2',\n  params: {\n    iterations: 10_000,\n  },\n};\nconst DEFAULT_DERIVATION_PARAMS: KeyDerivationOptions = {\n  algorithm: 'PBKDF2',\n  params: {\n    iterations: 900_000,\n  },\n};\n\n/**\n * Encrypts a data object that can be any serializable value using\n * a provided password.\n *\n * @param password - The password to use for encryption.\n * @param dataObj - The data to encrypt.\n * @param key - The CryptoKey to encrypt with.\n * @param salt - The salt to use to encrypt.\n * @param keyDerivationOptions - The options to use for key derivation.\n * @returns The encrypted vault.\n */\nexport async function encrypt<R>(\n  password: string,\n  dataObj: R,\n  key?: EncryptionKey | CryptoKey,\n  salt: string = generateSalt(),\n  keyDerivationOptions = DEFAULT_DERIVATION_PARAMS,\n): Promise<string> {\n  const cryptoKey =\n    key || (await keyFromPassword(password, salt, false, keyDerivationOptions));\n  const payload = await encryptWithKey(cryptoKey, dataObj);\n  payload.salt = salt;\n  return JSON.stringify(payload);\n}\n\n/**\n * Encrypts a data object that can be any serializable value using\n * a provided password.\n *\n * @param password - A password to use for encryption.\n * @param dataObj - The data to encrypt.\n * @param salt - The salt used to encrypt.\n * @param keyDerivationOptions - The options to use for key derivation.\n * @returns The vault and exported key string.\n */\nexport async function encryptWithDetail<R>(\n  password: string,\n  dataObj: R,\n  salt = generateSalt(),\n  keyDerivationOptions = DEFAULT_DERIVATION_PARAMS,\n): Promise<DetailedEncryptionResult> {\n  const key = await keyFromPassword(password, salt, true, keyDerivationOptions);\n  const exportedKeyString = await exportKey(key);\n  const vault = await encrypt(password, dataObj, key, salt);\n\n  return {\n    vault,\n    exportedKeyString,\n  };\n}\n\n/**\n * Encrypts the provided serializable javascript object using the\n * provided CryptoKey and returns an object containing the cypher text and\n * the initialization vector used.\n *\n * @param encryptionKey - The CryptoKey to encrypt with.\n * @param dataObj - A serializable JavaScript object to encrypt.\n * @returns The encrypted data.\n */\nexport async function encryptWithKey<R>(\n  encryptionKey: EncryptionKey | CryptoKey,\n  dataObj: R,\n): Promise<EncryptionResult> {\n  const data = JSON.stringify(dataObj);\n  const dataBuffer = Buffer.from(data, STRING_ENCODING);\n  const vector = globalThis.crypto.getRandomValues(new Uint8Array(16));\n  const key = unwrapKey(encryptionKey);\n\n  const buf = await globalThis.crypto.subtle.encrypt(\n    {\n      name: DERIVED_KEY_FORMAT,\n      iv: vector,\n    },\n    key,\n    dataBuffer,\n  );\n\n  const buffer = new Uint8Array(buf);\n  const vectorStr = Buffer.from(vector).toString('base64');\n  const vaultStr = Buffer.from(buffer).toString('base64');\n  const encryptionResult: EncryptionResult = {\n    data: vaultStr,\n    iv: vectorStr,\n  };\n\n  if (isEncryptionKey(encryptionKey)) {\n    encryptionResult.keyMetadata = encryptionKey.derivationOptions;\n  }\n\n  return encryptionResult;\n}\n\n/**\n * Given a password and a cypher text, decrypts the text and returns\n * the resulting value.\n *\n * @param password - The password to decrypt with.\n * @param text - The cypher text to decrypt.\n * @param encryptionKey - The key to decrypt with.\n * @returns The decrypted data.\n */\nexport async function decrypt(\n  password: string,\n  text: string,\n  encryptionKey?: EncryptionKey | CryptoKey,\n): Promise<unknown> {\n  const payload = JSON.parse(text);\n  const { salt, keyMetadata } = payload;\n  const cryptoKey = unwrapKey(\n    encryptionKey ||\n      (await keyFromPassword(password, salt, false, keyMetadata)),\n  );\n\n  const result = await decryptWithKey(cryptoKey, payload);\n  return result;\n}\n\n/**\n * Given a password and a cypher text, decrypts the text and returns\n * the resulting value, keyString, and salt.\n *\n * @param password - The password to decrypt with.\n * @param text - The encrypted vault to decrypt.\n * @returns The decrypted vault along with the salt and exported key.\n */\nexport async function decryptWithDetail(\n  password: string,\n  text: string,\n): Promise<DetailedDecryptResult> {\n  const payload = JSON.parse(text);\n  const { salt, keyMetadata } = payload;\n  const key = await keyFromPassword(password, salt, true, keyMetadata);\n  const exportedKeyString = await exportKey(key);\n  const vault = await decrypt(password, text, key);\n\n  return {\n    exportedKeyString,\n    vault,\n    salt,\n  };\n}\n\n/**\n * Given a CryptoKey and an EncryptionResult object containing the initialization\n * vector (iv) and data to decrypt, return the resulting decrypted value.\n *\n * @param encryptionKey - The CryptoKey to decrypt with.\n * @param payload - The payload to decrypt, returned from an encryption method.\n * @returns The decrypted data.\n */\nexport async function decryptWithKey<R>(\n  encryptionKey: EncryptionKey | CryptoKey,\n  payload: EncryptionResult,\n): Promise<R> {\n  const encryptedData = Buffer.from(payload.data, 'base64');\n  const vector = Buffer.from(payload.iv, 'base64');\n  const key = unwrapKey(encryptionKey);\n\n  let decryptedObj;\n  try {\n    const result = await crypto.subtle.decrypt(\n      { name: DERIVED_KEY_FORMAT, iv: vector },\n      key,\n      encryptedData,\n    );\n\n    const decryptedData = new Uint8Array(result);\n    const decryptedStr = Buffer.from(decryptedData).toString(STRING_ENCODING);\n    decryptedObj = JSON.parse(decryptedStr);\n  } catch (e) {\n    throw new Error('Incorrect password');\n  }\n\n  return decryptedObj;\n}\n\n/**\n * Receives an exported CryptoKey string and creates a key.\n *\n * This function supports both JsonWebKey's and exported EncryptionKey's.\n * It will return a CryptoKey for the former, and an EncryptionKey for the latter.\n *\n * @param keyString - The key string to import.\n * @returns An EncryptionKey or a CryptoKey.\n */\nexport async function importKey(\n  keyString: string,\n): Promise<EncryptionKey | CryptoKey> {\n  const exportedEncryptionKey = JSON.parse(keyString);\n\n  if (isExportedEncryptionKey(exportedEncryptionKey)) {\n    return {\n      key: await globalThis.crypto.subtle.importKey(\n        EXPORT_FORMAT,\n        exportedEncryptionKey.key,\n        DERIVED_KEY_FORMAT,\n        true,\n        ['encrypt', 'decrypt'],\n      ),\n      derivationOptions: exportedEncryptionKey.derivationOptions,\n    };\n  }\n\n  return await globalThis.crypto.subtle.importKey(\n    EXPORT_FORMAT,\n    exportedEncryptionKey,\n    DERIVED_KEY_FORMAT,\n    true,\n    ['encrypt', 'decrypt'],\n  );\n}\n\n/**\n * Exports a key string from a CryptoKey or from an\n * EncryptionKey instance.\n *\n * @param encryptionKey - The CryptoKey or EncryptionKey to export.\n * @returns A key string.\n */\nexport async function exportKey(\n  encryptionKey: CryptoKey | EncryptionKey,\n): Promise<string> {\n  if (isEncryptionKey(encryptionKey)) {\n    return JSON.stringify({\n      key: await globalThis.crypto.subtle.exportKey(\n        EXPORT_FORMAT,\n        encryptionKey.key,\n      ),\n      derivationOptions: encryptionKey.derivationOptions,\n    });\n  }\n\n  return JSON.stringify(\n    await globalThis.crypto.subtle.exportKey(EXPORT_FORMAT, encryptionKey),\n  );\n}\n\n/**\n * Generate a CryptoKey from a password and random salt.\n *\n * @param password - The password to use to generate key.\n * @param salt - The salt string to use in key derivation.\n * @param exportable - Whether or not the key should be exportable.\n * @returns A CryptoKey for encryption and decryption.\n */\nexport async function keyFromPassword(\n  password: string,\n  salt: string,\n  exportable?: boolean,\n): Promise<CryptoKey>;\n/**\n * Generate a CryptoKey from a password and random salt, specifying\n * key derivation options.\n *\n * @param password - The password to use to generate key.\n * @param salt - The salt string to use in key derivation.\n * @param exportable - Whether or not the key should be exportable.\n * @param opts - The options to use for key derivation.\n * @returns An EncryptionKey for encryption and decryption.\n */\nexport async function keyFromPassword(\n  password: string,\n  salt: string,\n  exportable?: boolean,\n  opts?: KeyDerivationOptions,\n): Promise<EncryptionKey>;\n// The overloads are already documented.\n// eslint-disable-next-line jsdoc/require-jsdoc\nexport async function keyFromPassword(\n  password: string,\n  salt: string,\n  exportable = false,\n  opts: KeyDerivationOptions = OLD_DERIVATION_PARAMS,\n): Promise<CryptoKey | EncryptionKey> {\n  const passBuffer = Buffer.from(password, STRING_ENCODING);\n  const saltBuffer = Buffer.from(salt, 'base64');\n\n  const key = await globalThis.crypto.subtle.importKey(\n    'raw',\n    passBuffer,\n    { name: 'PBKDF2' },\n    false,\n    ['deriveBits', 'deriveKey'],\n  );\n\n  const derivedKey = await globalThis.crypto.subtle.deriveKey(\n    {\n      name: 'PBKDF2',\n      salt: saltBuffer,\n      iterations: opts.params.iterations,\n      hash: 'SHA-256',\n    },\n    key,\n    { name: DERIVED_KEY_FORMAT, length: 256 },\n    exportable,\n    ['encrypt', 'decrypt'],\n  );\n\n  return opts\n    ? {\n        key: derivedKey,\n        derivationOptions: opts,\n      }\n    : derivedKey;\n}\n\n/**\n * Converts a hex string into a buffer.\n *\n * @param str - Hex encoded string.\n * @returns The string ecoded as a byte array.\n */\nexport function serializeBufferFromStorage(str: string): Uint8Array {\n  const stripStr = str.slice(0, 2) === '0x' ? str.slice(2) : str;\n  const buf = new Uint8Array(stripStr.length / 2);\n  for (let i = 0; i < stripStr.length; i += 2) {\n    const seg = stripStr.substr(i, 2);\n    buf[i / 2] = parseInt(seg, 16);\n  }\n  return buf;\n}\n\n/**\n * Converts a buffer into a hex string ready for storage.\n *\n * @param buffer - Buffer to serialize.\n * @returns A hex encoded string.\n */\nexport function serializeBufferForStorage(buffer: Uint8Array): string {\n  let result = '0x';\n  buffer.forEach((value) => {\n    result += unprefixedHex(value);\n  });\n  return result;\n}\n\n/**\n * Converts a number into hex value, and ensures proper leading 0\n * for single characters strings.\n *\n * @param num - The number to convert to string.\n * @returns An unprefixed hex string.\n */\nfunction unprefixedHex(num: number): string {\n  let hex = num.toString(16);\n  while (hex.length < 2) {\n    hex = `0${hex}`;\n  }\n  return hex;\n}\n\n/**\n * Generates a random string for use as a salt in CryptoKey generation.\n *\n * @param byteCount - The number of bytes to generate.\n * @returns A randomly generated string.\n */\nexport function generateSalt(byteCount = 32): string {\n  const view = new Uint8Array(byteCount);\n  globalThis.crypto.getRandomValues(view);\n  // Uint8Array is a fixed length array and thus does not have methods like pop, etc\n  // so TypeScript complains about casting it to an array. Array.from() works here for\n  // getting the proper type, but it results in a functional difference. In order to\n  // cast, you have to first cast view to unknown then cast the unknown value to number[]\n  // TypeScript ftw: double opt in to write potentially type-mismatched code.\n  const b64encoded = btoa(\n    String.fromCharCode.apply(null, view as unknown as number[]),\n  );\n  return b64encoded;\n}\n\n/**\n * Updates the provided vault, re-encrypting\n * data with a safer algorithm if one is available.\n *\n * If the provided vault is already using the latest available encryption method,\n * it is returned as is.\n *\n * @param vault - The vault to update.\n * @param password - The password to use for encryption.\n * @param targetDerivationParams - The options to use for key derivation.\n * @returns A promise resolving to the updated vault.\n */\nexport async function updateVault(\n  vault: string,\n  password: string,\n  targetDerivationParams = DEFAULT_DERIVATION_PARAMS,\n): Promise<string> {\n  if (isVaultUpdated(vault, targetDerivationParams)) {\n    return vault;\n  }\n\n  return encrypt(\n    password,\n    await decrypt(password, vault),\n    undefined,\n    undefined,\n    targetDerivationParams,\n  );\n}\n\n/**\n * Updates the provided vault and exported key, re-encrypting\n * data with a safer algorithm if one is available.\n *\n * If the provided vault is already using the latest available encryption method,\n * it is returned as is.\n *\n * @param encryptionResult - The encrypted data to update.\n * @param password - The password to use for encryption.\n * @param targetDerivationParams - The options to use for key derivation.\n * @returns A promise resolving to the updated encrypted data and exported key.\n */\nexport async function updateVaultWithDetail(\n  encryptionResult: DetailedEncryptionResult,\n  password: string,\n  targetDerivationParams = DEFAULT_DERIVATION_PARAMS,\n): Promise<DetailedEncryptionResult> {\n  if (isVaultUpdated(encryptionResult.vault, targetDerivationParams)) {\n    return encryptionResult;\n  }\n\n  return encryptWithDetail(\n    password,\n    await decrypt(password, encryptionResult.vault),\n    undefined,\n    targetDerivationParams,\n  );\n}\n\n/**\n * Checks if the provided key is an `EncryptionKey`.\n *\n * @param encryptionKey - The object to check.\n * @returns Whether or not the key is an `EncryptionKey`.\n */\nfunction isEncryptionKey(\n  encryptionKey: unknown,\n): encryptionKey is EncryptionKey {\n  return (\n    isPlainObject(encryptionKey) &&\n    hasProperty(encryptionKey, 'key') &&\n    hasProperty(encryptionKey, 'derivationOptions') &&\n    encryptionKey.key instanceof CryptoKey &&\n    isKeyDerivationOptions(encryptionKey.derivationOptions)\n  );\n}\n\n/**\n * Checks if the provided object is a `KeyDerivationOptions`.\n *\n * @param derivationOptions - The object to check.\n * @returns Whether or not the object is a `KeyDerivationOptions`.\n */\nfunction isKeyDerivationOptions(\n  derivationOptions: unknown,\n): derivationOptions is KeyDerivationOptions {\n  return (\n    isPlainObject(derivationOptions) &&\n    hasProperty(derivationOptions, 'algorithm') &&\n    hasProperty(derivationOptions, 'params')\n  );\n}\n\n/**\n * Checks if the provided key is an `ExportedEncryptionKey`.\n *\n * @param exportedKey - The object to check.\n * @returns Whether or not the object is an `ExportedEncryptionKey`.\n */\nfunction isExportedEncryptionKey(\n  exportedKey: unknown,\n): exportedKey is ExportedEncryptionKey {\n  return (\n    isPlainObject(exportedKey) &&\n    hasProperty(exportedKey, 'key') &&\n    hasProperty(exportedKey, 'derivationOptions') &&\n    isKeyDerivationOptions(exportedKey.derivationOptions)\n  );\n}\n\n/**\n * Returns the `CryptoKey` from the provided encryption key.\n * If the provided key is a `CryptoKey`, it is returned as is.\n *\n * @param encryptionKey - The key to unwrap.\n * @returns The `CryptoKey` from the provided encryption key.\n */\nfunction unwrapKey(encryptionKey: EncryptionKey | CryptoKey): CryptoKey {\n  return isEncryptionKey(encryptionKey) ? encryptionKey.key : encryptionKey;\n}\n\n/**\n * Checks if the provided vault is an updated encryption format.\n *\n * @param vault - The vault to check.\n * @param targetDerivationParams - The options to use for key derivation.\n * @returns Whether or not the vault is an updated encryption format.\n */\nexport function isVaultUpdated(\n  vault: string,\n  targetDerivationParams = DEFAULT_DERIVATION_PARAMS,\n): boolean {\n  const { keyMetadata } = JSON.parse(vault);\n  return (\n    isKeyDerivationOptions(keyMetadata) &&\n    keyMetadata.algorithm === targetDerivationParams.algorithm &&\n    keyMetadata.params.iterations === targetDerivationParams.params.iterations\n  );\n}\n"]}