cipher-kit 2.0.0-beta.0 → 2.0.0-beta.1
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/dist/{chunk-J5YHHXDC.js → chunk-6HNTSQAP.js} +60 -29
- package/dist/chunk-6HNTSQAP.js.map +1 -0
- package/dist/{chunk-IYMK2O3K.cjs → chunk-DZLEO2JD.cjs} +136 -98
- package/dist/chunk-DZLEO2JD.cjs.map +1 -0
- package/dist/{chunk-M7V4HSRH.js → chunk-I25C3WUZ.js} +61 -26
- package/dist/chunk-I25C3WUZ.js.map +1 -0
- package/dist/{chunk-N2ZI2CIT.js → chunk-SRGSVNQ2.js} +66 -28
- package/dist/chunk-SRGSVNQ2.js.map +1 -0
- package/dist/{chunk-4IOWANDJ.cjs → chunk-UR5HPMNF.cjs} +128 -93
- package/dist/chunk-UR5HPMNF.cjs.map +1 -0
- package/dist/{chunk-D656BYPA.cjs → chunk-ZIVTPFKN.cjs} +60 -30
- package/dist/chunk-ZIVTPFKN.cjs.map +1 -0
- package/dist/{export-Bh49U7Yf.d.ts → export-C2vQXrZa.d.cts} +35 -26
- package/dist/{export-VUQLKGvM.d.ts → export-DEWwhS-S.d.ts} +35 -26
- package/dist/{export-CrT_Y2Cy.d.cts → export-DzNR1ht3.d.ts} +35 -26
- package/dist/{export-VtQvdOuA.d.cts → export-oVEmcDLI.d.cts} +35 -26
- package/dist/index.cjs +36 -40
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/node.cjs +33 -33
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +2 -2
- package/dist/{validate-CPWPEEAt.d.cts → validate-TRx4DDtg.d.cts} +46 -9
- package/dist/{validate-CPWPEEAt.d.ts → validate-TRx4DDtg.d.ts} +46 -9
- package/dist/web-api.cjs +33 -33
- package/dist/web-api.d.cts +2 -2
- package/dist/web-api.d.ts +2 -2
- package/dist/web-api.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-4IOWANDJ.cjs.map +0 -1
- package/dist/chunk-D656BYPA.cjs.map +0 -1
- package/dist/chunk-IYMK2O3K.cjs.map +0 -1
- package/dist/chunk-J5YHHXDC.js.map +0 -1
- package/dist/chunk-M7V4HSRH.js.map +0 -1
- package/dist/chunk-N2ZI2CIT.js.map +0 -1
|
@@ -5,11 +5,64 @@ var __export = (target, all) => {
|
|
|
5
5
|
for (var name in all)
|
|
6
6
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
7
7
|
};
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
|
|
9
|
+
// src/helpers/consts.ts
|
|
10
|
+
var ENCODING_FORMATS = Object.freeze(["base64", "base64url", "hex", "utf8", "latin1"]);
|
|
11
|
+
var DIGEST_ALGORITHMS = Object.freeze({
|
|
12
|
+
sha256: { node: "sha256", web: "SHA-256" },
|
|
13
|
+
sha384: { node: "sha384", web: "SHA-384" },
|
|
14
|
+
sha512: { node: "sha512", web: "SHA-512" }
|
|
15
|
+
});
|
|
16
|
+
var ENCRYPTION_ALGORITHMS = Object.freeze({
|
|
17
|
+
aes256gcm: { name: "aes256gcm", keyBytes: 32, ivLength: 12, node: "aes-256-gcm", web: "AES-GCM" },
|
|
18
|
+
aes192gcm: { name: "aes192gcm", keyBytes: 24, ivLength: 12, node: "aes-192-gcm", web: "AES-GCM" },
|
|
19
|
+
aes128gcm: { name: "aes128gcm", keyBytes: 16, ivLength: 12, node: "aes-128-gcm", web: "AES-GCM" }
|
|
20
|
+
});
|
|
21
|
+
var PASSWORD_HASHING = Object.freeze({
|
|
22
|
+
pbkdf2: { saltLength: 16, iterations: 32e4, keyLength: 64 }
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// src/helpers/validate.ts
|
|
26
|
+
function $isStr(x, min = 1) {
|
|
27
|
+
return x !== null && x !== void 0 && typeof x === "string" && x.trim().length >= min;
|
|
10
28
|
}
|
|
11
|
-
function $isObj(
|
|
12
|
-
|
|
29
|
+
function $isObj(x) {
|
|
30
|
+
if (typeof x !== "object" || x === null || x === void 0) return false;
|
|
31
|
+
const proto = Object.getPrototypeOf(x);
|
|
32
|
+
return proto === Object.prototype || proto === null;
|
|
33
|
+
}
|
|
34
|
+
function $isLooseObj(x) {
|
|
35
|
+
return typeof x === "object" && x !== null && x !== void 0;
|
|
36
|
+
}
|
|
37
|
+
var expectedKeys = /* @__PURE__ */ new Set(["platform", "digest", "algo", "key"]);
|
|
38
|
+
var expectedAlgoKeys = /* @__PURE__ */ new Set(["name", "keyBytes", "ivLength", "node", "web"]);
|
|
39
|
+
function isSecretKey(x, platform) {
|
|
40
|
+
if (!$isLooseObj(x) || platform !== "node" && platform !== "web" || x.platform !== platform) return false;
|
|
41
|
+
const keys = Object.keys(x);
|
|
42
|
+
if (keys.length !== expectedKeys.size) return false;
|
|
43
|
+
for (const key of keys) if (!expectedKeys.has(key)) return false;
|
|
44
|
+
for (const key of expectedKeys) if (!Object.hasOwn(x, key)) return false;
|
|
45
|
+
if (typeof x.digest !== "string" || !(x.digest in DIGEST_ALGORITHMS)) return false;
|
|
46
|
+
if (!$isLooseObj(x.algo) || typeof x.algo.name !== "string" || !(x.algo.name in ENCRYPTION_ALGORITHMS)) return false;
|
|
47
|
+
const algoKeys = Object.keys(x.algo);
|
|
48
|
+
if (algoKeys.length !== expectedAlgoKeys.size) return false;
|
|
49
|
+
for (const key of algoKeys) if (!expectedAlgoKeys.has(key)) return false;
|
|
50
|
+
for (const key of expectedAlgoKeys) if (!Object.hasOwn(x.algo, key)) return false;
|
|
51
|
+
const algo = ENCRYPTION_ALGORITHMS[x.algo.name];
|
|
52
|
+
if (x.algo.keyBytes !== algo.keyBytes || x.algo.ivLength !== algo.ivLength || x.algo.node !== algo.node || x.algo.web !== algo.web) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (!$isLooseObj(x.key) || x.key.type !== "secret") return false;
|
|
56
|
+
if (platform === "node") {
|
|
57
|
+
if (!(x.key instanceof nodeCrypto.KeyObject) || typeof x.key.symmetricKeySize === "number" && x.key.symmetricKeySize !== algo.keyBytes) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (!$isLooseObj(x.key.algorithm) || x.key.algorithm.name !== algo.web || typeof x.key.algorithm.length === "number" && x.key.algorithm.length !== algo.keyBytes * 8 || typeof x.key.extractable !== "boolean" || !Array.isArray(x.key.usages) || x.key.usages.length !== 2 || !(x.key.usages.includes("encrypt") && x.key.usages.includes("decrypt"))) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
13
66
|
}
|
|
14
67
|
var ENCRYPTED_REGEX = Object.freeze({
|
|
15
68
|
general: /^(?:[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?\.)$/,
|
|
@@ -21,12 +74,6 @@ function matchPattern(data, format) {
|
|
|
21
74
|
if (!(format in ENCRYPTED_REGEX)) throw new Error(`Unknown format: ${format}`);
|
|
22
75
|
return ENCRYPTED_REGEX[format].test(data);
|
|
23
76
|
}
|
|
24
|
-
function isNodeSecretKey(key) {
|
|
25
|
-
return key instanceof nodeCrypto.KeyObject;
|
|
26
|
-
}
|
|
27
|
-
function isWebSecretKey(key) {
|
|
28
|
-
return key !== null && key !== void 0 && typeof key === "object" && "type" in key && typeof key.type === "string" && "algorithm" in key && typeof key.algorithm === "object" && "extractable" in key && typeof key.extractable === "boolean" && "usages" in key && Array.isArray(key.usages) && key.usages.every((usage) => typeof usage === "string");
|
|
29
|
-
}
|
|
30
77
|
|
|
31
78
|
// src/helpers/error.ts
|
|
32
79
|
function $ok(result) {
|
|
@@ -87,22 +134,6 @@ function parseToObj(str) {
|
|
|
87
134
|
return result;
|
|
88
135
|
}
|
|
89
136
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
sha256: { node: "sha256", web: "SHA-256" },
|
|
94
|
-
sha384: { node: "sha384", web: "SHA-384" },
|
|
95
|
-
sha512: { node: "sha512", web: "SHA-512" }
|
|
96
|
-
});
|
|
97
|
-
var ENCRYPTION_ALGORITHMS = Object.freeze({
|
|
98
|
-
aes256gcm: { keyBytes: 32, ivLength: 12, node: "aes-256-gcm", web: "AES-GCM" },
|
|
99
|
-
aes192gcm: { keyBytes: 24, ivLength: 12, node: "aes-192-gcm", web: "AES-GCM" },
|
|
100
|
-
aes128gcm: { keyBytes: 16, ivLength: 12, node: "aes-128-gcm", web: "AES-GCM" }
|
|
101
|
-
});
|
|
102
|
-
var PASSWORD_HASHING = Object.freeze({
|
|
103
|
-
pbkdf2: { saltLength: 16, iterations: 32e4, keyLength: 64 }
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
export { $err, $fmtError, $fmtResultErr, $isStr, $ok, $parseToObj, $stringifyObj, DIGEST_ALGORITHMS, ENCODING_FORMATS, ENCRYPTED_REGEX, ENCRYPTION_ALGORITHMS, PASSWORD_HASHING, __export, isNodeSecretKey, isWebSecretKey, matchPattern, parseToObj, stringifyObj, tryParseToObj, tryStringifyObj };
|
|
107
|
-
//# sourceMappingURL=chunk-J5YHHXDC.js.map
|
|
108
|
-
//# sourceMappingURL=chunk-J5YHHXDC.js.map
|
|
137
|
+
export { $err, $fmtError, $fmtResultErr, $isStr, $ok, $parseToObj, $stringifyObj, DIGEST_ALGORITHMS, ENCODING_FORMATS, ENCRYPTED_REGEX, ENCRYPTION_ALGORITHMS, PASSWORD_HASHING, __export, isSecretKey, matchPattern, parseToObj, stringifyObj, tryParseToObj, tryStringifyObj };
|
|
138
|
+
//# sourceMappingURL=chunk-6HNTSQAP.js.map
|
|
139
|
+
//# sourceMappingURL=chunk-6HNTSQAP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/helpers/consts.ts","../src/helpers/validate.ts","../src/helpers/error.ts","../src/helpers/object.ts"],"names":[],"mappings":"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","file":"chunk-6HNTSQAP.js","sourcesContent":["export const ENCODING_FORMATS = Object.freeze(['base64', 'base64url', 'hex', 'utf8', 'latin1'] as const);\r\n\r\nexport const DIGEST_ALGORITHMS = Object.freeze({\r\n sha256: { node: 'sha256', web: 'SHA-256' },\r\n sha384: { node: 'sha384', web: 'SHA-384' },\r\n sha512: { node: 'sha512', web: 'SHA-512' },\r\n} as const);\r\n\r\nexport const ENCRYPTION_ALGORITHMS = Object.freeze({\r\n aes256gcm: { name: 'aes256gcm', keyBytes: 32, ivLength: 12, node: 'aes-256-gcm', web: 'AES-GCM' },\r\n aes192gcm: { name: 'aes192gcm', keyBytes: 24, ivLength: 12, node: 'aes-192-gcm', web: 'AES-GCM' },\r\n aes128gcm: { name: 'aes128gcm', keyBytes: 16, ivLength: 12, node: 'aes-128-gcm', web: 'AES-GCM' },\r\n} as const);\r\n\r\nexport const PASSWORD_HASHING = Object.freeze({\r\n pbkdf2: { saltLength: 16, iterations: 320_000, keyLength: 64 },\r\n} as const);\r\n","import nodeCrypto from 'node:crypto';\r\nimport type { SecretKey } from '~/helpers/types';\r\nimport { DIGEST_ALGORITHMS, ENCRYPTION_ALGORITHMS } from './consts';\r\n\r\nexport function $isStr(x: unknown, min = 1): x is string {\r\n return x !== null && x !== undefined && typeof x === 'string' && x.trim().length >= min;\r\n}\r\n\r\nexport function $isObj(x: unknown): x is Record<string, unknown> {\r\n if (typeof x !== 'object' || x === null || x === undefined) return false;\r\n const proto = Object.getPrototypeOf(x);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n\r\nexport function $isLooseObj(x: unknown): x is Record<string, unknown> {\r\n return typeof x === 'object' && x !== null && x !== undefined;\r\n}\r\n\r\nconst expectedKeys = new Set(['platform', 'digest', 'algo', 'key']);\r\nconst expectedAlgoKeys = new Set(['name', 'keyBytes', 'ivLength', 'node', 'web']);\r\n\r\nexport function isSecretKey<Platform extends 'node' | 'web'>(x: unknown, platform: Platform): x is SecretKey<Platform> {\r\n if (!$isLooseObj(x) || (platform !== 'node' && platform !== 'web') || x.platform !== platform) return false;\r\n\r\n const keys = Object.keys(x);\r\n if (keys.length !== expectedKeys.size) return false;\r\n for (const key of keys) if (!expectedKeys.has(key)) return false;\r\n for (const key of expectedKeys) if (!Object.hasOwn(x, key)) return false;\r\n\r\n if (typeof x.digest !== 'string' || !(x.digest in DIGEST_ALGORITHMS)) return false;\r\n if (!$isLooseObj(x.algo) || typeof x.algo.name !== 'string' || !(x.algo.name in ENCRYPTION_ALGORITHMS)) return false;\r\n\r\n const algoKeys = Object.keys(x.algo);\r\n if (algoKeys.length !== expectedAlgoKeys.size) return false;\r\n for (const key of algoKeys) if (!expectedAlgoKeys.has(key)) return false;\r\n for (const key of expectedAlgoKeys) if (!Object.hasOwn(x.algo, key)) return false;\r\n\r\n const algo = ENCRYPTION_ALGORITHMS[x.algo.name as keyof typeof ENCRYPTION_ALGORITHMS];\r\n if (\r\n x.algo.keyBytes !== algo.keyBytes ||\r\n x.algo.ivLength !== algo.ivLength ||\r\n x.algo.node !== algo.node ||\r\n x.algo.web !== algo.web\r\n ) {\r\n return false;\r\n }\r\n\r\n if (!$isLooseObj(x.key) || x.key.type !== 'secret') return false;\r\n\r\n if (platform === 'node') {\r\n if (\r\n !(x.key instanceof nodeCrypto.KeyObject) ||\r\n (typeof x.key.symmetricKeySize === 'number' && x.key.symmetricKeySize !== algo.keyBytes)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (\r\n !$isLooseObj(x.key.algorithm) ||\r\n x.key.algorithm.name !== algo.web ||\r\n (typeof x.key.algorithm.length === 'number' && x.key.algorithm.length !== algo.keyBytes * 8) ||\r\n typeof x.key.extractable !== 'boolean' ||\r\n !Array.isArray(x.key.usages) ||\r\n x.key.usages.length !== 2 ||\r\n !(x.key.usages.includes('encrypt') && x.key.usages.includes('decrypt'))\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Regular expressions for encrypted data patterns */\r\nexport const ENCRYPTED_REGEX = Object.freeze({\r\n general: /^(?:[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)?\\.)$/,\r\n node: /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/,\r\n web: /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/,\r\n});\r\n\r\n/** Checks if the input string matches the specified encrypted data pattern. */\r\nexport function matchPattern(data: string, format: 'general' | 'node' | 'web'): boolean {\r\n if (typeof data !== 'string') return false;\r\n if (!(format in ENCRYPTED_REGEX)) throw new Error(`Unknown format: ${format}`);\r\n return ENCRYPTED_REGEX[format].test(data);\r\n}\r\n","import { $isObj } from './validate';\r\n\r\nexport interface ResultErr {\r\n readonly message: string;\r\n readonly description: string;\r\n}\r\n\r\nexport type Result<T, E = ResultErr> = T extends object\r\n ?\r\n | ({ readonly [K in keyof T]: T[K] } & { readonly success: true; readonly error?: undefined })\r\n | ({ readonly [K in keyof T]?: undefined } & { readonly success: false; readonly error: E })\r\n :\r\n | { readonly success: true; readonly result: T; readonly error?: undefined }\r\n | { readonly success: false; readonly error: E; readonly result?: undefined };\r\n\r\nexport function $ok<T>(result?: T): Result<T> {\r\n if ($isObj(result)) return { success: true, ...(result as T & object) } as Result<T>;\r\n return { success: true, result } as Result<T>;\r\n}\r\n\r\nexport function $err(err: { msg: string; desc: string }): Result<never, ResultErr>;\r\nexport function $err(err: ResultErr): Result<never, ResultErr>;\r\nexport function $err(err: { msg: string; desc: string } | ResultErr): Result<never, ResultErr> {\r\n return {\r\n success: false,\r\n error: {\r\n message: 'msg' in err ? err.msg : err.message,\r\n description: 'desc' in err ? err.desc : err.description,\r\n },\r\n } as Result<never, ResultErr>;\r\n}\r\n\r\nexport function $fmtError(error: unknown): string {\r\n if (error instanceof Error) return error.message;\r\n if (typeof error === 'string') return error;\r\n return String(error);\r\n}\r\n\r\nexport function $fmtResultErr(err: ResultErr): string {\r\n return `${err.message} - ${err.description}`;\r\n}\r\n","import { $err, $fmtError, $fmtResultErr, $ok, type Result } from './error';\r\nimport { $isObj, $isStr } from './validate';\r\n\r\nexport function $stringifyObj<T extends object = Record<string, unknown>>(obj: T): Result<string> {\r\n try {\r\n if (!$isObj(obj)) return $err({ msg: 'Invalid object', desc: 'Input is not a plain object' });\r\n return $ok(JSON.stringify(obj));\r\n } catch (error) {\r\n return $err({ msg: 'Utility: Stringify error', desc: $fmtError(error) });\r\n }\r\n}\r\n\r\n/**\r\n * Stringify an object.\r\n *\r\n * @param obj - The object to stringify.\r\n * @returns An JSON string.\r\n * @throws {Error} If the object cannot be stringified.\r\n */\r\nexport function stringifyObj<T extends object = Record<string, unknown>>(obj: T): string {\r\n const { result, error } = $stringifyObj(obj);\r\n if (error) throw new Error($fmtResultErr(error));\r\n return result;\r\n}\r\n\r\n/**\r\n * Stringify an object.\r\n *\r\n * @param obj - The object to stringify.\r\n * @returns A Result containing the JSON string or an error.\r\n */\r\nexport function tryStringifyObj<T extends object = Record<string, unknown>>(obj: T): Result<string> {\r\n return $stringifyObj(obj);\r\n}\r\n\r\nexport function $parseToObj<T extends object = Record<string, unknown>>(str: string): Result<{ result: T }> {\r\n try {\r\n if (!$isStr(str)) return $err({ msg: 'Utility: Invalid input', desc: 'Input is not a valid string' });\r\n const obj = JSON.parse(str);\r\n\r\n if (!$isObj(obj)) return $err({ msg: 'Utility: Invalid object format', desc: 'Parsed data is not a plain object' });\r\n return $ok({ result: obj as T });\r\n } catch (error) {\r\n return $err({ msg: 'Utility: Invalid format', desc: $fmtError(error) });\r\n }\r\n}\r\n\r\n/**\r\n * Parse a string to an object.\r\n *\r\n * @param str - The JSON string to parse.\r\n * @returns A Result containing the parsed object or an error.\r\n */\r\nexport function tryParseToObj<T extends object = Record<string, unknown>>(str: string): Result<{ result: T }> {\r\n return $parseToObj<T>(str);\r\n}\r\n\r\n/**\r\n * Parse a string to an object.\r\n *\r\n * @param str - The JSON string to parse.\r\n * @returns A parsed object.\r\n * @throws {Error} If the string cannot be parsed or is not a valid object.\r\n */\r\nexport function parseToObj<T extends object = Record<string, unknown>>(str: string): T {\r\n const { result, error } = $parseToObj<T>(str);\r\n if (error) throw new Error($fmtResultErr(error));\r\n return result;\r\n}\r\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkZIVTPFKN_cjs = require('./chunk-ZIVTPFKN.cjs');
|
|
4
4
|
|
|
5
5
|
// src/web/kit.ts
|
|
6
6
|
var kit_exports = {};
|
|
7
|
-
|
|
7
|
+
chunkZIVTPFKN_cjs.__export(kit_exports, {
|
|
8
8
|
convertBytesToStr: () => convertBytesToStr,
|
|
9
9
|
convertFormat: () => convertFormat,
|
|
10
10
|
convertStrToBytes: () => convertStrToBytes,
|
|
@@ -16,7 +16,6 @@ chunkD656BYPA_cjs.__export(kit_exports, {
|
|
|
16
16
|
generateUuid: () => generateUuid,
|
|
17
17
|
hash: () => hash,
|
|
18
18
|
hashPassword: () => hashPassword,
|
|
19
|
-
isWebSecretKey: () => chunkD656BYPA_cjs.isWebSecretKey,
|
|
20
19
|
tryConvertBytesToStr: () => tryConvertBytesToStr,
|
|
21
20
|
tryConvertFormat: () => tryConvertFormat,
|
|
22
21
|
tryConvertStrToBytes: () => tryConvertStrToBytes,
|
|
@@ -35,34 +34,34 @@ chunkD656BYPA_cjs.__export(kit_exports, {
|
|
|
35
34
|
var textEncoder = new TextEncoder();
|
|
36
35
|
var textDecoder = new TextDecoder();
|
|
37
36
|
function $convertStrToBytes(data, format = "utf8") {
|
|
38
|
-
if (!
|
|
39
|
-
return
|
|
37
|
+
if (!chunkZIVTPFKN_cjs.$isStr(data)) {
|
|
38
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
40
39
|
msg: "Crypto Web API - String to Bytes: Empty data",
|
|
41
40
|
desc: "Data must be a non-empty string"
|
|
42
41
|
});
|
|
43
42
|
}
|
|
44
|
-
if (!
|
|
45
|
-
return
|
|
43
|
+
if (!chunkZIVTPFKN_cjs.ENCODING_FORMATS.includes(format)) {
|
|
44
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
46
45
|
msg: `Crypto Web API - String to Bytes: Unsupported encode format: ${format}`,
|
|
47
46
|
desc: "Use base64, base64url, hex, utf8, or latin1"
|
|
48
47
|
});
|
|
49
48
|
}
|
|
50
49
|
try {
|
|
51
50
|
const bytes = strToBytes[format](data);
|
|
52
|
-
return
|
|
51
|
+
return chunkZIVTPFKN_cjs.$ok({ result: bytes });
|
|
53
52
|
} catch (error) {
|
|
54
|
-
return
|
|
53
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - String to Bytes: Failed to convert data", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
55
54
|
}
|
|
56
55
|
}
|
|
57
56
|
function $convertBytesToStr(data, format = "utf8") {
|
|
58
57
|
if (!(data instanceof ArrayBuffer || data instanceof Uint8Array)) {
|
|
59
|
-
return
|
|
58
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
60
59
|
msg: "Crypto Web API - Bytes to String: Invalid data type",
|
|
61
60
|
desc: "Data must be an ArrayBuffer or Uint8Array"
|
|
62
61
|
});
|
|
63
62
|
}
|
|
64
|
-
if (!
|
|
65
|
-
return
|
|
63
|
+
if (!chunkZIVTPFKN_cjs.ENCODING_FORMATS.includes(format)) {
|
|
64
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
66
65
|
msg: `Crypto Web API - Bytes to String: Unsupported format: ${format}`,
|
|
67
66
|
desc: "Use base64, base64url, hex, utf8, or latin1"
|
|
68
67
|
});
|
|
@@ -70,29 +69,29 @@ function $convertBytesToStr(data, format = "utf8") {
|
|
|
70
69
|
try {
|
|
71
70
|
const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
72
71
|
const str = bytesToStr[format](bytes);
|
|
73
|
-
return
|
|
72
|
+
return chunkZIVTPFKN_cjs.$ok(str);
|
|
74
73
|
} catch (error) {
|
|
75
|
-
return
|
|
74
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Bytes to String: Failed to convert data", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
function $convertFormat(data, from, to) {
|
|
79
|
-
if (!
|
|
80
|
-
return
|
|
78
|
+
if (!chunkZIVTPFKN_cjs.$isStr(data)) {
|
|
79
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
81
80
|
msg: "Crypto Web API - Convert Format: Empty data",
|
|
82
81
|
desc: "Data must be a non-empty string"
|
|
83
82
|
});
|
|
84
83
|
}
|
|
85
|
-
if (!
|
|
86
|
-
return
|
|
84
|
+
if (!chunkZIVTPFKN_cjs.ENCODING_FORMATS.includes(from) || !chunkZIVTPFKN_cjs.ENCODING_FORMATS.includes(to)) {
|
|
85
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
87
86
|
msg: `Crypto Web API - Convert Format: Unsupported format: from ${from} to ${to}`,
|
|
88
87
|
desc: "Use base64, base64url, hex, utf8, or latin1"
|
|
89
88
|
});
|
|
90
89
|
}
|
|
91
90
|
const bytes = $convertStrToBytes(data, from);
|
|
92
|
-
if (bytes.error) return
|
|
91
|
+
if (bytes.error) return chunkZIVTPFKN_cjs.$err({ msg: bytes.error.message, desc: bytes.error.description });
|
|
93
92
|
const str = $convertBytesToStr(bytes.result, to);
|
|
94
|
-
if (str.error) return
|
|
95
|
-
return
|
|
93
|
+
if (str.error) return chunkZIVTPFKN_cjs.$err({ msg: str.error.message, desc: str.error.description });
|
|
94
|
+
return chunkZIVTPFKN_cjs.$ok({ result: str.result });
|
|
96
95
|
}
|
|
97
96
|
var strToBytes = {
|
|
98
97
|
base64: $fromBase64,
|
|
@@ -158,136 +157,175 @@ function $fromHex(data) {
|
|
|
158
157
|
// src/web/web-encrypt.ts
|
|
159
158
|
function $generateUuid() {
|
|
160
159
|
try {
|
|
161
|
-
return
|
|
160
|
+
return chunkZIVTPFKN_cjs.$ok(crypto.randomUUID());
|
|
162
161
|
} catch (error) {
|
|
163
|
-
return
|
|
162
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - UUID Generation: Failed to generate UUID", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
164
163
|
}
|
|
165
164
|
}
|
|
166
|
-
async function $createSecretKey(
|
|
167
|
-
if (!
|
|
168
|
-
return
|
|
165
|
+
async function $createSecretKey(secret, options = {}) {
|
|
166
|
+
if (!chunkZIVTPFKN_cjs.$isStr(secret)) {
|
|
167
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Key Generation: Empty Secret", desc: "Secret must be a non-empty string" });
|
|
169
168
|
}
|
|
169
|
+
const algorithm = options.algorithm ?? "aes256gcm";
|
|
170
|
+
if (!(algorithm in chunkZIVTPFKN_cjs.ENCRYPTION_ALGORITHMS)) {
|
|
171
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
172
|
+
msg: `Crypto NodeJS API - Key Generation: Unsupported algorithm: ${algorithm}`,
|
|
173
|
+
desc: `Supported algorithms are: ${Object.keys(chunkZIVTPFKN_cjs.ENCRYPTION_ALGORITHMS).join(", ")}`
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
const digest = options.digest ?? "sha256";
|
|
177
|
+
if (!(digest in chunkZIVTPFKN_cjs.DIGEST_ALGORITHMS)) {
|
|
178
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
179
|
+
msg: `Crypto NodeJS API - Key Generation: Unsupported digest: ${digest}`,
|
|
180
|
+
desc: `Supported digests are: ${Object.keys(chunkZIVTPFKN_cjs.DIGEST_ALGORITHMS).join(", ")}`
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const salt = options.salt ?? "cipher-kit-salt";
|
|
184
|
+
if (!chunkZIVTPFKN_cjs.$isStr(salt, 8)) {
|
|
185
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
186
|
+
msg: "Crypto NodeJS API - Key Generation: Weak salt",
|
|
187
|
+
desc: "Salt must be a non-empty string with at least 8 characters"
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
const info = options.info ?? "cipher-kit";
|
|
191
|
+
if (!chunkZIVTPFKN_cjs.$isStr(info)) {
|
|
192
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
193
|
+
msg: "Crypto NodeJS API - Key Generation: Invalid info",
|
|
194
|
+
desc: "Info must be a non-empty string"
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const encryptAlgo = chunkZIVTPFKN_cjs.ENCRYPTION_ALGORITHMS[algorithm];
|
|
198
|
+
const digestAlgo = chunkZIVTPFKN_cjs.DIGEST_ALGORITHMS[digest];
|
|
170
199
|
try {
|
|
171
|
-
const
|
|
200
|
+
const ikm = await crypto.subtle.importKey("raw", textEncoder.encode(secret.normalize("NFKC")), "HKDF", false, [
|
|
201
|
+
"deriveKey"
|
|
202
|
+
]);
|
|
203
|
+
const key = await crypto.subtle.deriveKey(
|
|
172
204
|
{
|
|
173
205
|
name: "HKDF",
|
|
174
|
-
hash:
|
|
175
|
-
salt: textEncoder.encode(
|
|
176
|
-
info: textEncoder.encode("
|
|
206
|
+
hash: digestAlgo.web,
|
|
207
|
+
salt: textEncoder.encode(salt.normalize("NFKC")),
|
|
208
|
+
info: textEncoder.encode(info.normalize("NFKC"))
|
|
177
209
|
},
|
|
178
|
-
|
|
179
|
-
{ name:
|
|
210
|
+
ikm,
|
|
211
|
+
{ name: encryptAlgo.web, length: encryptAlgo.keyBytes * 8 },
|
|
180
212
|
true,
|
|
181
213
|
["encrypt", "decrypt"]
|
|
182
214
|
);
|
|
183
|
-
|
|
215
|
+
const secretKey = Object.freeze({
|
|
216
|
+
platform: "web",
|
|
217
|
+
digest,
|
|
218
|
+
algo: encryptAlgo,
|
|
219
|
+
key
|
|
220
|
+
});
|
|
221
|
+
return chunkZIVTPFKN_cjs.$ok({ result: secretKey });
|
|
184
222
|
} catch (error) {
|
|
185
|
-
return
|
|
223
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
186
224
|
msg: "Crypto Web API - Key Generation: Failed to create secret key",
|
|
187
|
-
desc:
|
|
225
|
+
desc: chunkZIVTPFKN_cjs.$fmtError(error)
|
|
188
226
|
});
|
|
189
227
|
}
|
|
190
228
|
}
|
|
191
229
|
async function $encrypt(data, secretKey) {
|
|
192
|
-
if (!
|
|
193
|
-
return
|
|
230
|
+
if (!chunkZIVTPFKN_cjs.$isStr(data)) {
|
|
231
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
194
232
|
msg: "Crypto Web API - Encryption: Empty data for encryption",
|
|
195
233
|
desc: "Data must be a non-empty string"
|
|
196
234
|
});
|
|
197
235
|
}
|
|
198
|
-
if (!
|
|
199
|
-
return
|
|
200
|
-
msg: "Crypto Web API - Encryption: Invalid
|
|
201
|
-
desc: "Expected a
|
|
236
|
+
if (!chunkZIVTPFKN_cjs.isSecretKey(secretKey, "web")) {
|
|
237
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
238
|
+
msg: "Crypto Web API - Encryption: Invalid Secret Key",
|
|
239
|
+
desc: "Expected a Web SecretKey"
|
|
202
240
|
});
|
|
203
241
|
}
|
|
204
242
|
const bytes = $convertStrToBytes(data, "utf8");
|
|
205
|
-
if (bytes.error) return
|
|
243
|
+
if (bytes.error) return chunkZIVTPFKN_cjs.$err(bytes.error);
|
|
206
244
|
try {
|
|
207
|
-
const iv = crypto.getRandomValues(new Uint8Array(
|
|
245
|
+
const iv = crypto.getRandomValues(new Uint8Array(secretKey.algo.ivLength));
|
|
208
246
|
const cipherWithTag = await crypto.subtle.encrypt(
|
|
209
|
-
{ name:
|
|
210
|
-
secretKey,
|
|
247
|
+
{ name: secretKey.algo.web, iv },
|
|
248
|
+
secretKey.key,
|
|
211
249
|
bytes.result
|
|
212
250
|
);
|
|
213
251
|
const ivStr = $convertBytesToStr(iv, "base64url");
|
|
214
252
|
const cipherStr = $convertBytesToStr(cipherWithTag, "base64url");
|
|
215
253
|
if (ivStr.error || cipherStr.error) {
|
|
216
|
-
return
|
|
254
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
217
255
|
msg: "Crypto Web API - Encryption: Failed to convert IV or encrypted data",
|
|
218
256
|
desc: `Conversion error: ${ivStr.error || cipherStr.error}`
|
|
219
257
|
});
|
|
220
258
|
}
|
|
221
|
-
return
|
|
259
|
+
return chunkZIVTPFKN_cjs.$ok(`${ivStr.result}.${cipherStr.result}.`);
|
|
222
260
|
} catch (error) {
|
|
223
|
-
return
|
|
261
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Encryption: Failed to encrypt data", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
224
262
|
}
|
|
225
263
|
}
|
|
226
264
|
async function $decrypt(encrypted, secretKey) {
|
|
227
|
-
if (
|
|
228
|
-
return
|
|
265
|
+
if (chunkZIVTPFKN_cjs.matchPattern(encrypted, "web") === false) {
|
|
266
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
229
267
|
msg: "Crypto Web API - Decryption: Invalid encrypted data format",
|
|
230
268
|
desc: 'Encrypted data must be in the format "iv.cipherWithTag."'
|
|
231
269
|
});
|
|
232
270
|
}
|
|
233
271
|
const [iv, encryptedWithTag] = encrypted.split(".", 3);
|
|
234
|
-
if (!
|
|
235
|
-
return
|
|
272
|
+
if (!chunkZIVTPFKN_cjs.$isStr(iv) || !chunkZIVTPFKN_cjs.$isStr(encryptedWithTag)) {
|
|
273
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
236
274
|
msg: "Crypto Web API - Decryption: Invalid encrypted data",
|
|
237
275
|
desc: "Encrypted data must contain valid IV, encrypted and tag components"
|
|
238
276
|
});
|
|
239
277
|
}
|
|
240
|
-
if (!
|
|
241
|
-
return
|
|
242
|
-
msg: "Crypto Web API - Decryption: Invalid
|
|
243
|
-
desc: "Expected a
|
|
278
|
+
if (!chunkZIVTPFKN_cjs.isSecretKey(secretKey, "web")) {
|
|
279
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
280
|
+
msg: "Crypto Web API - Decryption: Invalid Secret Key",
|
|
281
|
+
desc: "Expected a Web SecretKey"
|
|
244
282
|
});
|
|
245
283
|
}
|
|
246
284
|
const ivBytes = $convertStrToBytes(iv, "base64url");
|
|
247
285
|
const cipherWithTagBytes = $convertStrToBytes(encryptedWithTag, "base64url");
|
|
248
286
|
if (ivBytes.error || cipherWithTagBytes.error) {
|
|
249
|
-
return
|
|
287
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
250
288
|
msg: "Crypto Web API - Decryption: Failed to convert IV or encrypted data",
|
|
251
289
|
desc: `Conversion error: ${ivBytes.error || cipherWithTagBytes.error}`
|
|
252
290
|
});
|
|
253
291
|
}
|
|
254
292
|
try {
|
|
255
293
|
const decrypted = await crypto.subtle.decrypt(
|
|
256
|
-
{ name:
|
|
257
|
-
secretKey,
|
|
294
|
+
{ name: secretKey.algo.web, iv: ivBytes.result },
|
|
295
|
+
secretKey.key,
|
|
258
296
|
cipherWithTagBytes.result
|
|
259
297
|
);
|
|
260
298
|
return $convertBytesToStr(decrypted, "utf8");
|
|
261
299
|
} catch (error) {
|
|
262
|
-
return
|
|
300
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Decryption: Failed to decrypt data", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
263
301
|
}
|
|
264
302
|
}
|
|
265
303
|
async function $encryptObj(data, secretKey) {
|
|
266
|
-
const { result, error } =
|
|
267
|
-
if (error) return
|
|
304
|
+
const { result, error } = chunkZIVTPFKN_cjs.$stringifyObj(data);
|
|
305
|
+
if (error) return chunkZIVTPFKN_cjs.$err(error);
|
|
268
306
|
return await $encrypt(result, secretKey);
|
|
269
307
|
}
|
|
270
308
|
async function $decryptObj(encrypted, secretKey) {
|
|
271
309
|
const { result, error } = await $decrypt(encrypted, secretKey);
|
|
272
|
-
if (error) return
|
|
273
|
-
return
|
|
310
|
+
if (error) return chunkZIVTPFKN_cjs.$err(error);
|
|
311
|
+
return chunkZIVTPFKN_cjs.$parseToObj(result);
|
|
274
312
|
}
|
|
275
313
|
async function $hash(data) {
|
|
276
|
-
if (!
|
|
277
|
-
return
|
|
314
|
+
if (!chunkZIVTPFKN_cjs.$isStr(data, 0)) {
|
|
315
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Hashing: Empty data for hashing", desc: "Data must be a non-empty string" });
|
|
278
316
|
}
|
|
279
317
|
const bytes = $convertStrToBytes(data, "utf8");
|
|
280
|
-
if (bytes.error) return
|
|
318
|
+
if (bytes.error) return chunkZIVTPFKN_cjs.$err(bytes.error);
|
|
281
319
|
try {
|
|
282
|
-
const hashed = await crypto.subtle.digest(
|
|
320
|
+
const hashed = await crypto.subtle.digest(chunkZIVTPFKN_cjs.DIGEST_ALGORITHMS.sha256.web, bytes.result);
|
|
283
321
|
return $convertBytesToStr(hashed, "base64url");
|
|
284
322
|
} catch (error) {
|
|
285
|
-
return
|
|
323
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Hashing: Failed to hash data", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
286
324
|
}
|
|
287
325
|
}
|
|
288
326
|
async function $hashPassword(password) {
|
|
289
|
-
if (!
|
|
290
|
-
return
|
|
327
|
+
if (!chunkZIVTPFKN_cjs.$isStr(password)) {
|
|
328
|
+
return chunkZIVTPFKN_cjs.$err({
|
|
291
329
|
msg: "Crypto Web API - Password Hashing: Empty password",
|
|
292
330
|
desc: "Password must be a non-empty string"
|
|
293
331
|
});
|
|
@@ -302,21 +340,21 @@ async function $hashPassword(password) {
|
|
|
302
340
|
["deriveBits"]
|
|
303
341
|
);
|
|
304
342
|
const bits = await crypto.subtle.deriveBits(
|
|
305
|
-
{ name: "PBKDF2", salt, iterations:
|
|
343
|
+
{ name: "PBKDF2", salt, iterations: chunkZIVTPFKN_cjs.PASSWORD_HASHING.pbkdf2.iterations, hash: chunkZIVTPFKN_cjs.DIGEST_ALGORITHMS.sha512.web },
|
|
306
344
|
baseKey,
|
|
307
|
-
|
|
345
|
+
chunkZIVTPFKN_cjs.PASSWORD_HASHING.pbkdf2.keyLength * 8
|
|
308
346
|
);
|
|
309
347
|
const saltStr = $convertBytesToStr(salt, "base64url");
|
|
310
|
-
if (saltStr.error) return
|
|
348
|
+
if (saltStr.error) return chunkZIVTPFKN_cjs.$err(saltStr.error);
|
|
311
349
|
const hashedPasswordStr = $convertBytesToStr(bits, "base64url");
|
|
312
|
-
if (hashedPasswordStr.error) return
|
|
313
|
-
return
|
|
350
|
+
if (hashedPasswordStr.error) return chunkZIVTPFKN_cjs.$err(hashedPasswordStr.error);
|
|
351
|
+
return chunkZIVTPFKN_cjs.$ok({ hash: hashedPasswordStr.result, salt: saltStr.result });
|
|
314
352
|
} catch (error) {
|
|
315
|
-
return
|
|
353
|
+
return chunkZIVTPFKN_cjs.$err({ msg: "Crypto Web API - Password Hashing: Failed to hash password", desc: chunkZIVTPFKN_cjs.$fmtError(error) });
|
|
316
354
|
}
|
|
317
355
|
}
|
|
318
356
|
async function $verifyPassword(password, hashedPassword, salt) {
|
|
319
|
-
if (!
|
|
357
|
+
if (!chunkZIVTPFKN_cjs.$isStr(password) || !chunkZIVTPFKN_cjs.$isStr(hashedPassword) || !chunkZIVTPFKN_cjs.$isStr(salt)) return false;
|
|
320
358
|
const saltBytes = $convertStrToBytes(salt, "base64url");
|
|
321
359
|
if (saltBytes.error) return false;
|
|
322
360
|
const { result: hashedPasswordBytes, error: hashedPasswordError } = $convertStrToBytes(hashedPassword, "base64url");
|
|
@@ -334,11 +372,11 @@ async function $verifyPassword(password, hashedPassword, salt) {
|
|
|
334
372
|
{
|
|
335
373
|
name: "PBKDF2",
|
|
336
374
|
salt: saltBytes.result,
|
|
337
|
-
iterations:
|
|
338
|
-
hash:
|
|
375
|
+
iterations: chunkZIVTPFKN_cjs.PASSWORD_HASHING.pbkdf2.iterations,
|
|
376
|
+
hash: chunkZIVTPFKN_cjs.DIGEST_ALGORITHMS.sha512.web
|
|
339
377
|
},
|
|
340
378
|
baseKey,
|
|
341
|
-
|
|
379
|
+
chunkZIVTPFKN_cjs.PASSWORD_HASHING.pbkdf2.keyLength * 8
|
|
342
380
|
)
|
|
343
381
|
);
|
|
344
382
|
if (bits.length !== hashedPasswordBytes.length) return false;
|
|
@@ -358,15 +396,15 @@ function tryGenerateUuid() {
|
|
|
358
396
|
}
|
|
359
397
|
function generateUuid() {
|
|
360
398
|
const { result, error } = $generateUuid();
|
|
361
|
-
if (error) throw new Error(
|
|
399
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
362
400
|
return result;
|
|
363
401
|
}
|
|
364
|
-
async function tryCreateSecretKey(
|
|
365
|
-
return await $createSecretKey(
|
|
402
|
+
async function tryCreateSecretKey(secret, options = {}) {
|
|
403
|
+
return await $createSecretKey(secret, options);
|
|
366
404
|
}
|
|
367
|
-
async function createSecretKey(
|
|
368
|
-
const { result, error } = await $createSecretKey(
|
|
369
|
-
if (error) throw new Error(
|
|
405
|
+
async function createSecretKey(secret, options = {}) {
|
|
406
|
+
const { result, error } = await $createSecretKey(secret, options);
|
|
407
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
370
408
|
return result;
|
|
371
409
|
}
|
|
372
410
|
async function tryEncrypt(data, secretKey) {
|
|
@@ -374,7 +412,7 @@ async function tryEncrypt(data, secretKey) {
|
|
|
374
412
|
}
|
|
375
413
|
async function encrypt(data, secretKey) {
|
|
376
414
|
const { result, error } = await $encrypt(data, secretKey);
|
|
377
|
-
if (error) throw new Error(
|
|
415
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
378
416
|
return result;
|
|
379
417
|
}
|
|
380
418
|
async function tryDecrypt(encrypted, secretKey) {
|
|
@@ -382,7 +420,7 @@ async function tryDecrypt(encrypted, secretKey) {
|
|
|
382
420
|
}
|
|
383
421
|
async function decrypt(encrypted, secretKey) {
|
|
384
422
|
const { result, error } = await $decrypt(encrypted, secretKey);
|
|
385
|
-
if (error) throw new Error(
|
|
423
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
386
424
|
return result;
|
|
387
425
|
}
|
|
388
426
|
async function tryEncryptObj(data, secretKey) {
|
|
@@ -390,7 +428,7 @@ async function tryEncryptObj(data, secretKey) {
|
|
|
390
428
|
}
|
|
391
429
|
async function encryptObj(data, secretKey) {
|
|
392
430
|
const { result, error } = await $encryptObj(data, secretKey);
|
|
393
|
-
if (error) throw new Error(
|
|
431
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
394
432
|
return result;
|
|
395
433
|
}
|
|
396
434
|
async function tryDecryptObj(encrypted, secretKey) {
|
|
@@ -398,7 +436,7 @@ async function tryDecryptObj(encrypted, secretKey) {
|
|
|
398
436
|
}
|
|
399
437
|
async function decryptObj(encrypted, secretKey) {
|
|
400
438
|
const { result, error } = await $decryptObj(encrypted, secretKey);
|
|
401
|
-
if (error) throw new Error(
|
|
439
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
402
440
|
return { result };
|
|
403
441
|
}
|
|
404
442
|
async function tryHash(data) {
|
|
@@ -406,7 +444,7 @@ async function tryHash(data) {
|
|
|
406
444
|
}
|
|
407
445
|
async function hash(data) {
|
|
408
446
|
const { result, error } = await $hash(data);
|
|
409
|
-
if (error) throw new Error(
|
|
447
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
410
448
|
return result;
|
|
411
449
|
}
|
|
412
450
|
async function tryHashPassword(password) {
|
|
@@ -414,7 +452,7 @@ async function tryHashPassword(password) {
|
|
|
414
452
|
}
|
|
415
453
|
async function hashPassword(password) {
|
|
416
454
|
const { hash: hash2, salt, error } = await $hashPassword(password);
|
|
417
|
-
if (error) throw new Error(
|
|
455
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
418
456
|
return { hash: hash2, salt };
|
|
419
457
|
}
|
|
420
458
|
async function verifyPassword(password, hashedPassword, salt) {
|
|
@@ -425,7 +463,7 @@ function tryConvertStrToBytes(data, format = "utf8") {
|
|
|
425
463
|
}
|
|
426
464
|
function convertStrToBytes(data, format = "utf8") {
|
|
427
465
|
const { result, error } = $convertStrToBytes(data, format);
|
|
428
|
-
if (error) throw new Error(
|
|
466
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
429
467
|
return result;
|
|
430
468
|
}
|
|
431
469
|
function tryConvertBytesToStr(data, format = "utf8") {
|
|
@@ -433,7 +471,7 @@ function tryConvertBytesToStr(data, format = "utf8") {
|
|
|
433
471
|
}
|
|
434
472
|
function convertBytesToStr(data, format = "utf8") {
|
|
435
473
|
const { result, error } = $convertBytesToStr(data, format);
|
|
436
|
-
if (error) throw new Error(
|
|
474
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
437
475
|
return result;
|
|
438
476
|
}
|
|
439
477
|
function tryConvertFormat(data, from, to) {
|
|
@@ -441,7 +479,7 @@ function tryConvertFormat(data, from, to) {
|
|
|
441
479
|
}
|
|
442
480
|
function convertFormat(data, from, to) {
|
|
443
481
|
const { result, error } = $convertFormat(data, from, to);
|
|
444
|
-
if (error) throw new Error(
|
|
482
|
+
if (error) throw new Error(chunkZIVTPFKN_cjs.$fmtResultErr(error));
|
|
445
483
|
return result;
|
|
446
484
|
}
|
|
447
485
|
|
|
@@ -469,5 +507,5 @@ exports.tryGenerateUuid = tryGenerateUuid;
|
|
|
469
507
|
exports.tryHash = tryHash;
|
|
470
508
|
exports.tryHashPassword = tryHashPassword;
|
|
471
509
|
exports.verifyPassword = verifyPassword;
|
|
472
|
-
//# sourceMappingURL=chunk-
|
|
473
|
-
//# sourceMappingURL=chunk-
|
|
510
|
+
//# sourceMappingURL=chunk-DZLEO2JD.cjs.map
|
|
511
|
+
//# sourceMappingURL=chunk-DZLEO2JD.cjs.map
|