{
  "version": 3,
  "sources": ["../../src/aes/webcrypto.ts"],
  "sourcesContent": ["import { webcrypto } from '@bicycle-codes/one-webcrypto'\nimport {\n    DEFAULT_SYMM_ALGORITHM,\n    DEFAULT_CTR_LEN,\n    DEFAULT_SYMM_LEN,\n    DEFAULT_CHAR_SIZE,\n} from '../constants.js'\nimport {\n    CharSize,\n    type CipherText,\n    type SymmKey,\n    type Msg,\n    type SymmKeyLength,\n    type SymmKeyOpts,\n    type SymmAlg\n} from '../types.js'\nimport {\n    randomBuf,\n    normalizeUtf16ToBuf,\n    joinBufs,\n    normalizeBase64ToBuf,\n    arrBufToBase64,\n    arrBufToStr,\n    base64ToArrBuf,\n    normalizeUtf8ToBuf,\n} from '../util.js'\n\nexport async function encryptBytes (\n    msg:Msg,\n    key:SymmKey|string,\n    opts?:Partial<{\n        alg:SymmAlg\n        length:SymmKeyLength\n        iv:ArrayBuffer\n    }>,\n    charSize:CharSize = DEFAULT_CHAR_SIZE\n):Promise<CipherText> {\n    const data = (charSize === CharSize.B8 ?\n        normalizeUtf8ToBuf(msg) :\n        normalizeUtf16ToBuf(msg))\n\n    const importedKey = typeof key === 'string' ? await importKey(key, opts) : key\n    const alg = opts?.alg || DEFAULT_SYMM_ALGORITHM\n    const iv = opts?.iv || randomBuf(12)\n    const cipherBuf = await webcrypto.subtle.encrypt(\n        {\n            name: alg,\n            // AES-CTR uses a counter, AES-GCM/AES-CBC use an initialization vector\n            iv: alg === 'AES-CTR' ? undefined : iv,\n            counter: alg === 'AES-CTR' ? new Uint8Array(iv) : undefined,\n            length: alg === 'AES-CTR' ? DEFAULT_CTR_LEN : undefined,\n        },\n        importedKey,\n        data\n    )\n\n    return joinBufs(iv, cipherBuf)\n}\n\nexport async function decryptBytes (\n    msg:Msg,\n    key:SymmKey|string|Uint8Array,\n    opts?:Partial<SymmKeyOpts>\n):Promise<ArrayBuffer> {\n    const cipherText = normalizeBase64ToBuf(msg)\n    let importedKey:CryptoKey\n    if (typeof key === 'string') {\n        importedKey = await importKey(key, opts)\n    } else if (key instanceof Uint8Array) {\n        importedKey = await importKey(key, opts)\n    } else {\n        importedKey = key\n    }\n\n    const alg = opts?.alg || DEFAULT_SYMM_ALGORITHM\n    const iv = cipherText.slice(0, 12)\n    const cipherBytes = cipherText.slice(12)\n    const msgBuff = await webcrypto.subtle.decrypt(\n        {\n            name: alg,\n            // AES-CTR uses a counter, AES-GCM/AES-CBC use an initialization vector\n            iv: alg === 'AES-CTR' ? undefined : iv,\n            counter: alg === 'AES-CTR' ? new Uint8Array(iv) : undefined,\n            length: alg === 'AES-CTR' ? DEFAULT_CTR_LEN : undefined,\n        },\n        importedKey,\n        cipherBytes\n    )\n\n    return msgBuff\n}\n\nexport async function encrypt (\n    msg:Msg,\n    key:SymmKey|string,\n    opts?:Partial<SymmKeyOpts>\n):Promise<string> {\n    const cipherText = await encryptBytes(msg, key, opts)\n    return arrBufToBase64(cipherText)\n}\n\nexport async function decrypt (\n    msg:Msg,\n    key:SymmKey|string|Uint8Array,\n    opts?:Partial<SymmKeyOpts>,\n    charSize:CharSize = DEFAULT_CHAR_SIZE\n):Promise<string> {\n    const msgBytes = await decryptBytes(msg, key, opts)\n    return arrBufToStr(msgBytes, charSize)\n}\n\nexport async function exportKey (key:SymmKey):Promise<Uint8Array> {\n    const raw = await webcrypto.subtle.exportKey('raw', key)\n    return new Uint8Array(raw)\n}\n\nexport default {\n    encryptBytes,\n    decryptBytes,\n    encrypt,\n    decrypt,\n    exportKey\n}\n\nexport async function importKey (\n    key:string|Uint8Array,\n    opts?:Partial<SymmKeyOpts>\n):Promise<SymmKey> {\n    const buf = typeof key === 'string' ? base64ToArrBuf(key) : key\n\n    return webcrypto.subtle.importKey(\n        'raw',\n        buf,\n        {\n            name: opts?.alg || DEFAULT_SYMM_ALGORITHM,\n            length: opts?.length || DEFAULT_SYMM_LEN,\n        },\n        true,\n        ['encrypt', 'decrypt']\n    )\n}\n\n/**\n * Create a new AES key.\n */\nexport function create (opts:{ alg:SymmAlg, length:number } = {\n    alg: DEFAULT_SYMM_ALGORITHM,\n    length: DEFAULT_SYMM_LEN\n}):Promise<CryptoKey> {\n    return webcrypto.subtle.generateKey({\n        name: opts.alg,\n        length: opts.length\n    }, true, ['encrypt', 'decrypt'])\n}\n\n"],
  "mappings": "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",
  "names": []
}
