cipher-kit 2.1.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +324 -434
  2. package/dist/chunk-3A4RTUKO.cjs +509 -0
  3. package/dist/chunk-3A4RTUKO.cjs.map +1 -0
  4. package/dist/chunk-7254PEID.cjs +502 -0
  5. package/dist/chunk-7254PEID.cjs.map +1 -0
  6. package/dist/chunk-GL32EZRA.js +475 -0
  7. package/dist/chunk-GL32EZRA.js.map +1 -0
  8. package/dist/chunk-IY6XGUYO.js +494 -0
  9. package/dist/chunk-IY6XGUYO.js.map +1 -0
  10. package/dist/chunk-VCBHSRCS.cjs +523 -0
  11. package/dist/chunk-VCBHSRCS.cjs.map +1 -0
  12. package/dist/chunk-X6MX4NDE.js +478 -0
  13. package/dist/chunk-X6MX4NDE.js.map +1 -0
  14. package/dist/export-B-3CCZIO.d.cts +389 -0
  15. package/dist/export-BPo6yPV-.d.ts +389 -0
  16. package/dist/export-C0_UEEg8.d.ts +396 -0
  17. package/dist/export-DPuocAr3.d.cts +396 -0
  18. package/dist/index.cjs +11 -19
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +11 -40
  21. package/dist/index.d.ts +11 -40
  22. package/dist/index.js +3 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/node.cjs +39 -35
  25. package/dist/node.d.cts +3 -3
  26. package/dist/node.d.ts +3 -3
  27. package/dist/node.js +2 -2
  28. package/dist/validate-vDTesb-X.d.cts +195 -0
  29. package/dist/validate-vDTesb-X.d.ts +195 -0
  30. package/dist/web-api.cjs +39 -35
  31. package/dist/web-api.d.cts +2 -3
  32. package/dist/web-api.d.ts +2 -3
  33. package/dist/web-api.js +2 -2
  34. package/package.json +82 -92
  35. package/dist/chunk-BMX42IZM.cjs +0 -623
  36. package/dist/chunk-BMX42IZM.cjs.map +0 -1
  37. package/dist/chunk-HTRGOBZF.cjs +0 -169
  38. package/dist/chunk-HTRGOBZF.cjs.map +0 -1
  39. package/dist/chunk-LU7QOSQH.js +0 -141
  40. package/dist/chunk-LU7QOSQH.js.map +0 -1
  41. package/dist/chunk-S6SNCTU6.js +0 -485
  42. package/dist/chunk-S6SNCTU6.js.map +0 -1
  43. package/dist/chunk-T36BEDPY.js +0 -598
  44. package/dist/chunk-T36BEDPY.js.map +0 -1
  45. package/dist/chunk-ZNM5M6RD.cjs +0 -514
  46. package/dist/chunk-ZNM5M6RD.cjs.map +0 -1
  47. package/dist/export-BaM_OTFk.d.ts +0 -573
  48. package/dist/export-CCTGAosO.d.ts +0 -572
  49. package/dist/export-FYHgb-8E.d.cts +0 -572
  50. package/dist/export-KFT0YyMg.d.cts +0 -573
  51. package/dist/validate-lkJAHCeJ.d.cts +0 -399
  52. package/dist/validate-lkJAHCeJ.d.ts +0 -399
