@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.
- package/LICENSE +21 -0
- package/README.md +39 -2
- package/THIRD_PARTY_NOTICES.md +378 -0
- package/dist/Aead.d.mts +34 -0
- package/dist/Aead.mjs +28 -0
- package/dist/Aead.mjs.map +1 -0
- package/dist/Errors.d.mts +20 -0
- package/dist/Errors.mjs +19 -0
- package/dist/Errors.mjs.map +1 -0
- package/dist/Hmac.d.mts +39 -0
- package/dist/Hmac.mjs +26 -0
- package/dist/Hmac.mjs.map +1 -0
- package/dist/Kdf.d.mts +54 -0
- package/dist/Kdf.mjs +78 -0
- package/dist/Kdf.mjs.map +1 -0
- package/dist/KdfAdmission.d.mts +24 -0
- package/dist/KdfAdmission.mjs +48 -0
- package/dist/KdfAdmission.mjs.map +1 -0
- package/dist/Portable.d.mts +11 -0
- package/dist/Portable.mjs +13 -0
- package/dist/Portable.mjs.map +1 -0
- package/dist/Signature.d.mts +70 -0
- package/dist/Signature.mjs +73 -0
- package/dist/Signature.mjs.map +1 -0
- package/dist/WebCrypto.d.mts +20 -0
- package/dist/WebCrypto.mjs +33 -0
- package/dist/WebCrypto.mjs.map +1 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.mjs +7 -0
- package/dist/internal/aead.mjs +81 -0
- package/dist/internal/aead.mjs.map +1 -0
- package/dist/internal/argon2-core.mjs +293 -0
- package/dist/internal/argon2-core.mjs.map +1 -0
- package/dist/internal/argon2.mjs +16 -0
- package/dist/internal/argon2.mjs.map +1 -0
- package/dist/internal/blake2b.mjs +359 -0
- package/dist/internal/blake2b.mjs.map +1 -0
- package/dist/internal/common.mjs +20 -0
- package/dist/internal/common.mjs.map +1 -0
- package/dist/internal/hmac.mjs +68 -0
- package/dist/internal/hmac.mjs.map +1 -0
- package/dist/internal/kdf.mjs +99 -0
- package/dist/internal/kdf.mjs.map +1 -0
- package/dist/internal/layer.mjs +26 -0
- package/dist/internal/layer.mjs.map +1 -0
- package/dist/internal/node.d.mts +11 -0
- package/dist/internal/node.mjs +34 -0
- package/dist/internal/node.mjs.map +1 -0
- package/dist/internal/poly1305.mjs +247 -0
- package/dist/internal/poly1305.mjs.map +1 -0
- package/dist/internal/signature.mjs +140 -0
- package/dist/internal/signature.mjs.map +1 -0
- package/dist/internal/word64.mjs +25 -0
- package/dist/internal/word64.mjs.map +1 -0
- package/dist/internal/xchacha-core.mjs +285 -0
- package/dist/internal/xchacha-core.mjs.map +1 -0
- package/dist/internal/xchacha.mjs +21 -0
- package/dist/internal/xchacha.mjs.map +1 -0
- package/dist/platform-bun.d.mts +2 -0
- package/dist/platform-bun.mjs +2 -0
- package/dist/platform-node.d.mts +2 -0
- package/dist/platform-node.mjs +2 -0
- package/package.json +1 -6
- package/src/Aead.ts +39 -0
- package/src/Errors.ts +27 -0
- package/src/Hmac.ts +41 -0
- package/src/Kdf.ts +87 -0
- package/src/KdfAdmission.ts +87 -0
- package/src/Portable.ts +8 -0
- package/src/Signature.ts +87 -0
- package/src/WebCrypto.ts +46 -0
- package/src/index.ts +6 -0
- package/src/internal/aead.ts +119 -0
- package/src/internal/argon2-core.ts +470 -0
- package/src/internal/argon2.ts +23 -0
- package/src/internal/blake2b.ts +230 -0
- package/src/internal/common.ts +44 -0
- package/src/internal/hmac.ts +111 -0
- package/src/internal/kdf.ts +150 -0
- package/src/internal/layer.ts +32 -0
- package/src/internal/node.ts +46 -0
- package/src/internal/poly1305.ts +289 -0
- package/src/internal/signature.ts +188 -0
- package/src/internal/word64.ts +48 -0
- package/src/internal/xchacha-core.ts +397 -0
- package/src/internal/xchacha.ts +26 -0
- package/src/platform-bun.ts +2 -0
- 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":";;;;;;;AAOA,MAAM,SAAyB,4BAAY,KAAK;CAC9C;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CACpF;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;CAAY;AACtF,CAAC;AAED,MAAM,SAAyB,2BAAW,KAAK;CAC7C;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAG;CAAG;CAAG;CAAI;CAAI;CAAG;CAAG;CAAI;CAAG;CAAG;CAC/F;CAAG;CAAG;CAAG;CAAI;CAAG;CAAI;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAI;CAAG;CAC9F;CAAG;CAAI;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAG;CAAI;CAAI;CAAG;CAAG;CAAG;CAAI;CAAG;CAAI;CAAG;CAAI;CAAG;CAAI;CAC/F;CAAG;CAAG;CAAI;CAAG;CAAG;CAAI;CAAI;CAAG;CAAG;CAAI;CAAG;CAAG;CAAI;CAAI;CAAI;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAAG;CAC/F;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAG;CAAG;CAAG;CAAI;CAAG;CAAI;CAAI;CAAG;CAAI;CAAG;CAAG;CAAG;CAAI;CAAG;CAAI;CAAG;CAAG;CAAG;CAAI;CAAG;CAC7F;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAG;CAAI;CAAG;CAAI;CAAI;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;CAAI;CAC5F;CAAI;CAAI;CAAI;CAAI;CAAG;CAAG;CAAG;CAAI;CAAI;CAAG;CAAG;CAAI;CAAG;CAAG;CAAI;CAAG;CAAG;AAC7D,CAAC;AAGD,SAAS,IACP,MACA,GACA,GACA,GACA,GACA,KACA,GACA;CAEA,MAAM,KAAK,IAAI,IACb,KAAK,IAAI,IAAI;CAEf,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAEpB,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAEpB,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAEpB,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAGpB,MAAM,KAAKA,MAAU,IAAI,IAAI,EAAE;CAE/B,KAAKC,MAAU,IAAI,IAAI,IAAI,EAAE;CAC7B,KAAK,KAAK;CAGV,IAAI,KAAK,KAAK,IACZ,KAAK,KAAK;CAEZ,KAAKC,QAAY,IAAI,EAAE;CACvB,KAAKC,QAAY,IAAI,EAAE;CAEvB,CAAC,CAAE,GAAG,IAAI,GAAG,MAAOC,IAAQ,IAAI,IAAI,IAAI,EAAE;CAE1C,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAKC,OAAW,IAAI,IAAI,EAAE;CAC1B,KAAKC,OAAW,IAAI,IAAI,EAAE;CAC1B,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;CAClB,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;CAClB,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;CAClB,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;AACpB;AAGA,SAAS,IACP,MACA,GACA,GACA,GACA,GACA,KACA,GACA;CAEA,MAAM,KAAK,IAAI,IACb,KAAK,IAAI,IAAI;CAEf,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAEpB,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAEpB,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAEpB,IAAI,KAAK,KAAK,IAAI,IAChB,KAAK,KAAK,IAAI,IAAI;CAGpB,MAAM,KAAKN,MAAU,IAAI,IAAI,EAAE;CAE/B,KAAKC,MAAU,IAAI,IAAI,IAAI,EAAE;CAC7B,KAAK,KAAK;CAGV,IAAI,KAAK,KAAK,IACZ,KAAK,KAAK;CAEZ,KAAKI,OAAW,IAAI,IAAI,EAAE;CAC1B,KAAKC,OAAW,IAAI,IAAI,EAAE;CAE1B,CAAC,CAAE,GAAG,IAAI,GAAG,MAAOF,IAAQ,IAAI,IAAI,IAAI,EAAE;CAE1C,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAKG,OAAW,IAAI,IAAI,EAAE;CAC1B,KAAKC,OAAW,IAAI,IAAI,EAAE;CAC1B,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;CAClB,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;CAClB,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;CAClB,KAAK,IAAI,KAAK;CACd,KAAK,IAAI,IAAI,KAAK;AACpB;;AAGA,IAAa,UAAb,MAAqB;CASU;CAR7B,QAAyB,OAAO,MAAM;CACtC,yBAA0B,IAAI,WAAW,GAAG;CAC5C,wBAAyB,IAAI,YAAY,EAAE;CAC3C,wBAAyB,IAAI,YAAY,EAAE;CAC3C,OAAwB,IAAI,SAAS,KAAK,OAAO,MAAM;CACvD,SAAiB;CACjB,WAAmB;CAEnB,YAAY,eAAgC,IAAI;EAAnB,KAAA,eAAA;EAC3B,KAAK,MAAM,MAAM,WAAa;CAChC;CAEA,OAAO,MAAwB;EAC7B,KAAK,IAAI,WAAW,GAAG,WAAW,KAAK,SAAS;GAE9C,IAAI,KAAK,aAAa,KAAK;IACzB,KAAK,SAAS,KAAK;IACnB,KAAK,WAAW;GAClB;GACA,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK,UAAU,KAAK,SAAS,QAAQ;GAEjE,KAAK,OAAO,IAAI,KAAK,SAAS,UAAU,WAAW,IAAI,GAAG,KAAK,QAAQ;GACvE,KAAK,YAAY;GACjB,KAAK,UAAU;GACf,YAAY;EACd;EAEA,OAAO;CACT;CAEA,SAAiB,MAAqB;EACpC,MAAM,OAAO,KAAK;EAClB,MAAM,MAAM,KAAK;EAEjB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,UAAU,IAAI,GAAG,IAAI;EACrE,KAAK,IAAI,KAAK,KAAK;EACnB,KAAK,IAAI,QAAQ,EAAE;EACnB,KAAK,OAAO,KAAK,WAAW;EAC5B,KAAK,OAAQ,KAAK,SAAS,aAAe;EAC1C,IAAI,MAAM;GACR,KAAK,MAAM,CAAC,KAAK;GACjB,KAAK,MAAM,CAAC,KAAK;EACnB;EACA,IAAI,IAAI;EACR,MAAM,IAAI;EAIV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;GAC3B,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GAEvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI;GACvC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;GACtC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI;EACxC;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,IAAI;EACjE,KAAK,KAAK,CAAC;EACX,IAAI,KAAK,CAAC;CACZ;CAEA,SAAqB;EACnB,IAAI;GACF,KAAK,OAAO,KAAK,GAAG,KAAK,QAAQ;GACjC,KAAK,SAAS,IAAI;GAClB,MAAM,MAAM,IAAI,WAAW,KAAK,YAAY;GAE5C,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM,OAAQ,KAAK,IAAI;GAEhF,OAAO;EACT,UAAU;GACR,KAAK,QAAQ;EACf;CACF;CAEA,UAAgB;EACd,KAAK,MAAM,KAAK,CAAC;EACjB,KAAK,OAAO,KAAK,CAAC;EAClB,KAAK,MAAM,KAAK,CAAC;EACjB,KAAK,MAAM,KAAK,CAAC;EACjB,KAAK,SAAS;EACd,KAAK,WAAW;CAClB;AACF"}
|
|
@@ -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":"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"}
|
|
@@ -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
|