one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 15.3 kB
Source Map (JSON)
{"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":";;;AACA,MAAM,YAAY;CAAC;CAAK;CAAK;AAAG;AAChC,MAAM,cAAc;CAAC;CAAI;CAAI;CAAI;CAAI;CAAI;CAAG;AAAC;AAC7C,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,SAAS,gBAAgB,WAAW,MAAM;CACxC,IAAI,CAAC,YAAY,SAAS,SAAS,GAAG;EACpC,MAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B,YAAY,KAAK,IAAI,GAAG;CAChF;AACF;AACA,SAAS,QAAQ,OAAO,MAAM;CAC5B,IAAI,OAAO,UAAU,UAAU,OAAO,cAAc,OAAO,IAAI;CAC/D,IAAI,iBAAiB,aAAa,OAAO,IAAI,WAAW,MAAM,MAAM,CAAC,CAAC;CACtE,IAAI,YAAY,OAAO,KAAK,KAAK,MAAM,kBAAkB,aAAa;EACpE,OAAO,WAAW,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU,CAAC;CACpF;CACA,MAAM,IAAI,UAAU,GAAG,KAAK,uDAAuD;AACrF;AACA,MAAM,8BAA8B,IAAI,QAAQ;AAChD,MAAM,2BAA2B,IAAI,QAAQ;AAC7C,SAAS,YAAY,OAAO,UAAU;CACpC,OAAO,aAAa,WAAW,cAAc,KAAK,IAAI,WAAW,KAAK;AACxE;AACA,SAAS,aAAa,QAAQ;CAC5B,MAAM,iBAAiB;EACrB;EAGA,YAAY,OAAO;GACjB,IAAI,CAAC,UAAU,SAAS,MAAM,SAAS,CAAC,GAAG;IACzC,MAAM,IAAI,MACR,mEAAmE,MAAM,SAAS,GACpF;GACF;GACA,KAAK,OAAO,MAAM,SAAS;GAC3B,SAAS,IAAI,MAAM,WAAW,KAAK,CAAC;EACtC;EACA,aAAa,SAAS,OAAO,KAAK;GAChC,IAAI,CAAC,UAAU,SAAS,IAAI,GAAG;IAC7B,MAAM,IAAI,MAAM,0DAA0D,UAAU,KAAK,IAAI,GAAG;GAClG;GACA,MAAM,QAAQ,IAAI,WAAW,OAAO,CAAC;GACrC,OAAO,OAAO,KAAK;GACnB,OAAO,IAAI,iBAAiB,KAAK;EACnC;EACA,aAAa,OAAO,OAAO,UAAU;GACnC,MAAM,OAAO;GACb,IAAI;GACJ,IAAI,OAAO,UAAU,UAAU;IAC7B,IAAI,aAAa,OAAO,QAAQ,WAAW,OAAO,IAAI;SACjD,IAAI,aAAa,UAAU,QAAQ,cAAc,OAAO,IAAI;SAC5D,MAAM,IAAI,MAAM,GAAG,KAAK,qCAAqC;GACpE,OAAO,IAAI,iBAAiB,YAAY;IACtC,QAAQ,WAAW,KAAK;GAC1B,OAAO;IACL,MAAM,IAAI,UAAU,GAAG,KAAK,sCAAsC;GACpE;GACA,IAAI,CAAC,UAAU,SAAS,MAAM,SAAS,CAAC,GAAG;IACzC,MAAM,IAAI,MAAM,GAAG,KAAK,2CAA2C,MAAM,SAAS,GAAG;GACvF;GACA,OAAO,IAAI,iBAAiB,KAAK;EACnC;EACA,MAAM,QAAQ;GACZ,OAAO,WAAW,SAAS,IAAI,IAAI,CAAC;EACtC;EACA,MAAM,QAAQ,UAAU;GACtB,MAAM,QAAQ,SAAS,IAAI,IAAI;GAC/B,IAAI,aAAa,OAAO,OAAO,WAAW,KAAK;GAC/C,IAAI,aAAa,UAAU,OAAO,cAAc,KAAK;GACrD,MAAM,IAAI,MAAM,qEAAqE;EACvF;CACF;CACA,MAAM,cAAc;EAIlB,YAAY,OAAO;GACjB,IAAI,MAAM,GAAG,WAAW,GAAG,MAAM,IAAI,MAAM,4CAA4C;GACvF,gBAAgB,MAAM,IAAI,QAAQ,sBAAsB;GACxD,YAAY,IAAI,MAAM,KAAK;EAC7B;EACA,OAAO,aAAa,UAAU,SAAS,CAAC,GAAG;GACzC,MAAM,OAAO;GACb,MAAM,WAAW,OAAO,YAAY;GACpC,MAAM,YAAY,OAAO,aAAa;GACtC,gBAAgB,WAAW,IAAI;GAC/B,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,YAAY,GAAG;IAChD,MAAM,IAAI,MAAM,GAAG,KAAK,sCAAsC;GAChE;GACA,MAAM,QAAQ,QAAQ,UAAU,IAAI;GACpC,IAAI,MAAM,SAAS,WAAW,WAAW;IACvC,MAAM,IAAI,MAAM,GAAG,KAAK,+CAA+C;GACzE;GACA,OAAO,IAAI,cAAc;IACvB,IAAI,WAAW,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC1C,YAAY,WAAW,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS,CAAC;IACzE,KAAK,WAAW,MAAM,SAAS,MAAM,SAAS,SAAS,CAAC;GAC1D,CAAC;EACH;EACA,OAAO,UAAU,SAAS,iBAAiB,aAAa;GACtD,MAAM,OAAO;GACb,MAAM,KAAK,QAAQ,SAAS,IAAI;GAChC,MAAM,aAAa,QAAQ,iBAAiB,IAAI;GAChD,IAAI,gBAAgB,KAAK,KAAK,OAAO,gBAAgB,UAAU;IAC7D,MAAM,YAAY,eAAe;IACjC,gBAAgB,WAAW,IAAI;IAC/B,IAAI,WAAW,SAAS,WAAW;KACjC,MAAM,IAAI,MAAM,GAAG,KAAK,qCAAqC;IAC/D;IACA,OAAO,IAAI,cAAc;KACvB;KACA,YAAY,WAAW,WAAW,SAAS,GAAG,WAAW,SAAS,SAAS,CAAC;KAC5E,KAAK,WAAW,WAAW,SAAS,WAAW,SAAS,SAAS,CAAC;IACpE,CAAC;GACH;GACA,MAAM,MAAM,QAAQ,aAAa,IAAI;GACrC,gBAAgB,IAAI,QAAQ,IAAI;GAChC,OAAO,IAAI,cAAc;IAAE;IAAI;IAAY;GAAI,CAAC;EAClD;EAGA,OAAO,SAAS,IAAI,mBAAmB,WAAW;GAChD,OAAO,IAAI,cAAc;IACvB;IACA,YAAY,WAAW,kBAAkB,SAAS,GAAG,kBAAkB,SAAS,SAAS,CAAC;IAC1F,KAAK,WAAW,kBAAkB,SAAS,kBAAkB,SAAS,SAAS,CAAC;GAClF,CAAC;EACH;EACA,IAAI,SAAS;GACX,OAAO,YAAY,IAAI,IAAI,CAAC,CAAC,GAAG;EAClC;EACA,IAAI,UAAU;GACZ,OAAO,YAAY,IAAI,IAAI,CAAC,CAAC,IAAI;EACnC;EACA,IAAI,eAAe;GACjB,MAAM,QAAQ,YAAY,IAAI,IAAI;GAClC,OAAO,MAAM,GAAG,SAAS,MAAM,WAAW,SAAS,MAAM,IAAI;EAC/D;EACA,MAAM,GAAG,UAAU;GACjB,OAAO,YAAY,YAAY,IAAI,IAAI,CAAC,CAAC,IAAI,QAAQ;EACvD;EACA,MAAM,IAAI,UAAU;GAClB,OAAO,YAAY,YAAY,IAAI,IAAI,CAAC,CAAC,KAAK,QAAQ;EACxD;EACA,MAAM,WAAW,SAAS;GACxB,MAAM,QAAQ,YAAY,IAAI,IAAI;GAClC,MAAM,QAAQ,SAAS,aAAa,YAAY,CAAC,MAAM,YAAY,MAAM,GAAG,CAAC,IAAI,MAAM;GACvF,OAAO,YAAY,OAAO,SAAS,QAAQ;EAC7C;EACA,MAAM,SAAS,UAAU;GACvB,MAAM,QAAQ,YAAY,IAAI,IAAI;GAClC,OAAO,YAAY,YAAY;IAAC,MAAM;IAAI,MAAM;IAAY,MAAM;GAAG,CAAC,GAAG,QAAQ;EACnF;CACF;CACA,eAAe,YAAY,KAAK,MAAM;EACpC,MAAM,MAAM,SAAS,IAAI,GAAG;EAC5B,IAAI,KAAK,OAAO,WAAW,GAAG;EAC9B,IAAI,OAAO,OAAO,IAAI,UAAU,YAAY,OAAO,WAAW,MAAM,IAAI,MAAM,CAAC;EAC/E,MAAM,IAAI,UAAU,GAAG,KAAK,+BAA+B;CAC7D;CACA,eAAe,QAAQ,QAAQ,MAAM;EACnC,MAAM,MAAM,YAAY,IAAI,MAAM;EAClC,IAAI,KAAK;GACP,OAAO;IACL,IAAI,WAAW,IAAI,EAAE;IACrB,YAAY,WAAW,IAAI,UAAU;IACrC,KAAK,WAAW,IAAI,GAAG;GACzB;EACF;EACA,IAAI,UAAU,OAAO,OAAO,OAAO,cAAc,OAAO,OAAO,aAAa,YAAY;GACtF,MAAM,KAAK,WAAW,MAAM,OAAO,GAAG,CAAC;GACvC,MAAM,MAAM,WAAW,MAAM,OAAO,IAAI,CAAC;GACzC,MAAM,aAAa,WAAW,MAAM,OAAO,WAAW;IAAE,UAAU;IAAS,YAAY;GAAM,CAAC,CAAC;GAC/F,OAAO;IAAE;IAAI;IAAY;GAAI;EAC/B;EACA,MAAM,IAAI,UAAU,GAAG,KAAK,4BAA4B;CAC1D;CACA,eAAe,WAAW,WAAW,KAAK,UAAU,CAAC,GAAG;EACtD,MAAM,OAAO;EACb,MAAM,YAAY,QAAQ,aAAa;EACvC,gBAAgB,WAAW,IAAI;EAC/B,IAAI;EACJ,MAAM,QAAQ,QAAQ;EACtB,IAAI,SAAS,WAAW,SAAS,MAAM,UAAU,KAAK,GAAG;GACvD,KAAK,QAAQ,MAAM,OAAO,IAAI;GAC9B,IAAI,GAAG,WAAW,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,gCAAgC;EAC/E,OAAO;GACL,MAAM,SAAS,SAAS,YAAY,SAAS,MAAM,WAAW,KAAK,IAAI,MAAM,SAAS;GACtF,IAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;IAC5C,MAAM,IAAI,MAAM,GAAG,KAAK,0CAA0C;GACpE;GACA,KAAK,IAAI,WAAW,MAAM;GAC1B,OAAO,OAAO,EAAE;EAClB;EACA,MAAM,iBAAiB,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,QAAQ,QAAQ,gBAAgB,IAAI;EACxG,MAAM,aAAa,QAAQ,WAAW,IAAI;EAC1C,MAAM,SAAS,MAAM,OAAO,KAC1B,MAAM,YAAY,KAAK,IAAI,GAC3B,IACA,YACA,gBACA,SACF;EACA,MAAM,YAAY,OAAO,SAAS,WAAW;EAC7C,OAAO,cAAc,SAAS,IAAI,QAAQ,YAAY,IAAI,YAAY,SAAS;CACjF;CACA,eAAe,WAAW,YAAY,KAAK,UAAU,CAAC,GAAG;EACvD,MAAM,OAAO;EACb,MAAM,QAAQ,MAAM,QAAQ,YAAY,IAAI;EAC5C,MAAM,iBAAiB,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,QAAQ,QAAQ,gBAAgB,IAAI;EACxG,MAAM,YAAY,MAAM,OAAO,KAC7B,MAAM,YAAY,KAAK,IAAI,GAC3B,MAAM,IACN,YAAY,CAAC,MAAM,YAAY,MAAM,GAAG,CAAC,GACzC,gBACA,MAAM,IAAI,MACZ;EACA,OAAO,QAAQ,WAAW,WAAW,cAAc,SAAS,IAAI;CAClE;CACA,OAAO;EAAE;EAAkB;EAAe;EAAY;CAAW;AACnE"}