{"version":3,"file":"crypto.cjs","names":["ensureUint8Array","toUint8Array","equalBinary"],"sources":["../../../src/common/crypto/crypto.ts"],"sourcesContent":["import type { BinInput } from '../data/bin-types'\nimport { ensureUint8Array, equalBinary, toUint8Array } from '../data/bin'\n\n/** Get random bytes using window.crypto if available. Else use a poor fallback solution. */\nexport function randomUint8Array(length = 16): Uint8Array {\n  const randomBytes = new Uint8Array(length)\n  if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n    crypto.getRandomValues(randomBytes)\n  }\n  else {\n    // hack: not state of the art secure\n    // throw \"crypto.getRandomValues is required\"\n    for (let i = 0; i < length; i++) {\n      // Math.random: \"...range 0 to less than 1 (inclusive of 0, but not 1)\"\n      // 0.9... * 0xff < 255 therefore * 0x100\n      randomBytes[i] = Math.floor(Math.random() * 0x100) // 0...255\n    }\n  }\n  return randomBytes\n}\n\nexport const CRYPTO_DEFAULT_HASH_ALG = 'SHA-256'\nexport const CRYPTO_DEFAULT_ALG = 'AES-GCM'\nexport const CRYPTO_DEFAULT_DERIVE_ALG = 'PBKDF2'\nexport const CRYPTO_DEFAULT_DERIVE_ITERATIONS = 100000\nexport const CRYPTO_DEFAULT_IV_LENGTH = 12\n\nexport async function digest(\n  message: BinInput,\n  algorithm: AlgorithmIdentifier = CRYPTO_DEFAULT_HASH_ALG,\n): Promise<Uint8Array> {\n  const m = ensureUint8Array(toUint8Array(message))\n  return toUint8Array(\n    await crypto.subtle.digest(algorithm, m),\n  )\n}\n\nexport async function deriveKeyPbkdf2(\n  secret: BinInput,\n  opt: {\n    iterations?: number\n    salt?: BinInput\n  } = {},\n): Promise<CryptoKey> {\n  const secretBuffer = ensureUint8Array(toUint8Array(secret))\n  const keyMaterial = await crypto.subtle.importKey(\n    'raw',\n    secretBuffer,\n    CRYPTO_DEFAULT_DERIVE_ALG,\n    false,\n    ['deriveKey'],\n  )\n  return await crypto.subtle.deriveKey(\n    {\n      name: CRYPTO_DEFAULT_DERIVE_ALG,\n      salt: opt.salt ? ensureUint8Array(toUint8Array(opt.salt)) : new Uint8Array(0),\n      iterations: opt.iterations ?? CRYPTO_DEFAULT_DERIVE_ITERATIONS,\n      hash: CRYPTO_DEFAULT_HASH_ALG,\n    },\n    keyMaterial,\n    {\n      name: CRYPTO_DEFAULT_ALG,\n      length: 256,\n    },\n    true,\n    ['encrypt', 'decrypt'],\n  )\n}\n\nexport async function deriveKeyPbkdf2CBC(\n  secret: BinInput,\n  opt: {\n    iterations?: number\n    salt?: BinInput\n  } = {},\n): Promise<CryptoKey> {\n  const secretBuffer = ensureUint8Array(toUint8Array(secret))\n  const keyMaterial = await crypto.subtle.importKey(\n    'raw',\n    secretBuffer,\n    CRYPTO_DEFAULT_DERIVE_ALG,\n    false,\n    ['deriveKey'],\n  )\n  return await crypto.subtle.deriveKey(\n    {\n      name: CRYPTO_DEFAULT_DERIVE_ALG,\n      salt: opt.salt ? ensureUint8Array(toUint8Array(opt.salt)) : new Uint8Array(0),\n      iterations: opt.iterations ?? CRYPTO_DEFAULT_DERIVE_ITERATIONS,\n      hash: CRYPTO_DEFAULT_HASH_ALG,\n    },\n    keyMaterial,\n    {\n      name: 'AES-CBC',\n      length: 256,\n    },\n    true,\n    ['encrypt', 'decrypt'],\n  )\n}\n\nfunction getMagicId() {\n  return new Uint8Array([1, 1])\n}\n\nexport async function encrypt(\n  data: Uint8Array,\n  key: CryptoKey,\n): Promise<Uint8Array> {\n  const MAGIC_ID = getMagicId()\n  const iv = randomUint8Array(CRYPTO_DEFAULT_IV_LENGTH)\n  const cipher = await crypto.subtle.encrypt(\n    { name: CRYPTO_DEFAULT_ALG, iv: ensureUint8Array(iv) },\n    key,\n    ensureUint8Array(data),\n  )\n  const binCypher = new Uint8Array(cipher)\n  const bufferLength = MAGIC_ID.length + iv.length + binCypher.length\n  const buffer = new Uint8Array(bufferLength)\n  let pos = 0\n  buffer.set(MAGIC_ID, pos)\n  pos += MAGIC_ID.length\n  buffer.set(iv, pos)\n  pos += iv.length\n  buffer.set(binCypher, pos)\n  return buffer\n}\n\nexport async function decrypt(\n  data: Uint8Array,\n  key: CryptoKey,\n): Promise<Uint8Array> {\n  const magic = ensureUint8Array(data.subarray(0, 2))\n  if (!equalBinary(magic, getMagicId()))\n    return Promise.reject(new Error(`Unknown magic ${magic}`))\n\n  const iv = ensureUint8Array(data.subarray(2, 2 + CRYPTO_DEFAULT_IV_LENGTH))\n  const cipher = ensureUint8Array(data.subarray(2 + CRYPTO_DEFAULT_IV_LENGTH, data.length))\n  const plain = await crypto.subtle.decrypt(\n    { name: CRYPTO_DEFAULT_ALG, iv },\n    key,\n    cipher,\n  )\n  return new Uint8Array(plain)\n}\n"],"mappings":";;;;;AAIA,SAAgB,iBAAiB,SAAS,IAAgB;CACxD,MAAM,cAAc,IAAI,WAAW,OAAO;AAC1C,KAAI,OAAO,WAAW,eAAe,OAAO,gBAC1C,QAAO,gBAAgB,YAAY;KAKnC,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAG1B,aAAY,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAM;AAGtD,QAAO;;AAGT,MAAa,0BAA0B;AACvC,MAAa,qBAAqB;AAClC,MAAa,4BAA4B;AACzC,MAAa,mCAAmC;AAChD,MAAa,2BAA2B;AAExC,eAAsB,OACpB,SACA,YAAiC,yBACZ;CACrB,MAAM,IAAIA,6BAAiBC,yBAAa,QAAQ,CAAC;AACjD,QAAOA,yBACL,MAAM,OAAO,OAAO,OAAO,WAAW,EAAE,CACzC;;AAGH,eAAsB,gBACpB,QACA,MAGI,EAAE,EACc;CACpB,MAAM,eAAeD,6BAAiBC,yBAAa,OAAO,CAAC;CAC3D,MAAM,cAAc,MAAM,OAAO,OAAO,UACtC,OACA,cACA,2BACA,OACA,CAAC,YAAY,CACd;AACD,QAAO,MAAM,OAAO,OAAO,UACzB;EACE,MAAM;EACN,MAAM,IAAI,OAAOD,6BAAiBC,yBAAa,IAAI,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE;EAC7E,YAAY,IAAI;EAChB,MAAM;EACP,EACD,aACA;EACE,MAAM;EACN,QAAQ;EACT,EACD,MACA,CAAC,WAAW,UAAU,CACvB;;AAGH,eAAsB,mBACpB,QACA,MAGI,EAAE,EACc;CACpB,MAAM,eAAeD,6BAAiBC,yBAAa,OAAO,CAAC;CAC3D,MAAM,cAAc,MAAM,OAAO,OAAO,UACtC,OACA,cACA,2BACA,OACA,CAAC,YAAY,CACd;AACD,QAAO,MAAM,OAAO,OAAO,UACzB;EACE,MAAM;EACN,MAAM,IAAI,OAAOD,6BAAiBC,yBAAa,IAAI,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE;EAC7E,YAAY,IAAI;EAChB,MAAM;EACP,EACD,aACA;EACE,MAAM;EACN,QAAQ;EACT,EACD,MACA,CAAC,WAAW,UAAU,CACvB;;AAGH,SAAS,aAAa;AACpB,QAAO,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;;AAG/B,eAAsB,QACpB,MACA,KACqB;CACrB,MAAM,WAAW,YAAY;CAC7B,MAAM,KAAK,oBAA0C;CACrD,MAAM,SAAS,MAAM,OAAO,OAAO,QACjC;EAAE,MAAM;EAAoB,IAAID,6BAAiB,GAAG;EAAE,EACtD,KACAA,6BAAiB,KAAK,CACvB;CACD,MAAM,YAAY,IAAI,WAAW,OAAO;CACxC,MAAM,eAAe,SAAS,SAAS,GAAG,SAAS,UAAU;CAC7D,MAAM,SAAS,IAAI,WAAW,aAAa;CAC3C,IAAI,MAAM;AACV,QAAO,IAAI,UAAU,IAAI;AACzB,QAAO,SAAS;AAChB,QAAO,IAAI,IAAI,IAAI;AACnB,QAAO,GAAG;AACV,QAAO,IAAI,WAAW,IAAI;AAC1B,QAAO;;AAGT,eAAsB,QACpB,MACA,KACqB;CACrB,MAAM,QAAQA,6BAAiB,KAAK,SAAS,GAAG,EAAE,CAAC;AACnD,KAAI,CAACE,wBAAY,OAAO,YAAY,CAAC,CACnC,QAAO,QAAQ,uBAAO,IAAI,MAAM,iBAAiB,QAAQ,CAAC;CAE5D,MAAM,KAAKF,6BAAiB,KAAK,SAAS,GAAG,OAA6B,CAAC;CAC3E,MAAM,SAASA,6BAAiB,KAAK,SAAS,QAA8B,KAAK,OAAO,CAAC;CACzF,MAAM,QAAQ,MAAM,OAAO,OAAO,QAChC;EAAE,MAAM;EAAoB;EAAI,EAChC,KACA,OACD;AACD,QAAO,IAAI,WAAW,MAAM"}