@yielded/crypto 0.0.0-stage → 0.1.0-beta.20

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 (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -2
  3. package/THIRD_PARTY_NOTICES.md +378 -0
  4. package/dist/Aead.d.mts +34 -0
  5. package/dist/Aead.mjs +28 -0
  6. package/dist/Aead.mjs.map +1 -0
  7. package/dist/Errors.d.mts +20 -0
  8. package/dist/Errors.mjs +19 -0
  9. package/dist/Errors.mjs.map +1 -0
  10. package/dist/Hmac.d.mts +39 -0
  11. package/dist/Hmac.mjs +26 -0
  12. package/dist/Hmac.mjs.map +1 -0
  13. package/dist/Kdf.d.mts +54 -0
  14. package/dist/Kdf.mjs +78 -0
  15. package/dist/Kdf.mjs.map +1 -0
  16. package/dist/KdfAdmission.d.mts +24 -0
  17. package/dist/KdfAdmission.mjs +48 -0
  18. package/dist/KdfAdmission.mjs.map +1 -0
  19. package/dist/Portable.d.mts +11 -0
  20. package/dist/Portable.mjs +13 -0
  21. package/dist/Portable.mjs.map +1 -0
  22. package/dist/Signature.d.mts +70 -0
  23. package/dist/Signature.mjs +73 -0
  24. package/dist/Signature.mjs.map +1 -0
  25. package/dist/WebCrypto.d.mts +20 -0
  26. package/dist/WebCrypto.mjs +33 -0
  27. package/dist/WebCrypto.mjs.map +1 -0
  28. package/dist/index.d.mts +7 -0
  29. package/dist/index.mjs +7 -0
  30. package/dist/internal/aead.mjs +81 -0
  31. package/dist/internal/aead.mjs.map +1 -0
  32. package/dist/internal/argon2-core.mjs +293 -0
  33. package/dist/internal/argon2-core.mjs.map +1 -0
  34. package/dist/internal/argon2.mjs +16 -0
  35. package/dist/internal/argon2.mjs.map +1 -0
  36. package/dist/internal/blake2b.mjs +359 -0
  37. package/dist/internal/blake2b.mjs.map +1 -0
  38. package/dist/internal/common.mjs +20 -0
  39. package/dist/internal/common.mjs.map +1 -0
  40. package/dist/internal/hmac.mjs +68 -0
  41. package/dist/internal/hmac.mjs.map +1 -0
  42. package/dist/internal/kdf.mjs +99 -0
  43. package/dist/internal/kdf.mjs.map +1 -0
  44. package/dist/internal/layer.mjs +26 -0
  45. package/dist/internal/layer.mjs.map +1 -0
  46. package/dist/internal/node.d.mts +11 -0
  47. package/dist/internal/node.mjs +34 -0
  48. package/dist/internal/node.mjs.map +1 -0
  49. package/dist/internal/poly1305.mjs +247 -0
  50. package/dist/internal/poly1305.mjs.map +1 -0
  51. package/dist/internal/signature.mjs +140 -0
  52. package/dist/internal/signature.mjs.map +1 -0
  53. package/dist/internal/word64.mjs +25 -0
  54. package/dist/internal/word64.mjs.map +1 -0
  55. package/dist/internal/xchacha-core.mjs +285 -0
  56. package/dist/internal/xchacha-core.mjs.map +1 -0
  57. package/dist/internal/xchacha.mjs +21 -0
  58. package/dist/internal/xchacha.mjs.map +1 -0
  59. package/dist/platform-bun.d.mts +2 -0
  60. package/dist/platform-bun.mjs +2 -0
  61. package/dist/platform-node.d.mts +2 -0
  62. package/dist/platform-node.mjs +2 -0
  63. package/package.json +1 -6
  64. package/src/Aead.ts +39 -0
  65. package/src/Errors.ts +27 -0
  66. package/src/Hmac.ts +41 -0
  67. package/src/Kdf.ts +87 -0
  68. package/src/KdfAdmission.ts +87 -0
  69. package/src/Portable.ts +8 -0
  70. package/src/Signature.ts +87 -0
  71. package/src/WebCrypto.ts +46 -0
  72. package/src/index.ts +6 -0
  73. package/src/internal/aead.ts +119 -0
  74. package/src/internal/argon2-core.ts +470 -0
  75. package/src/internal/argon2.ts +23 -0
  76. package/src/internal/blake2b.ts +230 -0
  77. package/src/internal/common.ts +44 -0
  78. package/src/internal/hmac.ts +111 -0
  79. package/src/internal/kdf.ts +150 -0
  80. package/src/internal/layer.ts +32 -0
  81. package/src/internal/node.ts +46 -0
  82. package/src/internal/poly1305.ts +289 -0
  83. package/src/internal/signature.ts +188 -0
  84. package/src/internal/word64.ts +48 -0
  85. package/src/internal/xchacha-core.ts +397 -0
  86. package/src/internal/xchacha.ts +26 -0
  87. package/src/platform-bun.ts +2 -0
  88. package/src/platform-node.ts +2 -0
@@ -0,0 +1,359 @@
1
+ import { add, add3H, add3L, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL } from "./word64.mjs";
2
+ //#region src/internal/blake2b.ts
3
+ /**
4
+ * Adapted from noble-hashes, Copyright (c) 2022 Paul Miller.
5
+ * MIT; source revision 8060cc83bbab6681d23c9eed071db3f3a6b442da.
6
+ * See ../../THIRD_PARTY_NOTICES.md for source mapping and license.
7
+ */
8
+ const B2B_IV = /* @__PURE__ */ Uint32Array.from([
9
+ 4089235720,
10
+ 1779033703,
11
+ 2227873595,
12
+ 3144134277,
13
+ 4271175723,
14
+ 1013904242,
15
+ 1595750129,
16
+ 2773480762,
17
+ 2917565137,
18
+ 1359893119,
19
+ 725511199,
20
+ 2600822924,
21
+ 4215389547,
22
+ 528734635,
23
+ 327033209,
24
+ 1541459225
25
+ ]);
26
+ const BSIGMA = /* @__PURE__ */ Uint8Array.from([
27
+ 0,
28
+ 1,
29
+ 2,
30
+ 3,
31
+ 4,
32
+ 5,
33
+ 6,
34
+ 7,
35
+ 8,
36
+ 9,
37
+ 10,
38
+ 11,
39
+ 12,
40
+ 13,
41
+ 14,
42
+ 15,
43
+ 14,
44
+ 10,
45
+ 4,
46
+ 8,
47
+ 9,
48
+ 15,
49
+ 13,
50
+ 6,
51
+ 1,
52
+ 12,
53
+ 0,
54
+ 2,
55
+ 11,
56
+ 7,
57
+ 5,
58
+ 3,
59
+ 11,
60
+ 8,
61
+ 12,
62
+ 0,
63
+ 5,
64
+ 2,
65
+ 15,
66
+ 13,
67
+ 10,
68
+ 14,
69
+ 3,
70
+ 6,
71
+ 7,
72
+ 1,
73
+ 9,
74
+ 4,
75
+ 7,
76
+ 9,
77
+ 3,
78
+ 1,
79
+ 13,
80
+ 12,
81
+ 11,
82
+ 14,
83
+ 2,
84
+ 6,
85
+ 5,
86
+ 10,
87
+ 4,
88
+ 0,
89
+ 15,
90
+ 8,
91
+ 9,
92
+ 0,
93
+ 5,
94
+ 7,
95
+ 2,
96
+ 4,
97
+ 10,
98
+ 15,
99
+ 14,
100
+ 1,
101
+ 11,
102
+ 12,
103
+ 6,
104
+ 8,
105
+ 3,
106
+ 13,
107
+ 2,
108
+ 12,
109
+ 6,
110
+ 10,
111
+ 0,
112
+ 11,
113
+ 8,
114
+ 3,
115
+ 4,
116
+ 13,
117
+ 7,
118
+ 5,
119
+ 15,
120
+ 14,
121
+ 1,
122
+ 9,
123
+ 12,
124
+ 5,
125
+ 1,
126
+ 15,
127
+ 14,
128
+ 13,
129
+ 4,
130
+ 10,
131
+ 0,
132
+ 7,
133
+ 6,
134
+ 3,
135
+ 9,
136
+ 2,
137
+ 8,
138
+ 11,
139
+ 13,
140
+ 11,
141
+ 7,
142
+ 14,
143
+ 12,
144
+ 1,
145
+ 3,
146
+ 9,
147
+ 5,
148
+ 0,
149
+ 15,
150
+ 4,
151
+ 8,
152
+ 6,
153
+ 2,
154
+ 10,
155
+ 6,
156
+ 15,
157
+ 14,
158
+ 9,
159
+ 11,
160
+ 3,
161
+ 0,
162
+ 8,
163
+ 12,
164
+ 2,
165
+ 13,
166
+ 7,
167
+ 1,
168
+ 4,
169
+ 10,
170
+ 5,
171
+ 10,
172
+ 2,
173
+ 8,
174
+ 4,
175
+ 7,
176
+ 6,
177
+ 1,
178
+ 5,
179
+ 15,
180
+ 11,
181
+ 9,
182
+ 14,
183
+ 3,
184
+ 12,
185
+ 13,
186
+ 0,
187
+ 0,
188
+ 1,
189
+ 2,
190
+ 3,
191
+ 4,
192
+ 5,
193
+ 6,
194
+ 7,
195
+ 8,
196
+ 9,
197
+ 10,
198
+ 11,
199
+ 12,
200
+ 13,
201
+ 14,
202
+ 15,
203
+ 14,
204
+ 10,
205
+ 4,
206
+ 8,
207
+ 9,
208
+ 15,
209
+ 13,
210
+ 6,
211
+ 1,
212
+ 12,
213
+ 0,
214
+ 2,
215
+ 11,
216
+ 7,
217
+ 5,
218
+ 3
219
+ ]);
220
+ function G1b(BBUF, a, b, c, d, msg, x) {
221
+ const Xl = msg[x], Xh = msg[x + 1];
222
+ let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1];
223
+ let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1];
224
+ let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1];
225
+ let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1];
226
+ const ll = add3L(Al, Bl, Xl);
227
+ Ah = add3H(ll, Ah, Bh, Xh);
228
+ Al = ll | 0;
229
+ let xh = Dh ^ Ah, xl = Dl ^ Al;
230
+ Dh = rotr32H(xh, xl);
231
+ Dl = rotr32L(xh, xl);
232
+ ({h: Ch, l: Cl} = add(Ch, Cl, Dh, Dl));
233
+ xh = Bh ^ Ch;
234
+ xl = Bl ^ Cl;
235
+ Bh = rotrSH(xh, xl, 24);
236
+ Bl = rotrSL(xh, xl, 24);
237
+ BBUF[2 * a] = Al;
238
+ BBUF[2 * a + 1] = Ah;
239
+ BBUF[2 * b] = Bl;
240
+ BBUF[2 * b + 1] = Bh;
241
+ BBUF[2 * c] = Cl;
242
+ BBUF[2 * c + 1] = Ch;
243
+ BBUF[2 * d] = Dl;
244
+ BBUF[2 * d + 1] = Dh;
245
+ }
246
+ function G2b(BBUF, a, b, c, d, msg, x) {
247
+ const Xl = msg[x], Xh = msg[x + 1];
248
+ let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1];
249
+ let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1];
250
+ let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1];
251
+ let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1];
252
+ const ll = add3L(Al, Bl, Xl);
253
+ Ah = add3H(ll, Ah, Bh, Xh);
254
+ Al = ll | 0;
255
+ let xh = Dh ^ Ah, xl = Dl ^ Al;
256
+ Dh = rotrSH(xh, xl, 16);
257
+ Dl = rotrSL(xh, xl, 16);
258
+ ({h: Ch, l: Cl} = add(Ch, Cl, Dh, Dl));
259
+ xh = Bh ^ Ch;
260
+ xl = Bl ^ Cl;
261
+ Bh = rotrBH(xh, xl, 63);
262
+ Bl = rotrBL(xh, xl, 63);
263
+ BBUF[2 * a] = Al;
264
+ BBUF[2 * a + 1] = Ah;
265
+ BBUF[2 * b] = Bl;
266
+ BBUF[2 * b + 1] = Bh;
267
+ BBUF[2 * c] = Cl;
268
+ BBUF[2 * c + 1] = Ch;
269
+ BBUF[2 * d] = Dl;
270
+ BBUF[2 * d + 1] = Dh;
271
+ }
272
+ /** Unkeyed BLAKE2b used by Argon2's H0 and variable-length H'. */
273
+ var Blake2b = class {
274
+ outputLength;
275
+ state = B2B_IV.slice();
276
+ buffer = /* @__PURE__ */ new Uint8Array(128);
277
+ words = /* @__PURE__ */ new Uint32Array(32);
278
+ mixed = /* @__PURE__ */ new Uint32Array(32);
279
+ view = new DataView(this.buffer.buffer);
280
+ length = 0;
281
+ position = 0;
282
+ constructor(outputLength = 64) {
283
+ this.outputLength = outputLength;
284
+ this.state[0] ^= 16842752 ^ outputLength;
285
+ }
286
+ update(data) {
287
+ for (let position = 0; position < data.length;) {
288
+ if (this.position === 128) {
289
+ this.compress(false);
290
+ this.position = 0;
291
+ }
292
+ const take = Math.min(128 - this.position, data.length - position);
293
+ this.buffer.set(data.subarray(position, position + take), this.position);
294
+ this.position += take;
295
+ this.length += take;
296
+ position += take;
297
+ }
298
+ return this;
299
+ }
300
+ compress(last) {
301
+ const BBUF = this.mixed;
302
+ const msg = this.words;
303
+ for (let i = 0; i < 32; i++) msg[i] = this.view.getUint32(i * 4, true);
304
+ BBUF.set(this.state);
305
+ BBUF.set(B2B_IV, 16);
306
+ BBUF[24] ^= this.length >>> 0;
307
+ BBUF[25] ^= this.length / 4294967296 | 0;
308
+ if (last) {
309
+ BBUF[28] = ~BBUF[28];
310
+ BBUF[29] = ~BBUF[29];
311
+ }
312
+ let j = 0;
313
+ const s = BSIGMA;
314
+ for (let i = 0; i < 12; i++) {
315
+ G1b(BBUF, 0, 4, 8, 12, msg, 2 * s[j++]);
316
+ G2b(BBUF, 0, 4, 8, 12, msg, 2 * s[j++]);
317
+ G1b(BBUF, 1, 5, 9, 13, msg, 2 * s[j++]);
318
+ G2b(BBUF, 1, 5, 9, 13, msg, 2 * s[j++]);
319
+ G1b(BBUF, 2, 6, 10, 14, msg, 2 * s[j++]);
320
+ G2b(BBUF, 2, 6, 10, 14, msg, 2 * s[j++]);
321
+ G1b(BBUF, 3, 7, 11, 15, msg, 2 * s[j++]);
322
+ G2b(BBUF, 3, 7, 11, 15, msg, 2 * s[j++]);
323
+ G1b(BBUF, 0, 5, 10, 15, msg, 2 * s[j++]);
324
+ G2b(BBUF, 0, 5, 10, 15, msg, 2 * s[j++]);
325
+ G1b(BBUF, 1, 6, 11, 12, msg, 2 * s[j++]);
326
+ G2b(BBUF, 1, 6, 11, 12, msg, 2 * s[j++]);
327
+ G1b(BBUF, 2, 7, 8, 13, msg, 2 * s[j++]);
328
+ G2b(BBUF, 2, 7, 8, 13, msg, 2 * s[j++]);
329
+ G1b(BBUF, 3, 4, 9, 14, msg, 2 * s[j++]);
330
+ G2b(BBUF, 3, 4, 9, 14, msg, 2 * s[j++]);
331
+ }
332
+ for (let i = 0; i < 16; i++) this.state[i] ^= BBUF[i] ^ BBUF[i + 16];
333
+ BBUF.fill(0);
334
+ msg.fill(0);
335
+ }
336
+ digest() {
337
+ try {
338
+ this.buffer.fill(0, this.position);
339
+ this.compress(true);
340
+ const out = new Uint8Array(this.outputLength);
341
+ for (let i = 0; i < out.length; i++) out[i] = this.state[i >>> 2] >>> 8 * (i & 3);
342
+ return out;
343
+ } finally {
344
+ this.destroy();
345
+ }
346
+ }
347
+ destroy() {
348
+ this.state.fill(0);
349
+ this.buffer.fill(0);
350
+ this.words.fill(0);
351
+ this.mixed.fill(0);
352
+ this.length = 0;
353
+ this.position = 0;
354
+ }
355
+ };
356
+ //#endregion
357
+ export { Blake2b };
358
+
359
+ //# sourceMappingURL=blake2b.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blake2b.mjs","names":["u64.add3L","u64.add3H","u64.rotr32H","u64.rotr32L","u64.add","u64.rotrSH","u64.rotrSL","u64.rotrBH","u64.rotrBL"],"sources":["../../src/internal/blake2b.ts"],"sourcesContent":["/**\n * Adapted from noble-hashes, Copyright (c) 2022 Paul Miller.\n * MIT; source revision 8060cc83bbab6681d23c9eed071db3f3a6b442da.\n * See ../../THIRD_PARTY_NOTICES.md for source mapping and license.\n */\nimport * as u64 from \"./word64\";\n\nconst B2B_IV = /* @__PURE__ */ Uint32Array.from([\n 0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a,\n 0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19,\n]);\n\nconst BSIGMA = /* @__PURE__ */ Uint8Array.from([\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11,\n 7, 5, 3, 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4, 7, 9, 3, 1, 13, 12, 11, 14, 2, 6,\n 5, 10, 4, 0, 15, 8, 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13, 2, 12, 6, 10, 0, 11, 8,\n 3, 4, 13, 7, 5, 15, 14, 1, 9, 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11, 13, 11, 7, 14,\n 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10, 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5, 10,\n 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,\n 14, 15, 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,\n]);\n\n// BLAKE2b G mix split into two half-rounds over LE u32 low/high limbs.\nfunction G1b(\n BBUF: Uint32Array,\n a: number,\n b: number,\n c: number,\n d: number,\n msg: Uint32Array,\n x: number,\n) {\n // NOTE: V is LE here\n const Xl = msg[x],\n Xh = msg[x + 1];\n\n let Al = BBUF[2 * a],\n Ah = BBUF[2 * a + 1];\n\n let Bl = BBUF[2 * b],\n Bh = BBUF[2 * b + 1];\n\n let Cl = BBUF[2 * c],\n Ch = BBUF[2 * c + 1];\n\n let Dl = BBUF[2 * d],\n Dh = BBUF[2 * d + 1];\n\n // v[a] = (v[a] + v[b] + x) | 0;\n const ll = u64.add3L(Al, Bl, Xl);\n\n Ah = u64.add3H(ll, Ah, Bh, Xh);\n Al = ll | 0;\n\n // v[d] = rotr(v[d] ^ v[a], 32)\n let xh = Dh ^ Ah,\n xl = Dl ^ Al;\n\n Dh = u64.rotr32H(xh, xl);\n Dl = u64.rotr32L(xh, xl);\n // v[c] = (v[c] + v[d]) | 0;\n ({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));\n // v[b] = rotr(v[b] ^ v[c], 24)\n xh = Bh ^ Ch;\n xl = Bl ^ Cl;\n Bh = u64.rotrSH(xh, xl, 24);\n Bl = u64.rotrSL(xh, xl, 24);\n BBUF[2 * a] = Al;\n BBUF[2 * a + 1] = Ah;\n BBUF[2 * b] = Bl;\n BBUF[2 * b + 1] = Bh;\n BBUF[2 * c] = Cl;\n BBUF[2 * c + 1] = Ch;\n BBUF[2 * d] = Dl;\n BBUF[2 * d + 1] = Dh;\n}\n\n// Second half-round of the same LE-limb BLAKE2b G mix; `x` is the message word offset.\nfunction G2b(\n BBUF: Uint32Array,\n a: number,\n b: number,\n c: number,\n d: number,\n msg: Uint32Array,\n x: number,\n) {\n // NOTE: V is LE here\n const Xl = msg[x],\n Xh = msg[x + 1];\n\n let Al = BBUF[2 * a],\n Ah = BBUF[2 * a + 1];\n\n let Bl = BBUF[2 * b],\n Bh = BBUF[2 * b + 1];\n\n let Cl = BBUF[2 * c],\n Ch = BBUF[2 * c + 1];\n\n let Dl = BBUF[2 * d],\n Dh = BBUF[2 * d + 1];\n\n // v[a] = (v[a] + v[b] + x) | 0;\n const ll = u64.add3L(Al, Bl, Xl);\n\n Ah = u64.add3H(ll, Ah, Bh, Xh);\n Al = ll | 0;\n\n // v[d] = rotr(v[d] ^ v[a], 16)\n let xh = Dh ^ Ah,\n xl = Dl ^ Al;\n\n Dh = u64.rotrSH(xh, xl, 16);\n Dl = u64.rotrSL(xh, xl, 16);\n // v[c] = (v[c] + v[d]) | 0;\n ({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));\n // v[b] = rotr(v[b] ^ v[c], 63)\n xh = Bh ^ Ch;\n xl = Bl ^ Cl;\n Bh = u64.rotrBH(xh, xl, 63);\n Bl = u64.rotrBL(xh, xl, 63);\n BBUF[2 * a] = Al;\n BBUF[2 * a + 1] = Ah;\n BBUF[2 * b] = Bl;\n BBUF[2 * b + 1] = Bh;\n BBUF[2 * c] = Cl;\n BBUF[2 * c + 1] = Ch;\n BBUF[2 * d] = Dl;\n BBUF[2 * d + 1] = Dh;\n}\n\n/** Unkeyed BLAKE2b used by Argon2's H0 and variable-length H'. */\nexport class Blake2b {\n private readonly state = B2B_IV.slice();\n private readonly buffer = new Uint8Array(128);\n private readonly words = new Uint32Array(32);\n private readonly mixed = new Uint32Array(32);\n private readonly view = new DataView(this.buffer.buffer);\n private length = 0;\n private position = 0;\n\n constructor(private readonly outputLength = 64) {\n this.state[0] ^= 0x01010000 ^ outputLength;\n }\n\n update(data: Uint8Array): this {\n for (let position = 0; position < data.length;) {\n // BLAKE2 must retain the last block until its finalization flag is known.\n if (this.position === 128) {\n this.compress(false);\n this.position = 0;\n }\n const take = Math.min(128 - this.position, data.length - position);\n\n this.buffer.set(data.subarray(position, position + take), this.position);\n this.position += take;\n this.length += take;\n position += take;\n }\n\n return this;\n }\n\n private compress(last: boolean): void {\n const BBUF = this.mixed;\n const msg = this.words;\n\n for (let i = 0; i < 32; i++) msg[i] = this.view.getUint32(i * 4, true);\n BBUF.set(this.state);\n BBUF.set(B2B_IV, 16);\n BBUF[24] ^= this.length >>> 0;\n BBUF[25] ^= (this.length / 0x100000000) | 0;\n if (last) {\n BBUF[28] = ~BBUF[28];\n BBUF[29] = ~BBUF[29];\n }\n let j = 0;\n const s = BSIGMA;\n\n // SIGMA selects 64-bit message words; multiply by 2 because `msg` stores\n // each word as [low32, high32].\n for (let i = 0; i < 12; i++) {\n G1b(BBUF, 0, 4, 8, 12, msg, 2 * s[j++]);\n G2b(BBUF, 0, 4, 8, 12, msg, 2 * s[j++]);\n G1b(BBUF, 1, 5, 9, 13, msg, 2 * s[j++]);\n G2b(BBUF, 1, 5, 9, 13, msg, 2 * s[j++]);\n G1b(BBUF, 2, 6, 10, 14, msg, 2 * s[j++]);\n G2b(BBUF, 2, 6, 10, 14, msg, 2 * s[j++]);\n G1b(BBUF, 3, 7, 11, 15, msg, 2 * s[j++]);\n G2b(BBUF, 3, 7, 11, 15, msg, 2 * s[j++]);\n\n G1b(BBUF, 0, 5, 10, 15, msg, 2 * s[j++]);\n G2b(BBUF, 0, 5, 10, 15, msg, 2 * s[j++]);\n G1b(BBUF, 1, 6, 11, 12, msg, 2 * s[j++]);\n G2b(BBUF, 1, 6, 11, 12, msg, 2 * s[j++]);\n G1b(BBUF, 2, 7, 8, 13, msg, 2 * s[j++]);\n G2b(BBUF, 2, 7, 8, 13, msg, 2 * s[j++]);\n G1b(BBUF, 3, 4, 9, 14, msg, 2 * s[j++]);\n G2b(BBUF, 3, 4, 9, 14, msg, 2 * s[j++]);\n }\n\n for (let i = 0; i < 16; i++) this.state[i] ^= BBUF[i] ^ BBUF[i + 16];\n BBUF.fill(0);\n msg.fill(0);\n }\n\n digest(): Uint8Array {\n try {\n this.buffer.fill(0, this.position);\n this.compress(true);\n const out = new Uint8Array(this.outputLength);\n\n for (let i = 0; i < out.length; i++) out[i] = this.state[i >>> 2] >>> (8 * (i & 3));\n\n return out;\n } finally {\n this.destroy();\n }\n }\n\n destroy(): void {\n this.state.fill(0);\n this.buffer.fill(0);\n this.words.fill(0);\n this.mixed.fill(0);\n this.length = 0;\n this.position = 0;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { CryptoUnavailable, InvalidInput, UnsupportedAlgorithm } from "../Errors.mjs";
2
+ import { Effect, Predicate, Redacted, Schema } from "effect";
3
+ //#region src/internal/common.ts
4
+ const decode = (schema, input, reason) => Effect.suspend(() => Schema.decodeEffect(schema)(input)).pipe(Effect.mapError(() => InvalidInput.make({ reason })), Effect.catchDefect(() => InvalidInput.make({ reason })));
5
+ const nativeErrorName = (cause) => Predicate.hasProperty(cause, "name") && Predicate.isString(cause.name) ? cause.name : void 0;
6
+ const nativeError = (cause) => nativeErrorName(cause) === "NotSupportedError" ? UnsupportedAlgorithm.make({}) : CryptoUnavailable.make({});
7
+ const importError = (cause) => nativeErrorName(cause) === "DataError" || nativeErrorName(cause) === "SyntaxError" ? InvalidInput.make({ reason: "key" }) : nativeError(cause);
8
+ /** Own a secret copy through cleanup. Native users must join work that cannot be cancelled. */
9
+ const withSecret = (value, use) => Effect.acquireUseRelease(Effect.try({
10
+ try: () => new Uint8Array(Redacted.value(value)),
11
+ catch: () => InvalidInput.make({ reason: "data" })
12
+ }), use, (owned) => Effect.sync(() => owned.fill(0)));
13
+ const copy = (value) => Effect.try({
14
+ try: () => new Uint8Array(value),
15
+ catch: () => InvalidInput.make({ reason: "data" })
16
+ });
17
+ //#endregion
18
+ export { copy, decode, importError, nativeError, nativeErrorName, withSecret };
19
+
20
+ //# sourceMappingURL=common.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.mjs","names":[],"sources":["../../src/internal/common.ts"],"sourcesContent":["import { Effect, Predicate, Redacted, Schema } from \"effect\";\n\nimport { CryptoUnavailable, InvalidInput, UnsupportedAlgorithm } from \"../Errors\";\n\nexport const decode = <A>(schema: Schema.Codec<A, A>, input: A, reason: InvalidInput[\"reason\"]) =>\n // Erased Redacted values can defect during Schema decoding. Keep decoder\n // construction and evaluation inside the typed, secret-safe input boundary.\n Effect.suspend(() => Schema.decodeEffect(schema)(input)).pipe(\n Effect.mapError(() => InvalidInput.make({ reason })),\n Effect.catchDefect(() => InvalidInput.make({ reason })),\n );\n\nexport const nativeErrorName = (cause: unknown): string | undefined =>\n Predicate.hasProperty(cause, \"name\") && Predicate.isString(cause.name) ? cause.name : undefined;\n\nexport const nativeError = (cause: unknown) =>\n nativeErrorName(cause) === \"NotSupportedError\"\n ? UnsupportedAlgorithm.make({})\n : CryptoUnavailable.make({});\n\nexport const importError = (cause: unknown) =>\n nativeErrorName(cause) === \"DataError\" || nativeErrorName(cause) === \"SyntaxError\"\n ? InvalidInput.make({ reason: \"key\" })\n : nativeError(cause);\n\n/** Own a secret copy through cleanup. Native users must join work that cannot be cancelled. */\nexport const withSecret = <A, E, R>(\n value: Redacted.Redacted<Uint8Array>,\n use: (owned: Uint8Array<ArrayBuffer>) => Effect.Effect<A, E, R>,\n) =>\n Effect.acquireUseRelease(\n Effect.try({\n try: () => new Uint8Array(Redacted.value(value)),\n catch: () => InvalidInput.make({ reason: \"data\" }),\n }),\n use,\n (owned) => Effect.sync(() => owned.fill(0)),\n );\n\nexport const copy = (value: Uint8Array) =>\n Effect.try({\n try: () => new Uint8Array(value),\n catch: () => InvalidInput.make({ reason: \"data\" }),\n });\n"],"mappings":";;;AAIA,MAAa,UAAa,QAA4B,OAAU,WAG9D,OAAO,cAAc,OAAO,aAAa,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACvD,OAAO,eAAe,aAAa,KAAK,EAAE,OAAO,CAAC,CAAC,GACnD,OAAO,kBAAkB,aAAa,KAAK,EAAE,OAAO,CAAC,CAAC,CACxD;AAEF,MAAa,mBAAmB,UAC9B,UAAU,YAAY,OAAO,MAAM,KAAK,UAAU,SAAS,MAAM,IAAI,IAAI,MAAM,OAAO,KAAA;AAExF,MAAa,eAAe,UAC1B,gBAAgB,KAAK,MAAM,sBACvB,qBAAqB,KAAK,CAAC,CAAC,IAC5B,kBAAkB,KAAK,CAAC,CAAC;AAE/B,MAAa,eAAe,UAC1B,gBAAgB,KAAK,MAAM,eAAe,gBAAgB,KAAK,MAAM,gBACjE,aAAa,KAAK,EAAE,QAAQ,MAAM,CAAC,IACnC,YAAY,KAAK;;AAGvB,MAAa,cACX,OACA,QAEA,OAAO,kBACL,OAAO,IAAI;CACT,WAAW,IAAI,WAAW,SAAS,MAAM,KAAK,CAAC;CAC/C,aAAa,aAAa,KAAK,EAAE,QAAQ,OAAO,CAAC;AACnD,CAAC,GACD,MACC,UAAU,OAAO,WAAW,MAAM,KAAK,CAAC,CAAC,CAC5C;AAEF,MAAa,QAAQ,UACnB,OAAO,IAAI;CACT,WAAW,IAAI,WAAW,KAAK;CAC/B,aAAa,aAAa,KAAK,EAAE,QAAQ,OAAO,CAAC;AACnD,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { CryptoUnavailable } from "../Errors.mjs";
2
+ import { Hmac, Input, KeyInput, VerifyInput } from "../Hmac.mjs";
3
+ import { copy, decode, importError, nativeError, withSecret } from "./common.mjs";
4
+ import { Effect, Exit, Fiber, Redacted, Schema, Scope } from "effect";
5
+ //#region src/internal/hmac.ts
6
+ const keyBytes = Schema.Uint8Array.check(Schema.isMinLength(1));
7
+ const makeHmac = (subtle) => {
8
+ const importKey = Effect.fnUntraced(function* (input) {
9
+ const value = yield* decode(KeyInput, input, "key");
10
+ yield* decode(keyBytes, Redacted.value(value.key), "key");
11
+ const scope = yield* Scope.fork(yield* Effect.scope, "sequential");
12
+ let imported;
13
+ yield* Scope.addFinalizer(scope, Effect.sync(() => {
14
+ imported = void 0;
15
+ }));
16
+ const available = Effect.suspend(() => scope.state._tag === "Closed" ? Effect.fail(CryptoUnavailable.make({})) : Effect.void);
17
+ const run = (operation) => Effect.acquireUseRelease(available.pipe(Effect.andThen(Effect.forkIn(operation, scope, { uninterruptible: false }))), (fiber) => Effect.gen(function* () {
18
+ const exit = yield* Fiber.await(fiber);
19
+ yield* available;
20
+ return yield* exit;
21
+ }), Fiber.interrupt);
22
+ yield* run(withSecret(value.key, (material) => Effect.tryPromise({
23
+ try: () => subtle.importKey("raw", material, {
24
+ name: "HMAC",
25
+ hash: value.algorithm
26
+ }, false, ["sign", "verify"]),
27
+ catch: importError
28
+ }).pipe(Effect.tap((key) => Effect.sync(() => {
29
+ imported = key;
30
+ })), Effect.uninterruptible))).pipe(Effect.onExit((exit) => Exit.isFailure(exit) ? Scope.close(scope, exit) : Effect.void));
31
+ const use = (operation) => run(Effect.suspend(() => {
32
+ const key = imported;
33
+ return key === void 0 ? Effect.fail(CryptoUnavailable.make({})) : Effect.tryPromise({
34
+ try: () => operation(key),
35
+ catch: nativeError
36
+ });
37
+ }).pipe(Effect.uninterruptible));
38
+ return {
39
+ sign: Effect.fnUntraced(function* (input) {
40
+ const data = yield* decode(Schema.Uint8Array, input, "data").pipe(Effect.flatMap(copy));
41
+ return new Uint8Array(yield* use((key) => subtle.sign("HMAC", key, data)));
42
+ }),
43
+ verify: Effect.fnUntraced(function* (input, signature) {
44
+ const data = yield* decode(Schema.Uint8Array, input, "data").pipe(Effect.flatMap(copy));
45
+ const tag = yield* decode(Schema.Uint8Array, signature, "data").pipe(Effect.flatMap(copy));
46
+ return yield* use((key) => subtle.verify("HMAC", key, tag, data));
47
+ })
48
+ };
49
+ });
50
+ return Hmac.of({
51
+ importKey,
52
+ sign: Effect.fnUntraced(function* (input) {
53
+ const value = yield* decode(Input, input, "data");
54
+ const data = yield* copy(value.data);
55
+ return yield* (yield* importKey(value)).sign(data);
56
+ }, Effect.scoped),
57
+ verify: Effect.fnUntraced(function* (input) {
58
+ const value = yield* decode(VerifyInput, input, "data");
59
+ const data = yield* copy(value.data);
60
+ const tag = yield* copy(value.tag);
61
+ return yield* (yield* importKey(value)).verify(data, tag);
62
+ }, Effect.scoped)
63
+ });
64
+ };
65
+ //#endregion
66
+ export { makeHmac };
67
+
68
+ //# sourceMappingURL=hmac.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmac.mjs","names":[],"sources":["../../src/internal/hmac.ts"],"sourcesContent":["import { Effect, Exit, Fiber, Redacted, Schema, Scope } from \"effect\";\n\nimport { CryptoUnavailable } from \"../Errors\";\nimport { Hmac, Input, type Key, KeyInput, VerifyInput } from \"../Hmac\";\nimport { copy, decode, importError, nativeError, withSecret } from \"./common\";\n\nconst keyBytes = Schema.Uint8Array.check(Schema.isMinLength(1));\n\nexport const makeHmac = (subtle: SubtleCrypto): Hmac[\"Service\"] => {\n const importKey = Effect.fnUntraced(function* (input: KeyInput) {\n const value = yield* decode(KeyInput, input, \"key\");\n\n yield* decode(keyBytes, Redacted.value(value.key), \"key\");\n\n // A sequential child joins every native call before dropping the key, even\n // when the caller's Scope runs its other finalizers in parallel.\n const scope = yield* Scope.fork(yield* Effect.scope, \"sequential\");\n let imported: CryptoKey | undefined;\n\n yield* Scope.addFinalizer(\n scope,\n Effect.sync(() => {\n imported = undefined;\n }),\n );\n\n const available = Effect.suspend(() =>\n scope.state._tag === \"Closed\" ? Effect.fail(CryptoUnavailable.make({})) : Effect.void,\n );\n\n const run = <A, E>(operation: Effect.Effect<A, E>) =>\n Effect.acquireUseRelease(\n available.pipe(Effect.andThen(Effect.forkIn(operation, scope, { uninterruptible: false }))),\n (fiber) =>\n Effect.gen(function* () {\n const exit = yield* Fiber.await(fiber);\n\n yield* available;\n\n return yield* exit;\n }),\n Fiber.interrupt,\n );\n\n yield* run(\n withSecret(value.key, (material) =>\n Effect.tryPromise({\n try: () =>\n subtle.importKey(\"raw\", material, { name: \"HMAC\", hash: value.algorithm }, false, [\n \"sign\",\n \"verify\",\n ]),\n catch: importError,\n }).pipe(\n Effect.tap((key) =>\n Effect.sync(() => {\n imported = key;\n }),\n ),\n Effect.uninterruptible,\n ),\n ),\n ).pipe(\n Effect.onExit((exit) => (Exit.isFailure(exit) ? Scope.close(scope, exit) : Effect.void)),\n );\n\n const use = <A>(operation: (key: CryptoKey) => Promise<A>) =>\n run(\n Effect.suspend(() => {\n const key = imported;\n\n return key === undefined\n ? Effect.fail(CryptoUnavailable.make({}))\n : Effect.tryPromise({ try: () => operation(key), catch: nativeError });\n }).pipe(Effect.uninterruptible),\n );\n\n return {\n sign: Effect.fnUntraced(function* (input) {\n const data = yield* decode(Schema.Uint8Array, input, \"data\").pipe(Effect.flatMap(copy));\n\n return new Uint8Array(yield* use((key) => subtle.sign(\"HMAC\", key, data)));\n }),\n verify: Effect.fnUntraced(function* (input, signature) {\n const data = yield* decode(Schema.Uint8Array, input, \"data\").pipe(Effect.flatMap(copy));\n const tag = yield* decode(Schema.Uint8Array, signature, \"data\").pipe(Effect.flatMap(copy));\n\n return yield* use((key) => subtle.verify(\"HMAC\", key, tag, data));\n }),\n } satisfies Key;\n });\n\n return Hmac.of({\n importKey,\n sign: Effect.fnUntraced(function* (input) {\n const value = yield* decode(Input, input, \"data\");\n const data = yield* copy(value.data);\n const key = yield* importKey(value);\n\n return yield* key.sign(data);\n }, Effect.scoped),\n verify: Effect.fnUntraced(function* (input) {\n const value = yield* decode(VerifyInput, input, \"data\");\n const data = yield* copy(value.data);\n const tag = yield* copy(value.tag);\n const key = yield* importKey(value);\n\n return yield* key.verify(data, tag);\n }, Effect.scoped),\n });\n};\n"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { InvalidInput, UnsupportedAlgorithm } from "../Errors.mjs";
2
+ import { Argon2idInput, HkdfInput, Kdf, Pbkdf2Input } from "../Kdf.mjs";
3
+ import { KdfAdmission } from "../KdfAdmission.mjs";
4
+ import { copy, decode, importError, nativeError, withSecret } from "./common.mjs";
5
+ import { Effect, Redacted, Schema } from "effect";
6
+ //#region src/internal/kdf.ts
7
+ const makeKdf = Effect.fnUntraced(function* (subtle, limits, argon2) {
8
+ const admission = yield* KdfAdmission;
9
+ const boundedBytes = Schema.Uint8Array.check(Schema.isMaxLength(limits.maximumInputBytes));
10
+ const output = Schema.Int.check(Schema.isBetween({
11
+ minimum: 1,
12
+ maximum: limits.maximumOutputBytes
13
+ }));
14
+ const inputBytes = (input) => decode(boundedBytes, input, "data");
15
+ const outputLength = (input) => decode(output, input, "parameters");
16
+ return Kdf.of({
17
+ pbkdf2: (input) => admission.run(Effect.gen(function* () {
18
+ const value = yield* decode(Pbkdf2Input, input, "parameters");
19
+ yield* decode(Schema.Int.check(Schema.isBetween({
20
+ minimum: 1,
21
+ maximum: limits.maximumIterations
22
+ })), value.iterations, "parameters");
23
+ yield* outputLength(value.length);
24
+ yield* inputBytes(Redacted.value(value.password));
25
+ yield* inputBytes(value.salt);
26
+ const salt = yield* copy(value.salt);
27
+ return yield* withSecret(value.password, (password) => Effect.gen(function* () {
28
+ const key = yield* Effect.tryPromise({
29
+ try: () => subtle.importKey("raw", password, "PBKDF2", false, ["deriveBits"]),
30
+ catch: importError
31
+ });
32
+ const result = yield* Effect.tryPromise({
33
+ try: () => subtle.deriveBits({
34
+ name: "PBKDF2",
35
+ hash: "SHA-256",
36
+ salt,
37
+ iterations: value.iterations
38
+ }, key, value.length * 8),
39
+ catch: nativeError
40
+ });
41
+ return Redacted.make(new Uint8Array(result));
42
+ }).pipe(Effect.uninterruptible));
43
+ })),
44
+ hkdf: (input) => admission.run(Effect.gen(function* () {
45
+ const value = yield* decode(HkdfInput, input, "parameters");
46
+ yield* outputLength(value.length);
47
+ yield* inputBytes(Redacted.value(value.key));
48
+ yield* inputBytes(value.salt);
49
+ yield* inputBytes(value.info);
50
+ const salt = yield* copy(value.salt);
51
+ const info = yield* copy(value.info);
52
+ return yield* withSecret(value.key, (material) => Effect.gen(function* () {
53
+ const key = yield* Effect.tryPromise({
54
+ try: () => subtle.importKey("raw", material, "HKDF", false, ["deriveBits"]),
55
+ catch: importError
56
+ });
57
+ const result = yield* Effect.tryPromise({
58
+ try: () => subtle.deriveBits({
59
+ name: "HKDF",
60
+ hash: "SHA-256",
61
+ salt,
62
+ info
63
+ }, key, value.length * 8),
64
+ catch: nativeError
65
+ });
66
+ return Redacted.make(new Uint8Array(result));
67
+ }).pipe(Effect.uninterruptible));
68
+ })),
69
+ argon2id: (input) => admission.run(Effect.gen(function* () {
70
+ const value = yield* decode(Argon2idInput, input, "parameters");
71
+ yield* outputLength(value.length);
72
+ yield* inputBytes(Redacted.value(value.password));
73
+ yield* inputBytes(value.salt);
74
+ if (value.secret !== void 0) yield* inputBytes(Redacted.value(value.secret));
75
+ if (value.associatedData !== void 0) yield* inputBytes(value.associatedData);
76
+ if (value.memoryKiB < 8 * value.parallelism || value.memoryKiB > limits.maximumMemoryKiB || value.passes > limits.maximumPasses || value.parallelism > limits.maximumParallelism || value.memoryKiB * value.passes > limits.maximumMemoryPasses) return yield* InvalidInput.make({ reason: "parameters" });
77
+ if (argon2 === void 0) return yield* UnsupportedAlgorithm.make({});
78
+ const salt = yield* copy(value.salt);
79
+ const associatedData = yield* copy(value.associatedData ?? /* @__PURE__ */ new Uint8Array());
80
+ return yield* withSecret(value.password, (password) => {
81
+ const derive = (secret) => argon2({
82
+ password,
83
+ salt,
84
+ ...secret === void 0 ? {} : { secret },
85
+ associatedData,
86
+ memoryKiB: value.memoryKiB,
87
+ passes: value.passes,
88
+ parallelism: value.parallelism,
89
+ length: value.length
90
+ }).pipe(Effect.map((bytes) => Redacted.make(bytes)));
91
+ return value.secret === void 0 ? derive() : withSecret(value.secret, derive);
92
+ });
93
+ }))
94
+ });
95
+ });
96
+ //#endregion
97
+ export { makeKdf };
98
+
99
+ //# sourceMappingURL=kdf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kdf.mjs","names":[],"sources":["../../src/internal/kdf.ts"],"sourcesContent":["import { Effect, Redacted, Schema } from \"effect\";\n\nimport { InvalidInput, type OperationError, UnsupportedAlgorithm } from \"../Errors\";\nimport { Argon2idInput, HkdfInput, Kdf, type Limits, Pbkdf2Input } from \"../Kdf\";\nimport { KdfAdmission } from \"../KdfAdmission\";\nimport { copy, decode, importError, nativeError, withSecret } from \"./common\";\n\nexport interface Argon2Parameters {\n readonly password: Uint8Array<ArrayBuffer>;\n readonly salt: Uint8Array<ArrayBuffer>;\n readonly memoryKiB: number;\n readonly passes: number;\n readonly parallelism: number;\n readonly length: number;\n readonly secret?: Uint8Array<ArrayBuffer>;\n readonly associatedData: Uint8Array<ArrayBuffer>;\n}\n\nexport type Argon2 = (input: Argon2Parameters) => Effect.Effect<Uint8Array, OperationError>;\n\nexport const makeKdf = Effect.fnUntraced(function* (\n subtle: SubtleCrypto,\n limits: Limits,\n argon2?: Argon2,\n) {\n const admission = yield* KdfAdmission;\n const boundedBytes = Schema.Uint8Array.check(Schema.isMaxLength(limits.maximumInputBytes));\n\n const output = Schema.Int.check(\n Schema.isBetween({ minimum: 1, maximum: limits.maximumOutputBytes }),\n );\n\n const inputBytes = (input: Uint8Array) => decode(boundedBytes, input, \"data\");\n const outputLength = (input: number) => decode(output, input, \"parameters\");\n\n return Kdf.of({\n pbkdf2: (input) =>\n admission.run(\n Effect.gen(function* () {\n const value = yield* decode(Pbkdf2Input, input, \"parameters\");\n\n yield* decode(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: limits.maximumIterations })),\n value.iterations,\n \"parameters\",\n );\n yield* outputLength(value.length);\n yield* inputBytes(Redacted.value(value.password));\n yield* inputBytes(value.salt);\n const salt = yield* copy(value.salt);\n\n return yield* withSecret(value.password, (password) =>\n Effect.gen(function* () {\n const key = yield* Effect.tryPromise({\n try: () => subtle.importKey(\"raw\", password, \"PBKDF2\", false, [\"deriveBits\"]),\n catch: importError,\n });\n\n const result = yield* Effect.tryPromise({\n try: () =>\n subtle.deriveBits(\n { name: \"PBKDF2\", hash: \"SHA-256\", salt, iterations: value.iterations },\n key,\n value.length * 8,\n ),\n catch: nativeError,\n });\n\n return Redacted.make(new Uint8Array(result));\n }).pipe(Effect.uninterruptible),\n );\n }),\n ),\n hkdf: (input) =>\n admission.run(\n Effect.gen(function* () {\n const value = yield* decode(HkdfInput, input, \"parameters\");\n\n yield* outputLength(value.length);\n yield* inputBytes(Redacted.value(value.key));\n yield* inputBytes(value.salt);\n yield* inputBytes(value.info);\n const salt = yield* copy(value.salt);\n const info = yield* copy(value.info);\n\n return yield* withSecret(value.key, (material) =>\n Effect.gen(function* () {\n const key = yield* Effect.tryPromise({\n try: () => subtle.importKey(\"raw\", material, \"HKDF\", false, [\"deriveBits\"]),\n catch: importError,\n });\n\n const result = yield* Effect.tryPromise({\n try: () =>\n subtle.deriveBits(\n { name: \"HKDF\", hash: \"SHA-256\", salt, info },\n key,\n value.length * 8,\n ),\n catch: nativeError,\n });\n\n return Redacted.make(new Uint8Array(result));\n }).pipe(Effect.uninterruptible),\n );\n }),\n ),\n argon2id: (input) =>\n admission.run(\n Effect.gen(function* () {\n const value = yield* decode(Argon2idInput, input, \"parameters\");\n\n yield* outputLength(value.length);\n yield* inputBytes(Redacted.value(value.password));\n yield* inputBytes(value.salt);\n if (value.secret !== undefined) yield* inputBytes(Redacted.value(value.secret));\n if (value.associatedData !== undefined) yield* inputBytes(value.associatedData);\n\n if (\n value.memoryKiB < 8 * value.parallelism ||\n value.memoryKiB > limits.maximumMemoryKiB ||\n value.passes > limits.maximumPasses ||\n value.parallelism > limits.maximumParallelism ||\n value.memoryKiB * value.passes > limits.maximumMemoryPasses\n )\n return yield* InvalidInput.make({ reason: \"parameters\" });\n if (argon2 === undefined) return yield* UnsupportedAlgorithm.make({});\n\n const salt = yield* copy(value.salt);\n const associatedData = yield* copy(value.associatedData ?? new Uint8Array());\n\n return yield* withSecret(value.password, (password) => {\n const derive = (secret?: Uint8Array<ArrayBuffer>) =>\n argon2({\n password,\n salt,\n ...(secret === undefined ? {} : { secret }),\n associatedData,\n memoryKiB: value.memoryKiB,\n passes: value.passes,\n parallelism: value.parallelism,\n length: value.length,\n }).pipe(Effect.map((bytes) => Redacted.make(bytes)));\n\n return value.secret === undefined ? derive() : withSecret(value.secret, derive);\n });\n }),\n ),\n });\n});\n"],"mappings":";;;;;;AAoBA,MAAa,UAAU,OAAO,WAAW,WACvC,QACA,QACA,QACA;CACA,MAAM,YAAY,OAAO;CACzB,MAAM,eAAe,OAAO,WAAW,MAAM,OAAO,YAAY,OAAO,iBAAiB,CAAC;CAEzF,MAAM,SAAS,OAAO,IAAI,MACxB,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS,OAAO;CAAmB,CAAC,CACrE;CAEA,MAAM,cAAc,UAAsB,OAAO,cAAc,OAAO,MAAM;CAC5E,MAAM,gBAAgB,UAAkB,OAAO,QAAQ,OAAO,YAAY;CAE1E,OAAO,IAAI,GAAG;EACZ,SAAS,UACP,UAAU,IACR,OAAO,IAAI,aAAa;GACtB,MAAM,QAAQ,OAAO,OAAO,aAAa,OAAO,YAAY;GAE5D,OAAO,OACL,OAAO,IAAI,MAAM,OAAO,UAAU;IAAE,SAAS;IAAG,SAAS,OAAO;GAAkB,CAAC,CAAC,GACpF,MAAM,YACN,YACF;GACA,OAAO,aAAa,MAAM,MAAM;GAChC,OAAO,WAAW,SAAS,MAAM,MAAM,QAAQ,CAAC;GAChD,OAAO,WAAW,MAAM,IAAI;GAC5B,MAAM,OAAO,OAAO,KAAK,MAAM,IAAI;GAEnC,OAAO,OAAO,WAAW,MAAM,WAAW,aACxC,OAAO,IAAI,aAAa;IACtB,MAAM,MAAM,OAAO,OAAO,WAAW;KACnC,WAAW,OAAO,UAAU,OAAO,UAAU,UAAU,OAAO,CAAC,YAAY,CAAC;KAC5E,OAAO;IACT,CAAC;IAED,MAAM,SAAS,OAAO,OAAO,WAAW;KACtC,WACE,OAAO,WACL;MAAE,MAAM;MAAU,MAAM;MAAW;MAAM,YAAY,MAAM;KAAW,GACtE,KACA,MAAM,SAAS,CACjB;KACF,OAAO;IACT,CAAC;IAED,OAAO,SAAS,KAAK,IAAI,WAAW,MAAM,CAAC;GAC7C,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,CAChC;EACF,CAAC,CACH;EACF,OAAO,UACL,UAAU,IACR,OAAO,IAAI,aAAa;GACtB,MAAM,QAAQ,OAAO,OAAO,WAAW,OAAO,YAAY;GAE1D,OAAO,aAAa,MAAM,MAAM;GAChC,OAAO,WAAW,SAAS,MAAM,MAAM,GAAG,CAAC;GAC3C,OAAO,WAAW,MAAM,IAAI;GAC5B,OAAO,WAAW,MAAM,IAAI;GAC5B,MAAM,OAAO,OAAO,KAAK,MAAM,IAAI;GACnC,MAAM,OAAO,OAAO,KAAK,MAAM,IAAI;GAEnC,OAAO,OAAO,WAAW,MAAM,MAAM,aACnC,OAAO,IAAI,aAAa;IACtB,MAAM,MAAM,OAAO,OAAO,WAAW;KACnC,WAAW,OAAO,UAAU,OAAO,UAAU,QAAQ,OAAO,CAAC,YAAY,CAAC;KAC1E,OAAO;IACT,CAAC;IAED,MAAM,SAAS,OAAO,OAAO,WAAW;KACtC,WACE,OAAO,WACL;MAAE,MAAM;MAAQ,MAAM;MAAW;MAAM;KAAK,GAC5C,KACA,MAAM,SAAS,CACjB;KACF,OAAO;IACT,CAAC;IAED,OAAO,SAAS,KAAK,IAAI,WAAW,MAAM,CAAC;GAC7C,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,CAChC;EACF,CAAC,CACH;EACF,WAAW,UACT,UAAU,IACR,OAAO,IAAI,aAAa;GACtB,MAAM,QAAQ,OAAO,OAAO,eAAe,OAAO,YAAY;GAE9D,OAAO,aAAa,MAAM,MAAM;GAChC,OAAO,WAAW,SAAS,MAAM,MAAM,QAAQ,CAAC;GAChD,OAAO,WAAW,MAAM,IAAI;GAC5B,IAAI,MAAM,WAAW,KAAA,GAAW,OAAO,WAAW,SAAS,MAAM,MAAM,MAAM,CAAC;GAC9E,IAAI,MAAM,mBAAmB,KAAA,GAAW,OAAO,WAAW,MAAM,cAAc;GAE9E,IACE,MAAM,YAAY,IAAI,MAAM,eAC5B,MAAM,YAAY,OAAO,oBACzB,MAAM,SAAS,OAAO,iBACtB,MAAM,cAAc,OAAO,sBAC3B,MAAM,YAAY,MAAM,SAAS,OAAO,qBAExC,OAAO,OAAO,aAAa,KAAK,EAAE,QAAQ,aAAa,CAAC;GAC1D,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;GAEpE,MAAM,OAAO,OAAO,KAAK,MAAM,IAAI;GACnC,MAAM,iBAAiB,OAAO,KAAK,MAAM,kCAAkB,IAAI,WAAW,CAAC;GAE3E,OAAO,OAAO,WAAW,MAAM,WAAW,aAAa;IACrD,MAAM,UAAU,WACd,OAAO;KACL;KACA;KACA,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;KACzC;KACA,WAAW,MAAM;KACjB,QAAQ,MAAM;KACd,aAAa,MAAM;KACnB,QAAQ,MAAM;IAChB,CAAC,CAAC,CAAC,KAAK,OAAO,KAAK,UAAU,SAAS,KAAK,KAAK,CAAC,CAAC;IAErD,OAAO,MAAM,WAAW,KAAA,IAAY,OAAO,IAAI,WAAW,MAAM,QAAQ,MAAM;GAChF,CAAC;EACH,CAAC,CACH;CACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Aead } from "../Aead.mjs";
2
+ import { Hmac } from "../Hmac.mjs";
3
+ import { Kdf, Limits, defaultLimits } from "../Kdf.mjs";
4
+ import { Signature } from "../Signature.mjs";
5
+ import { decode } from "./common.mjs";
6
+ import { makeHmac } from "./hmac.mjs";
7
+ import { makeAead } from "./aead.mjs";
8
+ import { makeKdf } from "./kdf.mjs";
9
+ import { makeSignature } from "./signature.mjs";
10
+ import { Context, Effect, Layer } from "effect";
11
+ //#region src/internal/layer.ts
12
+ const makeLayer = (subtle, input, extensions = {}) => {
13
+ const snapshot = {
14
+ ...defaultLimits,
15
+ ...input
16
+ };
17
+ return Layer.effectContext(Effect.gen(function* () {
18
+ const limits = yield* decode(Limits, snapshot, "parameters");
19
+ const kdf = yield* makeKdf(subtle, limits, extensions.argon2);
20
+ return Context.make(Aead, makeAead(subtle, extensions.xchacha)).pipe(Context.add(Hmac, makeHmac(subtle)), Context.add(Kdf, kdf), Context.add(Signature, makeSignature(subtle)));
21
+ }));
22
+ };
23
+ //#endregion
24
+ export { makeLayer };
25
+
26
+ //# sourceMappingURL=layer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.mjs","names":[],"sources":["../../src/internal/layer.ts"],"sourcesContent":["import { Context, Effect, Layer } from \"effect\";\n\nimport { Aead } from \"../Aead\";\nimport { Hmac } from \"../Hmac\";\nimport { defaultLimits, Kdf, Limits } from \"../Kdf\";\nimport { Signature } from \"../Signature\";\nimport { makeAead, type XChaCha } from \"./aead\";\nimport { decode } from \"./common\";\nimport { makeHmac } from \"./hmac\";\nimport { type Argon2, makeKdf } from \"./kdf\";\nimport { makeSignature } from \"./signature\";\n\nexport const makeLayer = (\n subtle: SubtleCrypto,\n input: Partial<Limits>,\n extensions: { readonly argon2?: Argon2; readonly xchacha?: XChaCha } = {},\n) => {\n const snapshot = { ...defaultLimits, ...input };\n\n return Layer.effectContext(\n Effect.gen(function* () {\n const limits = yield* decode(Limits, snapshot, \"parameters\");\n const kdf = yield* makeKdf(subtle, limits, extensions.argon2);\n\n return Context.make(Aead, makeAead(subtle, extensions.xchacha)).pipe(\n Context.add(Hmac, makeHmac(subtle)),\n Context.add(Kdf, kdf),\n Context.add(Signature, makeSignature(subtle)),\n );\n }),\n );\n};\n"],"mappings":";;;;;;;;;;;AAYA,MAAa,aACX,QACA,OACA,aAAuE,CAAC,MACrE;CACH,MAAM,WAAW;EAAE,GAAG;EAAe,GAAG;CAAM;CAE9C,OAAO,MAAM,cACX,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO,OAAO,QAAQ,UAAU,YAAY;EAC3D,MAAM,MAAM,OAAO,QAAQ,QAAQ,QAAQ,WAAW,MAAM;EAE5D,OAAO,QAAQ,KAAK,MAAM,SAAS,QAAQ,WAAW,OAAO,CAAC,CAAC,CAAC,KAC9D,QAAQ,IAAI,MAAM,SAAS,MAAM,CAAC,GAClC,QAAQ,IAAI,KAAK,GAAG,GACpB,QAAQ,IAAI,WAAW,cAAc,MAAM,CAAC,CAC9C;CACF,CAAC,CACH;AACF"}
@@ -0,0 +1,11 @@
1
+ import { InvalidInput } from "../Errors.mjs";
2
+ import { Aead } from "../Aead.mjs";
3
+ import { Hmac } from "../Hmac.mjs";
4
+ import { Kdf, Limits } from "../Kdf.mjs";
5
+ import { KdfAdmission } from "../KdfAdmission.mjs";
6
+ import { Signature } from "../Signature.mjs";
7
+ //#region src/internal/node.d.ts
8
+ /** Node-compatible WebCrypto/Argon2id with the portable XChaCha20-Poly1305 extension. */
9
+ export declare const layer: (limits?: Partial<Limits>) => import("effect/Layer").Layer<Aead | Hmac | Kdf | Signature, InvalidInput, KdfAdmission>;
10
+ //#endregion
11
+ //# sourceMappingURL=node.d.mts.map