@@ -1,514 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkHTRGOBZF_cjs = require('./chunk-HTRGOBZF.cjs');
4
- var buffer = require('buffer');
5
- var nodeCrypto = require('crypto');
6
-
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
-
9
- var nodeCrypto__default = /*#__PURE__*/_interopDefault(nodeCrypto);
10
-
11
- // src/node/kit.ts
12
- var kit_exports = {};
13
- chunkHTRGOBZF_cjs.__export(kit_exports, {
14
- convertBytesToStr: () => convertBytesToStr,
15
- convertEncoding: () => convertEncoding,
16
- convertStrToBytes: () => convertStrToBytes,
17
- createSecretKey: () => createSecretKey,
18
- decrypt: () => decrypt,
19
- decryptObj: () => decryptObj,
20
- encrypt: () => encrypt,
21
- encryptObj: () => encryptObj,
22
- generateUuid: () => generateUuid,
23
- hash: () => hash,
24
- hashPassword: () => hashPassword,
25
- tryConvertBytesToStr: () => tryConvertBytesToStr,
26
- tryConvertEncoding: () => tryConvertEncoding,
27
- tryConvertStrToBytes: () => tryConvertStrToBytes,
28
- tryCreateSecretKey: () => tryCreateSecretKey,
29
- tryDecrypt: () => tryDecrypt,
30
- tryDecryptObj: () => tryDecryptObj,
31
- tryEncrypt: () => tryEncrypt,
32
- tryEncryptObj: () => tryEncryptObj,
33
- tryGenerateUuid: () => tryGenerateUuid,
34
- tryHash: () => tryHash,
35
- tryHashPassword: () => tryHashPassword,
36
- verifyPassword: () => verifyPassword
37
- });
38
- function $convertStrToBytes(data, inputEncoding = "utf8") {
39
- if (!chunkHTRGOBZF_cjs.$isStr(data)) {
40
- return chunkHTRGOBZF_cjs.$err({
41
- msg: "Crypto NodeJS API - String to Bytes: Empty data",
42
- desc: "Data must be a non-empty string"
43
- });
44
- }
45
- if (!chunkHTRGOBZF_cjs.ENCODING.includes(inputEncoding)) {
46
- return chunkHTRGOBZF_cjs.$err({
47
- msg: `Crypto NodeJS API - String to Bytes: Unsupported encoding: ${inputEncoding}`,
48
- desc: "Use base64, base64url, hex, utf8, or latin1"
49
- });
50
- }
51
- try {
52
- return chunkHTRGOBZF_cjs.$ok({ result: buffer.Buffer.from(data, inputEncoding) });
53
- } catch (error) {
54
- return chunkHTRGOBZF_cjs.$err({ msg: "Crypto NodeJS API - String to Bytes: Failed to convert data", desc: chunkHTRGOBZF_cjs.$fmtError(error) });
55
- }
56
- }
57
- function $convertBytesToStr(data, outputEncoding = "utf8") {
58
- if (!(data instanceof buffer.Buffer)) {
59
- return chunkHTRGOBZF_cjs.$err({
60
- msg: "Crypto NodeJS API - Bytes to String: Invalid data type",
61
- desc: "Data must be a Buffer"
62
- });
63
- }
64
- if (!chunkHTRGOBZF_cjs.ENCODING.includes(outputEncoding)) {
65
- return chunkHTRGOBZF_cjs.$err({
66
- msg: `Crypto NodeJS API - Bytes to String: Unsupported encoding: ${outputEncoding}`,
67
- desc: "Use base64, base64url, hex, utf8, or latin1"
68
- });
69
- }
70
- try {
71
- return chunkHTRGOBZF_cjs.$ok(buffer.Buffer.from(data).toString(outputEncoding));
72
- } catch (error) {
73
- return chunkHTRGOBZF_cjs.$err({ msg: "Crypto NodeJS API - Bytes to String: Failed to convert data", desc: chunkHTRGOBZF_cjs.$fmtError(error) });
74
- }
75
- }
76
- function $convertEncoding(data, from, to) {
77
- if (!chunkHTRGOBZF_cjs.$isStr(data)) {
78
- return chunkHTRGOBZF_cjs.$err({
79
- msg: "Crypto NodeJS API - Convert Format: Empty data",
80
- desc: "Data must be a non-empty string"
81
- });
82
- }
83
- if (!chunkHTRGOBZF_cjs.ENCODING.includes(from) || !chunkHTRGOBZF_cjs.ENCODING.includes(to)) {
84
- return chunkHTRGOBZF_cjs.$err({
85
- msg: `Crypto NodeJS API - Convert Format: Unsupported encoding: from ${from} to ${to}`,
86
- desc: "Use base64, base64url, hex, utf8, or latin1"
87
- });
88
- }
89
- const bytes = $convertStrToBytes(data, from);
90
- if (bytes.error) return chunkHTRGOBZF_cjs.$err({ msg: bytes.error.message, desc: bytes.error.description });
91
- const str = $convertBytesToStr(bytes.result, to);
92
- if (str.error) return chunkHTRGOBZF_cjs.$err({ msg: str.error.message, desc: str.error.description });
93
- return chunkHTRGOBZF_cjs.$ok({ result: str.result });
94
- }
95
- function $generateUuid() {
96
- try {
97
- return chunkHTRGOBZF_cjs.$ok(nodeCrypto__default.default.randomUUID());
98
- } catch (error) {
99
- return chunkHTRGOBZF_cjs.$err({ msg: `${chunkHTRGOBZF_cjs.title("node", "UUID Generation")}: Failed to generate UUID`, desc: chunkHTRGOBZF_cjs.$fmtError(error) });
100
- }
101
- }
102
- function $createSecretKey(secret, options) {
103
- if (!chunkHTRGOBZF_cjs.$isStr(secret, 8)) {
104
- return chunkHTRGOBZF_cjs.$err({
105
- msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Empty Secret`,
106
- desc: "Secret must be a non-empty string with at least 8 characters"
107
- });
108
- }
109
- if (!chunkHTRGOBZF_cjs.$isPlainObj(options)) {
110
- return chunkHTRGOBZF_cjs.$err({
111
- msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Invalid options`,
112
- desc: "Options must be an object"
113
- });
114
- }
115
- const algorithm = options.algorithm ?? "aes256gcm";
116
- if (!(algorithm in chunkHTRGOBZF_cjs.ENCRYPTION_ALGORITHMS)) {
117
- return chunkHTRGOBZF_cjs.$err({
118
- msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Unsupported algorithm: ${algorithm}`,
119
- desc: `Supported algorithms are: ${Object.keys(chunkHTRGOBZF_cjs.ENCRYPTION_ALGORITHMS).join(", ")}`
120
- });
121
- }
122
- const digest = options.digest ?? "sha256";
123
- if (!(digest in chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS)) {
124
- return chunkHTRGOBZF_cjs.$err({
125
- msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Unsupported digest: ${digest}`,
126
- desc: `Supported digests are: ${Object.keys(chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS).join(", ")}`
127
- });
128
- }
129
- const salt = options.salt ?? "cipher-kit-salt";
130
- if (!chunkHTRGOBZF_cjs.$isStr(salt, 8)) {
131
- return chunkHTRGOBZF_cjs.$err({
132
- msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Weak salt`,
133
- desc: "Salt must be a non-empty string with at least 8 characters"
134
- });
135
- }
136
- const info = options.info ?? "cipher-kit";
137
- if (!chunkHTRGOBZF_cjs.$isStr(info)) {
138
- return chunkHTRGOBZF_cjs.$err({
139
- msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Invalid info`,
140
- desc: "Info must be a non-empty string"
141
- });
142
- }
143
- const encryptAlgo = chunkHTRGOBZF_cjs.ENCRYPTION_ALGORITHMS[algorithm];
144
- const digestAlgo = chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS[digest];
145
- try {
146
- const derivedKey = nodeCrypto__default.default.hkdfSync(
147
- digestAlgo.node,
148
- secret.normalize("NFKC"),
149
- salt.normalize("NFKC"),
150
- info.normalize("NFKC"),
151
- encryptAlgo.keyBytes
152
- );
153
- const key = nodeCrypto__default.default.createSecretKey(buffer.Buffer.from(derivedKey));
154
- const secretKey = Object.freeze({
155
- platform: "node",
156
- digest,
157
- algorithm,
158
- key
159
- });
160
- return chunkHTRGOBZF_cjs.$ok({ result: secretKey });
161
- } catch (error) {
162
- return chunkHTRGOBZF_cjs.$err({ msg: `${chunkHTRGOBZF_cjs.title("node", "Key Generation")}: Failed to create secret key`, desc: chunkHTRGOBZF_cjs.$fmtError(error) });
163
- }
164
- }
165
- function $encrypt(data, secretKey, options) {
166
- if (!chunkHTRGOBZF_cjs.$isStr(data)) {
167
- return chunkHTRGOBZF_cjs.$err({
168
- msg: `${chunkHTRGOBZF_cjs.title("node", "Encryption")}: Empty data for encryption`,
169
- desc: "Data must be a non-empty string"
170
- });
171
- }
172
- if (!chunkHTRGOBZF_cjs.$isPlainObj(options)) {
173
- return chunkHTRGOBZF_cjs.$err({
174
- msg: `${chunkHTRGOBZF_cjs.title("node", "Encryption")}: Invalid options`,
175
- desc: "Options must be an object"
176
- });
177
- }
178
- const outputEncoding = options.outputEncoding ?? "base64url";
179
- if (!chunkHTRGOBZF_cjs.CIPHER_ENCODING.includes(outputEncoding)) {
180
- return chunkHTRGOBZF_cjs.$err({
181
- msg: `${chunkHTRGOBZF_cjs.title("node", "Encryption")}: Unsupported output encoding: ${outputEncoding}`,
182
- desc: "Use base64, base64url, or hex"
183
- });
184
- }
185
- const injectedKey = chunkHTRGOBZF_cjs.$isSecretKey(secretKey, "node");
186
- if (!injectedKey) {
187
- return chunkHTRGOBZF_cjs.$err({
188
- msg: `${chunkHTRGOBZF_cjs.title("node", "Encryption")}: Invalid Secret Key`,
189
- desc: "Expected a Node SecretKey"
190
- });
191
- }
192
- const { result, error } = $convertStrToBytes(data, "utf8");
193
- if (error) return chunkHTRGOBZF_cjs.$err(error);
194
- try {
195
- const iv = nodeCrypto__default.default.randomBytes(injectedKey.injected.ivLength);
196
- const cipher = nodeCrypto__default.default.createCipheriv(injectedKey.injected.node, injectedKey.key, iv);
197
- const encrypted = buffer.Buffer.concat([cipher.update(result), cipher.final()]);
198
- const tag = cipher.getAuthTag();
199
- const ivStr = $convertBytesToStr(iv, outputEncoding);
200
- const cipherStr = $convertBytesToStr(encrypted, outputEncoding);
201
- const tagStr = $convertBytesToStr(tag, outputEncoding);
202
- if (ivStr.error || cipherStr.error || tagStr.error) {
203
- return chunkHTRGOBZF_cjs.$err({
204
- msg: "Crypto NodeJS API - Encryption: Failed to convert IV or encrypted data or tag",
205
- desc: `Conversion error: ${chunkHTRGOBZF_cjs.$fmtResultErr(ivStr.error || cipherStr.error || tagStr.error)}`
206
- });
207
- }
208
- return chunkHTRGOBZF_cjs.$ok(`${ivStr.result}.${cipherStr.result}.${tagStr.result}.`);
209
- } catch (error2) {
210
- return chunkHTRGOBZF_cjs.$err({ msg: `${chunkHTRGOBZF_cjs.title("node", "Encryption")}: Failed to encrypt data`, desc: chunkHTRGOBZF_cjs.$fmtError(error2) });
211
- }
212
- }
213
- function $decrypt(encrypted, secretKey, options) {
214
- if (!chunkHTRGOBZF_cjs.matchEncryptedPattern(encrypted, "node")) {
215
- return chunkHTRGOBZF_cjs.$err({
216
- msg: `${chunkHTRGOBZF_cjs.title("node", "Decryption")}: Invalid encrypted data format`,
217
- desc: 'Encrypted data must be in the format "iv.cipher.tag."'
218
- });
219
- }
220
- if (!chunkHTRGOBZF_cjs.$isPlainObj(options)) {
221
- return chunkHTRGOBZF_cjs.$err({
222
- msg: `${chunkHTRGOBZF_cjs.title("node", "Decryption")}: Invalid options`,
223
- desc: "Options must be an object"
224
- });
225
- }
226
- const inputEncoding = options.inputEncoding ?? "base64url";
227
- if (!chunkHTRGOBZF_cjs.CIPHER_ENCODING.includes(inputEncoding)) {
228
- return chunkHTRGOBZF_cjs.$err({
229
- msg: `${chunkHTRGOBZF_cjs.title("node", "Decryption")}: Unsupported input encoding: ${inputEncoding}`,
230
- desc: "Use base64, base64url, or hex"
231
- });
232
- }
233
- const [iv, cipher, tag] = encrypted.split(".", 4);
234
- if (!chunkHTRGOBZF_cjs.$isStr(iv) || !chunkHTRGOBZF_cjs.$isStr(cipher) || !chunkHTRGOBZF_cjs.$isStr(tag)) {
235
- return chunkHTRGOBZF_cjs.$err({
236
- msg: `${chunkHTRGOBZF_cjs.title("node", "Decryption")}: Invalid encrypted data`,
237
- desc: "Encrypted data must contain valid IV, encrypted data, and tag components"
238
- });
239
- }
240
- const injectedKey = chunkHTRGOBZF_cjs.$isSecretKey(secretKey, "node");
241
- if (!injectedKey) {
242
- return chunkHTRGOBZF_cjs.$err({
243
- msg: "Crypto NodeJS API - Decryption: Invalid Secret Key",
244
- desc: "Expected a Node SecretKey"
245
- });
246
- }
247
- const ivBytes = $convertStrToBytes(iv, inputEncoding);
248
- const cipherBytes = $convertStrToBytes(cipher, inputEncoding);
249
- const tagBytes = $convertStrToBytes(tag, inputEncoding);
250
- if (ivBytes.error || cipherBytes.error || tagBytes.error) {
251
- return chunkHTRGOBZF_cjs.$err({
252
- msg: `${chunkHTRGOBZF_cjs.title("node", "Decryption")}: Failed to convert IV or encrypted data or tag`,
253
- desc: `Conversion error: ${chunkHTRGOBZF_cjs.$fmtResultErr(ivBytes.error || cipherBytes.error || tagBytes.error)}`
254
- });
255
- }
256
- try {
257
- const decipher = nodeCrypto__default.default.createDecipheriv(injectedKey.injected.node, injectedKey.key, ivBytes.result);
258
- decipher.setAuthTag(tagBytes.result);
259
- const decrypted = buffer.Buffer.concat([decipher.update(cipherBytes.result), decipher.final()]);
260
- return $convertBytesToStr(decrypted, "utf8");
261
- } catch (error) {
262
- return chunkHTRGOBZF_cjs.$err({ msg: `${chunkHTRGOBZF_cjs.title("node", "Decryption")}: Failed to decrypt data`, desc: chunkHTRGOBZF_cjs.$fmtError(error) });
263
- }
264
- }
265
- function $encryptObj(data, secretKey, options) {
266
- const { result, error } = chunkHTRGOBZF_cjs.$stringifyObj(data);
267
- if (error) return chunkHTRGOBZF_cjs.$err(error);
268
- return $encrypt(result, secretKey, options);
269
- }
270
- function $decryptObj(encrypted, secretKey, options) {
271
- const { result, error } = $decrypt(encrypted, secretKey, options);
272
- if (error) return chunkHTRGOBZF_cjs.$err(error);
273
- return chunkHTRGOBZF_cjs.$parseToObj(result);
274
- }
275
- function $hash(data, options = {}) {
276
- if (!chunkHTRGOBZF_cjs.$isStr(data)) {
277
- return chunkHTRGOBZF_cjs.$err({
278
- msg: `${chunkHTRGOBZF_cjs.title("node", "Hashing")}: Empty data for hashing`,
279
- desc: "Data must be a non-empty string"
280
- });
281
- }
282
- if (!chunkHTRGOBZF_cjs.$isPlainObj(options)) {
283
- return chunkHTRGOBZF_cjs.$err({
284
- msg: `${chunkHTRGOBZF_cjs.title("node", "Hashing")}: Invalid options`,
285
- desc: "Options must be an object"
286
- });
287
- }
288
- const outputEncoding = options.outputEncoding ?? "base64url";
289
- if (!chunkHTRGOBZF_cjs.CIPHER_ENCODING.includes(outputEncoding)) {
290
- return chunkHTRGOBZF_cjs.$err({
291
- msg: `${chunkHTRGOBZF_cjs.title("node", "Hashing")}: Unsupported output encoding: ${outputEncoding}`,
292
- desc: "Use base64, base64url, or hex"
293
- });
294
- }
295
- const digest = options.digest ?? "sha256";
296
- if (!(digest in chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS)) {
297
- return chunkHTRGOBZF_cjs.$err({
298
- msg: `${chunkHTRGOBZF_cjs.title("node", "Hashing")}: Unsupported digest: ${digest}`,
299
- desc: `Supported digests are: ${Object.keys(chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS).join(", ")}`
300
- });
301
- }
302
- const digestAlgo = chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS[digest];
303
- const { result, error } = $convertStrToBytes(data, "utf8");
304
- if (error) return chunkHTRGOBZF_cjs.$err(error);
305
- try {
306
- const hashed = nodeCrypto__default.default.createHash(digestAlgo.node).update(result).digest();
307
- return $convertBytesToStr(hashed, outputEncoding);
308
- } catch (error2) {
309
- return chunkHTRGOBZF_cjs.$err({ msg: `${chunkHTRGOBZF_cjs.title("node", "Hashing")}: Failed to hash data with Crypto NodeJS`, desc: chunkHTRGOBZF_cjs.$fmtError(error2) });
310
- }
311
- }
312
- function $hashPassword(password, options) {
313
- if (!chunkHTRGOBZF_cjs.$isStr(password)) {
314
- return chunkHTRGOBZF_cjs.$err({
315
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Empty password for hashing`,
316
- desc: "Password must be a non-empty string"
317
- });
318
- }
319
- if (!chunkHTRGOBZF_cjs.$isPlainObj(options)) {
320
- return chunkHTRGOBZF_cjs.$err({
321
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Invalid options`,
322
- desc: "Options must be an object"
323
- });
324
- }
325
- const digest = options.digest ?? "sha512";
326
- if (!(digest in chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS)) {
327
- return chunkHTRGOBZF_cjs.$err({
328
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Unsupported digest: ${digest}`,
329
- desc: `Supported digests are: ${Object.keys(chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS).join(", ")}`
330
- });
331
- }
332
- const digestAlgo = chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS[digest];
333
- const outputEncoding = options.outputEncoding ?? "base64url";
334
- if (!chunkHTRGOBZF_cjs.CIPHER_ENCODING.includes(outputEncoding)) {
335
- return chunkHTRGOBZF_cjs.$err({
336
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Unsupported encoding: ${outputEncoding}`,
337
- desc: "Use base64, base64url, or hex"
338
- });
339
- }
340
- const saltLength = options.saltLength ?? 16;
341
- if (typeof saltLength !== "number" || saltLength < 8) {
342
- return chunkHTRGOBZF_cjs.$err({
343
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Weak salt length`,
344
- desc: "Salt length must be a number and at least 8 bytes (recommended 16 or more)"
345
- });
346
- }
347
- const iterations = options.iterations ?? 32e4;
348
- if (typeof iterations !== "number" || iterations < 1e3) {
349
- return chunkHTRGOBZF_cjs.$err({
350
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Weak iterations count`,
351
- desc: "Iterations must be a number and at least 1000 (recommended 320,000 or more)"
352
- });
353
- }
354
- const keyLength = options.keyLength ?? 64;
355
- if (typeof keyLength !== "number" || keyLength < 16) {
356
- return chunkHTRGOBZF_cjs.$err({
357
- msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Invalid key length`,
358
- desc: "Key length must be a number and at least 16 bytes (recommended 64 or more)"
359
- });
360
- }
361
- try {
362
- const salt = nodeCrypto__default.default.randomBytes(saltLength);
363
- const hash2 = nodeCrypto__default.default.pbkdf2Sync(password.normalize("NFKC"), salt, iterations, keyLength, digestAlgo.node);
364
- return chunkHTRGOBZF_cjs.$ok({ result: hash2.toString(outputEncoding), salt: salt.toString(outputEncoding) });
365
- } catch (error) {
366
- return chunkHTRGOBZF_cjs.$err({ msg: `${chunkHTRGOBZF_cjs.title("node", "Password Hashing")}: Failed to hash password`, desc: chunkHTRGOBZF_cjs.$fmtError(error) });
367
- }
368
- }
369
- function $verifyPassword(password, hashedPassword, salt, options) {
370
- if (!chunkHTRGOBZF_cjs.$isStr(password) || !chunkHTRGOBZF_cjs.$isStr(hashedPassword) || !chunkHTRGOBZF_cjs.$isStr(salt) || !chunkHTRGOBZF_cjs.$isPlainObj(options)) {
371
- return false;
372
- }
373
- const digest = options.digest ?? "sha512";
374
- if (!(digest in chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS)) return false;
375
- const digestAlgo = chunkHTRGOBZF_cjs.DIGEST_ALGORITHMS[digest];
376
- const inputEncoding = options.inputEncoding ?? "base64url";
377
- if (!chunkHTRGOBZF_cjs.CIPHER_ENCODING.includes(inputEncoding)) return false;
378
- const iterations = options.iterations ?? 32e4;
379
- if (typeof iterations !== "number" || iterations < 1e3) return false;
380
- const keyLength = options.keyLength ?? 64;
381
- if (typeof keyLength !== "number" || keyLength < 16) return false;
382
- const saltBytes = $convertStrToBytes(salt, inputEncoding);
383
- if (saltBytes.error) return false;
384
- const hashedPasswordBytes = $convertStrToBytes(hashedPassword, inputEncoding);
385
- if (hashedPasswordBytes.error) return false;
386
- try {
387
- return nodeCrypto__default.default.timingSafeEqual(
388
- nodeCrypto__default.default.pbkdf2Sync(password.normalize("NFKC"), saltBytes.result, iterations, keyLength, digestAlgo.node),
389
- hashedPasswordBytes.result
390
- );
391
- } catch {
392
- return false;
393
- }
394
- }
395
-
396
- // src/node/kit.ts
397
- function tryGenerateUuid() {
398
- return $generateUuid();
399
- }
400
- function generateUuid() {
401
- const { result, error } = $generateUuid();
402
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
403
- return result;
404
- }
405
- function tryCreateSecretKey(secret, options = {}) {
406
- return $createSecretKey(secret, options);
407
- }
408
- function createSecretKey(secret, options = {}) {
409
- const { result, error } = $createSecretKey(secret, options);
410
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
411
- return result;
412
- }
413
- function tryEncrypt(data, secretKey, options = {}) {
414
- return $encrypt(data, secretKey, options);
415
- }
416
- function encrypt(data, secretKey, options = {}) {
417
- const { result, error } = $encrypt(data, secretKey, options);
418
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
419
- return result;
420
- }
421
- function tryDecrypt(encrypted, secretKey, options = {}) {
422
- return $decrypt(encrypted, secretKey, options);
423
- }
424
- function decrypt(encrypted, secretKey, options = {}) {
425
- const { result, error } = $decrypt(encrypted, secretKey, options);
426
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
427
- return result;
428
- }
429
- function tryEncryptObj(obj, secretKey, options = {}) {
430
- return $encryptObj(obj, secretKey, options);
431
- }
432
- function encryptObj(obj, secretKey, options = {}) {
433
- const { result, error } = $encryptObj(obj, secretKey, options);
434
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
435
- return result;
436
- }
437
- function tryDecryptObj(encrypted, secretKey, options = {}) {
438
- return $decryptObj(encrypted, secretKey, options);
439
- }
440
- function decryptObj(encrypted, secretKey, options = {}) {
441
- const { result, error } = $decryptObj(encrypted, secretKey, options);
442
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
443
- return result;
444
- }
445
- function tryHash(data, options = {}) {
446
- return $hash(data, options);
447
- }
448
- function hash(data, options = {}) {
449
- const { result, error } = $hash(data, options);
450
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
451
- return result;
452
- }
453
- function tryHashPassword(password, options = {}) {
454
- return $hashPassword(password, options);
455
- }
456
- function hashPassword(password, options = {}) {
457
- const { result, salt, error } = $hashPassword(password, options);
458
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
459
- return { result, salt };
460
- }
461
- function verifyPassword(password, hashedPassword, salt, options = {}) {
462
- return $verifyPassword(password, hashedPassword, salt, options);
463
- }
464
- function tryConvertStrToBytes(data, inputEncoding = "utf8") {
465
- return $convertStrToBytes(data, inputEncoding);
466
- }
467
- function convertStrToBytes(data, inputEncoding = "utf8") {
468
- const { result, error } = $convertStrToBytes(data, inputEncoding);
469
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
470
- return result;
471
- }
472
- function tryConvertBytesToStr(data, outputEncoding = "utf8") {
473
- return $convertBytesToStr(data, outputEncoding);
474
- }
475
- function convertBytesToStr(data, outputEncoding = "utf8") {
476
- const { result, error } = $convertBytesToStr(data, outputEncoding);
477
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
478
- return result;
479
- }
480
- function tryConvertEncoding(data, from, to) {
481
- return $convertEncoding(data, from, to);
482
- }
483
- function convertEncoding(data, from, to) {
484
- const { result, error } = $convertEncoding(data, from, to);
485
- if (error) throw new Error(chunkHTRGOBZF_cjs.$fmtResultErr(error));
486
- return result;
487
- }
488
-
489
- exports.convertBytesToStr = convertBytesToStr;
490
- exports.convertEncoding = convertEncoding;
491
- exports.convertStrToBytes = convertStrToBytes;
492
- exports.createSecretKey = createSecretKey;
493
- exports.decrypt = decrypt;
494
- exports.decryptObj = decryptObj;
495
- exports.encrypt = encrypt;
496
- exports.encryptObj = encryptObj;
497
- exports.generateUuid = generateUuid;
498
- exports.hash = hash;
499
- exports.hashPassword = hashPassword;
500
- exports.kit_exports = kit_exports;
501
- exports.tryConvertBytesToStr = tryConvertBytesToStr;
502
- exports.tryConvertEncoding = tryConvertEncoding;
503
- exports.tryConvertStrToBytes = tryConvertStrToBytes;
504
- exports.tryCreateSecretKey = tryCreateSecretKey;
505
- exports.tryDecrypt = tryDecrypt;
506
- exports.tryDecryptObj = tryDecryptObj;
507
- exports.tryEncrypt = tryEncrypt;
508
- exports.tryEncryptObj = tryEncryptObj;
509
- exports.tryGenerateUuid = tryGenerateUuid;
510
- exports.tryHash = tryHash;
511
- exports.tryHashPassword = tryHashPassword;
512
- exports.verifyPassword = verifyPassword;
513
- //# sourceMappingURL=chunk-ZNM5M6RD.cjs.map
514
- //# sourceMappingURL=chunk-ZNM5M6RD.cjs.map