quantum-resistant-rustykey 0.4.0 → 0.5.4

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.
@@ -1,6 +1,887 @@
1
+ // src/vendor/mlkem.js
2
+ async function MLKEM768Module(moduleArg = {}) {
3
+ var moduleRtn;
4
+ var Module = moduleArg;
5
+ var ENVIRONMENT_IS_WEB = typeof window == "object";
6
+ var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != "undefined";
7
+ var ENVIRONMENT_IS_NODE = typeof process == "object" && process.versions?.node && process.type != "renderer";
8
+ var _scriptName = import.meta.url;
9
+ var scriptDirectory = "";
10
+ var readAsync, readBinary;
11
+ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
12
+ try {
13
+ scriptDirectory = new URL(".", _scriptName).href;
14
+ } catch {
15
+ }
16
+ {
17
+ if (ENVIRONMENT_IS_WORKER) {
18
+ readBinary = (url) => {
19
+ var xhr = new XMLHttpRequest();
20
+ xhr.open("GET", url, false);
21
+ xhr.responseType = "arraybuffer";
22
+ xhr.send(null);
23
+ return new Uint8Array(xhr.response);
24
+ };
25
+ }
26
+ readAsync = async (url) => {
27
+ if (isFileURI(url)) {
28
+ return new Promise((resolve, reject) => {
29
+ var xhr = new XMLHttpRequest();
30
+ xhr.open("GET", url, true);
31
+ xhr.responseType = "arraybuffer";
32
+ xhr.onload = () => {
33
+ if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
34
+ resolve(xhr.response);
35
+ return;
36
+ }
37
+ reject(xhr.status);
38
+ };
39
+ xhr.onerror = reject;
40
+ xhr.send(null);
41
+ });
42
+ }
43
+ var response = await fetch(url, { credentials: "same-origin" });
44
+ if (response.ok) {
45
+ return response.arrayBuffer();
46
+ }
47
+ throw new Error(response.status + " : " + response.url);
48
+ };
49
+ }
50
+ } else {
51
+ }
52
+ var out = console.log.bind(console);
53
+ var err = console.error.bind(console);
54
+ var wasmBinary;
55
+ var ABORT = false;
56
+ var isFileURI = (filename) => filename.startsWith("file://");
57
+ var readyPromiseResolve, readyPromiseReject;
58
+ var wasmMemory;
59
+ var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
60
+ var HEAP64, HEAPU64;
61
+ var runtimeInitialized = false;
62
+ function updateMemoryViews() {
63
+ var b = wasmMemory.buffer;
64
+ Module["HEAP8"] = HEAP8 = new Int8Array(b);
65
+ HEAP16 = new Int16Array(b);
66
+ Module["HEAPU8"] = HEAPU8 = new Uint8Array(b);
67
+ HEAPU16 = new Uint16Array(b);
68
+ HEAP32 = new Int32Array(b);
69
+ HEAPU32 = new Uint32Array(b);
70
+ HEAPF32 = new Float32Array(b);
71
+ HEAPF64 = new Float64Array(b);
72
+ HEAP64 = new BigInt64Array(b);
73
+ HEAPU64 = new BigUint64Array(b);
74
+ }
75
+ function preRun() {
76
+ }
77
+ function initRuntime() {
78
+ runtimeInitialized = true;
79
+ wasmExports["b"]();
80
+ }
81
+ function postRun() {
82
+ }
83
+ function abort(what) {
84
+ what = "Aborted(" + what + ")";
85
+ err(what);
86
+ ABORT = true;
87
+ what += ". Build with -sASSERTIONS for more info.";
88
+ var e = new WebAssembly.RuntimeError(what);
89
+ readyPromiseReject?.(e);
90
+ throw e;
91
+ }
92
+ var wasmBinaryFile;
93
+ function findWasmBinary() {
94
+ return base64Decode("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CCIBIAAtABtzIAJxIAFzOgAbIAAgAy0A/AgiASAALQAccyACcSABczoAHCAAIAMtAP0IIgEgAC0AHXMgAnEgAXM6AB0gACADLQD+CCIBIAAtAB5zIAJxIAFzOgAeIAAgAiADLQD/CCIBIAAtAB9zcSABczoAHyADQdgJakIANwMAIANB0AlqQgA3AwAgA0HICWpCADcDACADQcAJakIANwMAIANCADcDuAkgA0IANwOwCSADQgA3A6gJIANCADcDoAkgA0GYCWpCADcDACADQZAJakIANwMAIANBiAlqQgA3AwAgA0GACWpCADcDACADQgA3A/gIIANCADcD8AggA0IANwPoCCADQgA3A+AIIANBAEHgCPwLAEEAIQcLJAAgBwvPAwEIfyMAIgQgBEGAFWtBYHEiBCQAIARBgAlqIgUgAhANIAUQDCAEIAUQDkEAIQUDQCAEIAZBAmoiB2otAAAgAiAHai0AAHMiByAEIAZBAWoiCWotAAAgAiAJai0AAHMiCSAEIAZqLQAAIAIgBmotAABzIgsgCHNzcyEIIAcgCSAFIAtycnIhBSAGQQNqIgZBgAlHDQALIARBAEGACfwLACAEQYAJaiIGQQBBgAz8CwAgCEEAIAVB/wFxa0EYdnNBfyEFQf8BcSAIQf8BcUYEQCAEIAMpAAA3A4AJIAQgAykAGDcDmAkgBCADKQAQNwOQCSAEIAMpAAg3A4gJIARBoAlqIgMgAhATIAQgBkHAABASIAAgBiACIARBIGoQGiABIAQpAxg3ABggASAEKQMQNwAQIAEgBCkDCDcACCABIAQpAwA3AAAgA0IANwMAIARBqAlqQgA3AwAgBEGwCWpCADcDACAEQbgJakIANwMAIARCADcDgAkgBEIANwOICSAEQgA3A5AJIARCADcDmAkgBEIANwM4IARCADcDMCAEQgA3AyggBEIANwMgIARCADcDGCAEQgA3AxAgBEIANwMIIARCADcDAEEAIQULJAAgBQuVBwIKfwR+IwAiAyADQYDPAGtBYHEiAyQAIAIpAAghDSACKQAQIQ4gAikAGCEPIAIpAAAhECADQQM6ACAgAyAPNwMYIAMgDjcDECADIA03AwggAyAQNwMAIANBwM4AaiADQSEQEiADQYgfaiADKQPITiINNwMAIANBkB9qIAMpA9BOIg43AwAgA0GYH2ogAykD2E4iDzcDACADQcgfaiANNwMAIANB0B9qIA43AwAgA0HYH2ogDzcDACADQZggaiAPNwMAIANBkCBqIA43AwAgA0GIIGogDTcDACADIA83A9geIAMgDjcD0B4gAyANNwPIHiADIAMpA8BOIg03A8AeIAMgDTcDgB8gAyANNwPAHyADIA03A4AgIANBgAI7AaAgIANBAjsB4B8gA0EBOwGgHyADQQA7AeAeIANBwCpqIgggA0HALmogA0HAMmogA0HANmoiCyADQcAeaiIGEAogA0GBBDsBoCAgA0GABDsB4B8gA0GCAjsBoB8gA0GBAjsB4B4gA0HAOmogA0HAPmogA0HAwgBqIgwgA0HAxgBqIAYQCiADQYIEOwHgHiADQcDKAGogBhAfIAZBAEGAAvwLACADQcAGaiIEIANBwApqIANBwA5qIANBwBJqIgUgA0HgzgBqIglBAEEBQQJB/wEQCyAGIANBwCJqIANBwCZqIAUgCUEDQQRBBUH/ARALIAQQBiAGEAYgA0FAayIHIAQQGCAFIAggBCAHEAIgA0HAFmogCyAEIAcQAiADQcAaaiAMIAQgBxACIAUQFyAFQYAEahAXIAVBgAhqEBcgBSAGECAgBRAMIAQQDCABIAQQDiAAIAUQDiAAQZgJaiADKQPYTjcAACAAQZAJaiADKQPQTjcAACAAQYgJaiADKQPITjcAACAAIAMpA8BONwCACSAJQgA3AwAgA0HozgBqQgA3AwAgA0HwzgBqQgA3AwAgA0H4zgBqQgA3AwAgA0IANwPATiADQgA3A8hOIANCADcD0E4gA0IANwPYTiADQQA6ACAgA0IANwMYIANCADcDECADQgA3AwggA0IANwMAIAhBAEGAJPwLACAGQQBBgAz8CwAgBEEAQYAM/AsAIAdBAEGABvwLACQAIAFBgAlqIABBoAn8CgAAIAFBoBJqIAAQEyABQdgSaiACKQA4NwAAIAFB0BJqIAIpADA3AAAgAUHIEmogAikAKDcAACABIAIpACA3AMASQQALAgALC8gDAQBBgAgLwAPs+wr9mf4T+tUFjgUfAcoAVf9uAikGtgDCA077Pvq8BT0C0/oIAX8Bw/yyBb75fv9X/fkD3AJgAvr5mwEz/935xwSMAtj99wPz+tMF5v74+QQC+P/A/mb9rvl2+34AvQWr/Kb/8f4+A2sAc/oJ/0n8cv7BAxz6K/3AAdf7pQIF+7H7rgErAksDHftnAw4GaQCmAUsCsQAV/93+NP4mBnUGCv8KA4cEbf/3/MsFpv1fBMr5hAKY/F0BogFJAWT/tf8xA0kEWwJiAioF+/pH+oABQft4/8IEyfqW/NwAXfuF+V/7BvoC+xoDGvqq/Jr83gGU/8z+5APfA74DTPryBVwGAQAAAAAAAACCgAAAAAAAAIqAAAAAAACAAIAAgAAAAICLgAAAAAAAAAEAAIAAAAAAgYAAgAAAAIAJgAAAAAAAgIoAAAAAAAAAiAAAAAAAAAAJgACAAAAAAAoAAIAAAAAAi4AAgAAAAACLAAAAAAAAgImAAAAAAACAA4AAAAAAAIACgAAAAAAAgIAAAAAAAACACoAAAAAAAAAKAACAAAAAgIGAAIAAAACAgIAAAAAAAIABAACAAAAAAAiAAIAAAACA");
95
+ }
96
+ function getBinarySync(file) {
97
+ if (ArrayBuffer.isView(file)) {
98
+ return file;
99
+ }
100
+ if (readBinary) {
101
+ return readBinary(file);
102
+ }
103
+ throw "both async and sync fetching of the wasm failed";
104
+ }
105
+ async function getWasmBinary(binaryFile) {
106
+ return getBinarySync(binaryFile);
107
+ }
108
+ async function instantiateArrayBuffer(binaryFile, imports) {
109
+ try {
110
+ var binary = await getWasmBinary(binaryFile);
111
+ var instance = await WebAssembly.instantiate(binary, imports);
112
+ return instance;
113
+ } catch (reason) {
114
+ err(`failed to asynchronously prepare wasm: ${reason}`);
115
+ abort(reason);
116
+ }
117
+ }
118
+ async function instantiateAsync(binary, binaryFile, imports) {
119
+ return instantiateArrayBuffer(binaryFile, imports);
120
+ }
121
+ function getWasmImports() {
122
+ return { a: wasmImports };
123
+ }
124
+ async function createWasm() {
125
+ function receiveInstance(instance, module) {
126
+ wasmExports = instance.exports;
127
+ wasmMemory = wasmExports["a"];
128
+ updateMemoryViews();
129
+ assignWasmExports(wasmExports);
130
+ return wasmExports;
131
+ }
132
+ function receiveInstantiationResult(result2) {
133
+ return receiveInstance(result2["instance"]);
134
+ }
135
+ var info = getWasmImports();
136
+ wasmBinaryFile ??= findWasmBinary();
137
+ var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
138
+ var exports = receiveInstantiationResult(result);
139
+ return exports;
140
+ }
141
+ class ExitStatus {
142
+ name = "ExitStatus";
143
+ constructor(status) {
144
+ this.message = `Program terminated with exit(${status})`;
145
+ this.status = status;
146
+ }
147
+ }
148
+ var base64Decode = (b64) => {
149
+ var b1, b2, i2 = 0, j = 0, bLength = b64.length;
150
+ var output = new Uint8Array((bLength * 3 >> 2) - (b64[bLength - 2] == "=") - (b64[bLength - 1] == "="));
151
+ for (; i2 < bLength; i2 += 4, j += 3) {
152
+ b1 = base64ReverseLookup[b64.charCodeAt(i2 + 1)];
153
+ b2 = base64ReverseLookup[b64.charCodeAt(i2 + 2)];
154
+ output[j] = base64ReverseLookup[b64.charCodeAt(i2)] << 2 | b1 >> 4;
155
+ output[j + 1] = b1 << 4 | b2 >> 2;
156
+ output[j + 2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i2 + 3)];
157
+ }
158
+ return output;
159
+ };
160
+ function getValue(ptr, type = "i8") {
161
+ if (type.endsWith("*")) type = "*";
162
+ switch (type) {
163
+ case "i1":
164
+ return HEAP8[ptr];
165
+ case "i8":
166
+ return HEAP8[ptr];
167
+ case "i16":
168
+ return HEAP16[ptr >> 1];
169
+ case "i32":
170
+ return HEAP32[ptr >> 2];
171
+ case "i64":
172
+ return HEAP64[ptr >> 3];
173
+ case "float":
174
+ return HEAPF32[ptr >> 2];
175
+ case "double":
176
+ return HEAPF64[ptr >> 3];
177
+ case "*":
178
+ return HEAPU32[ptr >> 2];
179
+ default:
180
+ abort(`invalid type for getValue: ${type}`);
181
+ }
182
+ }
183
+ function setValue(ptr, value, type = "i8") {
184
+ if (type.endsWith("*")) type = "*";
185
+ switch (type) {
186
+ case "i1":
187
+ HEAP8[ptr] = value;
188
+ break;
189
+ case "i8":
190
+ HEAP8[ptr] = value;
191
+ break;
192
+ case "i16":
193
+ HEAP16[ptr >> 1] = value;
194
+ break;
195
+ case "i32":
196
+ HEAP32[ptr >> 2] = value;
197
+ break;
198
+ case "i64":
199
+ HEAP64[ptr >> 3] = BigInt(value);
200
+ break;
201
+ case "float":
202
+ HEAPF32[ptr >> 2] = value;
203
+ break;
204
+ case "double":
205
+ HEAPF64[ptr >> 3] = value;
206
+ break;
207
+ case "*":
208
+ HEAPU32[ptr >> 2] = value;
209
+ break;
210
+ default:
211
+ abort(`invalid type for setValue: ${type}`);
212
+ }
213
+ }
214
+ var stackRestore = (val) => __emscripten_stack_restore(val);
215
+ var stackSave = () => _emscripten_stack_get_current();
216
+ var stackAlloc = (sz) => __emscripten_stack_alloc(sz);
217
+ for (var base64ReverseLookup = new Uint8Array(123), i = 25; i >= 0; --i) {
218
+ base64ReverseLookup[48 + i] = 52 + i;
219
+ base64ReverseLookup[65 + i] = i;
220
+ base64ReverseLookup[97 + i] = 26 + i;
221
+ }
222
+ base64ReverseLookup[43] = 62;
223
+ base64ReverseLookup[47] = 63;
224
+ {
225
+ }
226
+ Module["stackSave"] = stackSave;
227
+ Module["stackRestore"] = stackRestore;
228
+ Module["stackAlloc"] = stackAlloc;
229
+ Module["setValue"] = setValue;
230
+ Module["getValue"] = getValue;
231
+ var _mlkem768_keypair_derand, _mlkem768_enc_derand, _mlkem768_dec, __emscripten_stack_restore, __emscripten_stack_alloc, _emscripten_stack_get_current;
232
+ function assignWasmExports(wasmExports2) {
233
+ Module["_mlkem768_keypair_derand"] = _mlkem768_keypair_derand = wasmExports2["c"];
234
+ Module["_mlkem768_enc_derand"] = _mlkem768_enc_derand = wasmExports2["d"];
235
+ Module["_mlkem768_dec"] = _mlkem768_dec = wasmExports2["e"];
236
+ __emscripten_stack_restore = wasmExports2["f"];
237
+ __emscripten_stack_alloc = wasmExports2["g"];
238
+ _emscripten_stack_get_current = wasmExports2["h"];
239
+ }
240
+ var wasmImports = {};
241
+ function run() {
242
+ preRun();
243
+ function doRun() {
244
+ Module["calledRun"] = true;
245
+ if (ABORT) return;
246
+ initRuntime();
247
+ readyPromiseResolve?.(Module);
248
+ postRun();
249
+ }
250
+ {
251
+ doRun();
252
+ }
253
+ }
254
+ var wasmExports;
255
+ wasmExports = await createWasm();
256
+ run();
257
+ if (runtimeInitialized) {
258
+ moduleRtn = Module;
259
+ } else {
260
+ moduleRtn = new Promise((resolve, reject) => {
261
+ readyPromiseResolve = resolve;
262
+ readyPromiseReject = reject;
263
+ });
264
+ }
265
+ ;
266
+ return moduleRtn;
267
+ }
268
+ var wasm_module_default = MLKEM768Module;
269
+ var ALGORITHM_NAME = "ML-KEM-768";
270
+ var JWK_ALG = "MLKEM768";
271
+ var KEY_USAGES = [
272
+ "encapsulateKey",
273
+ "encapsulateBits",
274
+ "decapsulateKey",
275
+ "decapsulateBits"
276
+ ];
277
+ var MlKemOperationError = class extends Error {
278
+ constructor(message) {
279
+ super(message);
280
+ this.name = "OperationError";
281
+ }
282
+ };
283
+ var MlKemInvalidAccessError = class extends Error {
284
+ constructor(message) {
285
+ super(message);
286
+ this.name = "InvalidAccessError";
287
+ }
288
+ };
289
+ var MlKemNotSupportedError = class extends Error {
290
+ constructor(message) {
291
+ super(message);
292
+ this.name = "NotSupportedError";
293
+ }
294
+ };
295
+ var MlKemDataError = class extends Error {
296
+ constructor(message) {
297
+ super(message);
298
+ this.name = "DataError";
299
+ }
300
+ };
301
+ var internalKeyData = /* @__PURE__ */ new WeakMap();
302
+ function getInternalKeyData(key) {
303
+ const keyData = internalKeyData.get(key);
304
+ if (!keyData) {
305
+ throw new TypeError("Unknown key object");
306
+ }
307
+ return keyData;
308
+ }
309
+ var cleanupRegistry = new FinalizationRegistry((keyData) => {
310
+ keyData.publicKeyData.fill(0);
311
+ keyData.privateSeedData?.fill(0);
312
+ keyData.privateSecretKeyData?.fill(0);
313
+ });
314
+ function getPublicKeyDataRef(key) {
315
+ const keyData = getInternalKeyData(key);
316
+ if (!keyData.publicKeyData) {
317
+ throw new MlKemOperationError("Failed to get public key data");
318
+ }
319
+ return keyData.publicKeyData;
320
+ }
321
+ function getPrivateKeyDataRef(key) {
322
+ const keyData = getInternalKeyData(key);
323
+ if (!keyData.privateSeedData || !keyData.privateSecretKeyData) {
324
+ throw new MlKemOperationError("Failed to get private key data");
325
+ }
326
+ return keyData;
327
+ }
328
+ var noClone = /* @__PURE__ */ Symbol("CryptoKey created by mlkem-wasm cannot be cloned");
329
+ var keyIdKey = "_mlkem_wasm";
330
+ var emptyToJSON = () => ({});
331
+ function createKeyObject(type, extractable, usages, keyData) {
332
+ const key = {
333
+ type,
334
+ extractable,
335
+ algorithm: Object.freeze({ name: ALGORITHM_NAME }),
336
+ usages: Object.freeze(Array.from(usages)),
337
+ [keyIdKey]: noClone
338
+ // to prevent structured cloning
339
+ };
340
+ Object.defineProperty(key, "toJSON", {
341
+ value: emptyToJSON,
342
+ writable: false,
343
+ enumerable: false,
344
+ configurable: false
345
+ });
346
+ Object.setPrototypeOf(key, CryptoKey.prototype);
347
+ internalKeyData.set(key, keyData);
348
+ cleanupRegistry.register(key, keyData);
349
+ return Object.freeze(key);
350
+ }
351
+ function createPublicKey(publicKeyData, usages) {
352
+ return createKeyObject("public", true, usages, { publicKeyData });
353
+ }
354
+ function createPrivateKey(publicKeyData, privateSeedData, privateSecretKeyData, extractable, usages) {
355
+ return createKeyObject("private", extractable, usages, {
356
+ publicKeyData,
357
+ privateSeedData,
358
+ privateSecretKeyData
359
+ });
360
+ }
361
+ function _isSupportedCryptoKey(key) {
362
+ return key instanceof CryptoKey && keyIdKey in key && key[keyIdKey] == noClone && internalKeyData.has(key);
363
+ }
364
+ function toBase64url(data) {
365
+ return btoa(String.fromCharCode(...data)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
366
+ }
367
+ function fromBase64url(base64url) {
368
+ const base64 = base64url.replace(/-/g, "+").replace(/_/g, "/");
369
+ const binary = atob(base64 + "===".slice((base64.length + 3) % 4));
370
+ return Uint8Array.from(binary, (c) => c.charCodeAt(0));
371
+ }
372
+ var PUBLICKEY_BYTES = 1184;
373
+ var SECRETKEY_BYTES = 2400;
374
+ var CIPHERTEXT_BYTES = 1088;
375
+ var SHARED_SECRET_BYTES = 32;
376
+ var KEYPAIR_RANDOM_BYTES = 64;
377
+ var ENC_RANDOM_BYTES = 32;
378
+ var _module;
379
+ async function getModule() {
380
+ if (!_module) {
381
+ _module = await wasm_module_default();
382
+ }
383
+ return _module;
384
+ }
385
+ var getRandomValues = crypto.getRandomValues.bind(crypto);
386
+ function checkAlgorithm(algorithm) {
387
+ const name = typeof algorithm === "string" ? algorithm.toUpperCase() : typeof algorithm === "object" && algorithm !== null && "name" in algorithm && typeof algorithm.name === "string" ? algorithm.name.toUpperCase() : null;
388
+ if (name !== ALGORITHM_NAME) {
389
+ throw new TypeError("Unsupported algorithm");
390
+ }
391
+ }
392
+ async function internalGenerateKeyPair(coins) {
393
+ const module = await getModule();
394
+ const stackSave = module.stackSave();
395
+ try {
396
+ const pkPtr = module.stackAlloc(PUBLICKEY_BYTES);
397
+ const skPtr = module.stackAlloc(SECRETKEY_BYTES);
398
+ const coinsPtr = module.stackAlloc(KEYPAIR_RANDOM_BYTES);
399
+ module.HEAPU8.set(coins, coinsPtr);
400
+ const result = module._mlkem768_keypair_derand(pkPtr, skPtr, coinsPtr);
401
+ if (result !== 0) {
402
+ throw new MlKemOperationError("Key generation failed");
403
+ }
404
+ const rawPublicKey = new Uint8Array(PUBLICKEY_BYTES);
405
+ const rawSecretKey = new Uint8Array(SECRETKEY_BYTES);
406
+ const rawSeed = new Uint8Array(coins);
407
+ rawPublicKey.set(module.HEAPU8.subarray(pkPtr, pkPtr + PUBLICKEY_BYTES));
408
+ rawSecretKey.set(module.HEAPU8.subarray(skPtr, skPtr + SECRETKEY_BYTES));
409
+ module.HEAPU8.fill(0, pkPtr, pkPtr + PUBLICKEY_BYTES);
410
+ module.HEAPU8.fill(0, skPtr, skPtr + SECRETKEY_BYTES);
411
+ module.HEAPU8.fill(0, coinsPtr, coinsPtr + KEYPAIR_RANDOM_BYTES);
412
+ return { rawPublicKey, rawSecretKey, rawSeed };
413
+ } finally {
414
+ module.stackRestore(stackSave);
415
+ }
416
+ }
417
+ async function generateKey(keyAlgorithm, extractable, usages) {
418
+ checkAlgorithm(keyAlgorithm);
419
+ if (!Array.isArray(usages) || usages.some((usage) => !KEY_USAGES.includes(usage))) {
420
+ throw new SyntaxError("Invalid key usages");
421
+ }
422
+ const { rawPublicKey, rawSecretKey, rawSeed } = await internalGenerateKeyPair(
423
+ getRandomValues(new Uint8Array(KEYPAIR_RANDOM_BYTES))
424
+ );
425
+ const publicKey = createPublicKey(
426
+ rawPublicKey,
427
+ usages.filter(
428
+ (usage) => usage === "encapsulateKey" || usage === "encapsulateBits"
429
+ )
430
+ );
431
+ const privateKey = createPrivateKey(
432
+ rawPublicKey,
433
+ rawSeed,
434
+ rawSecretKey,
435
+ extractable,
436
+ usages.filter(
437
+ (usage) => usage === "decapsulateKey" || usage === "decapsulateBits"
438
+ )
439
+ );
440
+ return {
441
+ publicKey,
442
+ privateKey
443
+ };
444
+ }
445
+ async function exportKey(format, key) {
446
+ if (!(key instanceof CryptoKey)) {
447
+ throw new TypeError("Expected key to be an instance of CryptoKey");
448
+ }
449
+ checkAlgorithm(key.algorithm);
450
+ if (!key.extractable) {
451
+ throw new MlKemOperationError("Key is not extractable");
452
+ }
453
+ if (format === "spki") {
454
+ if (key.type !== "public") {
455
+ throw new TypeError("Expected key type to be 'public'");
456
+ }
457
+ return rawToDer(MLKEM768_SPKI, getPublicKeyDataRef(key)).buffer;
458
+ }
459
+ if (format === "pkcs8") {
460
+ if (key.type !== "private") {
461
+ throw new MlKemInvalidAccessError("Expected key type to be 'private'");
462
+ }
463
+ return rawToDer(MLKEM768_PKCS8, getPrivateKeyDataRef(key).privateSeedData).buffer;
464
+ }
465
+ if (format === "raw-public") {
466
+ if (key.type !== "public") {
467
+ throw new TypeError("Expected key type to be 'public'");
468
+ }
469
+ return new Uint8Array(getPublicKeyDataRef(key)).buffer;
470
+ }
471
+ if (format === "raw-seed") {
472
+ if (key.type !== "private") {
473
+ throw new MlKemInvalidAccessError("Expected key type to be 'private'");
474
+ }
475
+ return new Uint8Array(getPrivateKeyDataRef(key).privateSeedData).buffer;
476
+ }
477
+ if (format === "jwk") {
478
+ const jwk = {
479
+ // 2.2. Set the kty attribute of jwk to "AKP".
480
+ kty: "AKP",
481
+ // 2.3. Set the alg attribute of jwk to the alg value corresponding to
482
+ // the name member of normalizedAlgorithm indicated in Section 8 of
483
+ // [draft-ietf-jose-pqc-kem-01] (Figure 1).
484
+ alg: JWK_ALG,
485
+ // 2.4. Set the pub attribute of jwk to the base64url encoded public
486
+ // key corresponding to the [[handle]] internal slot of key.
487
+ pub: toBase64url(getPublicKeyDataRef(key))
488
+ };
489
+ if (key.type === "private") {
490
+ jwk.priv = toBase64url(getPrivateKeyDataRef(key).privateSeedData);
491
+ }
492
+ jwk.key_ops = key.usages;
493
+ jwk.ext = key.extractable;
494
+ return jwk;
495
+ }
496
+ throw new MlKemNotSupportedError("Format not supported");
497
+ }
498
+ function bufferSourcetoUint8Array(value) {
499
+ if (ArrayBuffer.isView(value) && value.buffer instanceof ArrayBuffer) {
500
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
501
+ } else if (value instanceof ArrayBuffer) {
502
+ return new Uint8Array(value);
503
+ } else {
504
+ throw new TypeError("Value must be a BufferSource");
505
+ }
506
+ }
507
+ function bufferSourcetoUint8ArrayCopy(value) {
508
+ return bufferSourcetoUint8Array(value).slice();
509
+ }
510
+ var MLKEM768_SPKI = {
511
+ fullLength: 1206,
512
+ prefix: new Uint8Array([
513
+ 48,
514
+ 130,
515
+ 4,
516
+ 178,
517
+ 48,
518
+ 11,
519
+ 6,
520
+ 9,
521
+ 96,
522
+ 134,
523
+ 72,
524
+ 1,
525
+ 101,
526
+ 3,
527
+ 4,
528
+ 4,
529
+ 2,
530
+ 3,
531
+ 130,
532
+ 4,
533
+ 161,
534
+ 0
535
+ ])
536
+ };
537
+ var MLKEM768_PKCS8 = {
538
+ fullLength: 86,
539
+ prefix: new Uint8Array([
540
+ 48,
541
+ 84,
542
+ 2,
543
+ 1,
544
+ 0,
545
+ 48,
546
+ 11,
547
+ 6,
548
+ 9,
549
+ 96,
550
+ 134,
551
+ 72,
552
+ 1,
553
+ 101,
554
+ 3,
555
+ 4,
556
+ 4,
557
+ 2,
558
+ 4,
559
+ 66,
560
+ 128,
561
+ 64
562
+ ])
563
+ };
564
+ function bytesEqual(a, b) {
565
+ if (a.length !== b.length) {
566
+ return false;
567
+ }
568
+ let diff = 0;
569
+ for (let i = 0; i < a.length; i++) {
570
+ diff |= a[i] ^ b[i];
571
+ }
572
+ return diff === 0;
573
+ }
574
+ function derToRaw(encoding, der) {
575
+ if (der.length !== encoding.fullLength) {
576
+ throw new MlKemDataError("Invalid encoding");
577
+ }
578
+ const prefix = der.subarray(0, encoding.prefix.length);
579
+ if (!bytesEqual(prefix, encoding.prefix)) {
580
+ throw new MlKemNotSupportedError("Unsupported encoding");
581
+ }
582
+ return der.slice(encoding.prefix.length);
583
+ }
584
+ function rawToDer(encoding, raw) {
585
+ const der = new Uint8Array(encoding.fullLength);
586
+ der.set(encoding.prefix);
587
+ der.set(raw, encoding.prefix.length);
588
+ return der;
589
+ }
590
+ async function importKey(format, keyData, algorithm, extractable, usages) {
591
+ checkAlgorithm(algorithm);
592
+ if (format === "spki") {
593
+ if (!Array.isArray(usages) || usages.some(
594
+ (usage) => usage !== "encapsulateKey" && usage !== "encapsulateBits"
595
+ )) {
596
+ throw new SyntaxError("Invalid key usages for public key");
597
+ }
598
+ const data = derToRaw(MLKEM768_SPKI, bufferSourcetoUint8Array(keyData));
599
+ if (data.length !== PUBLICKEY_BYTES) {
600
+ throw new MlKemDataError("Invalid key length");
601
+ }
602
+ return createPublicKey(data, usages);
603
+ }
604
+ if (format === "pkcs8") {
605
+ if (!Array.isArray(usages) || usages.some(
606
+ (usage) => usage !== "decapsulateKey" && usage !== "decapsulateBits"
607
+ )) {
608
+ throw new SyntaxError("Invalid key usages for private key");
609
+ }
610
+ const data = derToRaw(MLKEM768_PKCS8, bufferSourcetoUint8Array(keyData));
611
+ if (data.length !== KEYPAIR_RANDOM_BYTES) {
612
+ throw new MlKemDataError("Invalid key length");
613
+ }
614
+ const { rawPublicKey, rawSecretKey, rawSeed } = await internalGenerateKeyPair(data);
615
+ return createPrivateKey(
616
+ rawPublicKey,
617
+ rawSeed,
618
+ rawSecretKey,
619
+ extractable,
620
+ usages
621
+ );
622
+ }
623
+ if (format === "raw-public") {
624
+ if (!Array.isArray(usages) || usages.some(
625
+ (usage) => usage !== "encapsulateKey" && usage !== "encapsulateBits"
626
+ )) {
627
+ throw new SyntaxError("Invalid key usages for public key");
628
+ }
629
+ const data = bufferSourcetoUint8ArrayCopy(keyData);
630
+ return createPublicKey(data, usages);
631
+ }
632
+ if (format === "raw-seed") {
633
+ if (!Array.isArray(usages) || usages.some(
634
+ (usage) => usage !== "decapsulateKey" && usage !== "decapsulateBits"
635
+ )) {
636
+ throw new SyntaxError("Invalid key usages for private key");
637
+ }
638
+ const data = bufferSourcetoUint8ArrayCopy(keyData);
639
+ if (data.length !== KEYPAIR_RANDOM_BYTES) {
640
+ throw new MlKemDataError("Invalid key length");
641
+ }
642
+ const { rawPublicKey, rawSecretKey, rawSeed } = await internalGenerateKeyPair(data);
643
+ return createPrivateKey(
644
+ rawPublicKey,
645
+ rawSeed,
646
+ rawSecretKey,
647
+ extractable,
648
+ usages
649
+ );
650
+ }
651
+ if (format === "jwk") {
652
+ if (typeof keyData !== "object" || keyData === null) {
653
+ throw new MlKemDataError(
654
+ "Expected keyData to be a JsonWebKey dictionary"
655
+ );
656
+ }
657
+ const jwk = keyData;
658
+ if (jwk.priv && usages.some(
659
+ (usage) => usage !== "decapsulateKey" && usage !== "decapsulateBits"
660
+ )) {
661
+ throw new SyntaxError("Invalid key usages for private key");
662
+ }
663
+ if (!jwk.priv && usages.some(
664
+ (usage) => usage !== "encapsulateKey" && usage !== "encapsulateBits"
665
+ )) {
666
+ throw new SyntaxError("Invalid key usages for public key");
667
+ }
668
+ if (jwk.kty !== "AKP") {
669
+ throw new MlKemDataError("Invalid key type");
670
+ }
671
+ if (jwk.alg !== JWK_ALG && jwk.alg !== "ML-KEM-768+A192KW") {
672
+ throw new MlKemDataError("Invalid algorithm");
673
+ }
674
+ if (usages.length > 0 && jwk.use && jwk.use !== "enc") {
675
+ throw new MlKemDataError("Invalid key usage");
676
+ }
677
+ if (jwk.key_ops && Array.isArray(jwk.key_ops) && !Array.prototype.every.call(
678
+ jwk.key_ops,
679
+ (op) => KEY_USAGES.includes(op)
680
+ ) || !Array.isArray(jwk.key_ops)) {
681
+ throw new MlKemDataError("Invalid key operations");
682
+ }
683
+ if (jwk.ext === false && extractable) {
684
+ throw new MlKemDataError("Invalid key extractability");
685
+ }
686
+ if (jwk.priv) {
687
+ try {
688
+ const seedData = fromBase64url(jwk.priv);
689
+ if (seedData.length !== KEYPAIR_RANDOM_BYTES) {
690
+ throw new MlKemDataError("Invalid private key length");
691
+ }
692
+ const { rawPublicKey, rawSecretKey, rawSeed } = await internalGenerateKeyPair(seedData);
693
+ const key = createPrivateKey(
694
+ rawPublicKey,
695
+ rawSeed,
696
+ rawSecretKey,
697
+ extractable,
698
+ usages
699
+ );
700
+ if (toBase64url(rawPublicKey) !== jwk.pub) {
701
+ throw new MlKemDataError("Invalid public key data");
702
+ }
703
+ return key;
704
+ } catch {
705
+ throw new MlKemDataError("Invalid private key format");
706
+ }
707
+ } else {
708
+ try {
709
+ const publicKeyData = fromBase64url(jwk.pub);
710
+ if (publicKeyData.length !== PUBLICKEY_BYTES) {
711
+ throw new MlKemDataError("Invalid public key data");
712
+ }
713
+ return createPublicKey(publicKeyData, usages);
714
+ } catch {
715
+ throw new MlKemDataError("Invalid public key format");
716
+ }
717
+ }
718
+ }
719
+ throw new MlKemNotSupportedError("Unsupported key format");
720
+ }
721
+ async function getPublicKey(key, usages) {
722
+ if (!(key instanceof CryptoKey)) {
723
+ throw new TypeError("Expected key to be an instance of CryptoKey");
724
+ }
725
+ checkAlgorithm(key.algorithm);
726
+ if (key.type !== "private") {
727
+ throw new MlKemInvalidAccessError("Expected key type to be 'private'");
728
+ }
729
+ if (!Array.isArray(usages) || usages.some(
730
+ (usage) => usage !== "encapsulateKey" && usage !== "encapsulateBits"
731
+ )) {
732
+ throw new SyntaxError("Invalid key usages");
733
+ }
734
+ const keyData = getInternalKeyData(key);
735
+ if (!keyData.publicKeyData) {
736
+ throw new MlKemOperationError("Failed to get public key data");
737
+ }
738
+ return createPublicKey(new Uint8Array(keyData.publicKeyData), usages);
739
+ }
740
+ async function internalEncapsulate(algorithm, encapsulationKey, usage) {
741
+ const module = await getModule();
742
+ checkAlgorithm(algorithm);
743
+ if (!(encapsulationKey instanceof CryptoKey) || encapsulationKey.type !== "public") {
744
+ throw new MlKemInvalidAccessError(
745
+ "Expected publicKey to be an instance of MlKemCryptoKey with type 'public'"
746
+ );
747
+ }
748
+ if (!encapsulationKey.usages.includes(usage)) {
749
+ throw new MlKemInvalidAccessError(`Key usages don't include '${usage}'`);
750
+ }
751
+ const publicKeyData = getPublicKeyDataRef(encapsulationKey);
752
+ if (publicKeyData.length !== PUBLICKEY_BYTES) {
753
+ throw new MlKemOperationError("Invalid public key length");
754
+ }
755
+ const coins = getRandomValues(new Uint8Array(ENC_RANDOM_BYTES));
756
+ const stackSave = module.stackSave();
757
+ try {
758
+ const pkPtr = module.stackAlloc(PUBLICKEY_BYTES);
759
+ const ctPtr = module.stackAlloc(CIPHERTEXT_BYTES);
760
+ const ssPtr = module.stackAlloc(SHARED_SECRET_BYTES);
761
+ const coinsPtr = module.stackAlloc(ENC_RANDOM_BYTES);
762
+ module.HEAPU8.set(publicKeyData, pkPtr);
763
+ module.HEAPU8.set(coins, coinsPtr);
764
+ const result = module._mlkem768_enc_derand(ctPtr, ssPtr, pkPtr, coinsPtr);
765
+ if (result !== 0) {
766
+ throw new MlKemOperationError("Encapsulation failed");
767
+ }
768
+ const ciphertext = new Uint8Array(CIPHERTEXT_BYTES);
769
+ const sharedKey = new Uint8Array(SHARED_SECRET_BYTES);
770
+ ciphertext.set(module.HEAPU8.subarray(ctPtr, ctPtr + CIPHERTEXT_BYTES));
771
+ sharedKey.set(module.HEAPU8.subarray(ssPtr, ssPtr + SHARED_SECRET_BYTES));
772
+ module.HEAPU8.fill(0, ctPtr, ctPtr + CIPHERTEXT_BYTES);
773
+ module.HEAPU8.fill(0, ssPtr, ssPtr + SHARED_SECRET_BYTES);
774
+ module.HEAPU8.fill(0, pkPtr, pkPtr + PUBLICKEY_BYTES);
775
+ module.HEAPU8.fill(0, coinsPtr, coinsPtr + ENC_RANDOM_BYTES);
776
+ return {
777
+ ciphertext: ciphertext.buffer,
778
+ sharedKey: sharedKey.buffer
779
+ };
780
+ } finally {
781
+ module.stackRestore(stackSave);
782
+ }
783
+ }
784
+ async function encapsulateBits(algorithm, encapsulationKey) {
785
+ return internalEncapsulate(algorithm, encapsulationKey, "encapsulateBits");
786
+ }
787
+ async function encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages) {
788
+ const { sharedKey: sharedKeyBits, ciphertext } = await internalEncapsulate(
789
+ encapsulationAlgorithm,
790
+ encapsulationKey,
791
+ "encapsulateKey"
792
+ );
793
+ const sharedKey = await crypto.subtle.importKey(
794
+ "raw",
795
+ sharedKeyBits,
796
+ sharedKeyAlgorithm,
797
+ extractable,
798
+ usages
799
+ );
800
+ return {
801
+ sharedKey,
802
+ ciphertext
803
+ };
804
+ }
805
+ async function internalDecapsulate(algorithm, decapsulationKey, ciphertext, usage) {
806
+ const module = await getModule();
807
+ checkAlgorithm(algorithm);
808
+ if (!(decapsulationKey instanceof CryptoKey) || decapsulationKey.type !== "private") {
809
+ throw new MlKemInvalidAccessError(
810
+ "Expected key to be an instance of MlKemCryptoKey with type 'private'"
811
+ );
812
+ }
813
+ if (!decapsulationKey.usages.includes(usage)) {
814
+ throw new MlKemInvalidAccessError(`Key usages don't include '${usage}'`);
815
+ }
816
+ const secretKeyData = getPrivateKeyDataRef(decapsulationKey).privateSecretKeyData;
817
+ if (!secretKeyData || secretKeyData.length !== SECRETKEY_BYTES) {
818
+ throw new Error("Invalid secret key length");
819
+ }
820
+ const ct = bufferSourcetoUint8Array(ciphertext);
821
+ if (ct.length !== CIPHERTEXT_BYTES) {
822
+ throw new MlKemOperationError("Invalid ciphertext length");
823
+ }
824
+ const stackSave = module.stackSave();
825
+ try {
826
+ const ctPtr = module.stackAlloc(CIPHERTEXT_BYTES);
827
+ const skPtr = module.stackAlloc(SECRETKEY_BYTES);
828
+ const ssPtr = module.stackAlloc(SHARED_SECRET_BYTES);
829
+ module.HEAPU8.set(ct, ctPtr);
830
+ module.HEAPU8.set(secretKeyData, skPtr);
831
+ const result = module._mlkem768_dec(ssPtr, ctPtr, skPtr);
832
+ if (result !== 0) {
833
+ throw new MlKemOperationError("Decapsulation failed");
834
+ }
835
+ const sharedKey = new Uint8Array(SHARED_SECRET_BYTES);
836
+ sharedKey.set(module.HEAPU8.subarray(ssPtr, ssPtr + SHARED_SECRET_BYTES));
837
+ module.HEAPU8.fill(0, ctPtr, ctPtr + CIPHERTEXT_BYTES);
838
+ module.HEAPU8.fill(0, skPtr, skPtr + SECRETKEY_BYTES);
839
+ module.HEAPU8.fill(0, ssPtr, ssPtr + SHARED_SECRET_BYTES);
840
+ return sharedKey.buffer;
841
+ } finally {
842
+ module.stackRestore(stackSave);
843
+ }
844
+ }
845
+ async function decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext) {
846
+ return internalDecapsulate(
847
+ decapsulationAlgorithm,
848
+ decapsulationKey,
849
+ ciphertext,
850
+ "decapsulateBits"
851
+ );
852
+ }
853
+ async function decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages) {
854
+ const sharedKeyBits = await internalDecapsulate(
855
+ decapsulationAlgorithm,
856
+ decapsulationKey,
857
+ ciphertext,
858
+ "decapsulateKey"
859
+ );
860
+ const sharedKey = await crypto.subtle.importKey(
861
+ "raw",
862
+ sharedKeyBits,
863
+ sharedKeyAlgorithm,
864
+ extractable,
865
+ usages
866
+ );
867
+ return sharedKey;
868
+ }
869
+ var mlkem = {
870
+ generateKey,
871
+ exportKey,
872
+ importKey,
873
+ getPublicKey,
874
+ encapsulateBits,
875
+ encapsulateKey,
876
+ decapsulateBits,
877
+ decapsulateKey,
878
+ _isSupportedCryptoKey
879
+ };
880
+ var mlkem_default = mlkem;
881
+
1
882
  // src/kyber_crystals_wasm_engine.js
