{"version":3,"sources":["../src/browser/aes-ctr.ts","../src/browser/crypto.ts","../src/browser/randomBytes.ts"],"sourcesContent":["import { arrayify } from '@ethersproject/bytes';\nimport { pbkdf2 } from '@ethersproject/pbkdf2';\n\nimport type { Keystore } from '../types';\n\nimport { btoa } from './crypto';\nimport { randomBytes } from './randomBytes';\n\nconst ALGORITHM = 'AES-CTR';\n\nexport function bufferFromString(\n  string: string,\n  encoding: 'utf-8' | 'base64' = 'base64'\n): Uint8Array {\n  if (encoding === 'utf-8') {\n    return new TextEncoder().encode(string);\n  }\n\n  return new Uint8Array(\n    atob(string)\n      .split('')\n      .map((c) => c.charCodeAt(0))\n  );\n}\n\nexport function stringFromBuffer(\n  buffer: Uint8Array,\n  _encoding: 'utf-8' | 'base64' = 'base64'\n): string {\n  return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer) as unknown as number[]));\n}\n\n/**\n * Generate a pbkdf2 key from a password and random salt\n */\nexport function keyFromPassword(password: string, saltBuffer: Uint8Array): Uint8Array {\n  const passBuffer = bufferFromString(String(password).normalize('NFKC'), 'utf-8');\n  const key = pbkdf2(passBuffer, saltBuffer, 100000, 32, 'sha256');\n\n  return arrayify(key);\n}\n\n/**\n * Encrypts a data object that can be any serializable value using\n * a provided password.\n *\n * @returns Promise<Keystore> object\n */\nexport async function encrypt<T>(password: string, data: T): Promise<Keystore> {\n  const iv = randomBytes(16);\n  const salt = randomBytes(32);\n  const secret = keyFromPassword(password, salt);\n  const dataString = JSON.stringify(data);\n  const dataBuffer = bufferFromString(dataString, 'utf-8');\n  const alg = {\n    name: ALGORITHM,\n    counter: iv,\n    length: 64,\n  };\n  const key = await crypto.subtle.importKey('raw', secret, alg, false, ['encrypt']);\n  const encBuffer = await crypto.subtle.encrypt(alg, key, dataBuffer);\n\n  return {\n    data: stringFromBuffer(encBuffer),\n    iv: stringFromBuffer(iv),\n    salt: stringFromBuffer(salt),\n  };\n}\n\n/**\n * Given a password and a keystore object, decrypts the text and returns\n * the resulting value\n */\nexport async function decrypt<T>(password: string, keystore: Keystore): Promise<T> {\n  const iv = bufferFromString(keystore.iv);\n  const salt = bufferFromString(keystore.salt);\n  const secret = keyFromPassword(password, salt);\n  const encryptedText = bufferFromString(keystore.data);\n\n  const alg = {\n    name: ALGORITHM,\n    counter: iv,\n    length: 64,\n  };\n  const key = await crypto.subtle.importKey('raw', secret, alg, false, ['decrypt']);\n\n  const ptBuffer = await crypto.subtle.decrypt(alg, key, encryptedText);\n  const decryptedData = new TextDecoder().decode(ptBuffer);\n\n  try {\n    return JSON.parse(decryptedData);\n  } catch {\n    throw new Error('Invalid credentials');\n  }\n}\n","const { crypto, btoa } = globalThis;\n\nif (!crypto) {\n  throw new Error(`Could not found 'crypto' in current browser environment`);\n}\n\nif (!btoa) {\n  throw new Error(`Could not found 'btoa' in current browser environment`);\n}\n\nexport { crypto, btoa };\n","import { crypto } from './crypto';\n\nexport const randomBytes = (length: number) => {\n  const randomValues = crypto.getRandomValues(new Uint8Array(length));\n  return randomValues;\n};\n"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,cAAc;;;ACDvB,IAAM,EAAE,QAAAA,SAAQ,KAAK,IAAI;AAEzB,IAAI,CAACA,SAAQ;AACX,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAEA,IAAI,CAAC,MAAM;AACT,QAAM,IAAI,MAAM,uDAAuD;AACzE;;;ACNO,IAAM,cAAc,CAAC,WAAmB;AAC7C,QAAM,eAAeC,QAAO,gBAAgB,IAAI,WAAW,MAAM,CAAC;AAClE,SAAO;AACT;;;AFGA,IAAM,YAAY;AAEX,SAAS,iBACd,QACA,WAA+B,UACnB;AACZ,MAAI,aAAa,SAAS;AACxB,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAAA,EACxC;AAEA,SAAO,IAAI;AAAA,IACT,KAAK,MAAM,EACR,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,iBACd,QACA,YAAgC,UACxB;AACR,SAAO,KAAK,OAAO,aAAa,MAAM,MAAM,IAAI,WAAW,MAAM,CAAwB,CAAC;AAC5F;AAKO,SAAS,gBAAgB,UAAkB,YAAoC;AACpF,QAAM,aAAa,iBAAiB,OAAO,QAAQ,EAAE,UAAU,MAAM,GAAG,OAAO;AAC/E,QAAM,MAAM,OAAO,YAAY,YAAY,KAAQ,IAAI,QAAQ;AAE/D,SAAO,SAAS,GAAG;AACrB;AAQA,eAAsB,QAAW,UAAkB,MAA4B;AAC7E,QAAM,KAAK,YAAY,EAAE;AACzB,QAAM,OAAO,YAAY,EAAE;AAC3B,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAC7C,QAAM,aAAa,KAAK,UAAU,IAAI;AACtC,QAAM,aAAa,iBAAiB,YAAY,OAAO;AACvD,QAAM,MAAM;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACA,QAAM,MAAM,MAAM,OAAO,OAAO,UAAU,OAAO,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC;AAChF,QAAM,YAAY,MAAM,OAAO,OAAO,QAAQ,KAAK,KAAK,UAAU;AAElE,SAAO;AAAA,IACL,MAAM,iBAAiB,SAAS;AAAA,IAChC,IAAI,iBAAiB,EAAE;AAAA,IACvB,MAAM,iBAAiB,IAAI;AAAA,EAC7B;AACF;AAMA,eAAsB,QAAW,UAAkB,UAAgC;AACjF,QAAM,KAAK,iBAAiB,SAAS,EAAE;AACvC,QAAM,OAAO,iBAAiB,SAAS,IAAI;AAC3C,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAC7C,QAAM,gBAAgB,iBAAiB,SAAS,IAAI;AAEpD,QAAM,MAAM;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACA,QAAM,MAAM,MAAM,OAAO,OAAO,UAAU,OAAO,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC;AAEhF,QAAM,WAAW,MAAM,OAAO,OAAO,QAAQ,KAAK,KAAK,aAAa;AACpE,QAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,QAAQ;AAEvD,MAAI;AACF,WAAO,KAAK,MAAM,aAAa;AAAA,EACjC,QAAE;AACA,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACF;","names":["crypto","crypto"]}