@protontech/openpgp 5.5.0 → 5.7.0

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.
Files changed (35) hide show
  1. package/README.md +10 -0
  2. package/dist/lightweight/bn.interface.min.mjs +1 -1
  3. package/dist/lightweight/bn.interface.mjs +1 -1
  4. package/dist/lightweight/bn.min.mjs +2 -2
  5. package/dist/lightweight/bn.min.mjs.map +1 -1
  6. package/dist/lightweight/bn.mjs +1 -1
  7. package/dist/lightweight/elliptic.min.mjs +2 -2
  8. package/dist/lightweight/elliptic.min.mjs.map +1 -1
  9. package/dist/lightweight/elliptic.mjs +1 -1
  10. package/dist/lightweight/index.min.mjs +3 -0
  11. package/dist/lightweight/index.min.mjs.map +1 -0
  12. package/dist/lightweight/index.mjs +706 -0
  13. package/dist/lightweight/openpgp.min.mjs +2 -2
  14. package/dist/lightweight/openpgp.min.mjs.map +1 -1
  15. package/dist/lightweight/openpgp.mjs +5630 -5684
  16. package/dist/lightweight/ponyfill.es6.min.mjs +2 -2
  17. package/dist/lightweight/ponyfill.es6.min.mjs.map +1 -1
  18. package/dist/lightweight/ponyfill.es6.mjs +1 -1
  19. package/dist/lightweight/web-streams-adapter.min.mjs +2 -2
  20. package/dist/lightweight/web-streams-adapter.min.mjs.map +1 -1
  21. package/dist/lightweight/web-streams-adapter.mjs +1 -1
  22. package/dist/node/openpgp.js +5643 -5691
  23. package/dist/node/openpgp.min.js +3 -3
  24. package/dist/node/openpgp.min.js.map +1 -1
  25. package/dist/node/openpgp.min.mjs +3 -3
  26. package/dist/node/openpgp.min.mjs.map +1 -1
  27. package/dist/node/openpgp.mjs +5643 -5691
  28. package/dist/openpgp.js +5642 -5690
  29. package/dist/openpgp.min.js +3 -3
  30. package/dist/openpgp.min.js.map +1 -1
  31. package/dist/openpgp.min.mjs +3 -3
  32. package/dist/openpgp.min.mjs.map +1 -1
  33. package/dist/openpgp.mjs +5642 -5690
  34. package/openpgp.d.ts +20 -5
  35. package/package.json +14 -10
