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.
- package/README.md +15 -3
- package/{install → dist}/index.js +1037 -23
- package/dist/index.js.map +1 -0
- package/package.json +24 -38
- package/install/index.d.ts +0 -21
- package/install/index.js.map +0 -1
|
@@ -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
|
|
1817
|
-
const
|
|
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
|
-
|
|
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
|
|
1839
|
-
const
|
|
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
|
-
|
|
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,
|