@ricsam/quickjs-crypto 0.0.1 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/subtle-crypto.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { CryptoKeyState, KeyUsage } from \"./types.cjs\";\nimport {\n nextInstanceId,\n registerInstance,\n getInstanceStateById,\n marshal,\n unmarshal,\n} from \"@ricsam/quickjs-core\";\n\n/**\n * Helper to create a CryptoKey instance in QuickJS from a host CryptoKey\n *\n * This registers the host key in our state management and creates\n * a QuickJS CryptoKey object that references it via __instanceId__\n */\nexport function createCryptoKeyInstance(\n context: QuickJSContext,\n hostKey: globalThis.CryptoKey\n): QuickJSHandle {\n const instanceId = nextInstanceId();\n\n const state: CryptoKeyState = {\n hostKey,\n type: hostKey.type,\n extractable: hostKey.extractable,\n algorithm: hostKey.algorithm as KeyAlgorithm,\n usages: Array.from(hostKey.usages) as KeyUsage[],\n };\n\n registerInstance(instanceId, \"CryptoKey\", state);\n\n // Create instance via evalCode to properly instantiate with prototype chain\n const result = context.evalCode(`\n (function() {\n const key = Object.create(CryptoKey.prototype);\n Object.defineProperty(key, '__instanceId__', {\n value: ${instanceId},\n enumerable: false,\n writable: false,\n configurable: false\n });\n return key;\n })()\n `);\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to create CryptoKey instance: ${JSON.stringify(err)}`);\n }\n\n return result.value;\n}\n\n/**\n * Helper to create a CryptoKeyPair object in QuickJS\n */\nfunction createCryptoKeyPairInstance(\n context: QuickJSContext,\n keyPair: globalThis.CryptoKeyPair\n): QuickJSHandle {\n const publicKeyHandle = createCryptoKeyInstance(context, keyPair.publicKey);\n const privateKeyHandle = createCryptoKeyInstance(context, keyPair.privateKey);\n\n const obj = context.newObject();\n context.setProp(obj, \"publicKey\", publicKeyHandle);\n context.setProp(obj, \"privateKey\", privateKeyHandle);\n\n publicKeyHandle.dispose();\n privateKeyHandle.dispose();\n\n return obj;\n}\n\n/**\n * Helper to get the host CryptoKey from a QuickJS CryptoKey handle\n */\nfunction getHostKey(context: QuickJSContext, keyHandle: QuickJSHandle): globalThis.CryptoKey {\n const instanceIdHandle = context.getProp(keyHandle, \"__instanceId__\");\n if (context.typeof(instanceIdHandle) !== \"number\") {\n instanceIdHandle.dispose();\n throw new Error(\"Invalid CryptoKey: missing __instanceId__\");\n }\n\n const instanceId = context.getNumber(instanceIdHandle);\n instanceIdHandle.dispose();\n\n const state = getInstanceStateById<CryptoKeyState>(instanceId);\n if (!state) {\n throw new Error(\"Invalid CryptoKey: state not found\");\n }\n\n return state.hostKey;\n}\n\n/**\n * Helper to safely get an argument from the args array\n */\nfunction getArg(args: QuickJSHandle[], index: number): QuickJSHandle {\n const arg = args[index];\n if (!arg) {\n throw new Error(`Missing argument at index ${index}`);\n }\n return arg;\n}\n\n/**\n * Create an async SubtleCrypto method that handles CryptoKey marshalling\n *\n * @param unmarshalArgs - Function to unmarshal arguments synchronously before async work\n * @param implementation - Async implementation that receives unmarshaled args\n */\nfunction createSubtleMethod<T>(\n context: QuickJSContext,\n methodName: string,\n unmarshalArgs: (context: QuickJSContext, args: QuickJSHandle[]) => T,\n implementation: (context: QuickJSContext, unmarshaledArgs: T) => Promise<QuickJSHandle>\n): QuickJSHandle {\n return context.newFunction(methodName, (...args) => {\n const deferred = context.newPromise();\n\n // Unmarshal arguments synchronously BEFORE scheduling async work\n // This is critical because the QuickJS handles may be disposed before the microtask runs\n let unmarshaledArgs: T;\n try {\n unmarshaledArgs = unmarshalArgs(context, args);\n } catch (error) {\n // If unmarshalling fails, reject immediately\n const errorHandle = marshal(context, {\n name: error instanceof Error ? error.name : \"Error\",\n message: error instanceof Error ? error.message : String(error),\n });\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n return deferred.handle;\n }\n\n // Run the async implementation in a microtask\n Promise.resolve().then(async () => {\n try {\n const resultHandle = await implementation(context, unmarshaledArgs);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n } catch (error) {\n // Use marshal instead of newError to avoid issues with disposed context\n const errorHandle = marshal(context, {\n name: error instanceof Error ? error.name : \"Error\",\n message: error instanceof Error ? error.message : String(error),\n });\n deferred.reject(errorHandle);\n errorHandle.dispose();\n }\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n\n// Type definitions for unmarshaled args\ninterface DigestArgs {\n algorithm: AlgorithmIdentifier;\n data: Uint8Array;\n}\n\ninterface GenerateKeyArgs {\n algorithm: RsaHashedKeyGenParams | EcKeyGenParams | AesKeyGenParams | HmacKeyGenParams;\n extractable: boolean;\n keyUsages: globalThis.KeyUsage[];\n}\n\ninterface SignArgs {\n algorithm: AlgorithmIdentifier;\n key: globalThis.CryptoKey;\n data: Uint8Array;\n}\n\ninterface VerifyArgs {\n algorithm: AlgorithmIdentifier;\n key: globalThis.CryptoKey;\n signature: Uint8Array;\n data: Uint8Array;\n}\n\ninterface EncryptDecryptArgs {\n algorithm: AlgorithmIdentifier;\n key: globalThis.CryptoKey;\n data: Uint8Array;\n}\n\ninterface ImportKeyArgs {\n format: \"raw\" | \"pkcs8\" | \"spki\" | \"jwk\";\n keyData: Uint8Array | JsonWebKey;\n algorithm: AlgorithmIdentifier;\n extractable: boolean;\n keyUsages: globalThis.KeyUsage[];\n}\n\ninterface ExportKeyArgs {\n format: \"raw\" | \"pkcs8\" | \"spki\" | \"jwk\";\n key: globalThis.CryptoKey;\n}\n\ninterface DeriveBitsArgs {\n algorithm: Record<string, unknown>;\n baseKey: globalThis.CryptoKey;\n length: number;\n}\n\ninterface DeriveKeyArgs {\n algorithm: Record<string, unknown>;\n baseKey: globalThis.CryptoKey;\n derivedKeyType: AlgorithmIdentifier;\n extractable: boolean;\n keyUsages: globalThis.KeyUsage[];\n}\n\ninterface WrapKeyArgs {\n format: \"raw\" | \"pkcs8\" | \"spki\" | \"jwk\";\n key: globalThis.CryptoKey;\n wrappingKey: globalThis.CryptoKey;\n wrapAlgorithm: AlgorithmIdentifier;\n}\n\ninterface UnwrapKeyArgs {\n format: \"raw\" | \"pkcs8\" | \"spki\" | \"jwk\";\n wrappedKey: Uint8Array;\n unwrappingKey: globalThis.CryptoKey;\n unwrapAlgorithm: AlgorithmIdentifier;\n unwrappedKeyAlgorithm: AlgorithmIdentifier;\n extractable: boolean;\n keyUsages: globalThis.KeyUsage[];\n}\n\n/**\n * Create the SubtleCrypto object with all methods\n */\nexport function createSubtleCryptoObject(context: QuickJSContext): QuickJSHandle {\n const subtle = context.newObject();\n\n // digest(algorithm, data) -> ArrayBuffer\n const digestFn = createSubtleMethod<DigestArgs>(\n context,\n \"digest\",\n (ctx, args) => ({\n algorithm: unmarshal(ctx, getArg(args, 0)) as AlgorithmIdentifier,\n data: unmarshal(ctx, getArg(args, 1)) as Uint8Array,\n }),\n async (ctx, { algorithm, data }) => {\n const result = await crypto.subtle.digest(algorithm, data as unknown as BufferSource);\n return marshal(ctx, new Uint8Array(result));\n }\n );\n context.setProp(subtle, \"digest\", digestFn);\n digestFn.dispose();\n\n // generateKey(algorithm, extractable, keyUsages) -> CryptoKey | CryptoKeyPair\n const generateKeyFn = createSubtleMethod<GenerateKeyArgs>(\n context,\n \"generateKey\",\n (ctx, args) => ({\n algorithm: unmarshal(ctx, getArg(args, 0)) as GenerateKeyArgs[\"algorithm\"],\n extractable: unmarshal(ctx, getArg(args, 1)) as boolean,\n keyUsages: unmarshal(ctx, getArg(args, 2)) as globalThis.KeyUsage[],\n }),\n async (ctx, { algorithm, extractable, keyUsages }) => {\n const result = await crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n\n // Check if it's a key pair or single key\n if (\"publicKey\" in result && \"privateKey\" in result) {\n return createCryptoKeyPairInstance(ctx, result);\n } else {\n return createCryptoKeyInstance(ctx, result as globalThis.CryptoKey);\n }\n }\n );\n context.setProp(subtle, \"generateKey\", generateKeyFn);\n generateKeyFn.dispose();\n\n // sign(algorithm, key, data) -> ArrayBuffer\n const signFn = createSubtleMethod<SignArgs>(\n context,\n \"sign\",\n (ctx, args) => ({\n algorithm: unmarshal(ctx, getArg(args, 0)) as AlgorithmIdentifier,\n key: getHostKey(ctx, getArg(args, 1)),\n data: unmarshal(ctx, getArg(args, 2)) as Uint8Array,\n }),\n async (ctx, { algorithm, key, data }) => {\n const result = await crypto.subtle.sign(algorithm, key, data as unknown as BufferSource);\n return marshal(ctx, new Uint8Array(result));\n }\n );\n context.setProp(subtle, \"sign\", signFn);\n signFn.dispose();\n\n // verify(algorithm, key, signature, data) -> boolean\n const verifyFn = createSubtleMethod<VerifyArgs>(\n context,\n \"verify\",\n (ctx, args) => ({\n algorithm: unmarshal(ctx, getArg(args, 0)) as AlgorithmIdentifier,\n key: getHostKey(ctx, getArg(args, 1)),\n signature: unmarshal(ctx, getArg(args, 2)) as Uint8Array,\n data: unmarshal(ctx, getArg(args, 3)) as Uint8Array,\n }),\n async (ctx, { algorithm, key, signature, data }) => {\n const result = await crypto.subtle.verify(\n algorithm,\n key,\n signature as unknown as BufferSource,\n data as unknown as BufferSource\n );\n return marshal(ctx, result);\n }\n );\n context.setProp(subtle, \"verify\", verifyFn);\n verifyFn.dispose();\n\n // encrypt(algorithm, key, data) -> ArrayBuffer\n const encryptFn = createSubtleMethod<EncryptDecryptArgs>(\n context,\n \"encrypt\",\n (ctx, args) => ({\n algorithm: unmarshal(ctx, getArg(args, 0)) as AlgorithmIdentifier,\n key: getHostKey(ctx, getArg(args, 1)),\n data: unmarshal(ctx, getArg(args, 2)) as Uint8Array,\n }),\n async (ctx, { algorithm, key, data }) => {\n const result = await crypto.subtle.encrypt(\n algorithm,\n key,\n data as unknown as BufferSource\n );\n return marshal(ctx, new Uint8Array(result));\n }\n );\n context.setProp(subtle, \"encrypt\", encryptFn);\n encryptFn.dispose();\n\n // decrypt(algorithm, key, data) -> ArrayBuffer\n const decryptFn = createSubtleMethod<EncryptDecryptArgs>(\n context,\n \"decrypt\",\n (ctx, args) => ({\n algorithm: unmarshal(ctx, getArg(args, 0)) as AlgorithmIdentifier,\n key: getHostKey(ctx, getArg(args, 1)),\n data: unmarshal(ctx, getArg(args, 2)) as Uint8Array,\n }),\n async (ctx, { algorithm, key, data }) => {\n const result = await crypto.subtle.decrypt(\n algorithm,\n key,\n data as unknown as BufferSource\n );\n return marshal(ctx, new Uint8Array(result));\n }\n );\n context.setProp(subtle, \"decrypt\", decryptFn);\n decryptFn.dispose();\n\n // importKey(format, keyData, algorithm, extractable, keyUsages) -> CryptoKey\n const importKeyFn = createSubtleMethod<ImportKeyArgs>(\n context,\n \"importKey\",\n (ctx, args) => ({\n format: unmarshal(ctx, getArg(args, 0)) as ImportKeyArgs[\"format\"],\n keyData: unmarshal(ctx, getArg(args, 1)) as Uint8Array | JsonWebKey,\n algorithm: unmarshal(ctx, getArg(args, 2)) as AlgorithmIdentifier,\n extractable: unmarshal(ctx, getArg(args, 3)) as boolean,\n keyUsages: unmarshal(ctx, getArg(args, 4)) as globalThis.KeyUsage[],\n }),\n async (ctx, { format, keyData, algorithm, extractable, keyUsages }) => {\n let result: globalThis.CryptoKey;\n\n if (format === \"jwk\") {\n // JWK format expects JsonWebKey\n result = await crypto.subtle.importKey(\n format,\n keyData as JsonWebKey,\n algorithm,\n extractable,\n keyUsages\n );\n } else {\n // Non-jwk formats expect BufferSource\n // Convert Uint8Array to ArrayBuffer\n let data: BufferSource;\n if (keyData instanceof Uint8Array) {\n data = keyData.buffer.slice(keyData.byteOffset, keyData.byteOffset + keyData.byteLength) as ArrayBuffer;\n } else {\n data = keyData as BufferSource;\n }\n\n result = await crypto.subtle.importKey(\n format,\n data,\n algorithm,\n extractable,\n keyUsages\n ) as globalThis.CryptoKey;\n }\n\n return createCryptoKeyInstance(ctx, result);\n }\n );\n context.setProp(subtle, \"importKey\", importKeyFn);\n importKeyFn.dispose();\n\n // exportKey(format, key) -> ArrayBuffer | JsonWebKey\n const exportKeyFn = createSubtleMethod<ExportKeyArgs>(\n context,\n \"exportKey\",\n (ctx, args) => ({\n format: unmarshal(ctx, getArg(args, 0)) as ExportKeyArgs[\"format\"],\n key: getHostKey(ctx, getArg(args, 1)),\n }),\n async (ctx, { format, key }) => {\n const result = await crypto.subtle.exportKey(format, key);\n\n if (result instanceof ArrayBuffer) {\n return marshal(ctx, new Uint8Array(result));\n } else {\n // JsonWebKey - marshal as plain object\n return marshal(ctx, result);\n }\n }\n );\n context.setProp(subtle, \"exportKey\", exportKeyFn);\n exportKeyFn.dispose();\n\n // deriveBits(algorithm, baseKey, length) -> ArrayBuffer\n const deriveBitsFn = createSubtleMethod<DeriveBitsArgs>(\n context,\n \"deriveBits\",\n (ctx, args) => {\n const algorithmRaw = unmarshal(ctx, getArg(args, 0)) as Record<string, unknown>;\n const baseKey = getHostKey(ctx, getArg(args, 1));\n const length = unmarshal(ctx, getArg(args, 2)) as number;\n\n // If the algorithm has a 'public' property, it needs to be a CryptoKey\n let algorithm = algorithmRaw;\n if (algorithmRaw.public && typeof algorithmRaw.public === \"object\") {\n const publicKeyData = algorithmRaw.public as { __instanceId__?: number };\n if (publicKeyData.__instanceId__ !== undefined) {\n const publicKeyState = getInstanceStateById<CryptoKeyState>(publicKeyData.__instanceId__);\n if (publicKeyState) {\n algorithm = { ...algorithmRaw, public: publicKeyState.hostKey };\n }\n }\n }\n\n return { algorithm, baseKey, length };\n },\n async (ctx, { algorithm, baseKey, length }) => {\n const result = await crypto.subtle.deriveBits(\n algorithm as unknown as AlgorithmIdentifier,\n baseKey,\n length\n );\n return marshal(ctx, new Uint8Array(result));\n }\n );\n context.setProp(subtle, \"deriveBits\", deriveBitsFn);\n deriveBitsFn.dispose();\n\n // deriveKey(algorithm, baseKey, derivedKeyType, extractable, keyUsages) -> CryptoKey\n const deriveKeyFn = createSubtleMethod<DeriveKeyArgs>(\n context,\n \"deriveKey\",\n (ctx, args) => {\n const algorithmRaw = unmarshal(ctx, getArg(args, 0)) as Record<string, unknown>;\n const baseKey = getHostKey(ctx, getArg(args, 1));\n const derivedKeyType = unmarshal(ctx, getArg(args, 2)) as AlgorithmIdentifier;\n const extractable = unmarshal(ctx, getArg(args, 3)) as boolean;\n const keyUsages = unmarshal(ctx, getArg(args, 4)) as globalThis.KeyUsage[];\n\n // If the algorithm has a 'public' property, it needs to be a CryptoKey\n let algorithm = algorithmRaw;\n if (algorithmRaw.public && typeof algorithmRaw.public === \"object\") {\n const publicKeyData = algorithmRaw.public as { __instanceId__?: number };\n if (publicKeyData.__instanceId__ !== undefined) {\n const publicKeyState = getInstanceStateById<CryptoKeyState>(publicKeyData.__instanceId__);\n if (publicKeyState) {\n algorithm = { ...algorithmRaw, public: publicKeyState.hostKey };\n }\n }\n }\n\n return { algorithm, baseKey, derivedKeyType, extractable, keyUsages };\n },\n async (ctx, { algorithm, baseKey, derivedKeyType, extractable, keyUsages }) => {\n const result = await crypto.subtle.deriveKey(\n algorithm as unknown as AlgorithmIdentifier,\n baseKey,\n derivedKeyType,\n extractable,\n keyUsages\n );\n\n return createCryptoKeyInstance(ctx, result as globalThis.CryptoKey);\n }\n );\n context.setProp(subtle, \"deriveKey\", deriveKeyFn);\n deriveKeyFn.dispose();\n\n // wrapKey(format, key, wrappingKey, wrapAlgorithm) -> ArrayBuffer\n const wrapKeyFn = createSubtleMethod<WrapKeyArgs>(\n context,\n \"wrapKey\",\n (ctx, args) => ({\n format: unmarshal(ctx, getArg(args, 0)) as WrapKeyArgs[\"format\"],\n key: getHostKey(ctx, getArg(args, 1)),\n wrappingKey: getHostKey(ctx, getArg(args, 2)),\n wrapAlgorithm: unmarshal(ctx, getArg(args, 3)) as AlgorithmIdentifier,\n }),\n async (ctx, { format, key, wrappingKey, wrapAlgorithm }) => {\n const result = await crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n return marshal(ctx, new Uint8Array(result));\n }\n );\n context.setProp(subtle, \"wrapKey\", wrapKeyFn);\n wrapKeyFn.dispose();\n\n // unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages) -> CryptoKey\n const unwrapKeyFn = createSubtleMethod<UnwrapKeyArgs>(\n context,\n \"unwrapKey\",\n (ctx, args) => ({\n format: unmarshal(ctx, getArg(args, 0)) as UnwrapKeyArgs[\"format\"],\n wrappedKey: unmarshal(ctx, getArg(args, 1)) as Uint8Array,\n unwrappingKey: getHostKey(ctx, getArg(args, 2)),\n unwrapAlgorithm: unmarshal(ctx, getArg(args, 3)) as AlgorithmIdentifier,\n unwrappedKeyAlgorithm: unmarshal(ctx, getArg(args, 4)) as AlgorithmIdentifier,\n extractable: unmarshal(ctx, getArg(args, 5)) as boolean,\n keyUsages: unmarshal(ctx, getArg(args, 6)) as globalThis.KeyUsage[],\n }),\n async (ctx, { format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages }) => {\n const result = await crypto.subtle.unwrapKey(\n format,\n wrappedKey as unknown as BufferSource,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n\n return createCryptoKeyInstance(ctx, result as globalThis.CryptoKey);\n }\n );\n context.setProp(subtle, \"unwrapKey\", unwrapKeyFn);\n unwrapKeyFn.dispose();\n\n return subtle;\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "C0DB512361613CD264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,26 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+
21
+ // packages/crypto/src/types.ts
22
+ var exports_types = {};
23
+ module.exports = __toCommonJS(exports_types);
24
+ })
25
+
26
+ //# debugId=E81E3EE1B2E61F0D64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "E81E3EE1B2E61F0D64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,39 @@
1
+ // @bun
2
+ // packages/crypto/src/crypto-key.ts
3
+ import { defineClass } from "@ricsam/quickjs-core";
4
+ function createCryptoKeyClass(context, stateMap) {
5
+ return defineClass(context, stateMap, {
6
+ name: "CryptoKey",
7
+ construct: () => {
8
+ throw new Error("CryptoKey cannot be constructed directly. Use crypto.subtle methods instead.");
9
+ },
10
+ properties: {
11
+ type: {
12
+ get() {
13
+ return this.type;
14
+ }
15
+ },
16
+ extractable: {
17
+ get() {
18
+ return this.extractable;
19
+ }
20
+ },
21
+ algorithm: {
22
+ get() {
23
+ return { ...this.algorithm };
24
+ }
25
+ },
26
+ usages: {
27
+ get() {
28
+ return [...this.usages];
29
+ }
30
+ }
31
+ },
32
+ methods: {}
33
+ });
34
+ }
35
+ export {
36
+ createCryptoKeyClass
37
+ };
38
+
39
+ //# debugId=1FDEB7435B7912AF64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/crypto-key.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap, CryptoKeyState } from \"./types.mjs\";\nimport { defineClass } from \"@ricsam/quickjs-core\";\n\n/**\n * Create the CryptoKey class for the QuickJS context\n *\n * CryptoKey is an opaque type - the actual key material stays on the host.\n * The QuickJS instance only holds metadata and an instanceId that maps\n * to the host-side CryptoKey.\n */\nexport function createCryptoKeyClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<CryptoKeyState>(context, stateMap, {\n name: \"CryptoKey\",\n // CryptoKey cannot be constructed directly - only via SubtleCrypto methods\n construct: () => {\n throw new Error(\n \"CryptoKey cannot be constructed directly. Use crypto.subtle methods instead.\"\n );\n },\n properties: {\n type: {\n get(this: CryptoKeyState) {\n return this.type;\n },\n },\n extractable: {\n get(this: CryptoKeyState) {\n return this.extractable;\n },\n },\n algorithm: {\n get(this: CryptoKeyState) {\n // Return a copy of the algorithm object to prevent mutation\n return { ...this.algorithm };\n },\n },\n usages: {\n get(this: CryptoKeyState) {\n // Return a copy of usages array to prevent mutation\n return [...this.usages];\n },\n },\n },\n methods: {},\n });\n}\n"
6
+ ],
7
+ "mappings": ";;AAEA;AASO,SAAS,oBAAoB,CAClC,SACA,UACe;AAAA,EACf,OAAO,YAA4B,SAAS,UAAU;AAAA,IACpD,MAAM;AAAA,IAEN,WAAW,MAAM;AAAA,MACf,MAAM,IAAI,MACR,8EACF;AAAA;AAAA,IAEF,YAAY;AAAA,MACV,MAAM;AAAA,QACJ,GAAG,GAAuB;AAAA,UACxB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,aAAa;AAAA,QACX,GAAG,GAAuB;AAAA,UACxB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,WAAW;AAAA,QACT,GAAG,GAAuB;AAAA,UAExB,OAAO,KAAK,KAAK,UAAU;AAAA;AAAA,MAE/B;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,GAAuB;AAAA,UAExB,OAAO,CAAC,GAAG,KAAK,MAAM;AAAA;AAAA,MAE1B;AAAA,IACF;AAAA,IACA,SAAS,CAAC;AAAA,EACZ,CAAC;AAAA;",
8
+ "debugId": "1FDEB7435B7912AF64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,10 @@
1
+ // @bun
2
+ // packages/crypto/src/index.ts
3
+ import { setupCrypto } from "./setup.mjs";
4
+ import { createCryptoKeyInstance } from "./subtle-crypto.mjs";
5
+ export {
6
+ setupCrypto,
7
+ createCryptoKeyInstance
8
+ };
9
+
10
+ //# debugId=B1814670BBC9E6F064756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": [
5
+ "export { setupCrypto } from \"./setup.mjs\";\nexport type {\n SetupCryptoOptions,\n CryptoHandle,\n CryptoKeyState,\n KeyUsage,\n KeyType,\n} from \"./types.mjs\";\nexport { createCryptoKeyInstance } from \"./subtle-crypto.mjs\";\n"
6
+ ],
7
+ "mappings": ";;AAAA;AAQA;",
8
+ "debugId": "B1814670BBC9E6F064756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "@ricsam/quickjs-crypto",
3
+ "version": "0.2.13",
4
+ "type": "module"
5
+ }
@@ -0,0 +1,58 @@
1
+ // @bun
2
+ // packages/crypto/src/random.ts
3
+ import { marshal } from "@ricsam/quickjs-core";
4
+ function createGetRandomValuesFunction(context) {
5
+ return context.newFunction("getRandomValues", (arrayHandle) => {
6
+ const byteLengthHandle = context.getProp(arrayHandle, "byteLength");
7
+ const byteLengthType = context.typeof(byteLengthHandle);
8
+ if (byteLengthType !== "number") {
9
+ byteLengthHandle.dispose();
10
+ throw context.newError("getRandomValues: argument must be an integer-typed TypedArray");
11
+ }
12
+ const byteLength = context.getNumber(byteLengthHandle);
13
+ byteLengthHandle.dispose();
14
+ if (byteLength > 65536) {
15
+ throw context.newError("getRandomValues: quota exceeded (max 65536 bytes)");
16
+ }
17
+ const randomBytes = new Uint8Array(byteLength);
18
+ crypto.getRandomValues(randomBytes);
19
+ const bytesArray = Array.from(randomBytes);
20
+ const setValuesResult = context.evalCode(`
21
+ (function(typedArray, bytes) {
22
+ const view = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
23
+ for (let i = 0; i < bytes.length; i++) {
24
+ view[i] = bytes[i];
25
+ }
26
+ return typedArray;
27
+ })
28
+ `);
29
+ if (setValuesResult.error) {
30
+ const err = context.dump(setValuesResult.error);
31
+ setValuesResult.error.dispose();
32
+ throw context.newError(`getRandomValues failed: ${JSON.stringify(err)}`);
33
+ }
34
+ const setValuesFn = setValuesResult.value;
35
+ const bytesHandle = marshal(context, bytesArray);
36
+ const result = context.callFunction(setValuesFn, context.undefined, arrayHandle, bytesHandle);
37
+ setValuesFn.dispose();
38
+ bytesHandle.dispose();
39
+ if (result.error) {
40
+ const err = context.dump(result.error);
41
+ result.error.dispose();
42
+ throw context.newError(`getRandomValues failed: ${JSON.stringify(err)}`);
43
+ }
44
+ return result.value;
45
+ });
46
+ }
47
+ function createRandomUUIDFunction(context) {
48
+ return context.newFunction("randomUUID", () => {
49
+ const uuid = crypto.randomUUID();
50
+ return context.newString(uuid);
51
+ });
52
+ }
53
+ export {
54
+ createRandomUUIDFunction,
55
+ createGetRandomValuesFunction
56
+ };
57
+
58
+ //# debugId=972D3D366A2BF23664756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/random.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { marshal } from \"@ricsam/quickjs-core\";\n\n/**\n * Create the getRandomValues function for the crypto global\n *\n * getRandomValues fills a TypedArray with cryptographically random values\n * and returns the same array (modified in-place)\n */\nexport function createGetRandomValuesFunction(\n context: QuickJSContext\n): QuickJSHandle {\n return context.newFunction(\"getRandomValues\", (arrayHandle) => {\n // Get byteLength to determine how many random bytes we need\n const byteLengthHandle = context.getProp(arrayHandle, \"byteLength\");\n const byteLengthType = context.typeof(byteLengthHandle);\n\n if (byteLengthType !== \"number\") {\n byteLengthHandle.dispose();\n throw context.newError(\n \"getRandomValues: argument must be an integer-typed TypedArray\"\n );\n }\n\n const byteLength = context.getNumber(byteLengthHandle);\n byteLengthHandle.dispose();\n\n if (byteLength > 65536) {\n throw context.newError(\n \"getRandomValues: quota exceeded (max 65536 bytes)\"\n );\n }\n\n // Generate random bytes on the host\n const randomBytes = new Uint8Array(byteLength);\n crypto.getRandomValues(randomBytes);\n\n // Convert to array of numbers for JSON serialization\n const bytesArray = Array.from(randomBytes);\n\n // Use evalCode to copy the bytes into the TypedArray\n // We pass the array handle and use a helper to set the values\n const setValuesResult = context.evalCode(`\n (function(typedArray, bytes) {\n const view = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n view[i] = bytes[i];\n }\n return typedArray;\n })\n `);\n\n if (setValuesResult.error) {\n const err = context.dump(setValuesResult.error);\n setValuesResult.error.dispose();\n throw context.newError(`getRandomValues failed: ${JSON.stringify(err)}`);\n }\n\n const setValuesFn = setValuesResult.value;\n const bytesHandle = marshal(context, bytesArray);\n\n const result = context.callFunction(\n setValuesFn,\n context.undefined,\n arrayHandle,\n bytesHandle\n );\n\n setValuesFn.dispose();\n bytesHandle.dispose();\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw context.newError(`getRandomValues failed: ${JSON.stringify(err)}`);\n }\n\n return result.value;\n });\n}\n\n/**\n * Create the randomUUID function for the crypto global\n *\n * randomUUID returns a string containing a randomly generated UUID v4\n */\nexport function createRandomUUIDFunction(\n context: QuickJSContext\n): QuickJSHandle {\n return context.newFunction(\"randomUUID\", () => {\n const uuid = crypto.randomUUID();\n return context.newString(uuid);\n });\n}\n"
6
+ ],
7
+ "mappings": ";;AACA;AAQO,SAAS,6BAA6B,CAC3C,SACe;AAAA,EACf,OAAO,QAAQ,YAAY,mBAAmB,CAAC,gBAAgB;AAAA,IAE7D,MAAM,mBAAmB,QAAQ,QAAQ,aAAa,YAAY;AAAA,IAClE,MAAM,iBAAiB,QAAQ,OAAO,gBAAgB;AAAA,IAEtD,IAAI,mBAAmB,UAAU;AAAA,MAC/B,iBAAiB,QAAQ;AAAA,MACzB,MAAM,QAAQ,SACZ,+DACF;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,QAAQ,UAAU,gBAAgB;AAAA,IACrD,iBAAiB,QAAQ;AAAA,IAEzB,IAAI,aAAa,OAAO;AAAA,MACtB,MAAM,QAAQ,SACZ,mDACF;AAAA,IACF;AAAA,IAGA,MAAM,cAAc,IAAI,WAAW,UAAU;AAAA,IAC7C,OAAO,gBAAgB,WAAW;AAAA,IAGlC,MAAM,aAAa,MAAM,KAAK,WAAW;AAAA,IAIzC,MAAM,kBAAkB,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQxC;AAAA,IAED,IAAI,gBAAgB,OAAO;AAAA,MACzB,MAAM,MAAM,QAAQ,KAAK,gBAAgB,KAAK;AAAA,MAC9C,gBAAgB,MAAM,QAAQ;AAAA,MAC9B,MAAM,QAAQ,SAAS,2BAA2B,KAAK,UAAU,GAAG,GAAG;AAAA,IACzE;AAAA,IAEA,MAAM,cAAc,gBAAgB;AAAA,IACpC,MAAM,cAAc,QAAQ,SAAS,UAAU;AAAA,IAE/C,MAAM,SAAS,QAAQ,aACrB,aACA,QAAQ,WACR,aACA,WACF;AAAA,IAEA,YAAY,QAAQ;AAAA,IACpB,YAAY,QAAQ;AAAA,IAEpB,IAAI,OAAO,OAAO;AAAA,MAChB,MAAM,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,MACrC,OAAO,MAAM,QAAQ;AAAA,MACrB,MAAM,QAAQ,SAAS,2BAA2B,KAAK,UAAU,GAAG,GAAG;AAAA,IACzE;AAAA,IAEA,OAAO,OAAO;AAAA,GACf;AAAA;AAQI,SAAS,wBAAwB,CACtC,SACe;AAAA,EACf,OAAO,QAAQ,YAAY,cAAc,MAAM;AAAA,IAC7C,MAAM,OAAO,OAAO,WAAW;AAAA,IAC/B,OAAO,QAAQ,UAAU,IAAI;AAAA,GAC9B;AAAA;",
8
+ "debugId": "972D3D366A2BF23664756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,60 @@
1
+ // @bun
2
+ // packages/crypto/src/setup.ts
3
+ import { setupCore } from "@ricsam/quickjs-core";
4
+ import { createCryptoKeyClass } from "./crypto-key.mjs";
5
+ import { createSubtleCryptoObject } from "./subtle-crypto.mjs";
6
+ import {
7
+ createGetRandomValuesFunction,
8
+ createRandomUUIDFunction
9
+ } from "./random.mjs";
10
+ function setupCrypto(context, options = {}) {
11
+ const coreHandle = options.coreHandle ?? setupCore(context, { stateMap: options.stateMap });
12
+ const stateMap = options.stateMap ?? coreHandle.stateMap;
13
+ const CryptoKeyClass = createCryptoKeyClass(context, stateMap);
14
+ context.setProp(context.global, "CryptoKey", CryptoKeyClass);
15
+ CryptoKeyClass.dispose();
16
+ const subtleCrypto = createSubtleCryptoObject(context);
17
+ const cryptoObj = context.newObject();
18
+ const subtlePropResult = context.evalCode(`
19
+ (function(crypto, subtle) {
20
+ Object.defineProperty(crypto, 'subtle', {
21
+ value: subtle,
22
+ writable: false,
23
+ enumerable: true,
24
+ configurable: false
25
+ });
26
+ })
27
+ `);
28
+ if (subtlePropResult.error) {
29
+ const err = context.dump(subtlePropResult.error);
30
+ subtlePropResult.error.dispose();
31
+ throw new Error(`Failed to setup crypto.subtle: ${JSON.stringify(err)}`);
32
+ }
33
+ const defineSubtleFn = subtlePropResult.value;
34
+ const defineResult = context.callFunction(defineSubtleFn, context.undefined, cryptoObj, subtleCrypto);
35
+ defineSubtleFn.dispose();
36
+ subtleCrypto.dispose();
37
+ if (defineResult.error) {
38
+ const err = context.dump(defineResult.error);
39
+ defineResult.error.dispose();
40
+ throw new Error(`Failed to setup crypto.subtle: ${JSON.stringify(err)}`);
41
+ }
42
+ defineResult.value.dispose();
43
+ const getRandomValuesFn = createGetRandomValuesFunction(context);
44
+ context.setProp(cryptoObj, "getRandomValues", getRandomValuesFn);
45
+ getRandomValuesFn.dispose();
46
+ const randomUUIDFn = createRandomUUIDFunction(context);
47
+ context.setProp(cryptoObj, "randomUUID", randomUUIDFn);
48
+ randomUUIDFn.dispose();
49
+ context.setProp(context.global, "crypto", cryptoObj);
50
+ cryptoObj.dispose();
51
+ return {
52
+ stateMap,
53
+ dispose() {}
54
+ };
55
+ }
56
+ export {
57
+ setupCrypto
58
+ };
59
+
60
+ //# debugId=B776A934B2F9E4B364756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/setup.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext } from \"quickjs-emscripten\";\nimport { setupCore, createStateMap } from \"@ricsam/quickjs-core\";\nimport type { SetupCryptoOptions, CryptoHandle } from \"./types.mjs\";\nimport { createCryptoKeyClass } from \"./crypto-key.mjs\";\nimport { createSubtleCryptoObject } from \"./subtle-crypto.mjs\";\nimport {\n createGetRandomValuesFunction,\n createRandomUUIDFunction,\n} from \"./random.mjs\";\n\n/**\n * Setup crypto globals in a QuickJS context\n *\n * Provides: crypto.subtle (SubtleCrypto), crypto.getRandomValues, crypto.randomUUID, CryptoKey\n *\n * @example\n * ```typescript\n * const handle = setupCrypto(context);\n *\n * context.evalCode(`\n * // Generate a random UUID\n * const uuid = crypto.randomUUID();\n *\n * // Generate random bytes\n * const arr = new Uint8Array(16);\n * crypto.getRandomValues(arr);\n *\n * // Use SubtleCrypto for encryption\n * const key = await crypto.subtle.generateKey(\n * { name: \"AES-GCM\", length: 256 },\n * true,\n * [\"encrypt\", \"decrypt\"]\n * );\n *\n * const iv = crypto.getRandomValues(new Uint8Array(12));\n * const data = new TextEncoder().encode(\"secret message\");\n * const encrypted = await crypto.subtle.encrypt(\n * { name: \"AES-GCM\", iv },\n * key,\n * data\n * );\n * `);\n *\n * handle.dispose();\n * ```\n *\n * @param context - QuickJS context\n * @param options - Setup options\n * @returns CryptoHandle for cleanup\n */\nexport function setupCrypto(\n context: QuickJSContext,\n options: SetupCryptoOptions = {}\n): CryptoHandle {\n // Setup core if not provided (needed for marshal/unmarshal infrastructure)\n const coreHandle =\n options.coreHandle ?? setupCore(context, { stateMap: options.stateMap });\n const stateMap = options.stateMap ?? coreHandle.stateMap;\n\n // 1. Create and register CryptoKey class (needed by SubtleCrypto)\n const CryptoKeyClass = createCryptoKeyClass(context, stateMap);\n context.setProp(context.global, \"CryptoKey\", CryptoKeyClass);\n CryptoKeyClass.dispose();\n\n // 2. Create the SubtleCrypto object\n const subtleCrypto = createSubtleCryptoObject(context);\n\n // 3. Create the crypto global object\n const cryptoObj = context.newObject();\n\n // Set subtle as a non-writable property\n const subtlePropResult = context.evalCode(`\n (function(crypto, subtle) {\n Object.defineProperty(crypto, 'subtle', {\n value: subtle,\n writable: false,\n enumerable: true,\n configurable: false\n });\n })\n `);\n\n if (subtlePropResult.error) {\n const err = context.dump(subtlePropResult.error);\n subtlePropResult.error.dispose();\n throw new Error(`Failed to setup crypto.subtle: ${JSON.stringify(err)}`);\n }\n\n const defineSubtleFn = subtlePropResult.value;\n const defineResult = context.callFunction(\n defineSubtleFn,\n context.undefined,\n cryptoObj,\n subtleCrypto\n );\n defineSubtleFn.dispose();\n subtleCrypto.dispose();\n\n if (defineResult.error) {\n const err = context.dump(defineResult.error);\n defineResult.error.dispose();\n throw new Error(`Failed to setup crypto.subtle: ${JSON.stringify(err)}`);\n }\n defineResult.value.dispose();\n\n // 4. Set getRandomValues on crypto object\n const getRandomValuesFn = createGetRandomValuesFunction(context);\n context.setProp(cryptoObj, \"getRandomValues\", getRandomValuesFn);\n getRandomValuesFn.dispose();\n\n // 5. Set randomUUID on crypto object\n const randomUUIDFn = createRandomUUIDFunction(context);\n context.setProp(cryptoObj, \"randomUUID\", randomUUIDFn);\n randomUUIDFn.dispose();\n\n // 6. Set crypto on global\n context.setProp(context.global, \"crypto\", cryptoObj);\n cryptoObj.dispose();\n\n return {\n stateMap,\n dispose() {\n // Globals are owned by context.global, cleaned up by context.dispose()\n },\n };\n}\n"
6
+ ],
7
+ "mappings": ";;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AA6CO,SAAS,WAAW,CACzB,SACA,UAA8B,CAAC,GACjB;AAAA,EAEd,MAAM,aACJ,QAAQ,cAAc,UAAU,SAAS,EAAE,UAAU,QAAQ,SAAS,CAAC;AAAA,EACzE,MAAM,WAAW,QAAQ,YAAY,WAAW;AAAA,EAGhD,MAAM,iBAAiB,qBAAqB,SAAS,QAAQ;AAAA,EAC7D,QAAQ,QAAQ,QAAQ,QAAQ,aAAa,cAAc;AAAA,EAC3D,eAAe,QAAQ;AAAA,EAGvB,MAAM,eAAe,yBAAyB,OAAO;AAAA,EAGrD,MAAM,YAAY,QAAQ,UAAU;AAAA,EAGpC,MAAM,mBAAmB,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASzC;AAAA,EAED,IAAI,iBAAiB,OAAO;AAAA,IAC1B,MAAM,MAAM,QAAQ,KAAK,iBAAiB,KAAK;AAAA,IAC/C,iBAAiB,MAAM,QAAQ;AAAA,IAC/B,MAAM,IAAI,MAAM,kCAAkC,KAAK,UAAU,GAAG,GAAG;AAAA,EACzE;AAAA,EAEA,MAAM,iBAAiB,iBAAiB;AAAA,EACxC,MAAM,eAAe,QAAQ,aAC3B,gBACA,QAAQ,WACR,WACA,YACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,aAAa,QAAQ;AAAA,EAErB,IAAI,aAAa,OAAO;AAAA,IACtB,MAAM,MAAM,QAAQ,KAAK,aAAa,KAAK;AAAA,IAC3C,aAAa,MAAM,QAAQ;AAAA,IAC3B,MAAM,IAAI,MAAM,kCAAkC,KAAK,UAAU,GAAG,GAAG;AAAA,EACzE;AAAA,EACA,aAAa,MAAM,QAAQ;AAAA,EAG3B,MAAM,oBAAoB,8BAA8B,OAAO;AAAA,EAC/D,QAAQ,QAAQ,WAAW,mBAAmB,iBAAiB;AAAA,EAC/D,kBAAkB,QAAQ;AAAA,EAG1B,MAAM,eAAe,yBAAyB,OAAO;AAAA,EACrD,QAAQ,QAAQ,WAAW,cAAc,YAAY;AAAA,EACrD,aAAa,QAAQ;AAAA,EAGrB,QAAQ,QAAQ,QAAQ,QAAQ,UAAU,SAAS;AAAA,EACnD,UAAU,QAAQ;AAAA,EAElB,OAAO;AAAA,IACL;AAAA,IACA,OAAO,GAAG;AAAA,EAGZ;AAAA;",
8
+ "debugId": "B776A934B2F9E4B364756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,282 @@
1
+ // @bun
2
+ // packages/crypto/src/subtle-crypto.ts
3
+ import {
4
+ nextInstanceId,
5
+ registerInstance,
6
+ getInstanceStateById,
7
+ marshal,
8
+ unmarshal
9
+ } from "@ricsam/quickjs-core";
10
+ function createCryptoKeyInstance(context, hostKey) {
11
+ const instanceId = nextInstanceId();
12
+ const state = {
13
+ hostKey,
14
+ type: hostKey.type,
15
+ extractable: hostKey.extractable,
16
+ algorithm: hostKey.algorithm,
17
+ usages: Array.from(hostKey.usages)
18
+ };
19
+ registerInstance(instanceId, "CryptoKey", state);
20
+ const result = context.evalCode(`
21
+ (function() {
22
+ const key = Object.create(CryptoKey.prototype);
23
+ Object.defineProperty(key, '__instanceId__', {
24
+ value: ${instanceId},
25
+ enumerable: false,
26
+ writable: false,
27
+ configurable: false
28
+ });
29
+ return key;
30
+ })()
31
+ `);
32
+ if (result.error) {
33
+ const err = context.dump(result.error);
34
+ result.error.dispose();
35
+ throw new Error(`Failed to create CryptoKey instance: ${JSON.stringify(err)}`);
36
+ }
37
+ return result.value;
38
+ }
39
+ function createCryptoKeyPairInstance(context, keyPair) {
40
+ const publicKeyHandle = createCryptoKeyInstance(context, keyPair.publicKey);
41
+ const privateKeyHandle = createCryptoKeyInstance(context, keyPair.privateKey);
42
+ const obj = context.newObject();
43
+ context.setProp(obj, "publicKey", publicKeyHandle);
44
+ context.setProp(obj, "privateKey", privateKeyHandle);
45
+ publicKeyHandle.dispose();
46
+ privateKeyHandle.dispose();
47
+ return obj;
48
+ }
49
+ function getHostKey(context, keyHandle) {
50
+ const instanceIdHandle = context.getProp(keyHandle, "__instanceId__");
51
+ if (context.typeof(instanceIdHandle) !== "number") {
52
+ instanceIdHandle.dispose();
53
+ throw new Error("Invalid CryptoKey: missing __instanceId__");
54
+ }
55
+ const instanceId = context.getNumber(instanceIdHandle);
56
+ instanceIdHandle.dispose();
57
+ const state = getInstanceStateById(instanceId);
58
+ if (!state) {
59
+ throw new Error("Invalid CryptoKey: state not found");
60
+ }
61
+ return state.hostKey;
62
+ }
63
+ function getArg(args, index) {
64
+ const arg = args[index];
65
+ if (!arg) {
66
+ throw new Error(`Missing argument at index ${index}`);
67
+ }
68
+ return arg;
69
+ }
70
+ function createSubtleMethod(context, methodName, unmarshalArgs, implementation) {
71
+ return context.newFunction(methodName, (...args) => {
72
+ const deferred = context.newPromise();
73
+ let unmarshaledArgs;
74
+ try {
75
+ unmarshaledArgs = unmarshalArgs(context, args);
76
+ } catch (error) {
77
+ const errorHandle = marshal(context, {
78
+ name: error instanceof Error ? error.name : "Error",
79
+ message: error instanceof Error ? error.message : String(error)
80
+ });
81
+ deferred.reject(errorHandle);
82
+ errorHandle.dispose();
83
+ context.runtime.executePendingJobs();
84
+ return deferred.handle;
85
+ }
86
+ Promise.resolve().then(async () => {
87
+ try {
88
+ const resultHandle = await implementation(context, unmarshaledArgs);
89
+ deferred.resolve(resultHandle);
90
+ resultHandle.dispose();
91
+ } catch (error) {
92
+ const errorHandle = marshal(context, {
93
+ name: error instanceof Error ? error.name : "Error",
94
+ message: error instanceof Error ? error.message : String(error)
95
+ });
96
+ deferred.reject(errorHandle);
97
+ errorHandle.dispose();
98
+ }
99
+ context.runtime.executePendingJobs();
100
+ });
101
+ return deferred.handle;
102
+ });
103
+ }
104
+ function createSubtleCryptoObject(context) {
105
+ const subtle = context.newObject();
106
+ const digestFn = createSubtleMethod(context, "digest", (ctx, args) => ({
107
+ algorithm: unmarshal(ctx, getArg(args, 0)),
108
+ data: unmarshal(ctx, getArg(args, 1))
109
+ }), async (ctx, { algorithm, data }) => {
110
+ const result = await crypto.subtle.digest(algorithm, data);
111
+ return marshal(ctx, new Uint8Array(result));
112
+ });
113
+ context.setProp(subtle, "digest", digestFn);
114
+ digestFn.dispose();
115
+ const generateKeyFn = createSubtleMethod(context, "generateKey", (ctx, args) => ({
116
+ algorithm: unmarshal(ctx, getArg(args, 0)),
117
+ extractable: unmarshal(ctx, getArg(args, 1)),
118
+ keyUsages: unmarshal(ctx, getArg(args, 2))
119
+ }), async (ctx, { algorithm, extractable, keyUsages }) => {
120
+ const result = await crypto.subtle.generateKey(algorithm, extractable, keyUsages);
121
+ if ("publicKey" in result && "privateKey" in result) {
122
+ return createCryptoKeyPairInstance(ctx, result);
123
+ } else {
124
+ return createCryptoKeyInstance(ctx, result);
125
+ }
126
+ });
127
+ context.setProp(subtle, "generateKey", generateKeyFn);
128
+ generateKeyFn.dispose();
129
+ const signFn = createSubtleMethod(context, "sign", (ctx, args) => ({
130
+ algorithm: unmarshal(ctx, getArg(args, 0)),
131
+ key: getHostKey(ctx, getArg(args, 1)),
132
+ data: unmarshal(ctx, getArg(args, 2))
133
+ }), async (ctx, { algorithm, key, data }) => {
134
+ const result = await crypto.subtle.sign(algorithm, key, data);
135
+ return marshal(ctx, new Uint8Array(result));
136
+ });
137
+ context.setProp(subtle, "sign", signFn);
138
+ signFn.dispose();
139
+ const verifyFn = createSubtleMethod(context, "verify", (ctx, args) => ({
140
+ algorithm: unmarshal(ctx, getArg(args, 0)),
141
+ key: getHostKey(ctx, getArg(args, 1)),
142
+ signature: unmarshal(ctx, getArg(args, 2)),
143
+ data: unmarshal(ctx, getArg(args, 3))
144
+ }), async (ctx, { algorithm, key, signature, data }) => {
145
+ const result = await crypto.subtle.verify(algorithm, key, signature, data);
146
+ return marshal(ctx, result);
147
+ });
148
+ context.setProp(subtle, "verify", verifyFn);
149
+ verifyFn.dispose();
150
+ const encryptFn = createSubtleMethod(context, "encrypt", (ctx, args) => ({
151
+ algorithm: unmarshal(ctx, getArg(args, 0)),
152
+ key: getHostKey(ctx, getArg(args, 1)),
153
+ data: unmarshal(ctx, getArg(args, 2))
154
+ }), async (ctx, { algorithm, key, data }) => {
155
+ const result = await crypto.subtle.encrypt(algorithm, key, data);
156
+ return marshal(ctx, new Uint8Array(result));
157
+ });
158
+ context.setProp(subtle, "encrypt", encryptFn);
159
+ encryptFn.dispose();
160
+ const decryptFn = createSubtleMethod(context, "decrypt", (ctx, args) => ({
161
+ algorithm: unmarshal(ctx, getArg(args, 0)),
162
+ key: getHostKey(ctx, getArg(args, 1)),
163
+ data: unmarshal(ctx, getArg(args, 2))
164
+ }), async (ctx, { algorithm, key, data }) => {
165
+ const result = await crypto.subtle.decrypt(algorithm, key, data);
166
+ return marshal(ctx, new Uint8Array(result));
167
+ });
168
+ context.setProp(subtle, "decrypt", decryptFn);
169
+ decryptFn.dispose();
170
+ const importKeyFn = createSubtleMethod(context, "importKey", (ctx, args) => ({
171
+ format: unmarshal(ctx, getArg(args, 0)),
172
+ keyData: unmarshal(ctx, getArg(args, 1)),
173
+ algorithm: unmarshal(ctx, getArg(args, 2)),
174
+ extractable: unmarshal(ctx, getArg(args, 3)),
175
+ keyUsages: unmarshal(ctx, getArg(args, 4))
176
+ }), async (ctx, { format, keyData, algorithm, extractable, keyUsages }) => {
177
+ let result;
178
+ if (format === "jwk") {
179
+ result = await crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);
180
+ } else {
181
+ let data;
182
+ if (keyData instanceof Uint8Array) {
183
+ data = keyData.buffer.slice(keyData.byteOffset, keyData.byteOffset + keyData.byteLength);
184
+ } else {
185
+ data = keyData;
186
+ }
187
+ result = await crypto.subtle.importKey(format, data, algorithm, extractable, keyUsages);
188
+ }
189
+ return createCryptoKeyInstance(ctx, result);
190
+ });
191
+ context.setProp(subtle, "importKey", importKeyFn);
192
+ importKeyFn.dispose();
193
+ const exportKeyFn = createSubtleMethod(context, "exportKey", (ctx, args) => ({
194
+ format: unmarshal(ctx, getArg(args, 0)),
195
+ key: getHostKey(ctx, getArg(args, 1))
196
+ }), async (ctx, { format, key }) => {
197
+ const result = await crypto.subtle.exportKey(format, key);
198
+ if (result instanceof ArrayBuffer) {
199
+ return marshal(ctx, new Uint8Array(result));
200
+ } else {
201
+ return marshal(ctx, result);
202
+ }
203
+ });
204
+ context.setProp(subtle, "exportKey", exportKeyFn);
205
+ exportKeyFn.dispose();
206
+ const deriveBitsFn = createSubtleMethod(context, "deriveBits", (ctx, args) => {
207
+ const algorithmRaw = unmarshal(ctx, getArg(args, 0));
208
+ const baseKey = getHostKey(ctx, getArg(args, 1));
209
+ const length = unmarshal(ctx, getArg(args, 2));
210
+ let algorithm = algorithmRaw;
211
+ if (algorithmRaw.public && typeof algorithmRaw.public === "object") {
212
+ const publicKeyData = algorithmRaw.public;
213
+ if (publicKeyData.__instanceId__ !== undefined) {
214
+ const publicKeyState = getInstanceStateById(publicKeyData.__instanceId__);
215
+ if (publicKeyState) {
216
+ algorithm = { ...algorithmRaw, public: publicKeyState.hostKey };
217
+ }
218
+ }
219
+ }
220
+ return { algorithm, baseKey, length };
221
+ }, async (ctx, { algorithm, baseKey, length }) => {
222
+ const result = await crypto.subtle.deriveBits(algorithm, baseKey, length);
223
+ return marshal(ctx, new Uint8Array(result));
224
+ });
225
+ context.setProp(subtle, "deriveBits", deriveBitsFn);
226
+ deriveBitsFn.dispose();
227
+ const deriveKeyFn = createSubtleMethod(context, "deriveKey", (ctx, args) => {
228
+ const algorithmRaw = unmarshal(ctx, getArg(args, 0));
229
+ const baseKey = getHostKey(ctx, getArg(args, 1));
230
+ const derivedKeyType = unmarshal(ctx, getArg(args, 2));
231
+ const extractable = unmarshal(ctx, getArg(args, 3));
232
+ const keyUsages = unmarshal(ctx, getArg(args, 4));
233
+ let algorithm = algorithmRaw;
234
+ if (algorithmRaw.public && typeof algorithmRaw.public === "object") {
235
+ const publicKeyData = algorithmRaw.public;
236
+ if (publicKeyData.__instanceId__ !== undefined) {
237
+ const publicKeyState = getInstanceStateById(publicKeyData.__instanceId__);
238
+ if (publicKeyState) {
239
+ algorithm = { ...algorithmRaw, public: publicKeyState.hostKey };
240
+ }
241
+ }
242
+ }
243
+ return { algorithm, baseKey, derivedKeyType, extractable, keyUsages };
244
+ }, async (ctx, { algorithm, baseKey, derivedKeyType, extractable, keyUsages }) => {
245
+ const result = await crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyType, extractable, keyUsages);
246
+ return createCryptoKeyInstance(ctx, result);
247
+ });
248
+ context.setProp(subtle, "deriveKey", deriveKeyFn);
249
+ deriveKeyFn.dispose();
250
+ const wrapKeyFn = createSubtleMethod(context, "wrapKey", (ctx, args) => ({
251
+ format: unmarshal(ctx, getArg(args, 0)),
252
+ key: getHostKey(ctx, getArg(args, 1)),
253
+ wrappingKey: getHostKey(ctx, getArg(args, 2)),
254
+ wrapAlgorithm: unmarshal(ctx, getArg(args, 3))
255
+ }), async (ctx, { format, key, wrappingKey, wrapAlgorithm }) => {
256
+ const result = await crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);
257
+ return marshal(ctx, new Uint8Array(result));
258
+ });
259
+ context.setProp(subtle, "wrapKey", wrapKeyFn);
260
+ wrapKeyFn.dispose();
261
+ const unwrapKeyFn = createSubtleMethod(context, "unwrapKey", (ctx, args) => ({
262
+ format: unmarshal(ctx, getArg(args, 0)),
263
+ wrappedKey: unmarshal(ctx, getArg(args, 1)),
264
+ unwrappingKey: getHostKey(ctx, getArg(args, 2)),
265
+ unwrapAlgorithm: unmarshal(ctx, getArg(args, 3)),
266
+ unwrappedKeyAlgorithm: unmarshal(ctx, getArg(args, 4)),
267
+ extractable: unmarshal(ctx, getArg(args, 5)),
268
+ keyUsages: unmarshal(ctx, getArg(args, 6))
269
+ }), async (ctx, { format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages }) => {
270
+ const result = await crypto.subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages);
271
+ return createCryptoKeyInstance(ctx, result);
272
+ });
273
+ context.setProp(subtle, "unwrapKey", unwrapKeyFn);
274
+ unwrapKeyFn.dispose();
275
+ return subtle;
276
+ }
277
+ export {
278
+ createSubtleCryptoObject,
279
+ createCryptoKeyInstance
280
+ };
281
+
282
+ //# debugId=447E4B44811F04E864756E2164756E21