{"version":3,"file":"aes.js","names":[],"sources":["esm/platform/crypto/aes.js"],"sourcesContent":["import { base64ToBytes, bytesToBase64, bytesToHex, concatBytes, exactBytes, hexToBytes } from \"./bytes\";\nconst KEY_SIZES = [128, 192, 256];\nconst TAG_LENGTHS = [16, 15, 14, 13, 12, 8, 4];\nconst DEFAULT_IV_LENGTH = 12;\nconst DEFAULT_TAG_LENGTH = 16;\nfunction assertTagLength(tagLength, verb) {\n  if (!TAG_LENGTHS.includes(tagLength)) {\n    throw new Error(`${verb}: tagLength must be one of: ${TAG_LENGTHS.join(\", \")}`);\n  }\n}\nfunction toBytes(input, verb) {\n  if (typeof input === \"string\") return base64ToBytes(input, verb);\n  if (input instanceof ArrayBuffer) return new Uint8Array(input.slice(0));\n  if (ArrayBuffer.isView(input) && input.buffer instanceof ArrayBuffer) {\n    return exactBytes(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n  }\n  throw new TypeError(`${verb}: expected a base64 string, Uint8Array, or ArrayBuffer`);\n}\nconst sealedParts = /* @__PURE__ */ new WeakMap();\nconst keyBytes = /* @__PURE__ */ new WeakMap();\nfunction encodeParts(bytes, encoding) {\n  return encoding === \"base64\" ? bytesToBase64(bytes) : exactBytes(bytes);\n}\nfunction createAesApi(engine) {\n  class AESEncryptionKey {\n    size;\n    // construct through generate or import; direct construction still\n    // validates, so a key object can never hold a non-AES length.\n    constructor(bytes) {\n      if (!KEY_SIZES.includes(bytes.length * 8)) {\n        throw new Error(\n          `Crypto.AESEncryptionKey: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`\n        );\n      }\n      this.size = bytes.length * 8;\n      keyBytes.set(this, exactBytes(bytes));\n    }\n    static async generate(size = 256) {\n      if (!KEY_SIZES.includes(size)) {\n        throw new Error(`Crypto.AESEncryptionKey.generate: size must be one of: ${KEY_SIZES.join(\", \")}`);\n      }\n      const bytes = new Uint8Array(size / 8);\n      engine.random(bytes);\n      return new AESEncryptionKey(bytes);\n    }\n    static async import(input, encoding) {\n      const verb = \"Crypto.AESEncryptionKey.import\";\n      let bytes;\n      if (typeof input === \"string\") {\n        if (encoding === \"hex\") bytes = hexToBytes(input, verb);\n        else if (encoding === \"base64\") bytes = base64ToBytes(input, verb);\n        else throw new Error(`${verb}: encoding must be 'hex' or 'base64'`);\n      } else if (input instanceof Uint8Array) {\n        bytes = exactBytes(input);\n      } else {\n        throw new TypeError(`${verb}: expected bytes or an encoded string`);\n      }\n      if (!KEY_SIZES.includes(bytes.length * 8)) {\n        throw new Error(`${verb}: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);\n      }\n      return new AESEncryptionKey(bytes);\n    }\n    async bytes() {\n      return exactBytes(keyBytes.get(this));\n    }\n    async encoded(encoding) {\n      const bytes = keyBytes.get(this);\n      if (encoding === \"hex\") return bytesToHex(bytes);\n      if (encoding === \"base64\") return bytesToBase64(bytes);\n      throw new Error(`Crypto.AESEncryptionKey.encoded: encoding must be 'hex' or 'base64'`);\n    }\n  }\n  class AESSealedData {\n    // construct through fromCombined or fromParts. direct construction still\n    // validates, so sealed data can never carry an empty iv or a tag gcm\n    // does not allow.\n    constructor(parts) {\n      if (parts.iv.length === 0) throw new Error(\"Crypto.AESSealedData: iv must not be empty\");\n      assertTagLength(parts.tag.length, \"Crypto.AESSealedData\");\n      sealedParts.set(this, parts);\n    }\n    static fromCombined(combined, config = {}) {\n      const verb = \"Crypto.AESSealedData.fromCombined\";\n      const ivLength = config.ivLength ?? DEFAULT_IV_LENGTH;\n      const tagLength = config.tagLength ?? DEFAULT_TAG_LENGTH;\n      assertTagLength(tagLength, verb);\n      if (!Number.isInteger(ivLength) || ivLength <= 0) {\n        throw new Error(`${verb}: ivLength must be a positive integer`);\n      }\n      const bytes = toBytes(combined, verb);\n      if (bytes.length < ivLength + tagLength) {\n        throw new Error(`${verb}: combined data is shorter than its iv and tag`);\n      }\n      return new AESSealedData({\n        iv: exactBytes(bytes.subarray(0, ivLength)),\n        ciphertext: exactBytes(bytes.subarray(ivLength, bytes.length - tagLength)),\n        tag: exactBytes(bytes.subarray(bytes.length - tagLength))\n      });\n    }\n    static fromParts(ivInput, ciphertextInput, tagOrLength) {\n      const verb = \"Crypto.AESSealedData.fromParts\";\n      const iv = toBytes(ivInput, verb);\n      const ciphertext = toBytes(ciphertextInput, verb);\n      if (tagOrLength === void 0 || typeof tagOrLength === \"number\") {\n        const tagLength = tagOrLength ?? DEFAULT_TAG_LENGTH;\n        assertTagLength(tagLength, verb);\n        if (ciphertext.length < tagLength) {\n          throw new Error(`${verb}: ciphertext is shorter than its tag`);\n        }\n        return new AESSealedData({\n          iv,\n          ciphertext: exactBytes(ciphertext.subarray(0, ciphertext.length - tagLength)),\n          tag: exactBytes(ciphertext.subarray(ciphertext.length - tagLength))\n        });\n      }\n      const tag = toBytes(tagOrLength, verb);\n      assertTagLength(tag.length, verb);\n      return new AESSealedData({ iv, ciphertext, tag });\n    }\n    // internal: aesEncrypt builds sealed data from engine output without\n    // going through the public parsers (which would just re-split it).\n    static fromSeal(iv, ciphertextWithTag, tagLength) {\n      return new AESSealedData({\n        iv,\n        ciphertext: exactBytes(ciphertextWithTag.subarray(0, ciphertextWithTag.length - tagLength)),\n        tag: exactBytes(ciphertextWithTag.subarray(ciphertextWithTag.length - tagLength))\n      });\n    }\n    get ivSize() {\n      return sealedParts.get(this).iv.length;\n    }\n    get tagSize() {\n      return sealedParts.get(this).tag.length;\n    }\n    get combinedSize() {\n      const parts = sealedParts.get(this);\n      return parts.iv.length + parts.ciphertext.length + parts.tag.length;\n    }\n    async iv(encoding) {\n      return encodeParts(sealedParts.get(this).iv, encoding);\n    }\n    async tag(encoding) {\n      return encodeParts(sealedParts.get(this).tag, encoding);\n    }\n    async ciphertext(options) {\n      const parts = sealedParts.get(this);\n      const bytes = options?.includeTag ? concatBytes([parts.ciphertext, parts.tag]) : parts.ciphertext;\n      return encodeParts(bytes, options?.encoding);\n    }\n    async combined(encoding) {\n      const parts = sealedParts.get(this);\n      return encodeParts(concatBytes([parts.iv, parts.ciphertext, parts.tag]), encoding);\n    }\n  }\n  async function keyMaterial(key, verb) {\n    const own = keyBytes.get(key);\n    if (own) return exactBytes(own);\n    if (key && typeof key.bytes === \"function\") return exactBytes(await key.bytes());\n    throw new TypeError(`${verb}: expected an AESEncryptionKey`);\n  }\n  async function partsOf(sealed, verb) {\n    const own = sealedParts.get(sealed);\n    if (own) {\n      return {\n        iv: exactBytes(own.iv),\n        ciphertext: exactBytes(own.ciphertext),\n        tag: exactBytes(own.tag)\n      };\n    }\n    if (sealed && typeof sealed.iv === \"function\" && typeof sealed.combined === \"function\") {\n      const iv = exactBytes(await sealed.iv());\n      const tag = exactBytes(await sealed.tag());\n      const ciphertext = exactBytes(await sealed.ciphertext({ encoding: \"bytes\", includeTag: false }));\n      return { iv, ciphertext, tag };\n    }\n    throw new TypeError(`${verb}: expected an AESSealedData`);\n  }\n  async function aesEncrypt(plaintext, key, options = {}) {\n    const verb = \"Crypto.aesEncrypt\";\n    const tagLength = options.tagLength ?? DEFAULT_TAG_LENGTH;\n    assertTagLength(tagLength, verb);\n    let iv;\n    const nonce = options.nonce;\n    if (nonce && \"bytes\" in nonce && nonce.bytes !== void 0) {\n      iv = toBytes(nonce.bytes, verb);\n      if (iv.length === 0) throw new Error(`${verb}: nonce bytes must not be empty`);\n    } else {\n      const length = nonce && \"length\" in nonce && nonce.length !== void 0 ? nonce.length : DEFAULT_IV_LENGTH;\n      if (!Number.isInteger(length) || length <= 0) {\n        throw new Error(`${verb}: nonce length must be a positive integer`);\n      }\n      iv = new Uint8Array(length);\n      engine.random(iv);\n    }\n    const additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);\n    const plainBytes = toBytes(plaintext, verb);\n    const sealed = await engine.seal(\n      await keyMaterial(key, verb),\n      iv,\n      plainBytes,\n      additionalData,\n      tagLength\n    );\n    const actualTag = sealed.length - plainBytes.length;\n    return AESSealedData.fromSeal(iv, sealed, actualTag > 0 ? actualTag : tagLength);\n  }\n  async function aesDecrypt(sealedData, key, options = {}) {\n    const verb = \"Crypto.aesDecrypt\";\n    const parts = await partsOf(sealedData, verb);\n    const additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);\n    const plaintext = await engine.open(\n      await keyMaterial(key, verb),\n      parts.iv,\n      concatBytes([parts.ciphertext, parts.tag]),\n      additionalData,\n      parts.tag.length\n    );\n    return options.output === \"base64\" ? bytesToBase64(plaintext) : plaintext;\n  }\n  return { AESEncryptionKey, AESSealedData, aesEncrypt, aesDecrypt };\n}\nexport {\n  assertTagLength,\n  createAesApi,\n  toBytes\n};\n//# sourceMappingURL=aes.js.map\n"],"mappings":"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"}