@yielded/crypto 0.1.0-beta.30 → 0.1.0-beta.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -9
- package/THIRD_PARTY_NOTICES.md +3 -0
- package/dist/Kdf.d.mts +16 -2
- package/dist/Kdf.mjs +21 -3
- package/dist/Kdf.mjs.map +1 -1
- package/dist/Portable.d.mts +2 -1
- package/dist/Portable.mjs +3 -1
- package/dist/Portable.mjs.map +1 -1
- package/dist/WebCrypto.mjs +2 -1
- package/dist/WebCrypto.mjs.map +1 -1
- package/dist/internal/argon2-core.mjs +19 -12
- package/dist/internal/argon2-core.mjs.map +1 -1
- package/dist/internal/argon2-wasm.mjs +33 -0
- package/dist/internal/argon2-wasm.mjs.map +1 -0
- package/dist/internal/argon2.mjs +6 -5
- package/dist/internal/argon2.mjs.map +1 -1
- package/dist/internal/argon2.wasm +0 -0
- package/dist/internal/kdf.mjs +21 -1
- package/dist/internal/kdf.mjs.map +1 -1
- package/dist/internal/layer.mjs.map +1 -1
- package/dist/internal/node.d.mts +3 -2
- package/dist/internal/node.mjs +4 -3
- package/dist/internal/node.mjs.map +1 -1
- package/dist/internal/scrypt-backend.mjs +10 -0
- package/dist/internal/scrypt-backend.mjs.map +1 -0
- package/dist/internal/scrypt.mjs +25 -0
- package/dist/internal/scrypt.mjs.map +1 -0
- package/dist/platform-workerd.d.mts +14 -0
- package/dist/platform-workerd.mjs +18 -0
- package/dist/platform-workerd.mjs.map +1 -0
- package/package.json +1 -1
- package/src/Kdf.ts +20 -2
- package/src/Portable.ts +4 -1
- package/src/WebCrypto.ts +2 -1
- package/src/internal/argon2-block.c +76 -0
- package/src/internal/argon2-core.ts +36 -12
- package/src/internal/argon2-wasm.ts +59 -0
- package/src/internal/argon2.ts +28 -23
- package/src/internal/argon2.wasm +0 -0
- package/src/internal/kdf.ts +39 -1
- package/src/internal/layer.ts +4 -1
- package/src/internal/node.ts +6 -3
- package/src/internal/scrypt-backend.ts +25 -0
- package/src/internal/scrypt.ts +38 -0
- package/src/internal/wasm.d.ts +5 -0
- package/src/platform-workerd.ts +16 -0
package/README.md
CHANGED
|
@@ -17,16 +17,15 @@ an implementation through a direct backend import:
|
|
|
17
17
|
web adapters for Effect entropy/digests and HMAC.
|
|
18
18
|
- `/Portable`: WebCrypto plus owned Argon2id and XChaCha20-Poly1305 implementations.
|
|
19
19
|
- `/platform-node`, `/platform-bun`: shared Node-compatible WebCrypto and native
|
|
20
|
-
Argon2id, plus the owned XChaCha20-Poly1305 implementation.
|
|
20
|
+
Argon2id and scrypt, plus the owned XChaCha20-Poly1305 implementation.
|
|
21
|
+
- `/platform-workerd`: supplied WebCrypto, Wasm Argon2id, native scrypt and owned
|
|
22
|
+
XChaCha20-Poly1305. Wrangler bundles the included Wasm module; consumers need
|
|
23
|
+
no compiler. This backend requires Workers Node.js compatibility.
|
|
21
24
|
|
|
22
|
-
Full backend Layers require one shared `KdfAdmission` Layer
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
including interruption. Portable Argon2id yields through Effect between time slices,
|
|
27
|
-
accepts interruption, and clears its work buffers before releasing admission. It
|
|
28
|
-
still runs on the calling thread. JavaScript cannot guarantee zeroization or
|
|
29
|
-
constant-time execution.
|
|
25
|
+
Full backend Layers require one shared `KdfAdmission` Layer to bound derivation
|
|
26
|
+
concurrency and waiting. Interruption waits for admitted native work to finish;
|
|
27
|
+
portable Argon2id yields cooperatively but runs on the calling thread. The focused
|
|
28
|
+
`WebCrypto.layerHmac(subtle)` and global `layerWebCrypto` adapters need no KDF admission.
|
|
30
29
|
|
|
31
30
|
Secret inputs, derived bytes and decrypted plaintext use `Redacted`. Backend
|
|
32
31
|
errors contain classifications without native causes or secret payloads. Keep
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -21,6 +21,9 @@ and [noble-ciphers](https://github.com/paulmillr/noble-ciphers).
|
|
|
21
21
|
into `src/internal/argon2-core.ts`, `blake2b.ts`, and `word64.ts`. The port retains
|
|
22
22
|
Argon2id v19 and its unkeyed BLAKE2b machinery, with per-derivation work buffers,
|
|
23
23
|
explicit little-endian encoding, and an Effect driver in `src/internal/argon2.ts`.
|
|
24
|
+
`src/internal/argon2-block.c` expresses the same block compression with Wasm SIMD;
|
|
25
|
+
`src/internal/argon2.wasm` is its compiled artifact. The workerd backend shares
|
|
26
|
+
the portable initialization, indexing, finalization and Effect scheduling.
|
|
24
27
|
- noble-ciphers 2.1.1, revision `785181b0772ba84afbe812025714163e4e48262f`:
|
|
25
28
|
AEAD test behavior and independent vectors informed `test/primitives.test.ts`
|
|
26
29
|
and `test/vectors.ts`. `src/chacha.ts`, `src/_poly1305.ts`, and the stream/nonce
|
package/dist/Kdf.d.mts
CHANGED
|
@@ -12,6 +12,15 @@ export declare const Argon2idInput: Schema.Struct<{
|
|
|
12
12
|
readonly associatedData: Schema.optionalKey<Schema.Uint8Array>;
|
|
13
13
|
}>;
|
|
14
14
|
export type Argon2idInput = typeof Argon2idInput.Type;
|
|
15
|
+
export declare const ScryptInput: Schema.Struct<{
|
|
16
|
+
readonly password: Schema.Redacted<Schema.Uint8Array>;
|
|
17
|
+
readonly salt: Schema.Uint8Array;
|
|
18
|
+
readonly cost: Schema.Int;
|
|
19
|
+
readonly blockSize: Schema.Int;
|
|
20
|
+
readonly parallelism: Schema.Int;
|
|
21
|
+
readonly length: Schema.Int;
|
|
22
|
+
}>;
|
|
23
|
+
export type ScryptInput = typeof ScryptInput.Type;
|
|
15
24
|
export declare const Pbkdf2Input: Schema.Struct<{
|
|
16
25
|
readonly password: Schema.Redacted<Schema.Uint8Array>;
|
|
17
26
|
readonly salt: Schema.Uint8Array;
|
|
@@ -26,7 +35,10 @@ export declare const HkdfInput: Schema.Struct<{
|
|
|
26
35
|
readonly length: Schema.Int;
|
|
27
36
|
}>;
|
|
28
37
|
export type HkdfInput = typeof HkdfInput.Type;
|
|
29
|
-
/** Resource ceilings, not a password-strength policy. Limits apply per permit.
|
|
38
|
+
/** Resource ceilings, not a password-strength policy. Limits apply per permit.
|
|
39
|
+
* Scrypt bounds its allocation by maximumMemoryKiB and N*r*p/8 by
|
|
40
|
+
* maximumMemoryPasses. maximumPasses/maximumParallelism apply to Argon2id.
|
|
41
|
+
*/
|
|
30
42
|
export declare const Limits: Schema.Struct<{
|
|
31
43
|
readonly maximumMemoryKiB: Schema.Int;
|
|
32
44
|
readonly maximumPasses: Schema.Int;
|
|
@@ -40,12 +52,14 @@ export type Limits = typeof Limits.Type;
|
|
|
40
52
|
export declare const defaultLimits: Limits;
|
|
41
53
|
declare const Kdf_base: Context.ServiceClass<Kdf, "@yielded/crypto/Kdf", {
|
|
42
54
|
readonly argon2id: (input: Argon2idInput) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;
|
|
55
|
+
readonly scrypt: (input: ScryptInput) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;
|
|
43
56
|
readonly pbkdf2: (input: Pbkdf2Input) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;
|
|
44
57
|
readonly hkdf: (input: HkdfInput) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;
|
|
45
58
|
}>;
|
|
46
59
|
/**
|
|
47
60
|
* Byte-preserving derivation; no text normalization, PHC parsing or password policy.
|
|
48
|
-
* Argon2id uses version 19; PBKDF2 and HKDF use SHA-256.
|
|
61
|
+
* Argon2id uses version 19; PBKDF2 and HKDF use SHA-256. Scrypt names N/r/p as
|
|
62
|
+
* cost/blockSize/parallelism. A backend captures shared
|
|
49
63
|
* KdfAdmission when its Layer is built and retains admission until work and cleanup
|
|
50
64
|
* finish, including when a native operation cannot be cancelled.
|
|
51
65
|
*/
|
package/dist/Kdf.mjs
CHANGED
|
@@ -25,6 +25,20 @@ const Argon2idInput = Schema.Struct({
|
|
|
25
25
|
secret: Schema.optionalKey(argon2Secret),
|
|
26
26
|
associatedData: Schema.optionalKey(argon2Bytes)
|
|
27
27
|
});
|
|
28
|
+
const ScryptInput = Schema.Struct({
|
|
29
|
+
password: secret,
|
|
30
|
+
salt: bytes,
|
|
31
|
+
cost: Schema.Int.check(Schema.isBetween({
|
|
32
|
+
minimum: 2,
|
|
33
|
+
maximum: 2147483648
|
|
34
|
+
})),
|
|
35
|
+
blockSize: uint32,
|
|
36
|
+
parallelism: uint32,
|
|
37
|
+
length: Schema.Int.check(Schema.isBetween({
|
|
38
|
+
minimum: 1,
|
|
39
|
+
maximum: 2147483647
|
|
40
|
+
}))
|
|
41
|
+
});
|
|
28
42
|
const Pbkdf2Input = Schema.Struct({
|
|
29
43
|
password: secret,
|
|
30
44
|
salt: bytes,
|
|
@@ -46,7 +60,10 @@ const HkdfInput = Schema.Struct({
|
|
|
46
60
|
maximum: 8160
|
|
47
61
|
}))
|
|
48
62
|
});
|
|
49
|
-
/** Resource ceilings, not a password-strength policy. Limits apply per permit.
|
|
63
|
+
/** Resource ceilings, not a password-strength policy. Limits apply per permit.
|
|
64
|
+
* Scrypt bounds its allocation by maximumMemoryKiB and N*r*p/8 by
|
|
65
|
+
* maximumMemoryPasses. maximumPasses/maximumParallelism apply to Argon2id.
|
|
66
|
+
*/
|
|
50
67
|
const Limits = Schema.Struct({
|
|
51
68
|
maximumMemoryKiB: positive,
|
|
52
69
|
maximumPasses: positive,
|
|
@@ -67,12 +84,13 @@ const defaultLimits = Object.freeze({
|
|
|
67
84
|
});
|
|
68
85
|
/**
|
|
69
86
|
* Byte-preserving derivation; no text normalization, PHC parsing or password policy.
|
|
70
|
-
* Argon2id uses version 19; PBKDF2 and HKDF use SHA-256.
|
|
87
|
+
* Argon2id uses version 19; PBKDF2 and HKDF use SHA-256. Scrypt names N/r/p as
|
|
88
|
+
* cost/blockSize/parallelism. A backend captures shared
|
|
71
89
|
* KdfAdmission when its Layer is built and retains admission until work and cleanup
|
|
72
90
|
* finish, including when a native operation cannot be cancelled.
|
|
73
91
|
*/
|
|
74
92
|
var Kdf = class extends Context.Service()("@yielded/crypto/Kdf") {};
|
|
75
93
|
//#endregion
|
|
76
|
-
export { Argon2idInput, HkdfInput, Kdf, Limits, Pbkdf2Input, defaultLimits };
|
|
94
|
+
export { Argon2idInput, HkdfInput, Kdf, Limits, Pbkdf2Input, ScryptInput, defaultLimits };
|
|
77
95
|
|
|
78
96
|
//# sourceMappingURL=Kdf.mjs.map
|
package/dist/Kdf.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kdf.mjs","names":[],"sources":["../src/Kdf.ts"],"sourcesContent":["import { Context, type Effect, type Redacted, Schema } from \"effect\";\n\nimport type { KdfBusy, OperationError } from \"./Errors\";\n\nconst positive = Schema.Int.check(Schema.isGreaterThan(0));\nconst uint32 = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0xffffffff }));\nconst bytes = Schema.Uint8Array;\nconst secret = Schema.Redacted(bytes, { disallowJsonEncode: true });\nconst argon2Bytes = bytes.check(Schema.isMaxLength(0xffffffff));\nconst argon2Secret = Schema.Redacted(argon2Bytes, { disallowJsonEncode: true });\n\nexport const Argon2idInput = Schema.Struct({\n password: argon2Secret,\n salt: argon2Bytes.check(Schema.isMinLength(8)),\n memoryKiB: uint32,\n passes: uint32,\n parallelism: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0xffffff })),\n length: Schema.Int.check(Schema.isBetween({ minimum: 4, maximum: 0xffffffff })),\n secret: Schema.optionalKey(argon2Secret),\n associatedData: Schema.optionalKey(argon2Bytes),\n});\n\nexport type Argon2idInput = typeof Argon2idInput.Type;\n\nexport const Pbkdf2Input = Schema.Struct({\n password: secret,\n salt: bytes,\n // Native Node/Bun PBKDF2 accepts a positive signed 32-bit iteration count.\n iterations: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0x7fffffff })),\n // WebCrypto takes an unsigned 32-bit bit count; this API takes whole bytes.\n length: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0x1fffffff })),\n});\n\nexport type Pbkdf2Input = typeof Pbkdf2Input.Type;\n\nexport const HkdfInput = Schema.Struct({\n key: secret,\n salt: bytes,\n info: bytes.check(Schema.isMaxLength(1024)),\n length: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 255 * 32 })),\n});\n\nexport type HkdfInput = typeof HkdfInput.Type;\n\n/** Resource ceilings, not a password-strength policy. Limits apply per permit. */\nexport const Limits = Schema.Struct({\n maximumMemoryKiB: positive,\n maximumPasses: positive,\n maximumParallelism: positive,\n maximumMemoryPasses: positive,\n maximumIterations: positive,\n maximumInputBytes: positive,\n maximumOutputBytes: positive,\n});\n\nexport type Limits = typeof Limits.Type;\n\nexport const defaultLimits: Limits = Object.freeze({\n maximumMemoryKiB: 65536,\n maximumPasses: 6,\n maximumParallelism: 4,\n maximumMemoryPasses: 131072,\n maximumIterations: 1000000,\n maximumInputBytes: 65536,\n maximumOutputBytes: 1024,\n});\n\n/**\n * Byte-preserving derivation; no text normalization, PHC parsing or password policy.\n * Argon2id uses version 19; PBKDF2 and HKDF use SHA-256. A backend captures shared\n * KdfAdmission when its Layer is built and retains admission until work and cleanup\n * finish, including when a native operation cannot be cancelled.\n */\nexport class Kdf extends Context.Service<\n Kdf,\n {\n readonly argon2id: (\n input: Argon2idInput,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n readonly pbkdf2: (\n input: Pbkdf2Input,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n readonly hkdf: (\n input: HkdfInput,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n }\n>()(\"@yielded/crypto/Kdf\") {}\n"],"mappings":";;AAIA,MAAM,WAAW,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;AACzD,MAAM,SAAS,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAW,CAAC,CAAC;AACrF,MAAM,QAAQ,OAAO;AACrB,MAAM,SAAS,OAAO,SAAS,OAAO,EAAE,oBAAoB,KAAK,CAAC;AAClE,MAAM,cAAc,MAAM,MAAM,OAAO,YAAY,UAAU,CAAC;AAC9D,MAAM,eAAe,OAAO,SAAS,aAAa,EAAE,oBAAoB,KAAK,CAAC;AAE9E,MAAa,gBAAgB,OAAO,OAAO;CACzC,UAAU;CACV,MAAM,YAAY,MAAM,OAAO,YAAY,CAAC,CAAC;CAC7C,WAAW;CACX,QAAQ;CACR,aAAa,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAS,CAAC,CAAC;CACjF,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;CAC9E,QAAQ,OAAO,YAAY,YAAY;CACvC,gBAAgB,OAAO,YAAY,WAAW;AAChD,CAAC;AAID,MAAa,cAAc,OAAO,OAAO;CACvC,UAAU;CACV,MAAM;CAEN,YAAY,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;CAElF,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;AAChF,CAAC;AAID,MAAa,YAAY,OAAO,OAAO;CACrC,KAAK;CACL,MAAM;CACN,MAAM,MAAM,MAAM,OAAO,YAAY,IAAI,CAAC;CAC1C,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAS,CAAC,CAAC;AAC9E,CAAC
|
|
1
|
+
{"version":3,"file":"Kdf.mjs","names":[],"sources":["../src/Kdf.ts"],"sourcesContent":["import { Context, type Effect, type Redacted, Schema } from \"effect\";\n\nimport type { KdfBusy, OperationError } from \"./Errors\";\n\nconst positive = Schema.Int.check(Schema.isGreaterThan(0));\nconst uint32 = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0xffffffff }));\nconst bytes = Schema.Uint8Array;\nconst secret = Schema.Redacted(bytes, { disallowJsonEncode: true });\nconst argon2Bytes = bytes.check(Schema.isMaxLength(0xffffffff));\nconst argon2Secret = Schema.Redacted(argon2Bytes, { disallowJsonEncode: true });\n\nexport const Argon2idInput = Schema.Struct({\n password: argon2Secret,\n salt: argon2Bytes.check(Schema.isMinLength(8)),\n memoryKiB: uint32,\n passes: uint32,\n parallelism: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0xffffff })),\n length: Schema.Int.check(Schema.isBetween({ minimum: 4, maximum: 0xffffffff })),\n secret: Schema.optionalKey(argon2Secret),\n associatedData: Schema.optionalKey(argon2Bytes),\n});\n\nexport type Argon2idInput = typeof Argon2idInput.Type;\n\nexport const ScryptInput = Schema.Struct({\n password: secret,\n salt: bytes,\n cost: Schema.Int.check(Schema.isBetween({ minimum: 2, maximum: 0x80000000 })),\n blockSize: uint32,\n parallelism: uint32,\n length: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0x7fffffff })),\n});\n\nexport type ScryptInput = typeof ScryptInput.Type;\n\nexport const Pbkdf2Input = Schema.Struct({\n password: secret,\n salt: bytes,\n // Native Node/Bun PBKDF2 accepts a positive signed 32-bit iteration count.\n iterations: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0x7fffffff })),\n // WebCrypto takes an unsigned 32-bit bit count; this API takes whole bytes.\n length: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 0x1fffffff })),\n});\n\nexport type Pbkdf2Input = typeof Pbkdf2Input.Type;\n\nexport const HkdfInput = Schema.Struct({\n key: secret,\n salt: bytes,\n info: bytes.check(Schema.isMaxLength(1024)),\n length: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 255 * 32 })),\n});\n\nexport type HkdfInput = typeof HkdfInput.Type;\n\n/** Resource ceilings, not a password-strength policy. Limits apply per permit.\n * Scrypt bounds its allocation by maximumMemoryKiB and N*r*p/8 by\n * maximumMemoryPasses. maximumPasses/maximumParallelism apply to Argon2id.\n */\nexport const Limits = Schema.Struct({\n maximumMemoryKiB: positive,\n maximumPasses: positive,\n maximumParallelism: positive,\n maximumMemoryPasses: positive,\n maximumIterations: positive,\n maximumInputBytes: positive,\n maximumOutputBytes: positive,\n});\n\nexport type Limits = typeof Limits.Type;\n\nexport const defaultLimits: Limits = Object.freeze({\n maximumMemoryKiB: 65536,\n maximumPasses: 6,\n maximumParallelism: 4,\n maximumMemoryPasses: 131072,\n maximumIterations: 1000000,\n maximumInputBytes: 65536,\n maximumOutputBytes: 1024,\n});\n\n/**\n * Byte-preserving derivation; no text normalization, PHC parsing or password policy.\n * Argon2id uses version 19; PBKDF2 and HKDF use SHA-256. Scrypt names N/r/p as\n * cost/blockSize/parallelism. A backend captures shared\n * KdfAdmission when its Layer is built and retains admission until work and cleanup\n * finish, including when a native operation cannot be cancelled.\n */\nexport class Kdf extends Context.Service<\n Kdf,\n {\n readonly argon2id: (\n input: Argon2idInput,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n readonly scrypt: (\n input: ScryptInput,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n readonly pbkdf2: (\n input: Pbkdf2Input,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n readonly hkdf: (\n input: HkdfInput,\n ) => Effect.Effect<Redacted.Redacted<Uint8Array>, OperationError | KdfBusy>;\n }\n>()(\"@yielded/crypto/Kdf\") {}\n"],"mappings":";;AAIA,MAAM,WAAW,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;AACzD,MAAM,SAAS,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAW,CAAC,CAAC;AACrF,MAAM,QAAQ,OAAO;AACrB,MAAM,SAAS,OAAO,SAAS,OAAO,EAAE,oBAAoB,KAAK,CAAC;AAClE,MAAM,cAAc,MAAM,MAAM,OAAO,YAAY,UAAU,CAAC;AAC9D,MAAM,eAAe,OAAO,SAAS,aAAa,EAAE,oBAAoB,KAAK,CAAC;AAE9E,MAAa,gBAAgB,OAAO,OAAO;CACzC,UAAU;CACV,MAAM,YAAY,MAAM,OAAO,YAAY,CAAC,CAAC;CAC7C,WAAW;CACX,QAAQ;CACR,aAAa,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAS,CAAC,CAAC;CACjF,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;CAC9E,QAAQ,OAAO,YAAY,YAAY;CACvC,gBAAgB,OAAO,YAAY,WAAW;AAChD,CAAC;AAID,MAAa,cAAc,OAAO,OAAO;CACvC,UAAU;CACV,MAAM;CACN,MAAM,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;CAC5E,WAAW;CACX,aAAa;CACb,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;AAChF,CAAC;AAID,MAAa,cAAc,OAAO,OAAO;CACvC,UAAU;CACV,MAAM;CAEN,YAAY,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;CAElF,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC;AAChF,CAAC;AAID,MAAa,YAAY,OAAO,OAAO;CACrC,KAAK;CACL,MAAM;CACN,MAAM,MAAM,MAAM,OAAO,YAAY,IAAI,CAAC;CAC1C,QAAQ,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAS,CAAC,CAAC;AAC9E,CAAC;;;;;AAQD,MAAa,SAAS,OAAO,OAAO;CAClC,kBAAkB;CAClB,eAAe;CACf,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;AACtB,CAAC;AAID,MAAa,gBAAwB,OAAO,OAAO;CACjD,kBAAkB;CAClB,eAAe;CACf,oBAAoB;CACpB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;AACtB,CAAC;;;;;;;;AASD,IAAa,MAAb,cAAyB,QAAQ,QAgB/B,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC"}
|
package/dist/Portable.d.mts
CHANGED
|
@@ -4,8 +4,9 @@ import { Hmac } from "./Hmac.mjs";
|
|
|
4
4
|
import { Kdf, Limits } from "./Kdf.mjs";
|
|
5
5
|
import { KdfAdmission } from "./KdfAdmission.mjs";
|
|
6
6
|
import { Signature } from "./Signature.mjs";
|
|
7
|
+
import { Layer } from "effect";
|
|
7
8
|
//#region src/Portable.d.ts
|
|
8
9
|
/** WebCrypto with owned, portable Argon2id and XChaCha20-Poly1305 implementations. */
|
|
9
|
-
export declare const layer: (subtle: SubtleCrypto, limits?: Partial<Limits>) =>
|
|
10
|
+
export declare const layer: (subtle: SubtleCrypto, limits?: Partial<Limits>) => Layer.Layer<Aead | Hmac | Kdf | Signature, InvalidInput, KdfAdmission>;
|
|
10
11
|
//#endregion
|
|
11
12
|
//# sourceMappingURL=Portable.d.mts.map
|
package/dist/Portable.mjs
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { layerUnsupported } from "./internal/scrypt-backend.mjs";
|
|
1
2
|
import { makeLayer } from "./internal/layer.mjs";
|
|
2
3
|
import { xchacha } from "./internal/xchacha.mjs";
|
|
3
4
|
import { argon2 } from "./internal/argon2.mjs";
|
|
5
|
+
import { Layer } from "effect";
|
|
4
6
|
//#region src/Portable.ts
|
|
5
7
|
/** WebCrypto with owned, portable Argon2id and XChaCha20-Poly1305 implementations. */
|
|
6
8
|
const layer = (subtle, limits = {}) => makeLayer(subtle, limits, {
|
|
7
9
|
argon2,
|
|
8
10
|
xchacha
|
|
9
|
-
});
|
|
11
|
+
}).pipe(Layer.provide(layerUnsupported));
|
|
10
12
|
//#endregion
|
|
11
13
|
export { layer };
|
|
12
14
|
|
package/dist/Portable.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Portable.mjs","names":[],"sources":["../src/Portable.ts"],"sourcesContent":["import { argon2 } from \"./internal/argon2\";\nimport { makeLayer } from \"./internal/layer\";\nimport { xchacha } from \"./internal/xchacha\";\nimport type { Limits } from \"./Kdf\";\n\n/** WebCrypto with owned, portable Argon2id and XChaCha20-Poly1305 implementations. */\nexport const layer = (subtle: SubtleCrypto, limits: Partial<Limits> = {}) =>\n makeLayer(subtle, limits, { argon2, xchacha });\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Portable.mjs","names":[],"sources":["../src/Portable.ts"],"sourcesContent":["import { Layer } from \"effect\";\n\nimport { argon2 } from \"./internal/argon2\";\nimport { makeLayer } from \"./internal/layer\";\nimport { layerUnsupported } from \"./internal/scrypt-backend\";\nimport { xchacha } from \"./internal/xchacha\";\nimport type { Limits } from \"./Kdf\";\n\n/** WebCrypto with owned, portable Argon2id and XChaCha20-Poly1305 implementations. */\nexport const layer = (subtle: SubtleCrypto, limits: Partial<Limits> = {}) =>\n makeLayer(subtle, limits, { argon2, xchacha }).pipe(Layer.provide(layerUnsupported));\n"],"mappings":";;;;;;;AASA,MAAa,SAAS,QAAsB,SAA0B,CAAC,MACrE,UAAU,QAAQ,QAAQ;CAAE;CAAQ;AAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,gBAAgB,CAAC"}
|
package/dist/WebCrypto.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Hmac } from "./Hmac.mjs";
|
|
2
2
|
import { makeHmac } from "./internal/hmac.mjs";
|
|
3
|
+
import { layerUnsupported } from "./internal/scrypt-backend.mjs";
|
|
3
4
|
import { makeLayer } from "./internal/layer.mjs";
|
|
4
5
|
import { Crypto, Effect, Layer, PlatformError } from "effect";
|
|
5
6
|
//#region src/WebCrypto.ts
|
|
6
7
|
/** Supply the host capability explicitly; no implicit global backend selection. */
|
|
7
|
-
const layer = (subtle, limits = {}) => makeLayer(subtle, limits);
|
|
8
|
+
const layer = (subtle, limits = {}) => makeLayer(subtle, limits).pipe(Layer.provide(layerUnsupported));
|
|
8
9
|
/** HMAC alone has no KDF admission requirement. */
|
|
9
10
|
const layerHmac = (subtle) => Layer.sync(Hmac)(() => makeHmac(subtle));
|
|
10
11
|
/** Effect entropy and SHA digests from the host's global WebCrypto implementation. */
|
package/dist/WebCrypto.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebCrypto.mjs","names":[],"sources":["../src/WebCrypto.ts"],"sourcesContent":["import { Crypto, Effect, Layer, PlatformError } from \"effect\";\n\nimport { Hmac } from \"./Hmac\";\nimport { makeHmac } from \"./internal/hmac\";\nimport { makeLayer } from \"./internal/layer\";\nimport type { Limits } from \"./Kdf\";\n\n/** Supply the host capability explicitly; no implicit global backend selection. */\nexport const layer = (subtle: SubtleCrypto, limits: Partial<Limits> = {}) =>\n makeLayer(subtle, limits);\n\n/** HMAC alone has no KDF admission requirement. */\nexport const layerHmac = (subtle: SubtleCrypto): Layer.Layer<Hmac> =>\n Layer.sync(Hmac)(() => makeHmac(subtle));\n\n/** Effect entropy and SHA digests from the host's global WebCrypto implementation. */\nexport const layerCryptoWeb: Layer.Layer<Crypto.Crypto> = Layer.sync(Crypto.Crypto)(() =>\n Crypto.make({\n randomBytes: (size) => globalThis.crypto.getRandomValues(new Uint8Array(size)),\n digest: (algorithm, data) =>\n Effect.tryPromise({\n try: () => globalThis.crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: (cause) =>\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"Crypto\",\n method: \"digest\",\n cause,\n }),\n }).pipe(Effect.map((bytes) => new Uint8Array(bytes))),\n }),\n);\n\n/** HMAC from global WebCrypto. Missing WebCrypto is a platform defect at Layer construction. */\nexport const layerHmacWeb: Layer.Layer<Hmac> = Layer.effect(Hmac)(\n Effect.suspend(() => {\n const subtle = globalThis.crypto?.subtle;\n\n return subtle === undefined\n ? Effect.die(new Error(\"WebCrypto is unavailable in this runtime\"))\n : Effect.succeed(makeHmac(subtle));\n }),\n);\n\n/** Entropy, SHA digests and HMAC for sessions and proofs, without password derivation. */\nexport const layerWebCrypto = Layer.merge(layerCryptoWeb, layerHmacWeb);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"WebCrypto.mjs","names":[],"sources":["../src/WebCrypto.ts"],"sourcesContent":["import { Crypto, Effect, Layer, PlatformError } from \"effect\";\n\nimport { Hmac } from \"./Hmac\";\nimport { makeHmac } from \"./internal/hmac\";\nimport { makeLayer } from \"./internal/layer\";\nimport { layerUnsupported } from \"./internal/scrypt-backend\";\nimport type { Limits } from \"./Kdf\";\n\n/** Supply the host capability explicitly; no implicit global backend selection. */\nexport const layer = (subtle: SubtleCrypto, limits: Partial<Limits> = {}) =>\n makeLayer(subtle, limits).pipe(Layer.provide(layerUnsupported));\n\n/** HMAC alone has no KDF admission requirement. */\nexport const layerHmac = (subtle: SubtleCrypto): Layer.Layer<Hmac> =>\n Layer.sync(Hmac)(() => makeHmac(subtle));\n\n/** Effect entropy and SHA digests from the host's global WebCrypto implementation. */\nexport const layerCryptoWeb: Layer.Layer<Crypto.Crypto> = Layer.sync(Crypto.Crypto)(() =>\n Crypto.make({\n randomBytes: (size) => globalThis.crypto.getRandomValues(new Uint8Array(size)),\n digest: (algorithm, data) =>\n Effect.tryPromise({\n try: () => globalThis.crypto.subtle.digest(algorithm, new Uint8Array(data)),\n catch: (cause) =>\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"Crypto\",\n method: \"digest\",\n cause,\n }),\n }).pipe(Effect.map((bytes) => new Uint8Array(bytes))),\n }),\n);\n\n/** HMAC from global WebCrypto. Missing WebCrypto is a platform defect at Layer construction. */\nexport const layerHmacWeb: Layer.Layer<Hmac> = Layer.effect(Hmac)(\n Effect.suspend(() => {\n const subtle = globalThis.crypto?.subtle;\n\n return subtle === undefined\n ? Effect.die(new Error(\"WebCrypto is unavailable in this runtime\"))\n : Effect.succeed(makeHmac(subtle));\n }),\n);\n\n/** Entropy, SHA digests and HMAC for sessions and proofs, without password derivation. */\nexport const layerWebCrypto = Layer.merge(layerCryptoWeb, layerHmacWeb);\n"],"mappings":";;;;;;;AASA,MAAa,SAAS,QAAsB,SAA0B,CAAC,MACrE,UAAU,QAAQ,MAAM,CAAC,CAAC,KAAK,MAAM,QAAQ,gBAAgB,CAAC;;AAGhE,MAAa,aAAa,WACxB,MAAM,KAAK,IAAI,CAAC,OAAO,SAAS,MAAM,CAAC;;AAGzC,MAAa,iBAA6C,MAAM,KAAK,OAAO,MAAM,CAAC,OACjF,OAAO,KAAK;CACV,cAAc,SAAS,WAAW,OAAO,gBAAgB,IAAI,WAAW,IAAI,CAAC;CAC7E,SAAS,WAAW,SAClB,OAAO,WAAW;EAChB,WAAW,WAAW,OAAO,OAAO,OAAO,WAAW,IAAI,WAAW,IAAI,CAAC;EAC1E,QAAQ,UACN,cAAc,YAAY;GACxB,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;EACF,CAAC;CACL,CAAC,CAAC,CAAC,KAAK,OAAO,KAAK,UAAU,IAAI,WAAW,KAAK,CAAC,CAAC;AACxD,CAAC,CACH;;AAGA,MAAa,eAAkC,MAAM,OAAO,IAAI,CAAC,CAC/D,OAAO,cAAc;CACnB,MAAM,SAAS,WAAW,QAAQ;CAElC,OAAO,WAAW,KAAA,IACd,OAAO,oBAAI,IAAI,MAAM,0CAA0C,CAAC,IAChE,OAAO,QAAQ,SAAS,MAAM,CAAC;AACrC,CAAC,CACH;;AAGA,MAAa,iBAAiB,MAAM,MAAM,gBAAgB,YAAY"}
|
|
@@ -157,15 +157,22 @@ function variableHash(words, length) {
|
|
|
157
157
|
data.fill(0);
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
-
const allocate = (input) => {
|
|
160
|
+
const allocate = (input, backing) => {
|
|
161
161
|
const blocks = 4 * input.parallelism * Math.floor(input.memoryKiB / (4 * input.parallelism));
|
|
162
162
|
const laneLength = blocks / input.parallelism;
|
|
163
|
+
let offset = backing?.byteOffset ?? 0;
|
|
164
|
+
const words = (length) => {
|
|
165
|
+
if (backing === void 0) return new Uint32Array(length);
|
|
166
|
+
const view = new Uint32Array(backing.buffer, offset, length);
|
|
167
|
+
offset += view.byteLength;
|
|
168
|
+
return view;
|
|
169
|
+
};
|
|
163
170
|
return {
|
|
164
|
-
memory:
|
|
165
|
-
scratch:
|
|
166
|
-
address:
|
|
167
|
-
initial:
|
|
168
|
-
final:
|
|
171
|
+
memory: words(blocks * 256),
|
|
172
|
+
scratch: words(256),
|
|
173
|
+
address: words(768),
|
|
174
|
+
initial: words(18),
|
|
175
|
+
final: words(256),
|
|
169
176
|
blocks,
|
|
170
177
|
laneLength,
|
|
171
178
|
segmentLength: laneLength / 4
|
|
@@ -232,7 +239,7 @@ const initialize = (state, input) => {
|
|
|
232
239
|
}
|
|
233
240
|
};
|
|
234
241
|
/** Yield block boundaries to the Effect driver; all scratch belongs to this derivation. */
|
|
235
|
-
function* fill(state, input) {
|
|
242
|
+
function* fill(state, input, compress = block) {
|
|
236
243
|
const { memory: B, scratch, address, laneLength: laneLen, segmentLength: segmentLen } = state;
|
|
237
244
|
const p = input.parallelism;
|
|
238
245
|
address[262] = state.blocks;
|
|
@@ -250,8 +257,8 @@ function* fill(state, input) {
|
|
|
250
257
|
const start = r === 0 && s === 0 ? 2 : 0;
|
|
251
258
|
if (start === 2 && dataIndependent) {
|
|
252
259
|
address[268]++;
|
|
253
|
-
|
|
254
|
-
|
|
260
|
+
compress(scratch, address, 256, 512, 0, false);
|
|
261
|
+
compress(scratch, address, 0, 512, 0, false);
|
|
255
262
|
}
|
|
256
263
|
let offset = lane * laneLen + s * segmentLen + start;
|
|
257
264
|
for (let index = start; index < segmentLen; index++, offset++) {
|
|
@@ -262,8 +269,8 @@ function* fill(state, input) {
|
|
|
262
269
|
const addressIndex = index % 128;
|
|
263
270
|
if (addressIndex === 0) {
|
|
264
271
|
address[268]++;
|
|
265
|
-
|
|
266
|
-
|
|
272
|
+
compress(scratch, address, 256, 512, 0, false);
|
|
273
|
+
compress(scratch, address, 0, 512, 0, false);
|
|
267
274
|
}
|
|
268
275
|
randL = address[2 * addressIndex];
|
|
269
276
|
randH = address[2 * addressIndex + 1];
|
|
@@ -273,7 +280,7 @@ function* fill(state, input) {
|
|
|
273
280
|
}
|
|
274
281
|
const refLane = r === 0 && s === 0 ? lane : randH % p;
|
|
275
282
|
const refPos = indexAlpha(r, s, laneLen, segmentLen, index, randL, refLane === lane);
|
|
276
|
-
|
|
283
|
+
compress(scratch, B, 256 * prev, 256 * (laneLen * refLane + refPos), offset * 256, needXor);
|
|
277
284
|
yield;
|
|
278
285
|
}
|
|
279
286
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argon2-core.mjs","names":[],"sources":["../../src/internal/argon2-core.ts"],"sourcesContent":["import { Blake2b } from \"./blake2b\";\nimport type { Argon2Parameters } from \"./kdf\";\n/**\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 { rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL } from \"./word64\";\n\nconst ARGON2_SYNC_POINTS = 4;\n\n// Unsigned `u32 * u32 = { h, l }`, returned as split 64-bit halves.\nfunction mul(a: number, b: number) {\n // Split into 16-bit limbs so each partial product stays exact under `Math.imul`.\n const aL = a & 0xffff;\n const aH = a >>> 16;\n const bL = b & 0xffff;\n const bH = b >>> 16;\n const ll = Math.imul(aL, bL);\n const hl = Math.imul(aH, bL);\n const lh = Math.imul(aL, bH);\n const hh = Math.imul(aH, bH);\n const carry = (ll >>> 16) + (hl & 0xffff) + lh;\n const high = (hh + (hl >>> 16) + (carry >>> 16)) | 0;\n const low = (carry << 16) | (ll & 0xffff);\n\n return { h: high, l: low };\n}\n\n// High 32 bits of unsigned u32 multiply, via the same 16-bit limb split as `mul`.\nfunction mulHi(a: number, b: number): number {\n const aL = a & 0xffff,\n aH = a >>> 16,\n bL = b & 0xffff,\n bH = b >>> 16;\n\n const carry = (Math.imul(aL, bL) >>> 16) + (Math.imul(aH, bL) & 0xffff) + Math.imul(aL, bH);\n\n return (Math.imul(aH, bH) + (Math.imul(aH, bL) >>> 16) + (carry >>> 16)) | 0;\n}\n\n// 1024-byte block: 256 u32 = 128 interleaved low/high halves = RFC's\n// 8x8 matrix of 16-byte registers.\n\n// Quarter-round over 64-bit word indices into `A2_BUF`; each index maps to adjacent low/high u32s.\n// Each BlaMka step `X = X + Y + 2 * trunc(X) * trunc(Y)` (trunc = low 32 bits) is three lines:\n// `Math.imul` is the low product half, `mulHi` the high half, then a split 64-bit add with the\n// doubling folded in. RFC 9106 Figure 19 GB rotates by 32, 24, 16, and 63 bits after each XOR.\nfunction G(A2_BUF: Uint32Array, a: number, b: number, c: number, d: number) {\n let Al = A2_BUF[2 * a],\n Ah = A2_BUF[2 * a + 1];\n\n let Bl = A2_BUF[2 * b],\n Bh = A2_BUF[2 * b + 1];\n\n let Cl = A2_BUF[2 * c],\n Ch = A2_BUF[2 * c + 1];\n\n let Dl = A2_BUF[2 * d],\n Dh = A2_BUF[2 * d + 1];\n\n let ml = 0,\n mh = 0,\n rl = 0,\n xh = 0,\n xl = 0;\n\n // A = blamka(A, B); D = rotr64(D ^ A, 32)\n ml = Math.imul(Al, Bl);\n mh = mulHi(Al, Bl);\n rl = (Al >>> 0) + (Bl >>> 0) + ((ml << 1) >>> 0);\n Ah = (Ah + Bh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Al = rl | 0;\n xh = Dh ^ Ah;\n xl = Dl ^ Al;\n Dh = rotr32H(xh, xl);\n Dl = rotr32L(xh, xl);\n\n // C = blamka(C, D); B = rotr64(B ^ C, 24)\n ml = Math.imul(Cl, Dl);\n mh = mulHi(Cl, Dl);\n rl = (Cl >>> 0) + (Dl >>> 0) + ((ml << 1) >>> 0);\n Ch = (Ch + Dh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Cl = rl | 0;\n xh = Bh ^ Ch;\n xl = Bl ^ Cl;\n Bh = rotrSH(xh, xl, 24);\n Bl = rotrSL(xh, xl, 24);\n\n // A = blamka(A, B); D = rotr64(D ^ A, 16)\n ml = Math.imul(Al, Bl);\n mh = mulHi(Al, Bl);\n rl = (Al >>> 0) + (Bl >>> 0) + ((ml << 1) >>> 0);\n Ah = (Ah + Bh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Al = rl | 0;\n xh = Dh ^ Ah;\n xl = Dl ^ Al;\n Dh = rotrSH(xh, xl, 16);\n Dl = rotrSL(xh, xl, 16);\n\n // C = blamka(C, D); B = rotr64(B ^ C, 63)\n ml = Math.imul(Cl, Dl);\n mh = mulHi(Cl, Dl);\n rl = (Cl >>> 0) + (Dl >>> 0) + ((ml << 1) >>> 0);\n Ch = (Ch + Dh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Cl = rl | 0;\n xh = Bh ^ Ch;\n xl = Bl ^ Cl;\n Bh = rotrBH(xh, xl, 63);\n Bl = rotrBL(xh, xl, 63);\n\n A2_BUF[2 * a] = Al;\n A2_BUF[2 * a + 1] = Ah;\n A2_BUF[2 * b] = Bl;\n A2_BUF[2 * b + 1] = Bh;\n A2_BUF[2 * c] = Cl;\n A2_BUF[2 * c + 1] = Ch;\n A2_BUF[2 * d] = Dl;\n A2_BUF[2 * d + 1] = Dh;\n}\n\n// Argon2 permutation over 16 register indices into `A2_BUF`, not the register values themselves.\n// RFC 9106 Figure 17: these arguments are the 16 `v0..v15` 64-bit word\n// indices inside eight 16-byte inputs, not copied word values.\nfunction P(\n A2_BUF: Uint32Array,\n v00: number,\n v01: number,\n v02: number,\n v03: number,\n v04: number,\n v05: number,\n v06: number,\n v07: number,\n v08: number,\n v09: number,\n v10: number,\n v11: number,\n v12: number,\n v13: number,\n v14: number,\n v15: number,\n) {\n // RFC 9106 Figure 18: first apply GB across rows, then across columns of the 8x8 register matrix.\n G(A2_BUF, v00, v04, v08, v12);\n G(A2_BUF, v01, v05, v09, v13);\n G(A2_BUF, v02, v06, v10, v14);\n G(A2_BUF, v03, v07, v11, v15);\n G(A2_BUF, v00, v05, v10, v15);\n G(A2_BUF, v01, v06, v11, v12);\n G(A2_BUF, v02, v07, v08, v13);\n G(A2_BUF, v03, v04, v09, v14);\n}\n\nfunction block(\n A2_BUF: Uint32Array,\n x: Uint32Array,\n xPos: number,\n yPos: number,\n outPos: number,\n needXor: boolean,\n) {\n for (let i = 0; i < 256; i++) A2_BUF[i] = x[xPos + i] ^ x[yPos + i];\n // rows (8 consecutive 16-register groups)\n for (let i = 0; i < 128; i += 16) {\n P(\n A2_BUF,\n i,\n i + 1,\n i + 2,\n i + 3,\n i + 4,\n i + 5,\n i + 6,\n i + 7,\n i + 8,\n i + 9,\n i + 10,\n i + 11,\n i + 12,\n i + 13,\n i + 14,\n i + 15,\n );\n }\n // columns (8 strided 16-register groups)\n for (let i = 0; i < 16; i += 2) {\n P(\n A2_BUF,\n i,\n i + 1,\n i + 16,\n i + 17,\n i + 32,\n i + 33,\n i + 48,\n i + 49,\n i + 64,\n i + 65,\n i + 80,\n i + 81,\n i + 96,\n i + 97,\n i + 112,\n i + 113,\n );\n }\n\n // RFC 9106 step 6: passes after the first XOR the old destination block into the new G(X, Y).\n if (needXor) for (let i = 0; i < 256; i++) x[outPos + i] ^= A2_BUF[i] ^ x[xPos + i] ^ x[yPos + i];\n else for (let i = 0; i < 256; i++) x[outPos + i] = A2_BUF[i] ^ x[xPos + i] ^ x[yPos + i];\n A2_BUF.fill(0);\n}\n\n// Used only inside argon2Blocks!\nfunction indexAlpha(\n r: number,\n s: number,\n laneLen: number,\n segmentLen: number,\n index: number,\n randL: number,\n sameLane: boolean = false,\n) {\n // RFC 9106 §3.4.2 Figures 12-13: map `J1` / `J2` into the current lane's reference area `W`.\n let area: number;\n\n if (r === 0) {\n if (s === 0) area = index - 1;\n else if (sameLane) area = s * segmentLen + index - 1;\n else area = s * segmentLen + (index === 0 ? -1 : 0);\n } else if (sameLane) area = laneLen - segmentLen + index - 1;\n else area = laneLen - segmentLen + (index === 0 ? -1 : 0);\n const startPos = r !== 0 && s !== ARGON2_SYNC_POINTS - 1 ? (s + 1) * segmentLen : 0;\n // RFC 9106 Figure 13: `mul(randL, randL).h` is `floor(J_1^2 / 2^32)`, and the outer high-half\n // multiply computes `floor(|W| * x / 2^32)` without floating-point math.\n const rel = area - 1 - mul(area, mul(randL, randL).h).h;\n\n return (startPos + rel) % laneLen;\n}\n\nconst bytesOfWords = (words: Uint32Array): Uint8Array => {\n const bytes = new Uint8Array(words.length * 4);\n const view = new DataView(bytes.buffer);\n\n for (let i = 0; i < words.length; i++) view.setUint32(i * 4, words[i], true);\n\n return bytes;\n};\n\nconst hash = (data: Uint8Array, length = 64) => {\n const state = new Blake2b(length);\n\n try {\n return state.update(data).digest();\n } finally {\n state.destroy();\n }\n};\n\n// RFC 9106 H': preserve byte tails, including output lengths not divisible by four.\nfunction variableHash(words: Uint32Array, length: number): Uint8Array {\n const data = bytesOfWords(words);\n const prefix = new Uint8Array(4);\n\n new DataView(prefix.buffer).setUint32(0, length, true);\n const state = new Blake2b(Math.min(length, 64));\n let previous: Uint8Array | undefined;\n let out: Uint8Array | undefined;\n\n try {\n previous = state.update(prefix).update(data).digest();\n if (length <= 64) {\n const result = previous;\n\n previous = undefined;\n\n return result;\n }\n out = new Uint8Array(length);\n out.set(previous.subarray(0, 32));\n let position = 32;\n\n for (; length - position > 64; position += 32) {\n const next = hash(previous);\n\n previous.fill(0);\n previous = next;\n out.set(previous.subarray(0, 32), position);\n }\n const last = hash(previous, length - position);\n\n out.set(last, position);\n last.fill(0);\n\n return out;\n } catch (error) {\n out?.fill(0);\n throw error;\n } finally {\n state.destroy();\n previous?.fill(0);\n prefix.fill(0);\n data.fill(0);\n }\n}\n\nexport interface State {\n readonly memory: Uint32Array;\n readonly scratch: Uint32Array;\n readonly address: Uint32Array;\n readonly initial: Uint32Array;\n readonly final: Uint32Array;\n readonly blocks: number;\n readonly laneLength: number;\n readonly segmentLength: number;\n}\n\n// Allocate before absorbing secrets. Kdf has already applied Schema/resource limits.\nexport const allocate = (input: Argon2Parameters): State => {\n const blocks = 4 * input.parallelism * Math.floor(input.memoryKiB / (4 * input.parallelism));\n const laneLength = blocks / input.parallelism;\n\n return {\n memory: new Uint32Array(blocks * 256),\n scratch: new Uint32Array(256),\n address: new Uint32Array(3 * 256),\n initial: new Uint32Array(18),\n final: new Uint32Array(256),\n blocks,\n laneLength,\n segmentLength: laneLength / 4,\n };\n};\n\nexport const destroy = (state: State): void => {\n state.memory.fill(0);\n state.scratch.fill(0);\n state.address.fill(0);\n state.initial.fill(0);\n state.final.fill(0);\n};\n\nexport const initialize = (state: State, input: Argon2Parameters): void => {\n const h = new Blake2b();\n const scalar = new Uint8Array(4);\n const view = new DataView(scalar.buffer);\n\n const number = (value: number) => {\n view.setUint32(0, value, true);\n h.update(scalar);\n };\n\n try {\n for (const value of [input.parallelism, input.length, input.memoryKiB, input.passes, 19, 2])\n number(value);\n for (const data of [\n input.password,\n input.salt,\n input.secret ?? new Uint8Array(),\n input.associatedData,\n ]) {\n number(data.length);\n h.update(data);\n }\n const initial = h.digest();\n\n try {\n const hashView = new DataView(initial.buffer, initial.byteOffset, initial.byteLength);\n\n for (let i = 0; i < 16; i++) state.initial[i] = hashView.getUint32(i * 4, true);\n } finally {\n initial.fill(0);\n }\n for (let lane = 0; lane < input.parallelism; lane++) {\n state.initial[17] = lane;\n for (let first = 0; first < 2; first++) {\n state.initial[16] = first;\n const expanded = variableHash(state.initial, 1024);\n\n try {\n const expandedView = new DataView(\n expanded.buffer,\n expanded.byteOffset,\n expanded.byteLength,\n );\n\n const offset = (lane * state.laneLength + first) * 256;\n\n for (let i = 0; i < 256; i++)\n state.memory[offset + i] = expandedView.getUint32(i * 4, true);\n } finally {\n expanded.fill(0);\n }\n }\n }\n } finally {\n h.destroy();\n scalar.fill(0);\n state.initial.fill(0);\n }\n};\n\n/** Yield block boundaries to the Effect driver; all scratch belongs to this derivation. */\nexport function* fill(state: State, input: Argon2Parameters): Generator<void, void> {\n const { memory: B, scratch, address, laneLength: laneLen, segmentLength: segmentLen } = state;\n const p = input.parallelism;\n\n address[256 + 6] = state.blocks;\n address[256 + 8] = input.passes;\n address[256 + 10] = 2;\n for (let r = 0; r < input.passes; r++) {\n const needXor = r !== 0;\n\n address[256] = r;\n for (let s = 0; s < ARGON2_SYNC_POINTS; s++) {\n address[256 + 4] = s;\n const dataIndependent = r === 0 && s < 2;\n\n for (let lane = 0; lane < p; lane++) {\n address[256 + 2] = lane;\n address[256 + 12] = 0;\n const start = r === 0 && s === 0 ? 2 : 0;\n\n if (start === 2 && dataIndependent) {\n address[256 + 12]++;\n block(scratch, address, 256, 512, 0, false);\n block(scratch, address, 0, 512, 0, false);\n }\n let offset = lane * laneLen + s * segmentLen + start;\n\n for (let index = start; index < segmentLen; index++, offset++) {\n const prev = offset % laneLen ? offset - 1 : offset + laneLen - 1;\n let randL: number;\n let randH: number;\n\n if (dataIndependent) {\n const addressIndex = index % 128;\n\n if (addressIndex === 0) {\n address[256 + 12]++;\n block(scratch, address, 256, 512, 0, false);\n block(scratch, address, 0, 512, 0, false);\n }\n randL = address[2 * addressIndex];\n randH = address[2 * addressIndex + 1];\n } else {\n randL = B[256 * prev];\n randH = B[256 * prev + 1];\n }\n const refLane = r === 0 && s === 0 ? lane : randH % p;\n const refPos = indexAlpha(r, s, laneLen, segmentLen, index, randL, refLane === lane);\n\n block(scratch, B, 256 * prev, 256 * (laneLen * refLane + refPos), offset * 256, needXor);\n yield;\n }\n }\n }\n }\n}\n\nexport const output = (state: State, input: Argon2Parameters): Uint8Array => {\n for (let lane = 0; lane < input.parallelism; lane++) {\n const offset = 256 * (state.laneLength * lane + state.laneLength - 1);\n\n for (let word = 0; word < 256; word++) state.final[word] ^= state.memory[offset + word];\n }\n\n return variableHash(state.final, input.length);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"argon2-core.mjs","names":[],"sources":["../../src/internal/argon2-core.ts"],"sourcesContent":["import { Blake2b } from \"./blake2b\";\nimport type { Argon2Parameters } from \"./kdf\";\n/**\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 { rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL } from \"./word64\";\n\nconst ARGON2_SYNC_POINTS = 4;\n\n// Unsigned `u32 * u32 = { h, l }`, returned as split 64-bit halves.\nfunction mul(a: number, b: number) {\n // Split into 16-bit limbs so each partial product stays exact under `Math.imul`.\n const aL = a & 0xffff;\n const aH = a >>> 16;\n const bL = b & 0xffff;\n const bH = b >>> 16;\n const ll = Math.imul(aL, bL);\n const hl = Math.imul(aH, bL);\n const lh = Math.imul(aL, bH);\n const hh = Math.imul(aH, bH);\n const carry = (ll >>> 16) + (hl & 0xffff) + lh;\n const high = (hh + (hl >>> 16) + (carry >>> 16)) | 0;\n const low = (carry << 16) | (ll & 0xffff);\n\n return { h: high, l: low };\n}\n\n// High 32 bits of unsigned u32 multiply, via the same 16-bit limb split as `mul`.\nfunction mulHi(a: number, b: number): number {\n const aL = a & 0xffff,\n aH = a >>> 16,\n bL = b & 0xffff,\n bH = b >>> 16;\n\n const carry = (Math.imul(aL, bL) >>> 16) + (Math.imul(aH, bL) & 0xffff) + Math.imul(aL, bH);\n\n return (Math.imul(aH, bH) + (Math.imul(aH, bL) >>> 16) + (carry >>> 16)) | 0;\n}\n\n// 1024-byte block: 256 u32 = 128 interleaved low/high halves = RFC's\n// 8x8 matrix of 16-byte registers.\n\n// Quarter-round over 64-bit word indices into `A2_BUF`; each index maps to adjacent low/high u32s.\n// Each BlaMka step `X = X + Y + 2 * trunc(X) * trunc(Y)` (trunc = low 32 bits) is three lines:\n// `Math.imul` is the low product half, `mulHi` the high half, then a split 64-bit add with the\n// doubling folded in. RFC 9106 Figure 19 GB rotates by 32, 24, 16, and 63 bits after each XOR.\nfunction G(A2_BUF: Uint32Array, a: number, b: number, c: number, d: number) {\n let Al = A2_BUF[2 * a],\n Ah = A2_BUF[2 * a + 1];\n\n let Bl = A2_BUF[2 * b],\n Bh = A2_BUF[2 * b + 1];\n\n let Cl = A2_BUF[2 * c],\n Ch = A2_BUF[2 * c + 1];\n\n let Dl = A2_BUF[2 * d],\n Dh = A2_BUF[2 * d + 1];\n\n let ml = 0,\n mh = 0,\n rl = 0,\n xh = 0,\n xl = 0;\n\n // A = blamka(A, B); D = rotr64(D ^ A, 32)\n ml = Math.imul(Al, Bl);\n mh = mulHi(Al, Bl);\n rl = (Al >>> 0) + (Bl >>> 0) + ((ml << 1) >>> 0);\n Ah = (Ah + Bh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Al = rl | 0;\n xh = Dh ^ Ah;\n xl = Dl ^ Al;\n Dh = rotr32H(xh, xl);\n Dl = rotr32L(xh, xl);\n\n // C = blamka(C, D); B = rotr64(B ^ C, 24)\n ml = Math.imul(Cl, Dl);\n mh = mulHi(Cl, Dl);\n rl = (Cl >>> 0) + (Dl >>> 0) + ((ml << 1) >>> 0);\n Ch = (Ch + Dh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Cl = rl | 0;\n xh = Bh ^ Ch;\n xl = Bl ^ Cl;\n Bh = rotrSH(xh, xl, 24);\n Bl = rotrSL(xh, xl, 24);\n\n // A = blamka(A, B); D = rotr64(D ^ A, 16)\n ml = Math.imul(Al, Bl);\n mh = mulHi(Al, Bl);\n rl = (Al >>> 0) + (Bl >>> 0) + ((ml << 1) >>> 0);\n Ah = (Ah + Bh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Al = rl | 0;\n xh = Dh ^ Ah;\n xl = Dl ^ Al;\n Dh = rotrSH(xh, xl, 16);\n Dl = rotrSL(xh, xl, 16);\n\n // C = blamka(C, D); B = rotr64(B ^ C, 63)\n ml = Math.imul(Cl, Dl);\n mh = mulHi(Cl, Dl);\n rl = (Cl >>> 0) + (Dl >>> 0) + ((ml << 1) >>> 0);\n Ch = (Ch + Dh + ((mh << 1) | (ml >>> 31)) + ((rl / 0x100000000) | 0)) | 0;\n Cl = rl | 0;\n xh = Bh ^ Ch;\n xl = Bl ^ Cl;\n Bh = rotrBH(xh, xl, 63);\n Bl = rotrBL(xh, xl, 63);\n\n A2_BUF[2 * a] = Al;\n A2_BUF[2 * a + 1] = Ah;\n A2_BUF[2 * b] = Bl;\n A2_BUF[2 * b + 1] = Bh;\n A2_BUF[2 * c] = Cl;\n A2_BUF[2 * c + 1] = Ch;\n A2_BUF[2 * d] = Dl;\n A2_BUF[2 * d + 1] = Dh;\n}\n\n// Argon2 permutation over 16 register indices into `A2_BUF`, not the register values themselves.\n// RFC 9106 Figure 17: these arguments are the 16 `v0..v15` 64-bit word\n// indices inside eight 16-byte inputs, not copied word values.\nfunction P(\n A2_BUF: Uint32Array,\n v00: number,\n v01: number,\n v02: number,\n v03: number,\n v04: number,\n v05: number,\n v06: number,\n v07: number,\n v08: number,\n v09: number,\n v10: number,\n v11: number,\n v12: number,\n v13: number,\n v14: number,\n v15: number,\n) {\n // RFC 9106 Figure 18: first apply GB across rows, then across columns of the 8x8 register matrix.\n G(A2_BUF, v00, v04, v08, v12);\n G(A2_BUF, v01, v05, v09, v13);\n G(A2_BUF, v02, v06, v10, v14);\n G(A2_BUF, v03, v07, v11, v15);\n G(A2_BUF, v00, v05, v10, v15);\n G(A2_BUF, v01, v06, v11, v12);\n G(A2_BUF, v02, v07, v08, v13);\n G(A2_BUF, v03, v04, v09, v14);\n}\n\nfunction block(\n A2_BUF: Uint32Array,\n x: Uint32Array,\n xPos: number,\n yPos: number,\n outPos: number,\n needXor: boolean,\n) {\n for (let i = 0; i < 256; i++) A2_BUF[i] = x[xPos + i] ^ x[yPos + i];\n // rows (8 consecutive 16-register groups)\n for (let i = 0; i < 128; i += 16) {\n P(\n A2_BUF,\n i,\n i + 1,\n i + 2,\n i + 3,\n i + 4,\n i + 5,\n i + 6,\n i + 7,\n i + 8,\n i + 9,\n i + 10,\n i + 11,\n i + 12,\n i + 13,\n i + 14,\n i + 15,\n );\n }\n // columns (8 strided 16-register groups)\n for (let i = 0; i < 16; i += 2) {\n P(\n A2_BUF,\n i,\n i + 1,\n i + 16,\n i + 17,\n i + 32,\n i + 33,\n i + 48,\n i + 49,\n i + 64,\n i + 65,\n i + 80,\n i + 81,\n i + 96,\n i + 97,\n i + 112,\n i + 113,\n );\n }\n\n // RFC 9106 step 6: passes after the first XOR the old destination block into the new G(X, Y).\n if (needXor) for (let i = 0; i < 256; i++) x[outPos + i] ^= A2_BUF[i] ^ x[xPos + i] ^ x[yPos + i];\n else for (let i = 0; i < 256; i++) x[outPos + i] = A2_BUF[i] ^ x[xPos + i] ^ x[yPos + i];\n A2_BUF.fill(0);\n}\n\n// Used only inside argon2Blocks!\nfunction indexAlpha(\n r: number,\n s: number,\n laneLen: number,\n segmentLen: number,\n index: number,\n randL: number,\n sameLane: boolean = false,\n) {\n // RFC 9106 §3.4.2 Figures 12-13: map `J1` / `J2` into the current lane's reference area `W`.\n let area: number;\n\n if (r === 0) {\n if (s === 0) area = index - 1;\n else if (sameLane) area = s * segmentLen + index - 1;\n else area = s * segmentLen + (index === 0 ? -1 : 0);\n } else if (sameLane) area = laneLen - segmentLen + index - 1;\n else area = laneLen - segmentLen + (index === 0 ? -1 : 0);\n const startPos = r !== 0 && s !== ARGON2_SYNC_POINTS - 1 ? (s + 1) * segmentLen : 0;\n // RFC 9106 Figure 13: `mul(randL, randL).h` is `floor(J_1^2 / 2^32)`, and the outer high-half\n // multiply computes `floor(|W| * x / 2^32)` without floating-point math.\n const rel = area - 1 - mul(area, mul(randL, randL).h).h;\n\n return (startPos + rel) % laneLen;\n}\n\nconst bytesOfWords = (words: Uint32Array): Uint8Array => {\n const bytes = new Uint8Array(words.length * 4);\n const view = new DataView(bytes.buffer);\n\n for (let i = 0; i < words.length; i++) view.setUint32(i * 4, words[i], true);\n\n return bytes;\n};\n\nconst hash = (data: Uint8Array, length = 64) => {\n const state = new Blake2b(length);\n\n try {\n return state.update(data).digest();\n } finally {\n state.destroy();\n }\n};\n\n// RFC 9106 H': preserve byte tails, including output lengths not divisible by four.\nfunction variableHash(words: Uint32Array, length: number): Uint8Array {\n const data = bytesOfWords(words);\n const prefix = new Uint8Array(4);\n\n new DataView(prefix.buffer).setUint32(0, length, true);\n const state = new Blake2b(Math.min(length, 64));\n let previous: Uint8Array | undefined;\n let out: Uint8Array | undefined;\n\n try {\n previous = state.update(prefix).update(data).digest();\n if (length <= 64) {\n const result = previous;\n\n previous = undefined;\n\n return result;\n }\n out = new Uint8Array(length);\n out.set(previous.subarray(0, 32));\n let position = 32;\n\n for (; length - position > 64; position += 32) {\n const next = hash(previous);\n\n previous.fill(0);\n previous = next;\n out.set(previous.subarray(0, 32), position);\n }\n const last = hash(previous, length - position);\n\n out.set(last, position);\n last.fill(0);\n\n return out;\n } catch (error) {\n out?.fill(0);\n throw error;\n } finally {\n state.destroy();\n previous?.fill(0);\n prefix.fill(0);\n data.fill(0);\n }\n}\n\nexport interface State {\n readonly memory: Uint32Array;\n readonly scratch: Uint32Array;\n readonly address: Uint32Array;\n readonly initial: Uint32Array;\n readonly final: Uint32Array;\n readonly blocks: number;\n readonly laneLength: number;\n readonly segmentLength: number;\n}\n\n// Allocate before absorbing secrets. Kdf has already applied Schema/resource limits.\nexport const allocate = (\n input: Argon2Parameters,\n backing?: { readonly buffer: ArrayBuffer; readonly byteOffset: number },\n): State => {\n const blocks = 4 * input.parallelism * Math.floor(input.memoryKiB / (4 * input.parallelism));\n const laneLength = blocks / input.parallelism;\n let offset = backing?.byteOffset ?? 0;\n\n const words = (length: number) => {\n if (backing === undefined) return new Uint32Array(length);\n const view = new Uint32Array(backing.buffer, offset, length);\n\n offset += view.byteLength;\n\n return view;\n };\n\n return {\n memory: words(blocks * 256),\n scratch: words(256),\n address: words(3 * 256),\n initial: words(18),\n final: words(256),\n blocks,\n laneLength,\n segmentLength: laneLength / 4,\n };\n};\n\nexport const destroy = (state: State): void => {\n state.memory.fill(0);\n state.scratch.fill(0);\n state.address.fill(0);\n state.initial.fill(0);\n state.final.fill(0);\n};\n\nexport const initialize = (state: State, input: Argon2Parameters): void => {\n const h = new Blake2b();\n const scalar = new Uint8Array(4);\n const view = new DataView(scalar.buffer);\n\n const number = (value: number) => {\n view.setUint32(0, value, true);\n h.update(scalar);\n };\n\n try {\n for (const value of [input.parallelism, input.length, input.memoryKiB, input.passes, 19, 2])\n number(value);\n for (const data of [\n input.password,\n input.salt,\n input.secret ?? new Uint8Array(),\n input.associatedData,\n ]) {\n number(data.length);\n h.update(data);\n }\n const initial = h.digest();\n\n try {\n const hashView = new DataView(initial.buffer, initial.byteOffset, initial.byteLength);\n\n for (let i = 0; i < 16; i++) state.initial[i] = hashView.getUint32(i * 4, true);\n } finally {\n initial.fill(0);\n }\n for (let lane = 0; lane < input.parallelism; lane++) {\n state.initial[17] = lane;\n for (let first = 0; first < 2; first++) {\n state.initial[16] = first;\n const expanded = variableHash(state.initial, 1024);\n\n try {\n const expandedView = new DataView(\n expanded.buffer,\n expanded.byteOffset,\n expanded.byteLength,\n );\n\n const offset = (lane * state.laneLength + first) * 256;\n\n for (let i = 0; i < 256; i++)\n state.memory[offset + i] = expandedView.getUint32(i * 4, true);\n } finally {\n expanded.fill(0);\n }\n }\n }\n } finally {\n h.destroy();\n scalar.fill(0);\n state.initial.fill(0);\n }\n};\n\n/** Yield block boundaries to the Effect driver; all scratch belongs to this derivation. */\nexport function* fill(\n state: State,\n input: Argon2Parameters,\n compress: typeof block = block,\n): Generator<void, void> {\n const { memory: B, scratch, address, laneLength: laneLen, segmentLength: segmentLen } = state;\n const p = input.parallelism;\n\n address[256 + 6] = state.blocks;\n address[256 + 8] = input.passes;\n address[256 + 10] = 2;\n for (let r = 0; r < input.passes; r++) {\n const needXor = r !== 0;\n\n address[256] = r;\n for (let s = 0; s < ARGON2_SYNC_POINTS; s++) {\n address[256 + 4] = s;\n const dataIndependent = r === 0 && s < 2;\n\n for (let lane = 0; lane < p; lane++) {\n address[256 + 2] = lane;\n address[256 + 12] = 0;\n const start = r === 0 && s === 0 ? 2 : 0;\n\n if (start === 2 && dataIndependent) {\n address[256 + 12]++;\n compress(scratch, address, 256, 512, 0, false);\n compress(scratch, address, 0, 512, 0, false);\n }\n let offset = lane * laneLen + s * segmentLen + start;\n\n for (let index = start; index < segmentLen; index++, offset++) {\n const prev = offset % laneLen ? offset - 1 : offset + laneLen - 1;\n let randL: number;\n let randH: number;\n\n if (dataIndependent) {\n const addressIndex = index % 128;\n\n if (addressIndex === 0) {\n address[256 + 12]++;\n compress(scratch, address, 256, 512, 0, false);\n compress(scratch, address, 0, 512, 0, false);\n }\n randL = address[2 * addressIndex];\n randH = address[2 * addressIndex + 1];\n } else {\n randL = B[256 * prev];\n randH = B[256 * prev + 1];\n }\n const refLane = r === 0 && s === 0 ? lane : randH % p;\n const refPos = indexAlpha(r, s, laneLen, segmentLen, index, randL, refLane === lane);\n\n compress(\n scratch,\n B,\n 256 * prev,\n 256 * (laneLen * refLane + refPos),\n offset * 256,\n needXor,\n );\n yield;\n }\n }\n }\n }\n}\n\nexport const output = (state: State, input: Argon2Parameters): Uint8Array => {\n for (let lane = 0; lane < input.parallelism; lane++) {\n const offset = 256 * (state.laneLength * lane + state.laneLength - 1);\n\n for (let word = 0; word < 256; word++) state.final[word] ^= state.memory[offset + word];\n }\n\n return variableHash(state.final, input.length);\n};\n"],"mappings":";;;;;;;;AASA,MAAM,qBAAqB;AAG3B,SAAS,IAAI,GAAW,GAAW;CAEjC,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,KAAK,KAAK,IAAI,EAAE;CAC3B,MAAM,KAAK,KAAK,KAAK,IAAI,EAAE;CAC3B,MAAM,KAAK,KAAK,KAAK,IAAI,EAAE;CAC3B,MAAM,KAAK,KAAK,KAAK,IAAI,EAAE;CAC3B,MAAM,SAAS,OAAO,OAAO,KAAK,SAAU;CAI5C,OAAO;EAAE,GAHK,MAAM,OAAO,OAAO,UAAU,MAAO;EAGjC,GAFL,SAAS,KAAO,KAAK;CAET;AAC3B;AAGA,SAAS,MAAM,GAAW,GAAmB;CAC3C,MAAM,KAAK,IAAI,OACb,KAAK,MAAM,IACX,KAAK,IAAI,OACT,KAAK,MAAM;CAEb,MAAM,SAAS,KAAK,KAAK,IAAI,EAAE,MAAM,OAAO,KAAK,KAAK,IAAI,EAAE,IAAI,SAAU,KAAK,KAAK,IAAI,EAAE;CAE1F,OAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,KAAK,IAAI,EAAE,MAAM,OAAO,UAAU,MAAO;AAC7E;AASA,SAAS,EAAE,QAAqB,GAAW,GAAW,GAAW,GAAW;CAC1E,IAAI,KAAK,OAAO,IAAI,IAClB,KAAK,OAAO,IAAI,IAAI;CAEtB,IAAI,KAAK,OAAO,IAAI,IAClB,KAAK,OAAO,IAAI,IAAI;CAEtB,IAAI,KAAK,OAAO,IAAI,IAClB,KAAK,OAAO,IAAI,IAAI;CAEtB,IAAI,KAAK,OAAO,IAAI,IAClB,KAAK,OAAO,IAAI,IAAI;CAEtB,IAAI,KAAK,GACP,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK;CAGP,KAAK,KAAK,KAAK,IAAI,EAAE;CACrB,KAAK,MAAM,IAAI,EAAE;CACjB,MAAM,OAAO,MAAM,OAAO,MAAO,MAAM,MAAO;CAC9C,KAAM,KAAK,MAAO,MAAM,IAAM,OAAO,OAAS,KAAK,aAAe,KAAM;CACxE,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,QAAQ,IAAI,EAAE;CACnB,KAAK,QAAQ,IAAI,EAAE;CAGnB,KAAK,KAAK,KAAK,IAAI,EAAE;CACrB,KAAK,MAAM,IAAI,EAAE;CACjB,MAAM,OAAO,MAAM,OAAO,MAAO,MAAM,MAAO;CAC9C,KAAM,KAAK,MAAO,MAAM,IAAM,OAAO,OAAS,KAAK,aAAe,KAAM;CACxE,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,OAAO,IAAI,IAAI,EAAE;CACtB,KAAK,OAAO,IAAI,IAAI,EAAE;CAGtB,KAAK,KAAK,KAAK,IAAI,EAAE;CACrB,KAAK,MAAM,IAAI,EAAE;CACjB,MAAM,OAAO,MAAM,OAAO,MAAO,MAAM,MAAO;CAC9C,KAAM,KAAK,MAAO,MAAM,IAAM,OAAO,OAAS,KAAK,aAAe,KAAM;CACxE,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,OAAO,IAAI,IAAI,EAAE;CACtB,KAAK,OAAO,IAAI,IAAI,EAAE;CAGtB,KAAK,KAAK,KAAK,IAAI,EAAE;CACrB,KAAK,MAAM,IAAI,EAAE;CACjB,MAAM,OAAO,MAAM,OAAO,MAAO,MAAM,MAAO;CAC9C,KAAM,KAAK,MAAO,MAAM,IAAM,OAAO,OAAS,KAAK,aAAe,KAAM;CACxE,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,OAAO,IAAI,IAAI,EAAE;CACtB,KAAK,OAAO,IAAI,IAAI,EAAE;CAEtB,OAAO,IAAI,KAAK;CAChB,OAAO,IAAI,IAAI,KAAK;CACpB,OAAO,IAAI,KAAK;CAChB,OAAO,IAAI,IAAI,KAAK;CACpB,OAAO,IAAI,KAAK;CAChB,OAAO,IAAI,IAAI,KAAK;CACpB,OAAO,IAAI,KAAK;CAChB,OAAO,IAAI,IAAI,KAAK;AACtB;AAKA,SAAS,EACP,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA;CAEA,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;CAC5B,EAAE,QAAQ,KAAK,KAAK,KAAK,GAAG;AAC9B;AAEA,SAAS,MACP,QACA,GACA,MACA,MACA,QACA,SACA;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,OAAO;CAEjE,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,IAC5B,EACE,QACA,GACA,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,EACN;CAGF,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,GAC3B,EACE,QACA,GACA,IAAI,GACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,IACJ,IAAI,KACJ,IAAI,GACN;CAIF,IAAI,SAAS,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,EAAE,SAAS,MAAM,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,OAAO;MAC1F,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,EAAE,SAAS,KAAK,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,OAAO;CACtF,OAAO,KAAK,CAAC;AACf;AAGA,SAAS,WACP,GACA,GACA,SACA,YACA,OACA,OACA,WAAoB,OACpB;CAEA,IAAI;CAEJ,IAAI,MAAM,GAAG;EACX,IAAI,MAAM,GAAG,OAAO,QAAQ;OACvB,IAAI,UAAU,OAAO,IAAI,aAAa,QAAQ;OAC9C,OAAO,IAAI,cAAc,UAAU,IAAI,KAAK;CACnD,OAAO,IAAI,UAAU,OAAO,UAAU,aAAa,QAAQ;MACtD,OAAO,UAAU,cAAc,UAAU,IAAI,KAAK;CAMvD,SALiB,MAAM,KAAK,MAAM,KAA0B,IAAI,KAAK,aAAa,MAGtE,OAAO,IAAI,IAAI,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAE5B;AAC5B;AAEA,MAAM,gBAAgB,UAAmC;CACvD,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,CAAC;CAC7C,MAAM,OAAO,IAAI,SAAS,MAAM,MAAM;CAEtC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,KAAK,UAAU,IAAI,GAAG,MAAM,IAAI,IAAI;CAE3E,OAAO;AACT;AAEA,MAAM,QAAQ,MAAkB,SAAS,OAAO;CAC9C,MAAM,QAAQ,IAAI,QAAQ,MAAM;CAEhC,IAAI;EACF,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO;CACnC,UAAU;EACR,MAAM,QAAQ;CAChB;AACF;AAGA,SAAS,aAAa,OAAoB,QAA4B;CACpE,MAAM,OAAO,aAAa,KAAK;CAC/B,MAAM,yBAAS,IAAI,WAAW,CAAC;CAE/B,IAAI,SAAS,OAAO,MAAM,CAAC,CAAC,UAAU,GAAG,QAAQ,IAAI;CACrD,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,QAAQ,EAAE,CAAC;CAC9C,IAAI;CACJ,IAAI;CAEJ,IAAI;EACF,WAAW,MAAM,OAAO,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;EACpD,IAAI,UAAU,IAAI;GAChB,MAAM,SAAS;GAEf,WAAW,KAAA;GAEX,OAAO;EACT;EACA,MAAM,IAAI,WAAW,MAAM;EAC3B,IAAI,IAAI,SAAS,SAAS,GAAG,EAAE,CAAC;EAChC,IAAI,WAAW;EAEf,OAAO,SAAS,WAAW,IAAI,YAAY,IAAI;GAC7C,MAAM,OAAO,KAAK,QAAQ;GAE1B,SAAS,KAAK,CAAC;GACf,WAAW;GACX,IAAI,IAAI,SAAS,SAAS,GAAG,EAAE,GAAG,QAAQ;EAC5C;EACA,MAAM,OAAO,KAAK,UAAU,SAAS,QAAQ;EAE7C,IAAI,IAAI,MAAM,QAAQ;EACtB,KAAK,KAAK,CAAC;EAEX,OAAO;CACT,SAAS,OAAO;EACd,KAAK,KAAK,CAAC;EACX,MAAM;CACR,UAAU;EACR,MAAM,QAAQ;EACd,UAAU,KAAK,CAAC;EAChB,OAAO,KAAK,CAAC;EACb,KAAK,KAAK,CAAC;CACb;AACF;AAcA,MAAa,YACX,OACA,YACU;CACV,MAAM,SAAS,IAAI,MAAM,cAAc,KAAK,MAAM,MAAM,aAAa,IAAI,MAAM,YAAY;CAC3F,MAAM,aAAa,SAAS,MAAM;CAClC,IAAI,SAAS,SAAS,cAAc;CAEpC,MAAM,SAAS,WAAmB;EAChC,IAAI,YAAY,KAAA,GAAW,OAAO,IAAI,YAAY,MAAM;EACxD,MAAM,OAAO,IAAI,YAAY,QAAQ,QAAQ,QAAQ,MAAM;EAE3D,UAAU,KAAK;EAEf,OAAO;CACT;CAEA,OAAO;EACL,QAAQ,MAAM,SAAS,GAAG;EAC1B,SAAS,MAAM,GAAG;EAClB,SAAS,MAAM,GAAO;EACtB,SAAS,MAAM,EAAE;EACjB,OAAO,MAAM,GAAG;EAChB;EACA;EACA,eAAe,aAAa;CAC9B;AACF;AAEA,MAAa,WAAW,UAAuB;CAC7C,MAAM,OAAO,KAAK,CAAC;CACnB,MAAM,QAAQ,KAAK,CAAC;CACpB,MAAM,QAAQ,KAAK,CAAC;CACpB,MAAM,QAAQ,KAAK,CAAC;CACpB,MAAM,MAAM,KAAK,CAAC;AACpB;AAEA,MAAa,cAAc,OAAc,UAAkC;CACzE,MAAM,IAAI,IAAI,QAAQ;CACtB,MAAM,yBAAS,IAAI,WAAW,CAAC;CAC/B,MAAM,OAAO,IAAI,SAAS,OAAO,MAAM;CAEvC,MAAM,UAAU,UAAkB;EAChC,KAAK,UAAU,GAAG,OAAO,IAAI;EAC7B,EAAE,OAAO,MAAM;CACjB;CAEA,IAAI;EACF,KAAK,MAAM,SAAS;GAAC,MAAM;GAAa,MAAM;GAAQ,MAAM;GAAW,MAAM;GAAQ;GAAI;EAAC,GACxF,OAAO,KAAK;EACd,KAAK,MAAM,QAAQ;GACjB,MAAM;GACN,MAAM;GACN,MAAM,0BAAU,IAAI,WAAW;GAC/B,MAAM;EACR,GAAG;GACD,OAAO,KAAK,MAAM;GAClB,EAAE,OAAO,IAAI;EACf;EACA,MAAM,UAAU,EAAE,OAAO;EAEzB,IAAI;GACF,MAAM,WAAW,IAAI,SAAS,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,UAAU;GAEpF,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,MAAM,QAAQ,KAAK,SAAS,UAAU,IAAI,GAAG,IAAI;EAChF,UAAU;GACR,QAAQ,KAAK,CAAC;EAChB;EACA,KAAK,IAAI,OAAO,GAAG,OAAO,MAAM,aAAa,QAAQ;GACnD,MAAM,QAAQ,MAAM;GACpB,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS;IACtC,MAAM,QAAQ,MAAM;IACpB,MAAM,WAAW,aAAa,MAAM,SAAS,IAAI;IAEjD,IAAI;KACF,MAAM,eAAe,IAAI,SACvB,SAAS,QACT,SAAS,YACT,SAAS,UACX;KAEA,MAAM,UAAU,OAAO,MAAM,aAAa,SAAS;KAEnD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACvB,MAAM,OAAO,SAAS,KAAK,aAAa,UAAU,IAAI,GAAG,IAAI;IACjE,UAAU;KACR,SAAS,KAAK,CAAC;IACjB;GACF;EACF;CACF,UAAU;EACR,EAAE,QAAQ;EACV,OAAO,KAAK,CAAC;EACb,MAAM,QAAQ,KAAK,CAAC;CACtB;AACF;;AAGA,UAAiB,KACf,OACA,OACA,WAAyB,OACF;CACvB,MAAM,EAAE,QAAQ,GAAG,SAAS,SAAS,YAAY,SAAS,eAAe,eAAe;CACxF,MAAM,IAAI,MAAM;CAEhB,QAAQ,OAAW,MAAM;CACzB,QAAQ,OAAW,MAAM;CACzB,QAAQ,OAAY;CACpB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,UAAU,MAAM;EAEtB,QAAQ,OAAO;EACf,KAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,KAAK;GAC3C,QAAQ,OAAW;GACnB,MAAM,kBAAkB,MAAM,KAAK,IAAI;GAEvC,KAAK,IAAI,OAAO,GAAG,OAAO,GAAG,QAAQ;IACnC,QAAQ,OAAW;IACnB,QAAQ,OAAY;IACpB,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI,IAAI;IAEvC,IAAI,UAAU,KAAK,iBAAiB;KAClC,QAAQ,IAAS;KACjB,SAAS,SAAS,SAAS,KAAK,KAAK,GAAG,KAAK;KAC7C,SAAS,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;IAC7C;IACA,IAAI,SAAS,OAAO,UAAU,IAAI,aAAa;IAE/C,KAAK,IAAI,QAAQ,OAAO,QAAQ,YAAY,SAAS,UAAU;KAC7D,MAAM,OAAO,SAAS,UAAU,SAAS,IAAI,SAAS,UAAU;KAChE,IAAI;KACJ,IAAI;KAEJ,IAAI,iBAAiB;MACnB,MAAM,eAAe,QAAQ;MAE7B,IAAI,iBAAiB,GAAG;OACtB,QAAQ,IAAS;OACjB,SAAS,SAAS,SAAS,KAAK,KAAK,GAAG,KAAK;OAC7C,SAAS,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;MAC7C;MACA,QAAQ,QAAQ,IAAI;MACpB,QAAQ,QAAQ,IAAI,eAAe;KACrC,OAAO;MACL,QAAQ,EAAE,MAAM;MAChB,QAAQ,EAAE,MAAM,OAAO;KACzB;KACA,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI,OAAO,QAAQ;KACpD,MAAM,SAAS,WAAW,GAAG,GAAG,SAAS,YAAY,OAAO,OAAO,YAAY,IAAI;KAEnF,SACE,SACA,GACA,MAAM,MACN,OAAO,UAAU,UAAU,SAC3B,SAAS,KACT,OACF;KACA;IACF;GACF;EACF;CACF;AACF;AAEA,MAAa,UAAU,OAAc,UAAwC;CAC3E,KAAK,IAAI,OAAO,GAAG,OAAO,MAAM,aAAa,QAAQ;EACnD,MAAM,SAAS,OAAO,MAAM,aAAa,OAAO,MAAM,aAAa;EAEnE,KAAK,IAAI,OAAO,GAAG,OAAO,KAAK,QAAQ,MAAM,MAAM,SAAS,MAAM,OAAO,SAAS;CACpF;CAEA,OAAO,aAAa,MAAM,OAAO,MAAM,MAAM;AAC/C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { nativeError } from "./common.mjs";
|
|
2
|
+
import { allocate } from "./argon2-core.mjs";
|
|
3
|
+
import { derive } from "./argon2.mjs";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
//#region src/internal/argon2-wasm.ts
|
|
6
|
+
const makeArgon2 = (module) => (input) => Effect.acquireUseRelease(Effect.try({
|
|
7
|
+
try: () => {
|
|
8
|
+
const memory = new WebAssembly.Memory({
|
|
9
|
+
initial: 2,
|
|
10
|
+
maximum: Math.ceil(input.memoryKiB / 64) + 2
|
|
11
|
+
});
|
|
12
|
+
const exports = new WebAssembly.Instance(module, { env: { memory } }).exports;
|
|
13
|
+
const byteOffset = Number(exports.__heap_base.value);
|
|
14
|
+
const block = exports.argon2_block;
|
|
15
|
+
const bytes = byteOffset + (input.memoryKiB + 5) * 1024 + 72;
|
|
16
|
+
memory.grow(Math.max(0, Math.ceil(bytes / 65536) - 2));
|
|
17
|
+
const state = allocate(input, {
|
|
18
|
+
buffer: memory.buffer,
|
|
19
|
+
byteOffset
|
|
20
|
+
});
|
|
21
|
+
const compress = (scratch, words, x, y, out, xor) => block(scratch.byteOffset, words.byteOffset, x, y, out, Number(xor));
|
|
22
|
+
return {
|
|
23
|
+
memory,
|
|
24
|
+
state,
|
|
25
|
+
compress
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
catch: nativeError
|
|
29
|
+
}), ({ state, compress }) => derive(input, state, compress), ({ memory }) => Effect.sync(() => new Uint8Array(memory.buffer).fill(0)));
|
|
30
|
+
//#endregion
|
|
31
|
+
export { makeArgon2 };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=argon2-wasm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argon2-wasm.mjs","names":[],"sources":["../../src/internal/argon2-wasm.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { derive } from \"./argon2\";\nimport { allocate, type fill } from \"./argon2-core\";\nimport { nativeError } from \"./common\";\nimport type { Argon2 } from \"./kdf\";\n\n/** ABI of the package's owned argon2.wasm, built from argon2-block.c. */\ninterface Exports extends WebAssembly.Exports {\n readonly __heap_base: WebAssembly.Global;\n readonly argon2_block: (\n scratch: number,\n memory: number,\n x: number,\n y: number,\n out: number,\n xor: number,\n ) => void;\n}\n\nexport const makeArgon2 =\n (module: WebAssembly.Module): Argon2 =>\n (input) =>\n Effect.acquireUseRelease(\n Effect.try({\n try: () => {\n // Each admitted derivation owns an instance. Two extra pages cover the\n // module's 64 KiB stack, scratch, address, initial and final buffers.\n const memory = new WebAssembly.Memory({\n initial: 2,\n maximum: Math.ceil(input.memoryKiB / 64) + 2,\n });\n\n const exports = new WebAssembly.Instance(module, { env: { memory } }).exports as Exports;\n const byteOffset = Number(exports.__heap_base.value);\n const block = exports.argon2_block;\n const bytes = byteOffset + (input.memoryKiB + 5) * 1024 + 72;\n\n memory.grow(Math.max(0, Math.ceil(bytes / 65536) - 2));\n const state = allocate(input, { buffer: memory.buffer, byteOffset });\n\n const compress: NonNullable<Parameters<typeof fill>[2]> = (\n scratch,\n words,\n x,\n y,\n out,\n xor,\n ) => block(scratch.byteOffset, words.byteOffset, x, y, out, Number(xor));\n\n return { memory, state, compress };\n },\n catch: nativeError,\n }),\n ({ state, compress }) => derive(input, state, compress),\n // Clear the entire linear memory, including any compiler stack spills,\n // before Kdf releases admission on completion, failure or interruption.\n ({ memory }) => Effect.sync(() => new Uint8Array(memory.buffer).fill(0)),\n );\n"],"mappings":";;;;;AAoBA,MAAa,cACV,YACA,UACC,OAAO,kBACL,OAAO,IAAI;CACT,WAAW;EAGT,MAAM,SAAS,IAAI,YAAY,OAAO;GACpC,SAAS;GACT,SAAS,KAAK,KAAK,MAAM,YAAY,EAAE,IAAI;EAC7C,CAAC;EAED,MAAM,UAAU,IAAI,YAAY,SAAS,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;EACtE,MAAM,aAAa,OAAO,QAAQ,YAAY,KAAK;EACnD,MAAM,QAAQ,QAAQ;EACtB,MAAM,QAAQ,cAAc,MAAM,YAAY,KAAK,OAAO;EAE1D,OAAO,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,KAAK,IAAI,CAAC,CAAC;EACrD,MAAM,QAAQ,SAAS,OAAO;GAAE,QAAQ,OAAO;GAAQ;EAAW,CAAC;EAEnE,MAAM,YACJ,SACA,OACA,GACA,GACA,KACA,QACG,MAAM,QAAQ,YAAY,MAAM,YAAY,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC;EAEvE,OAAO;GAAE;GAAQ;GAAO;EAAS;CACnC;CACA,OAAO;AACT,CAAC,IACA,EAAE,OAAO,eAAe,OAAO,OAAO,OAAO,QAAQ,IAGrD,EAAE,aAAa,OAAO,WAAW,IAAI,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CACzE"}
|
package/dist/internal/argon2.mjs
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { allocate, destroy, fill, initialize, output } from "./argon2-core.mjs";
|
|
2
2
|
import { Clock, Effect } from "effect";
|
|
3
3
|
//#region src/internal/argon2.ts
|
|
4
|
-
|
|
5
|
-
const argon2 = (input) => Effect.acquireUseRelease(Effect.sync(() => allocate(input)), (state) => Effect.gen(function* () {
|
|
4
|
+
const derive = Effect.fnUntraced(function* (input, state, compress) {
|
|
6
5
|
const clock = yield* Clock.Clock;
|
|
7
6
|
initialize(state, input);
|
|
8
|
-
const blocks = fill(state, input);
|
|
7
|
+
const blocks = fill(state, input, compress);
|
|
9
8
|
for (;;) {
|
|
10
9
|
const started = clock.monotonicTimeNanosUnsafe();
|
|
11
10
|
for (let processed = 0; processed < 2048; processed += 256) {
|
|
@@ -14,8 +13,10 @@ const argon2 = (input) => Effect.acquireUseRelease(Effect.sync(() => allocate(in
|
|
|
14
13
|
}
|
|
15
14
|
yield* Effect.yieldNow;
|
|
16
15
|
}
|
|
17
|
-
})
|
|
16
|
+
});
|
|
17
|
+
/** Effect schedules time slices; admission remains held through buffer cleanup. */
|
|
18
|
+
const argon2 = (input) => Effect.acquireUseRelease(Effect.sync(() => allocate(input)), (state) => derive(input, state), (state) => Effect.sync(() => destroy(state)));
|
|
18
19
|
//#endregion
|
|
19
|
-
export { argon2 };
|
|
20
|
+
export { argon2, derive };
|
|
20
21
|
|
|
21
22
|
//# sourceMappingURL=argon2.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argon2.mjs","names":[],"sources":["../../src/internal/argon2.ts"],"sourcesContent":["import { Clock, Effect } from \"effect\";\n\nimport { allocate, destroy, fill, initialize, output } from \"./argon2-core\";\nimport type { Argon2 } from \"./kdf\";\n\
|
|
1
|
+
{"version":3,"file":"argon2.mjs","names":[],"sources":["../../src/internal/argon2.ts"],"sourcesContent":["import { Clock, Effect } from \"effect\";\n\nimport { allocate, destroy, fill, initialize, output, type State } from \"./argon2-core\";\nimport type { Argon2, Argon2Parameters } from \"./kdf\";\n\nexport const derive = Effect.fnUntraced(function* (\n input: Argon2Parameters,\n state: State,\n compress?: Parameters<typeof fill>[2],\n) {\n const clock = yield* Clock.Clock;\n\n initialize(state, input);\n const blocks = fill(state, input, compress);\n\n for (;;) {\n const started = clock.monotonicTimeNanosUnsafe();\n\n // Workers freeze clocks during CPU work. Cap each slice as well so\n // interruption and other fibers still get a turn on those runtimes.\n for (let processed = 0; processed < 2048; processed += 256) {\n for (let batch = 0; batch < 256; batch++) {\n if (blocks.next().done) return output(state, input);\n }\n if (clock.monotonicTimeNanosUnsafe() - started >= 8_000_000n) break;\n }\n yield* Effect.yieldNow;\n }\n});\n\n/** Effect schedules time slices; admission remains held through buffer cleanup. */\nexport const argon2: Argon2 = (input) =>\n Effect.acquireUseRelease(\n Effect.sync(() => allocate(input)),\n (state) => derive(input, state),\n (state) => Effect.sync(() => destroy(state)),\n );\n"],"mappings":";;;AAKA,MAAa,SAAS,OAAO,WAAW,WACtC,OACA,OACA,UACA;CACA,MAAM,QAAQ,OAAO,MAAM;CAE3B,WAAW,OAAO,KAAK;CACvB,MAAM,SAAS,KAAK,OAAO,OAAO,QAAQ;CAE1C,SAAS;EACP,MAAM,UAAU,MAAM,yBAAyB;EAI/C,KAAK,IAAI,YAAY,GAAG,YAAY,MAAM,aAAa,KAAK;GAC1D,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAC/B,IAAI,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,OAAO,OAAO,KAAK;GAEpD,IAAI,MAAM,yBAAyB,IAAI,WAAW,UAAY;EAChE;EACA,OAAO,OAAO;CAChB;AACF,CAAC;;AAGD,MAAa,UAAkB,UAC7B,OAAO,kBACL,OAAO,WAAW,SAAS,KAAK,CAAC,IAChC,UAAU,OAAO,OAAO,KAAK,IAC7B,UAAU,OAAO,WAAW,QAAQ,KAAK,CAAC,CAC7C"}
|
|
Binary file
|
package/dist/internal/kdf.mjs
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { InvalidInput, UnsupportedAlgorithm } from "../Errors.mjs";
|
|
2
|
-
import { Argon2idInput, HkdfInput, Kdf, Pbkdf2Input } from "../Kdf.mjs";
|
|
2
|
+
import { Argon2idInput, HkdfInput, Kdf, Pbkdf2Input, ScryptInput } from "../Kdf.mjs";
|
|
3
3
|
import { KdfAdmission } from "../KdfAdmission.mjs";
|
|
4
4
|
import { copy, decode, importError, nativeError, withSecret } from "./common.mjs";
|
|
5
|
+
import { ScryptBackend } from "./scrypt-backend.mjs";
|
|
5
6
|
import { Effect, Redacted, Schema } from "effect";
|
|
6
7
|
//#region src/internal/kdf.ts
|
|
7
8
|
const makeKdf = Effect.fnUntraced(function* (subtle, limits, argon2) {
|
|
8
9
|
const admission = yield* KdfAdmission;
|
|
10
|
+
const scrypt = yield* ScryptBackend;
|
|
9
11
|
const boundedBytes = Schema.Uint8Array.check(Schema.isMaxLength(limits.maximumInputBytes));
|
|
10
12
|
const output = Schema.Int.check(Schema.isBetween({
|
|
11
13
|
minimum: 1,
|
|
@@ -14,6 +16,24 @@ const makeKdf = Effect.fnUntraced(function* (subtle, limits, argon2) {
|
|
|
14
16
|
const inputBytes = (input) => decode(boundedBytes, input, "data");
|
|
15
17
|
const outputLength = (input) => decode(output, input, "parameters");
|
|
16
18
|
return Kdf.of({
|
|
19
|
+
scrypt: (input) => admission.run(Effect.gen(function* () {
|
|
20
|
+
const value = yield* decode(ScryptInput, input, "parameters");
|
|
21
|
+
yield* outputLength(value.length);
|
|
22
|
+
yield* inputBytes(Redacted.value(value.password));
|
|
23
|
+
yield* inputBytes(value.salt);
|
|
24
|
+
const memoryBytes = 128 * value.blockSize * (value.cost + value.parallelism + 2);
|
|
25
|
+
if (!Number.isInteger(Math.log2(value.cost)) || Math.log2(value.cost) >= 16 * value.blockSize || value.blockSize * value.parallelism >= 2 ** 30 || memoryBytes > limits.maximumMemoryKiB * 1024 || value.cost * value.blockSize * value.parallelism / 8 > limits.maximumMemoryPasses) return yield* InvalidInput.make({ reason: "parameters" });
|
|
26
|
+
const salt = yield* copy(value.salt);
|
|
27
|
+
return yield* withSecret(value.password, (password) => scrypt.derive({
|
|
28
|
+
password,
|
|
29
|
+
salt,
|
|
30
|
+
cost: value.cost,
|
|
31
|
+
blockSize: value.blockSize,
|
|
32
|
+
parallelism: value.parallelism,
|
|
33
|
+
length: value.length,
|
|
34
|
+
maximumMemoryBytes: limits.maximumMemoryKiB * 1024
|
|
35
|
+
}).pipe(Effect.map(Redacted.make)));
|
|
36
|
+
})),
|
|
17
37
|
pbkdf2: (input) => admission.run(Effect.gen(function* () {
|
|
18
38
|
const value = yield* decode(Pbkdf2Input, input, "parameters");
|
|
19
39
|
yield* decode(Schema.Int.check(Schema.isBetween({
|
|
@@ -1 +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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"}
|
|
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, ScryptInput } from \"../Kdf\";\nimport { KdfAdmission } from \"../KdfAdmission\";\nimport { copy, decode, importError, nativeError, withSecret } from \"./common\";\nimport { ScryptBackend } from \"./scrypt-backend\";\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 scrypt = yield* ScryptBackend;\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 scrypt: (input) =>\n admission.run(\n Effect.gen(function* () {\n const value = yield* decode(ScryptInput, input, \"parameters\");\n\n yield* outputLength(value.length);\n yield* inputBytes(Redacted.value(value.password));\n yield* inputBytes(value.salt);\n\n const memoryBytes = 128 * value.blockSize * (value.cost + value.parallelism + 2);\n\n if (\n !Number.isInteger(Math.log2(value.cost)) ||\n Math.log2(value.cost) >= 16 * value.blockSize ||\n value.blockSize * value.parallelism >= 2 ** 30 ||\n memoryBytes > limits.maximumMemoryKiB * 1024 ||\n (value.cost * value.blockSize * value.parallelism) / 8 > limits.maximumMemoryPasses\n )\n return yield* InvalidInput.make({ reason: \"parameters\" });\n const salt = yield* copy(value.salt);\n\n return yield* withSecret(value.password, (password) =>\n scrypt\n .derive({\n password,\n salt,\n cost: value.cost,\n blockSize: value.blockSize,\n parallelism: value.parallelism,\n length: value.length,\n maximumMemoryBytes: limits.maximumMemoryKiB * 1024,\n })\n .pipe(Effect.map(Redacted.make)),\n );\n }),\n ),\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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"}
|
|
@@ -1 +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: {
|
|
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: {\n readonly argon2?: Argon2;\n readonly xchacha?: XChaCha;\n } = {},\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,aAGI,CAAC,MACF;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"}
|
package/dist/internal/node.d.mts
CHANGED
|
@@ -4,8 +4,9 @@ import { Hmac } from "../Hmac.mjs";
|
|
|
4
4
|
import { Kdf, Limits } from "../Kdf.mjs";
|
|
5
5
|
import { KdfAdmission } from "../KdfAdmission.mjs";
|
|
6
6
|
import { Signature } from "../Signature.mjs";
|
|
7
|
+
import { Layer } from "effect";
|
|
7
8
|
//#region src/internal/node.d.ts
|
|
8
|
-
/** Node-compatible WebCrypto
|
|
9
|
-
export declare const layer: (limits?: Partial<Limits>) =>
|
|
9
|
+
/** Node-compatible WebCrypto and native password KDFs with portable XChaCha20-Poly1305. */
|
|
10
|
+
export declare const layer: (limits?: Partial<Limits>) => Layer.Layer<Aead | Hmac | Kdf | Signature, InvalidInput, KdfAdmission>;
|
|
10
11
|
//#endregion
|
|
11
12
|
//# sourceMappingURL=node.d.mts.map
|