@@ -0,0 +1,706 @@
1
+ /*! OpenPGP.js v5.5.0 - 2023-02-16 - this is LGPL licensed code, see LICENSE/our website https://openpgpjs.org/ for more information. */
2
+ const globalThis = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
3
+
4
+ // Adapted from the reference implementation in RFC7693
5
+ // Initial port to Javascript by https://github.com/dcposch and https://github.com/emilbayes
6
+
7
+ // Uint64 values are represented using two Uint32s, stored as little endian
8
+ // NB: Uint32Arrays endianness depends on the underlying system, so for interoperability, conversions between Uint8Array and Uint32Arrays
9
+ // need to be manually handled
10
+
11
+ // 64-bit unsigned addition (little endian, in place)
12
+ // Sets a[i,i+1] += b[j,j+1]
13
+ // `a` and `b` must be Uint32Array(2)
14
+ function ADD64 (a, i, b, j) {
15
+ a[i] += b[j];
16
+ a[i+1] += b[j+1] + (a[i] < b[j]); // add carry
17
+ }
18
+
19
+ // Increment 64-bit little-endian unsigned value by `c` (in place)
20
+ // `a` must be Uint32Array(2)
21
+ function INC64 (a, c) {
22
+ a[0] += c;
23
+ a[1] += (a[0] < c);
24
+ }
25
+
26
+ // G Mixing function
27
+ // The ROTRs are inlined for speed
28
+ function G (v, m, a, b, c, d, ix, iy) {
29
+ ADD64(v, a, v, b); // v[a,a+1] += v[b,b+1]
30
+ ADD64(v, a, m, ix); // v[a, a+1] += x ... x0
31
+
32
+ // v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated to the right by 32 bits
33
+ let xor0 = v[d] ^ v[a];
34
+ let xor1 = v[d + 1] ^ v[a + 1];
35
+ v[d] = xor1;
36
+ v[d + 1] = xor0;
37
+
38
+ ADD64(v, c, v, d);
39
+
40
+ // v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 24 bits
41
+ xor0 = v[b] ^ v[c];
42
+ xor1 = v[b + 1] ^ v[c + 1];
43
+ v[b] = (xor0 >>> 24) ^ (xor1 << 8);
44
+ v[b + 1] = (xor1 >>> 24) ^ (xor0 << 8);
45
+
46
+ ADD64(v, a, v, b);
47
+ ADD64(v, a, m, iy);
48
+
49
+ // v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated right by 16 bits
50
+ xor0 = v[d] ^ v[a];
51
+ xor1 = v[d + 1] ^ v[a + 1];
52
+ v[d] = (xor0 >>> 16) ^ (xor1 << 16);
53
+ v[d + 1] = (xor1 >>> 16) ^ (xor0 << 16);
54
+
55
+ ADD64(v, c, v, d);
56
+
57
+ // v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 63 bits
58
+ xor0 = v[b] ^ v[c];
59
+ xor1 = v[b + 1] ^ v[c + 1];
60
+ v[b] = (xor1 >>> 31) ^ (xor0 << 1);
61
+ v[b + 1] = (xor0 >>> 31) ^ (xor1 << 1);
62
+ }
63
+
64
+ // Initialization Vector
65
+ const BLAKE2B_IV32 = new Uint32Array([
66
+ 0xF3BCC908, 0x6A09E667, 0x84CAA73B, 0xBB67AE85,
67
+ 0xFE94F82B, 0x3C6EF372, 0x5F1D36F1, 0xA54FF53A,
68
+ 0xADE682D1, 0x510E527F, 0x2B3E6C1F, 0x9B05688C,
69
+ 0xFB41BD6B, 0x1F83D9AB, 0x137E2179, 0x5BE0CD19
70
+ ]);
71
+
72
+ // These are offsets into a Uint64 buffer.
73
+ // Multiply them all by 2 to make them offsets into a Uint32 buffer
74
+ const SIGMA = new Uint8Array([
75
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
76
+ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
77
+ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
78
+ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
79
+ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
80
+ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
81
+ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11,
82
+ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10,
83
+ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5,
84
+ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0,
85
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
86
+ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3
87
+ ].map(x => x * 2));
88
+
89
+ // Compression function. 'last' flag indicates last block.
90
+ // Note: we're representing 16 uint64s as 32 uint32s
91
+ function compress(S, last) {
92
+ const v = new Uint32Array(32);
93
+ const m = new Uint32Array(S.b.buffer, S.b.byteOffset, 32);
94
+
95
+ // init work variables
96
+ for (let i = 0; i < 16; i++) {
97
+ v[i] = S.h[i];
98
+ v[i + 16] = BLAKE2B_IV32[i];
99
+ }
100
+
101
+ // low 64 bits of offset
102
+ v[24] ^= S.t0[0];
103
+ v[25] ^= S.t0[1];
104
+ // high 64 bits not supported (`t1`), offset may not be higher than 2**53-1
105
+
106
+ // if last block
107
+ const f0 = last ? 0xFFFFFFFF : 0;
108
+ v[28] ^= f0;
109
+ v[29] ^= f0;
110
+
111
+ // twelve rounds of mixing
112
+ for (let i = 0; i < 12; i++) {
113
+ // ROUND(r)
114
+ const i16 = i << 4;
115
+ G(v, m, 0, 8, 16, 24, SIGMA[i16 + 0], SIGMA[i16 + 1]);
116
+ G(v, m, 2, 10, 18, 26, SIGMA[i16 + 2], SIGMA[i16 + 3]);
117
+ G(v, m, 4, 12, 20, 28, SIGMA[i16 + 4], SIGMA[i16 + 5]);
118
+ G(v, m, 6, 14, 22, 30, SIGMA[i16 + 6], SIGMA[i16 + 7]);
119
+ G(v, m, 0, 10, 20, 30, SIGMA[i16 + 8], SIGMA[i16 + 9]);
120
+ G(v, m, 2, 12, 22, 24, SIGMA[i16 + 10], SIGMA[i16 + 11]);
121
+ G(v, m, 4, 14, 16, 26, SIGMA[i16 + 12], SIGMA[i16 + 13]);
122
+ G(v, m, 6, 8, 18, 28, SIGMA[i16 + 14], SIGMA[i16 + 15]);
123
+ }
124
+
125
+ for (let i = 0; i < 16; i++) {
126
+ S.h[i] ^= v[i] ^ v[i + 16];
127
+ }
128
+ }
129
+
130
+ // Creates a BLAKE2b hashing context
131
+ // Requires an output length between 1 and 64 bytes
132
+ // Takes an optional Uint8Array key
133
+ class Blake2b {
134
+ constructor(outlen, key, salt, personal) {
135
+ const params = new Uint8Array(64);
136
+ // 0: outlen, keylen, fanout, depth
137
+ // 4: leaf length, sequential mode
138
+ // 8: node offset
139
+ // 12: node offset
140
+ // 16: node depth, inner length, rfu
141
+ // 20: rfu
142
+ // 24: rfu
143
+ // 28: rfu
144
+ // 32: salt
145
+ // 36: salt
146
+ // 40: salt
147
+ // 44: salt
148
+ // 48: personal
149
+ // 52: personal
150
+ // 56: personal
151
+ // 60: personal
152
+
153
+ // init internal state
154
+ this.S = {
155
+ b: new Uint8Array(BLOCKBYTES),
156
+ h: new Uint32Array(OUTBYTES_MAX / 4),
157
+ t0: new Uint32Array(2), // input counter `t`, lower 64-bits only
158
+ c: 0, // `fill`, pointer within buffer, up to `BLOCKBYTES`
159
+ outlen // output length in bytes
160
+ };
161
+
162
+ // init parameter block
163
+ params[0] = outlen;
164
+ if (key) params[1] = key.length;
165
+ params[2] = 1; // fanout
166
+ params[3] = 1; // depth
167
+ if (salt) params.set(salt, 32);
168
+ if (personal) params.set(personal, 48);
169
+ const params32 = new Uint32Array(params.buffer, params.byteOffset, params.length / Uint32Array.BYTES_PER_ELEMENT);
170
+
171
+ // initialize hash state
172
+ for (let i = 0; i < 16; i++) {
173
+ this.S.h[i] = BLAKE2B_IV32[i] ^ params32[i];
174
+ }
175
+
176
+ // key the hash, if applicable
177
+ if (key) {
178
+ const block = new Uint8Array(BLOCKBYTES);
179
+ block.set(key);
180
+ this.update(block);
181
+ }
182
+ }
183
+
184
+ // Updates a BLAKE2b streaming hash
185
+ // Requires Uint8Array (byte array)
186
+ update(input) {
187
+ if (!(input instanceof Uint8Array)) throw new Error('Input must be Uint8Array or Buffer')
188
+ // for (let i = 0; i < input.length; i++) {
189
+ // if (this.S.c === BLOCKBYTES) { // buffer full
190
+ // INC64(this.S.t0, this.S.c) // add counters
191
+ // compress(this.S, false)
192
+ // this.S.c = 0 // empty buffer
193
+ // }
194
+ // this.S.b[this.S.c++] = input[i]
195
+ // }
196
+ let i = 0;
197
+ while(i < input.length) {
198
+ if (this.S.c === BLOCKBYTES) { // buffer full
199
+ INC64(this.S.t0, this.S.c); // add counters
200
+ compress(this.S, false);
201
+ this.S.c = 0; // empty buffer
202
+ }
203
+ let left = BLOCKBYTES - this.S.c;
204
+ this.S.b.set(input.subarray(i, i + left), this.S.c); // end index can be out of bounds
205
+ const fill = Math.min(left, input.length - i);
206
+ this.S.c += fill;
207
+ i += fill;
208
+ }
209
+ return this
210
+ }
211
+
212
+ /**
213
+ * Return a BLAKE2b hash, either filling the given Uint8Array or allocating a new one
214
+ * @param {Uint8Array} [prealloc] - optional preallocated buffer
215
+ * @returns {ArrayBuffer} message digest
216
+ */
217
+ digest(prealloc) {
218
+ INC64(this.S.t0, this.S.c); // mark last block offset
219
+
220
+ // final block, padded
221
+ this.S.b.fill(0, this.S.c);
222
+ this.S.c = BLOCKBYTES;
223
+ compress(this.S, true);
224
+
225
+ const out = prealloc || new Uint8Array(this.S.outlen);
226
+ for (let i = 0; i < this.S.outlen; i++) {
227
+ // must be loaded individually since default Uint32 endianness is platform dependant
228
+ out[i] = this.S.h[i >> 2] >> (8 * (i & 3));
229
+ }
230
+ this.S.h = null; // prevent calling `update` after `digest`
231
+ return out.buffer;
232
+ }
233
+ }
234
+
235
+
236
+ function createHash(outlen, key, salt, personal) {
237
+ if (outlen > OUTBYTES_MAX) throw new Error(`outlen must be at most ${OUTBYTES_MAX} (given: ${outlen})`)
238
+ if (key) {
239
+ if (!(key instanceof Uint8Array)) throw new Error('key must be Uint8Array or Buffer')
240
+ if (key.length > KEYBYTES_MAX) throw new Error(`key size must be at most ${KEYBYTES_MAX} (given: ${key.length})`)
241
+ }
242
+ if (salt) {
243
+ if (!(salt instanceof Uint8Array)) throw new Error('salt must be Uint8Array or Buffer')
244
+ if (salt.length !== SALTBYTES) throw new Error(`salt must be exactly ${SALTBYTES} (given: ${salt.length}`)
245
+ }
246
+ if (personal) {
247
+ if (!(personal instanceof Uint8Array)) throw new Error('personal must be Uint8Array or Buffer')
248
+ if (personal.length !== PERSONALBYTES) throw new Error(`salt must be exactly ${PERSONALBYTES} (given: ${personal.length}`)
249
+ }
250
+
251
+ return new Blake2b(outlen, key, salt, personal)
252
+ }
253
+
254
+ const OUTBYTES_MAX = 64;
255
+ const KEYBYTES_MAX = 64;
256
+ const SALTBYTES = 16;
257
+ const PERSONALBYTES = 16;
258
+ const BLOCKBYTES = 128;
259
+
260
+ const TYPE = 2; // Argon2id
261
+ const VERSION = 0x13;
262
+ const TAGBYTES_MAX = 0xFFFFFFFF; // Math.pow(2, 32) - 1;
263
+ const TAGBYTES_MIN = 4; // Math.pow(2, 32) - 1;
264
+ const SALTBYTES_MAX = 0xFFFFFFFF; // Math.pow(2, 32) - 1;
265
+ const SALTBYTES_MIN = 8;
266
+ const passwordBYTES_MAX = 0xFFFFFFFF;// Math.pow(2, 32) - 1;
267
+ const passwordBYTES_MIN = 8;
268
+ const MEMBYTES_MAX = 0xFFFFFFFF;// Math.pow(2, 32) - 1;
269
+ const ADBYTES_MAX = 0xFFFFFFFF; // Math.pow(2, 32) - 1; // associated data (optional)
270
+ const SECRETBYTES_MAX = 32; // key (optional)
271
+
272
+ const ARGON2_BLOCK_SIZE = 1024;
273
+ const ARGON2_PREHASH_DIGEST_LENGTH = 64;
274
+
275
+ const isLittleEndian = new Uint8Array(new Uint16Array([0xabcd]).buffer)[0] === 0xcd;
276
+
277
+ // store n as a little-endian 32-bit Uint8Array inside buf (at buf[i:i+3])
278
+ function LE32(buf, n, i) {
279
+ buf[i+0] = n;
280
+ buf[i+1] = n >> 8;
281
+ buf[i+2] = n >> 16;
282
+ buf[i+3] = n >> 24;
283
+ return buf;
284
+ }
285
+
286
+ /**
287
+ * Store n as a 64-bit LE number in the given buffer (from buf[i] to buf[i+7])
288
+ * @param {Uint8Array} buf
289
+ * @param {Number} n
290
+ * @param {Number} i
291
+ */
292
+ function LE64(buf, n, i) {
293
+ if (n > Number.MAX_SAFE_INTEGER) throw new Error("LE64: large numbers unsupported");
294
+ // ECMAScript standard has engines convert numbers to 32-bit integers for bitwise operations
295
+ // shifting by 32 or more bits is not supported (https://stackoverflow.com/questions/6729122/javascript-bit-shift-number-wraps)
296
+ // so we manually extract each byte
297
+ let remainder = n;
298
+ for (let offset = i; offset < i+7; offset++) { // last byte can be ignored as it would overflow MAX_SAFE_INTEGER
299
+ buf[offset] = remainder; // implicit & 0xff
300
+ remainder = (remainder - buf[offset]) / 256;
301
+ }
302
+ return buf;
303
+ }
304
+
305
+ /**
306
+ * Variable-Length Hash Function H'
307
+ * @param {Number} outlen - T
308
+ * @param {Uint8Array} X - value to hash
309
+ * @param {Uint8Array} res - output buffer, of length `outlength` or larger
310
+ */
311
+ function H_(outlen, X, res) {
312
+ const V = new Uint8Array(64); // no need to keep around all V_i
313
+
314
+ const V1_in = new Uint8Array(4 + X.length);
315
+ LE32(V1_in, outlen, 0);
316
+ V1_in.set(X, 4);
317
+ if (outlen <= 64) {
318
+ // H'^T(A) = H^T(LE32(T)||A)
319
+ createHash(outlen).update(V1_in).digest(res);
320
+ return res
321
+ }
322
+
323
+ const r = Math.ceil(outlen / 32) - 2;
324
+
325
+ // Let V_i be a 64-byte block and W_i be its first 32 bytes.
326
+ // V_1 = H^(64)(LE32(T)||A)
327
+ // V_2 = H^(64)(V_1)
328
+ // ...
329
+ // V_r = H^(64)(V_{r-1})
330
+ // V_{r+1} = H^(T-32*r)(V_{r})
331
+ // H'^T(X) = W_1 || W_2 || ... || W_r || V_{r+1}
332
+ for (let i = 0; i < r; i++) {
333
+ createHash(64).update(i === 0 ? V1_in : V).digest(V);
334
+ // store W_i in result buffer already
335
+ res.set(V.subarray(0, 32), i*32);
336
+ }
337
+ // V_{r+1}
338
+ const V_r1 = new Uint8Array(createHash(outlen - 32*r).update(V).digest());
339
+ res.set(V_r1, r*32);
340
+
341
+ return res;
342
+ }
343
+
344
+ // compute buf = xs ^ ys
345
+ function XOR(wasmContext, buf, xs, ys) {
346
+ wasmContext.fn.XOR(
347
+ buf.byteOffset,
348
+ xs.byteOffset,
349
+ ys.byteOffset,
350
+ );
351
+ return buf
352
+ }
353
+
354
+ /**
355
+ * @param {Uint8Array} X (read-only)
356
+ * @param {Uint8Array} Y (read-only)
357
+ * @param {Uint8Array} R - output buffer
358
+ * @returns
359
+ */
360
+ function G$1(wasmContext, X, Y, R) {
361
+ wasmContext.fn.G(
362
+ X.byteOffset,
363
+ Y.byteOffset,
364
+ R.byteOffset,
365
+ wasmContext.refs.gZ.byteOffset
366
+ );
367
+ return R;
368
+ }
369
+
370
+ function G2(wasmContext, X, Y, R) {
371
+ wasmContext.fn.G2(
372
+ X.byteOffset,
373
+ Y.byteOffset,
374
+ R.byteOffset,
375
+ wasmContext.refs.gZ.byteOffset
376
+ );
377
+ return R;
378
+ }
379
+
380
+ // Generator for data-independent J1, J2. Each `next()` invocation returns a new pair of values.
381
+ function* makePRNG(wasmContext, pass, lane, slice, m_, totalPasses, segmentLength, segmentOffset) {
382
+ // For each segment, we do the following. First, we compute the value Z as:
383
+ // Z= ( LE64(r) || LE64(l) || LE64(sl) || LE64(m') || LE64(t) || LE64(y) )
384
+ wasmContext.refs.prngTmp.fill(0);
385
+ const Z = wasmContext.refs.prngTmp.subarray(0, 6 * 8);
386
+ LE64(Z, pass, 0);
387
+ LE64(Z, lane, 8);
388
+ LE64(Z, slice, 16);
389
+ LE64(Z, m_, 24);
390
+ LE64(Z, totalPasses, 32);
391
+ LE64(Z, TYPE, 40);
392
+
393
+ // Then we compute q/(128*SL) 1024-byte values
394
+ // G( ZERO(1024),
395
+ // G( ZERO(1024), Z || LE64(1) || ZERO(968) ) ),
396
+ // ...,
397
+ // G( ZERO(1024),
398
+ // G( ZERO(1024), Z || LE64(q/(128*SL)) || ZERO(968) )),
399
+ for(let i = 1; i <= segmentLength; i++) {
400
+ // tmp.set(Z); // no need to re-copy
401
+ LE64(wasmContext.refs.prngTmp, i, Z.length); // tmp.set(ZER0968) not necessary, memory already zeroed
402
+ const g2 = G2(wasmContext, wasmContext.refs.ZERO1024, wasmContext.refs.prngTmp, wasmContext.refs.prngR );
403
+
404
+ // each invocation of G^2 outputs 1024 bytes that are to be partitioned into 8-bytes values, take as X1 || X2
405
+ // NB: the first generated pair must be used for the first block of the segment, and so on.
406
+ // Hence, if some blocks are skipped (e.g. during the first pass), the corresponding J1J2 are discarded based on the given segmentOffset.
407
+ for(let k = i === 1 ? segmentOffset*8 : 0; k < g2.length; k += 8) {
408
+ yield g2.subarray(k, k+8);
409
+ }
410
+ }
411
+ return [];
412
+ }
413
+
414
+ function validateParams({ type, version, tagLength, password, salt, ad, secret, parallelism, memorySize, passes }) {
415
+ const assertLength = (name, value, min, max) => {
416
+ if (value < min || value > max) { throw new Error(`${name} size should be between ${min} and ${max} bytes`); }
417
+ };
418
+
419
+ if (type !== TYPE || version !== VERSION) throw new Error('Unsupported type or version');
420
+ assertLength('password', password, passwordBYTES_MIN, passwordBYTES_MAX);
421
+ assertLength('salt', salt, SALTBYTES_MIN, SALTBYTES_MAX);
422
+ assertLength('tag', tagLength, TAGBYTES_MIN, TAGBYTES_MAX);
423
+ assertLength('memory', memorySize, 8*parallelism, MEMBYTES_MAX);
424
+ // optional fields
425
+ ad && assertLength('associated data', ad, 0, ADBYTES_MAX);
426
+ secret && assertLength('secret', secret, 0, SECRETBYTES_MAX);
427
+
428
+ return { type, version, tagLength, password, salt, ad, secret, lanes: parallelism, memorySize, passes };
429
+ }
430
+
431
+ const KB = 1024;
432
+ const WASM_PAGE_SIZE = 64 * KB;
433
+
434
+ function argon2id(params, { memory, instance: wasmInstance }) {
435
+ if (!isLittleEndian) throw new Error('BigEndian system not supported'); // optmisations assume LE system
436
+
437
+ const ctx = validateParams({ type: TYPE, version: VERSION, ...params });
438
+
439
+ const { G:wasmG, G2:wasmG2, xor:wasmXOR, getLZ:wasmLZ } = wasmInstance.exports;
440
+ const wasmRefs = {};
441
+ const wasmFn = {};
442
+ wasmFn.G = wasmG;
443
+ wasmFn.G2 = wasmG2;
444
+ wasmFn.XOR = wasmXOR;
445
+
446
+ // The actual number of blocks is m', which is m rounded down to the nearest multiple of 4*p.
447
+ const m_ = 4 * ctx.lanes * Math.floor(ctx.memorySize / (4 * ctx.lanes));
448
+ const requiredMemory = m_ * ARGON2_BLOCK_SIZE + 10 * KB; // Additional KBs for utility references
449
+ if (memory.buffer.byteLength < requiredMemory) {
450
+ const missing = Math.ceil((requiredMemory - memory.buffer.byteLength) / WASM_PAGE_SIZE);
451
+ // If enough memory is available, the `memory.buffer` is internally detached and the reference updated.
452
+ // Otherwise, the operation fails, and the original memory can still be used.
453
+ memory.grow(missing);
454
+ }
455
+
456
+ let offset = 0;
457
+ // Init wasm memory needed in other functions
458
+ wasmRefs.gZ = new Uint8Array(memory.buffer, offset, ARGON2_BLOCK_SIZE); offset+= wasmRefs.gZ.length;
459
+ wasmRefs.prngR = new Uint8Array(memory.buffer, offset, ARGON2_BLOCK_SIZE); offset+=wasmRefs.prngR.length;
460
+ wasmRefs.prngTmp = new Uint8Array(memory.buffer, offset, ARGON2_BLOCK_SIZE); offset+=wasmRefs.prngTmp.length;
461
+ wasmRefs.ZERO1024 = new Uint8Array(memory.buffer, offset, 1024); offset+=wasmRefs.ZERO1024.length;
462
+ // Init wasm memory needed locally
463
+ const lz = new Uint32Array(memory.buffer, offset, 2); offset+=lz.length * Uint32Array.BYTES_PER_ELEMENT;
464
+ const wasmContext = { fn: wasmFn, refs: wasmRefs };
465
+ const newBlock = new Uint8Array(memory.buffer, offset, ARGON2_BLOCK_SIZE); offset+=newBlock.length;
466
+ const blockMemory = new Uint8Array(memory.buffer, offset, ctx.memorySize * ARGON2_BLOCK_SIZE);
467
+ const allocatedMemory = new Uint8Array(memory.buffer, 0, offset);
468
+
469
+ // 1. Establish H_0
470
+ const H0 = getH0(ctx);
471
+
472
+ // 2. Allocate the memory as m' 1024-byte blocks
473
+ // For p lanes, the memory is organized in a matrix B[i][j] of blocks with p rows (lanes) and q = m' / p columns.
474
+ const q = m_ / ctx.lanes;
475
+ const B = new Array(ctx.lanes).fill(null).map(() => new Array(q));
476
+ const initBlock = (i, j) => {
477
+ B[i][j] = blockMemory.subarray(i*q*1024 + j*1024, (i*q*1024 + j*1024) + ARGON2_BLOCK_SIZE);
478
+ return B[i][j];
479
+ };
480
+
481
+ for (let i = 0; i < ctx.lanes; i++) {
482
+ // const LEi = LE0; // since p = 1 for us
483
+ const tmp = new Uint8Array(H0.length + 8);
484
+ // 3. Compute B[i][0] for all i ranging from (and including) 0 to (not including) p
485
+ // B[i][0] = H'^(1024)(H_0 || LE32(0) || LE32(i))
486
+ tmp.set(H0); LE32(tmp, 0, H0.length); LE32(tmp, i, H0.length + 4);
487
+ H_(ARGON2_BLOCK_SIZE, tmp, initBlock(i, 0));
488
+ // 4. Compute B[i][1] for all i ranging from (and including) 0 to (not including) p
489
+ // B[i][1] = H'^(1024)(H_0 || LE32(1) || LE32(i))
490
+ LE32(tmp, 1, H0.length);
491
+ H_(ARGON2_BLOCK_SIZE, tmp, initBlock(i, 1));
492
+ }
493
+
494
+ // 5. Compute B[i][j] for all i ranging from (and including) 0 to (not including) p and for all j ranging from (and including) 2
495
+ // to (not including) q. The computation MUST proceed slicewise (Section 3.4) : first, blocks from slice 0 are computed for all lanes
496
+ // (in an arbitrary order of lanes), then blocks from slice 1 are computed, etc.
497
+ const SL = 4; // vertical slices
498
+ const segmentLength = q / SL;
499
+ for (let pass = 0; pass < ctx.passes; pass++) {
500
+ // The intersection of a slice and a lane is called a segment, which has a length of q/SL. Segments of the same slice can be computed in parallel
501
+ for (let sl = 0; sl < SL; sl++) {
502
+ const isDataIndependent = pass === 0 && sl <= 1;
503
+ for (let i = 0; i < ctx.lanes; i++) { // lane
504
+ // On the first slice of the first pass, blocks 0 and 1 are already filled
505
+ let segmentOffset = sl === 0 && pass === 0 ? 2 : 0;
506
+ // no need to generate all J1J2s, use iterator/generator that creates the value on the fly (to save memory)
507
+ const PRNG = isDataIndependent ? makePRNG(wasmContext, pass, i, sl, m_, ctx.passes, segmentLength, segmentOffset) : null;
508
+ for (segmentOffset; segmentOffset < segmentLength; segmentOffset++) {
509
+ const j = sl * segmentLength + segmentOffset;
510
+ const prevBlock = j > 0 ? B[i][j-1] : B[i][q-1]; // B[i][(j-1) mod q]
511
+
512
+ // we can assume the PRNG is never done
513
+ const J1J2 = isDataIndependent ? PRNG.next().value : prevBlock; // .subarray(0, 8) not required since we only pass the byteOffset to wasm
514
+ // The block indices l and z are determined for each i, j differently for Argon2d, Argon2i, and Argon2id.
515
+ wasmLZ(lz.byteOffset, J1J2.byteOffset, i, ctx.lanes, pass, sl, segmentOffset, SL, segmentLength);
516
+ const l = lz[0]; const z = lz[1];
517
+ // for (let i = 0; i < p; i++ )
518
+ // B[i][j] = G(B[i][j-1], B[l][z])
519
+ // The block indices l and z are determined for each i, j differently for Argon2d, Argon2i, and Argon2id.
520
+ if (pass === 0) initBlock(i, j);
521
+ G$1(wasmContext, prevBlock, B[l][z], pass > 0 ? newBlock : B[i][j]);
522
+
523
+ // 6. If the number of passes t is larger than 1, we repeat step 5. However, blocks are computed differently as the old value is XORed with the new one
524
+ if (pass > 0) XOR(wasmContext, B[i][j], newBlock, B[i][j]);
525
+ }
526
+ }
527
+ }
528
+ }
529
+
530
+ // 7. After t steps have been iterated, the final block C is computed as the XOR of the last column:
531
+ // C = B[0][q-1] XOR B[1][q-1] XOR ... XOR B[p-1][q-1]
532
+ const C = B[0][q-1];
533
+ for(let i = 1; i < ctx.lanes; i++) {
534
+ XOR(wasmContext, C, C, B[i][q-1]);
535
+ }
536
+
537
+ const tag = H_(ctx.tagLength, C, new Uint8Array(ctx.tagLength));
538
+ // clear memory since the module might be cached
539
+ allocatedMemory.fill(0); // clear sensitive contents
540
+ memory.grow(0); // allow deallocation
541
+ // 8. The output tag is computed as H'^T(C).
542
+ return tag;
543
+
544
+ }
545
+
546
+ function getH0(ctx) {
547
+ const H = createHash(ARGON2_PREHASH_DIGEST_LENGTH);
548
+ const ZERO32 = new Uint8Array(4);
549
+ const params = new Uint8Array(24);
550
+ LE32(params, ctx.lanes, 0);
551
+ LE32(params, ctx.tagLength, 4);
552
+ LE32(params, ctx.memorySize, 8);
553
+ LE32(params, ctx.passes, 12);
554
+ LE32(params, ctx.version, 16);
555
+ LE32(params, ctx.type, 20);
556
+
557
+ const toHash = [params];
558
+ if (ctx.password) {
559
+ toHash.push(LE32(new Uint8Array(4), ctx.password.length, 0));
560
+ toHash.push(ctx.password);
561
+ } else {
562
+ toHash.push(ZERO32); // context.password.length
563
+ }
564
+
565
+ if (ctx.salt) {
566
+ toHash.push(LE32(new Uint8Array(4), ctx.salt.length, 0));
567
+ toHash.push(ctx.salt);
568
+ } else {
569
+ toHash.push(ZERO32); // context.salt.length
570
+ }
571
+
572
+ if (ctx.secret) {
573
+ toHash.push(LE32(new Uint8Array(4), ctx.secret.length, 0));
574
+ toHash.push(ctx.secret);
575
+ // todo clear secret?
576
+ } else {
577
+ toHash.push(ZERO32); // context.secret.length
578
+ }
579
+
580
+ if (ctx.ad) {
581
+ toHash.push(LE32(new Uint8Array(4), ctx.ad.length, 0));
582
+ toHash.push(ctx.ad);
583
+ } else {
584
+ toHash.push(ZERO32); // context.ad.length
585
+ }
586
+ H.update(concatArrays(toHash));
587
+
588
+ const outputBuffer = H.digest();
589
+ return new Uint8Array(outputBuffer);
590
+ }
591
+
592
+ function concatArrays(arrays) {
593
+ if (arrays.length === 1) return arrays[0];
594
+
595
+ let totalLength = 0;
596
+ for (let i = 0; i < arrays.length; i++) {
597
+ if (!(arrays[i] instanceof Uint8Array)) {
598
+ throw new Error('concatArrays: Data must be in the form of a Uint8Array');
599
+ }
600
+
601
+ totalLength += arrays[i].length;
602
+ }
603
+
604
+ const result = new Uint8Array(totalLength);
605
+ let pos = 0;
606
+ arrays.forEach((element) => {
607
+ result.set(element, pos);
608
+ pos += element.length;
609
+ });
610
+
611
+ return result;
612
+ }
613
+
614
+ let isSIMDSupported;
615
+ async function wasmLoader(memory, getSIMD, getNonSIMD) {
616
+ const importObject = { env: { memory } };
617
+ if (isSIMDSupported === undefined) {
618
+ try {
619
+ isSIMDSupported = true; // will be overwritten in the catch
620
+ return await getSIMD(importObject);
621
+ } catch(e) {
622
+ isSIMDSupported = false;
623
+ }
624
+ }
625
+
626
+ const loader = isSIMDSupported ? getSIMD : getNonSIMD;
627
+ return loader(importObject);
628
+ }
629
+
630
+ async function setupWasm(getSIMD, getNonSIMD) {
631
+ const memory = new WebAssembly.Memory({
632
+ // in pages of 64KiB each
633
+ // these values need to be compatible with those declared when building in `build-wasm`
634
+ initial: 1040, // 65MB
635
+ maximum: 65536, // 4GB
636
+ });
637
+ const wasmModule = await wasmLoader(memory, getSIMD, getNonSIMD);
638
+
639
+ /**
640
+ * Argon2id hash function
641
+ * @callback computeHash
642
+ * @param {Object} params
643
+ * @param {Uint8Array} params.password - password
644
+ * @param {Uint8Array} params.salt - salt
645
+ * @param {Integer} params.parallelism
646
+ * @param {Integer} params.passes
647
+ * @param {Integer} params.memorySize - in kibibytes
648
+ * @param {Integer} params.tagLength - output tag length
649
+ * @param {Uint8Array} [params.ad] - associated data (optional)
650
+ * @param {Uint8Array} [params.secret] - secret data (optional)
651
+ * @return {Uint8Array} argon2id hash
652
+ */
653
+ const computeHash = (params) => argon2id(params, { instance: wasmModule.instance, memory });
654
+
655
+ return computeHash;
656
+ }
657
+
658
+ function _loadWasmModule (sync, filepath, src, imports) {
659
+ function _instantiateOrCompile(source, imports, stream) {
660
+ var instantiateFunc = stream ? WebAssembly.instantiateStreaming : WebAssembly.instantiate;
661
+ var compileFunc = stream ? WebAssembly.compileStreaming : WebAssembly.compile;
662
+
663
+ if (imports) {
664
+ return instantiateFunc(source, imports)
665
+ } else {
666
+ return compileFunc(source)
667
+ }
668
+ }
669
+
670
+
671
+ var buf = null;
672
+ var isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
673
+ if (isNode) {
674
+
675
+ buf = Buffer.from(src, 'base64');
676
+
677
+ } else {
678
+
679
+ var raw = globalThis.atob(src);
680
+ var rawLength = raw.length;
681
+ buf = new Uint8Array(new ArrayBuffer(rawLength));
682
+ for(var i = 0; i < rawLength; i++) {
683
+ buf[i] = raw.charCodeAt(i);
684
+ }
685
+
686
+ }
687
+
688
+
689
+ if(sync) {
690
+ var mod = new WebAssembly.Module(buf);
691
+ return imports ? new WebAssembly.Instance(mod, imports) : mod
692
+ } else {
693
+ return _instantiateOrCompile(buf, imports, false)
694
+ }
695
+ }
696
+
697
+ function wasmSIMD(imports){return _loadWasmModule(0, null, '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', imports)}
698
+
699
+ function wasmNonSIMD(imports){return _loadWasmModule(0, null, 'AGFzbQEAAAABPwhgBH9/f38AYAABf2AAAGADf39/AGARf39/f39/f39/f39/f39/f38AYAl/f39/f39/f38Bf2ABfwBgAX8BfwITAQNlbnYGbWVtb3J5AgGQCICABAMLCgIDBAAABQEGBwEEBQFwAQICBgkBfwFBkIjAAgsHfQoDeG9yAAEBRwADAkcyAAQFZ2V0TFoABRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALX2luaXRpYWxpemUAABBfX2Vycm5vX2xvY2F0aW9uAAkJc3RhY2tTYXZlAAYMc3RhY2tSZXN0b3JlAAcKc3RhY2tBbGxvYwAICQcBAEEBCwEACssaCgMAAQtQAQJ/A0AgACAEQQN0IgNqIAIgA2opAwAgASADaikDAIU3AwAgACADQQhyIgNqIAIgA2opAwAgASADaikDAIU3AwAgBEECaiIEQYABRw0ACwveDwICfgF/IAAgAUEDdGoiEyATKQMAIhEgACAFQQN0aiIBKQMAIhJ8IBFCAYZC/v///x+DIBJC/////w+DfnwiETcDACAAIA1BA3RqIgUgESAFKQMAhUIgiSIRNwMAIAAgCUEDdGoiCSARIAkpAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAEgESABKQMAhUIoiSIRNwMAIBMgESATKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACAFIBEgBSkDAIVCMIkiETcDACAJIBEgCSkDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgASARIAEpAwCFQgGJNwMAIAAgAkEDdGoiDSANKQMAIhEgACAGQQN0aiICKQMAIhJ8IBFCAYZC/v///x+DIBJC/////w+DfnwiETcDACAAIA5BA3RqIgYgESAGKQMAhUIgiSIRNwMAIAAgCkEDdGoiCiARIAopAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAIgESACKQMAhUIoiSIRNwMAIA0gESANKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACAGIBEgBikDAIVCMIkiETcDACAKIBEgCikDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgAiARIAIpAwCFQgGJNwMAIAAgA0EDdGoiDiAOKQMAIhEgACAHQQN0aiIDKQMAIhJ8IBFCAYZC/v///x+DIBJC/////w+DfnwiETcDACAAIA9BA3RqIgcgESAHKQMAhUIgiSIRNwMAIAAgC0EDdGoiCyARIAspAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAMgESADKQMAhUIoiSIRNwMAIA4gESAOKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACAHIBEgBykDAIVCMIkiETcDACALIBEgCykDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgAyARIAMpAwCFQgGJNwMAIAAgBEEDdGoiDyAPKQMAIhEgACAIQQN0aiIEKQMAIhJ8IBFCAYZC/v///x+DIBJC/////w+DfnwiETcDACAAIBBBA3RqIgggESAIKQMAhUIgiSIRNwMAIAAgDEEDdGoiACARIAApAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAQgESAEKQMAhUIoiSIRNwMAIA8gESAPKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACAIIBEgCCkDAIVCMIkiETcDACAAIBEgACkDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgBCARIAQpAwCFQgGJNwMAIBMgEykDACIRIAIpAwAiEnwgEUIBhkL+////H4MgEkL/////D4N+fCIRNwMAIAggESAIKQMAhUIgiSIRNwMAIAsgESALKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACACIBEgAikDAIVCKIkiETcDACATIBEgEykDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgCCARIAgpAwCFQjCJIhE3AwAgCyARIAspAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAIgESACKQMAhUIBiTcDACANIA0pAwAiESADKQMAIhJ8IBFCAYZC/v///x+DIBJC/////w+DfnwiETcDACAFIBEgBSkDAIVCIIkiETcDACAAIBEgACkDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgAyARIAMpAwCFQiiJIhE3AwAgDSARIA0pAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAUgESAFKQMAhUIwiSIRNwMAIAAgESAAKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACADIBEgAykDAIVCAYk3AwAgDiAOKQMAIhEgBCkDACISfCARQgGGQv7///8fgyASQv////8Pg358IhE3AwAgBiARIAYpAwCFQiCJIhE3AwAgCSARIAkpAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAQgESAEKQMAhUIoiSIRNwMAIA4gESAOKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACAGIBEgBikDAIVCMIkiETcDACAJIBEgCSkDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgBCARIAQpAwCFQgGJNwMAIA8gDykDACIRIAEpAwAiEnwgEUIBhkL+////H4MgEkL/////D4N+fCIRNwMAIAcgESAHKQMAhUIgiSIRNwMAIAogESAKKQMAIhJ8IBFC/////w+DIBJCAYZC/v///x+DfnwiETcDACABIBEgASkDAIVCKIkiETcDACAPIBEgDykDACISfCARQv////8PgyASQgGGQv7///8fg358IhE3AwAgByARIAcpAwCFQjCJIhE3AwAgCiARIAopAwAiEnwgEUL/////D4MgEkIBhkL+////H4N+fCIRNwMAIAEgESABKQMAhUIBiTcDAAvdCAEPfwNAIAIgBUEDdCIGaiABIAZqKQMAIAAgBmopAwCFNwMAIAIgBkEIciIGaiABIAZqKQMAIAAgBmopAwCFNwMAIAVBAmoiBUGAAUcNAAsDQCADIARBA3QiAGogACACaikDADcDACADIARBAXIiAEEDdCIBaiABIAJqKQMANwMAIAMgBEECciIBQQN0IgVqIAIgBWopAwA3AwAgAyAEQQNyIgVBA3QiBmogAiAGaikDADcDACADIARBBHIiBkEDdCIHaiACIAdqKQMANwMAIAMgBEEFciIHQQN0IghqIAIgCGopAwA3AwAgAyAEQQZyIghBA3QiCWogAiAJaikDADcDACADIARBB3IiCUEDdCIKaiACIApqKQMANwMAIAMgBEEIciIKQQN0IgtqIAIgC2opAwA3AwAgAyAEQQlyIgtBA3QiDGogAiAMaikDADcDACADIARBCnIiDEEDdCINaiACIA1qKQMANwMAIAMgBEELciINQQN0Ig5qIAIgDmopAwA3AwAgAyAEQQxyIg5BA3QiD2ogAiAPaikDADcDACADIARBDXIiD0EDdCIQaiACIBBqKQMANwMAIAMgBEEOciIQQQN0IhFqIAIgEWopAwA3AwAgAyAEQQ9yIhFBA3QiEmogAiASaikDADcDACADIARB//8DcSAAQf//A3EgAUH//wNxIAVB//8DcSAGQf//A3EgB0H//wNxIAhB//8DcSAJQf//A3EgCkH//wNxIAtB//8DcSAMQf//A3EgDUH//wNxIA5B//8DcSAPQf//A3EgEEH//wNxIBFB//8DcRACIARB8ABJIQAgBEEQaiEEIAANAAtBACEBIANBAEEBQRBBEUEgQSFBMEExQcAAQcEAQdAAQdEAQeAAQeEAQfAAQfEAEAIgA0ECQQNBEkETQSJBI0EyQTNBwgBBwwBB0gBB0wBB4gBB4wBB8gBB8wAQAiADQQRBBUEUQRVBJEElQTRBNUHEAEHFAEHUAEHVAEHkAEHlAEH0AEH1ABACIANBBkEHQRZBF0EmQSdBNkE3QcYAQccAQdYAQdcAQeYAQecAQfYAQfcAEAIgA0EIQQlBGEEZQShBKUE4QTlByABByQBB2ABB2QBB6ABB6QBB+ABB+QAQAiADQQpBC0EaQRtBKkErQTpBO0HKAEHLAEHaAEHbAEHqAEHrAEH6AEH7ABACIANBDEENQRxBHUEsQS1BPEE9QcwAQc0AQdwAQd0AQewAQe0AQfwAQf0AEAIgA0EOQQ9BHkEfQS5BL0E+QT9BzgBBzwBB3gBB3wBB7gBB7wBB/gBB/wAQAgNAIAIgAUEDdCIAaiIEIAAgA2opAwAgBCkDAIU3AwAgAiAAQQhyIgRqIgUgAyAEaikDACAFKQMAhTcDACACIABBEHIiBGoiBSADIARqKQMAIAUpAwCFNwMAIAIgAEEYciIAaiIEIAAgA2opAwAgBCkDAIU3AwAgAUEEaiIBQYABRw0ACwsWACAAIAEgAiADEAMgACACIAIgAxADC3sCAX8BfiACIQkgATUCACEKIAQgBXIEQCABKAIEIANwIQkLIAAgCTYCACAAIAdBAWsgBSAEGyAIbCAGQQFrQQBBfyAGGyACIAlGG2oiASAFQQFqIAhsQQAgBBtqIAGtIAogCn5CIIh+QiCIp0F/c2ogByAIbHA2AgQgAAsEACMACwYAIAAkAAsQACMAIABrQXBxIgAkACAACwUAQYAICw==', imports)}
700
+
701
+ const loadWasm = async () => setupWasm(
702
+ (instanceObject) => wasmSIMD(instanceObject),
703
+ (instanceObject) => wasmNonSIMD(instanceObject),
704
+ );
705
+
706
+ export default loadWasm;