2
883
  var kyber_crystals_wasm_engine = /* @__PURE__ */ (() => {
3
- return async function(moduleArg = {}) {
884
+ return (async function(moduleArg = {}) {
4
885
  var moduleRtn;
5
886
  var Module = moduleArg;
6
887
  var readyPromiseResolve, readyPromiseReject;
@@ -1791,12 +2672,147 @@ var kyber_crystals_wasm_engine = /* @__PURE__ */ (() => {
1791
2672
  run();
1792
2673
  moduleRtn = readyPromise;
1793
2674
  return moduleRtn;
1794
- };
2675
+ });
1795
2676
  })();
1796
2677
  var kyber_crystals_wasm_engine_default = kyber_crystals_wasm_engine;
1797
2678
 
1798
2679
  // src/index.ts
2680
+ var MLKEM_ALGORITHM = { name: "ML-KEM-768" };
2681
+ function bytesToHexWithSpaces(bytes) {
2682
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(" ");
2683
+ }
2684
+ function hexStringToBytes(hex) {
2685
+ const cleaned = hex.trim().replace(/^0x/i, "");
2686
+ if (!cleaned) return new Uint8Array();
2687
+ const parts = cleaned.includes(" ") ? cleaned.split(/\s+/) : null;
2688
+ if (parts) {
2689
+ return Uint8Array.from(parts.map((p) => parseInt(p, 16)));
2690
+ }
2691
+ if (cleaned.length % 2 !== 0) {
2692
+ throw new TypeError("Hex string must have even length");
2693
+ }
2694
+ const out = new Uint8Array(cleaned.length / 2);
2695
+ for (let i = 0; i < out.length; i++) {
2696
+ out[i] = parseInt(cleaned.slice(i * 2, i * 2 + 2), 16);
2697
+ }
2698
+ return out;
2699
+ }
2700
+ function bufferSourceToBytes(value) {
2701
+ if (value instanceof Uint8Array) {
2702
+ if (typeof SharedArrayBuffer !== "undefined" && value.buffer instanceof SharedArrayBuffer)
2703
+ return new Uint8Array(value);
2704
+ return value;
2705
+ }
2706
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
2707
+ if (ArrayBuffer.isView(value)) {
2708
+ const buffer = value.buffer;
2709
+ if (typeof SharedArrayBuffer !== "undefined" && buffer instanceof SharedArrayBuffer) {
2710
+ const view = value;
2711
+ const u8 = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
2712
+ return new Uint8Array(u8);
2713
+ }
2714
+ return new Uint8Array(buffer, value.byteOffset, value.byteLength);
2715
+ }
2716
+ throw new TypeError("Expected a BufferSource (ArrayBuffer or typed array)");
2717
+ }
2718
+ function bytesToArrayBuffer(bytes) {
2719
+ if (typeof SharedArrayBuffer !== "undefined" && bytes.buffer instanceof SharedArrayBuffer) {
2720
+ return Uint8Array.from(bytes).buffer;
2721
+ }
2722
+ return bytes.buffer;
2723
+ }
2724
+ async function secretToKeyBytes(secret) {
2725
+ const resolved = await secret;
2726
+ if (typeof resolved === "string") return hexStringToBytes(resolved);
2727
+ const bytes = bufferSourceToBytes(resolved);
2728
+ return new Uint8Array(bytes);
2729
+ }
2730
+ async function cryptoKeyToRawHex(key) {
2731
+ const format = key.type === "public" ? "raw-public" : "raw-seed";
2732
+ const raw = await mlkem_default.exportKey(format, key);
2733
+ return bytesToHexWithSpaces(bufferSourceToBytes(raw));
2734
+ }
1799
2735
  var MlKemWrapper = class {
2736
+ keypair() {
2737
+ const keyPairPromise = mlkem_default.generateKey(
2738
+ MLKEM_ALGORITHM,
2739
+ true,
2740
+ // allow export for buffer_to_string
2741
+ ["encapsulateBits", "decapsulateBits"]
2742
+ );
2743
+ return {
2744
+ get: (key) => keyPairPromise.then((kp) => key === "public_key" ? kp.publicKey : kp.privateKey)
2745
+ };
2746
+ }
2747
+ encrypt(public_key) {
2748
+ const publicKeyPromise = Promise.resolve(public_key);
2749
+ const encPromise = publicKeyPromise.then(
2750
+ (pk) => mlkem_default.encapsulateBits(MLKEM_ALGORITHM, pk)
2751
+ );
2752
+ return {
2753
+ get: (key) => {
2754
+ if (key === "cyphertext") return encPromise.then((r) => r.ciphertext);
2755
+ if (key === "secret") return encPromise.then((r) => r.sharedKey);
2756
+ throw new Error(`Unknown encrypt result field: ${String(key)}`);
2757
+ }
2758
+ };
2759
+ }
2760
+ decrypt(cyphertext, private_key) {
2761
+ const ctPromise = Promise.resolve(cyphertext);
2762
+ const skPromise = Promise.resolve(private_key);
2763
+ return Promise.all([ctPromise, skPromise]).then(
2764
+ ([ct, sk]) => mlkem_default.decapsulateBits(MLKEM_ALGORITHM, sk, ct)
2765
+ );
2766
+ }
2767
+ buffer_to_string(buffer) {
2768
+ if (buffer && typeof buffer.then === "function") {
2769
+ return buffer.then((b) => this.buffer_to_string(b));
2770
+ }
2771
+ if (buffer instanceof CryptoKey) {
2772
+ return cryptoKeyToRawHex(buffer);
2773
+ }
2774
+ return bytesToHexWithSpaces(bufferSourceToBytes(buffer));
2775
+ }
2776
+ async encryptMessage(message, secret) {
2777
+ const secretBytes = await secretToKeyBytes(secret);
2778
+ const secretKeyBuffer = bytesToArrayBuffer(secretBytes);
2779
+ const key = await crypto.subtle.importKey("raw", secretKeyBuffer, { name: "AES-GCM" }, false, [
2780
+ "encrypt"
2781
+ ]);
2782
+ const iv = crypto.getRandomValues(new Uint8Array(12));
2783
+ const messageBytes = new TextEncoder().encode(message);
2784
+ const encryptedData = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, messageBytes);
2785
+ const encryptedMessage = new Uint8Array(iv.length + encryptedData.byteLength);
2786
+ encryptedMessage.set(iv, 0);
2787
+ encryptedMessage.set(new Uint8Array(encryptedData), iv.length);
2788
+ return encryptedMessage;
2789
+ }
2790
+ async decryptMessage(encryptedMessage, secret) {
2791
+ const secretBytes = await secretToKeyBytes(secret);
2792
+ const secretKeyBuffer = bytesToArrayBuffer(secretBytes);
2793
+ const iv = encryptedMessage.slice(0, 12);
2794
+ const encryptedData = encryptedMessage.slice(12);
2795
+ const key = await crypto.subtle.importKey("raw", secretKeyBuffer, { name: "AES-GCM" }, false, [
2796
+ "decrypt"
2797
+ ]);
2798
+ const decryptedData = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, encryptedData);
2799
+ return new TextDecoder().decode(decryptedData);
2800
+ }
2801
+ delete() {
2802
+ }
2803
+ };
2804
+ async function loadMlKem1024() {
2805
+ const wasm = await kyber_crystals_wasm_engine_default();
2806
+ return new KyberVariantWrapper(new wasm.MlKem1024());
2807
+ }
2808
+ async function loadMlKem512() {
2809
+ const wasm = await kyber_crystals_wasm_engine_default();
2810
+ return new KyberVariantWrapper(new wasm.MlKem512());
2811
+ }
2812
+ async function loadMlKem768() {
2813
+ return new MlKemWrapper();
2814
+ }
2815
+ var KyberVariantWrapper = class {
1800
2816
  constructor(instance) {
1801
2817
  this.instance = instance;
1802
2818
  }
@@ -1806,42 +2822,52 @@ var MlKemWrapper = class {
1806
2822
  encrypt(public_key) {
1807
2823
  return this.instance.encrypt(public_key);
1808
2824
  }
1809
- decrypt(cyphertext, private_key) {
2825
+ async decrypt(cyphertext, private_key) {
1810
2826
  return this.instance.decrypt(cyphertext, private_key);
1811
2827
  }
1812
2828
  buffer_to_string(buffer) {
1813
2829
  return this.instance.buffer_to_string(buffer);
1814
2830
  }
2831
+ async toSecretBytes(secret) {
2832
+ const resolved = await secret;
2833
+ if (typeof resolved === "string") return hexStringToBytes(resolved);
2834
+ try {
2835
+ return await secretToKeyBytes(resolved);
2836
+ } catch {
2837
+ const hex = this.instance.buffer_to_string(resolved);
2838
+ return hexStringToBytes(hex);
2839
+ }
2840
+ }
1815
2841
  async encryptMessage(message, secret) {
1816
- const sharedSecret = this.buffer_to_string(secret);
1817
- const sharedSecretBuffer = new Uint8Array(sharedSecret.trim().split(" ").map((x) => parseInt(x, 16)));
1818
- const messageBytes = new TextEncoder().encode(message);
2842
+ const secretBytes = await this.toSecretBytes(secret);
2843
+ const secretKeyBuffer = bytesToArrayBuffer(secretBytes);
1819
2844
  const key = await crypto.subtle.importKey(
1820
2845
  "raw",
1821
- sharedSecretBuffer,
2846
+ secretKeyBuffer,
1822
2847
  { name: "AES-GCM" },
1823
2848
  false,
1824
2849
  ["encrypt"]
1825
2850
  );
1826
2851
  const iv = crypto.getRandomValues(new Uint8Array(12));
2852
+ const messageBytes = new TextEncoder().encode(message);
1827
2853
  const encryptedData = await crypto.subtle.encrypt(
1828
2854
  { name: "AES-GCM", iv },
1829
2855
  key,
1830
2856
  messageBytes
1831
2857
  );
1832
2858
  const encryptedMessage = new Uint8Array(iv.length + encryptedData.byteLength);
1833
- encryptedMessage.set(iv);
2859
+ encryptedMessage.set(iv, 0);
1834
2860
  encryptedMessage.set(new Uint8Array(encryptedData), iv.length);
1835
2861
  return encryptedMessage;
1836
2862
  }
1837
2863
  async decryptMessage(encryptedMessage, secret) {
1838
- const sharedSecret = this.buffer_to_string(secret);
1839
- const sharedSecretBuffer = new Uint8Array(sharedSecret.trim().split(" ").map((x) => parseInt(x, 16)));
2864
+ const secretBytes = await this.toSecretBytes(secret);
2865
+ const secretKeyBuffer = bytesToArrayBuffer(secretBytes);
1840
2866
  const iv = encryptedMessage.slice(0, 12);
1841
2867
  const encryptedData = encryptedMessage.slice(12);
1842
2868
  const key = await crypto.subtle.importKey(
1843
2869
  "raw",
1844
- sharedSecretBuffer,
2870
+ secretKeyBuffer,
1845
2871
  { name: "AES-GCM" },
1846
2872
  false,
1847
2873
  ["decrypt"]
@@ -1857,18 +2883,6 @@ var MlKemWrapper = class {
1857
2883
  this.instance.delete();
1858
2884
  }
1859
2885
  };
1860
- async function loadMlKem1024() {
1861
- const wasm = await kyber_crystals_wasm_engine_default();
1862
- return new MlKemWrapper(new wasm.MlKem1024());
1863
- }
1864
- async function loadMlKem768() {
1865
- const wasm = await kyber_crystals_wasm_engine_default();
1866
- return new MlKemWrapper(new wasm.MlKem768());
1867
- }
1868
- async function loadMlKem512() {
1869
- const wasm = await kyber_crystals_wasm_engine_default();
1870
- return new MlKemWrapper(new wasm.MlKem512());
1871
- }
1872
2886
  export {
1873
2887
  loadMlKem1024,
1874
2888
  loadMlKem512,