cipher-kit 0.0.2 → 0.0.4
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-6EC6NPNV.cjs +139 -0
- package/dist/chunk-6EC6NPNV.cjs.map +1 -0
- package/dist/{chunk-NT4ZCTLJ.cjs → chunk-DAMEE4F4.cjs} +51 -54
- package/dist/chunk-DAMEE4F4.cjs.map +1 -0
- package/dist/{chunk-XIXGSHXM.js → chunk-HSRKAY2V.js} +20 -23
- package/dist/chunk-HSRKAY2V.js.map +1 -0
- package/dist/{chunk-7QVQLIZE.js → chunk-IHTNNCLY.js} +8 -5
- package/dist/chunk-IHTNNCLY.js.map +1 -0
- package/dist/{chunk-QN3P7CIM.cjs → chunk-SSMTQMF4.cjs} +12 -6
- package/dist/chunk-SSMTQMF4.cjs.map +1 -0
- package/dist/{chunk-42BWXKCF.js → chunk-VJ4BV4K2.js} +13 -16
- package/dist/chunk-VJ4BV4K2.js.map +1 -0
- package/dist/index.cjs +57 -37
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/node.cjs +32 -16
- package/dist/node.d.cts +6 -6
- package/dist/node.d.ts +6 -6
- package/dist/node.js +2 -2
- package/dist/{error-FGvKfjsn.d.cts → utils-1Ds0QKBI.d.cts} +9 -1
- package/dist/{error-FGvKfjsn.d.ts → utils-1Ds0QKBI.d.ts} +9 -1
- package/dist/web-api.cjs +32 -16
- package/dist/web-api.d.cts +5 -5
- package/dist/web-api.d.ts +5 -5
- package/dist/web-api.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-42BWXKCF.js.map +0 -1
- package/dist/chunk-4DJEDYAV.cjs +0 -142
- package/dist/chunk-4DJEDYAV.cjs.map +0 -1
- package/dist/chunk-7QVQLIZE.js.map +0 -1
- package/dist/chunk-NT4ZCTLJ.cjs.map +0 -1
- package/dist/chunk-QN3P7CIM.cjs.map +0 -1
- package/dist/chunk-XIXGSHXM.js.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkSSMTQMF4_cjs = require('./chunk-SSMTQMF4.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
|
+
function encode(data, format = "utf8") {
|
|
12
|
+
try {
|
|
13
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: buffer.Buffer.from(data, format) });
|
|
14
|
+
} catch (error) {
|
|
15
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function decode(data, format = "utf8") {
|
|
19
|
+
try {
|
|
20
|
+
return chunkSSMTQMF4_cjs.$ok(buffer.Buffer.from(data).toString(format));
|
|
21
|
+
} catch (error) {
|
|
22
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
var NODE_ALGORITHM = "aes-256-gcm";
|
|
26
|
+
function newUuid() {
|
|
27
|
+
try {
|
|
28
|
+
return chunkSSMTQMF4_cjs.$ok(nodeCrypto__default.default.randomUUID());
|
|
29
|
+
} catch (error) {
|
|
30
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to generate UUID with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function isNodeKey(key) {
|
|
34
|
+
return key instanceof nodeCrypto__default.default.KeyObject;
|
|
35
|
+
}
|
|
36
|
+
function hash(data) {
|
|
37
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
38
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const hashed = nodeCrypto__default.default.createHash("sha256").update(data).digest();
|
|
42
|
+
return decode(hashed, "base64url");
|
|
43
|
+
} catch (error) {
|
|
44
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to hash data with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function newSecretKey(key) {
|
|
48
|
+
if (typeof key === "string") {
|
|
49
|
+
if (!chunkSSMTQMF4_cjs.$isStr(key, 1)) return chunkSSMTQMF4_cjs.$err({ message: "Empty key for Crypto NodeJS", description: "Invalid secret key" });
|
|
50
|
+
try {
|
|
51
|
+
const hashedKey = nodeCrypto__default.default.createHash("sha256").update(key).digest();
|
|
52
|
+
const secretKey = nodeCrypto__default.default.createSecretKey(hashedKey);
|
|
53
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey });
|
|
54
|
+
} catch (error) {
|
|
55
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to create secret key with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!isNodeKey(key)) return chunkSSMTQMF4_cjs.$err({ message: "Invalid secret key", description: "Expected a crypto.KeyObject" });
|
|
59
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey: key });
|
|
60
|
+
}
|
|
61
|
+
function encrypt(data, secretKey) {
|
|
62
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
63
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
|
|
64
|
+
}
|
|
65
|
+
if (!isNodeKey(secretKey)) {
|
|
66
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid encryption key", description: "Expected a crypto.KeyObject" });
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const iv = nodeCrypto__default.default.randomBytes(12);
|
|
70
|
+
const cipher = nodeCrypto__default.default.createCipheriv(NODE_ALGORITHM, secretKey, iv);
|
|
71
|
+
const encrypted = buffer.Buffer.concat([cipher.update(data, "utf8"), cipher.final()]);
|
|
72
|
+
const tag = cipher.getAuthTag();
|
|
73
|
+
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
74
|
+
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
75
|
+
const { result: decodedTag, error: tagError } = decode(tag, "base64url");
|
|
76
|
+
if (ivError || encryptedError || tagError) {
|
|
77
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode encrypted data", description: "Encoding error" });
|
|
78
|
+
}
|
|
79
|
+
return chunkSSMTQMF4_cjs.$ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encrypt data with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function decrypt(encrypted, secretKey) {
|
|
85
|
+
if (chunkSSMTQMF4_cjs.ENCRYPTED_NODE_REGEX.test(encrypted) === false) {
|
|
86
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
87
|
+
message: "Invalid encrypted data format",
|
|
88
|
+
description: 'Encrypted data must be in the format "iv.encrypted.tag."'
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const [iv, encryptedData, tag] = encrypted.split(".", 4);
|
|
92
|
+
if (!chunkSSMTQMF4_cjs.$isStr(iv, 1) || !chunkSSMTQMF4_cjs.$isStr(encryptedData, 1) || !chunkSSMTQMF4_cjs.$isStr(tag, 1)) {
|
|
93
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
94
|
+
message: "Invalid parameters for decryption",
|
|
95
|
+
description: "IV, encrypted data, and tag must be non-empty strings"
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (!isNodeKey(secretKey)) {
|
|
99
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid decryption key", description: "Expected a crypto.KeyObject" });
|
|
100
|
+
}
|
|
101
|
+
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
102
|
+
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, "base64url");
|
|
103
|
+
const { bytes: tagBytes, error: tagError } = encode(tag, "base64url");
|
|
104
|
+
if (ivError || encryptedError || tagError) {
|
|
105
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const decipher = nodeCrypto__default.default.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);
|
|
109
|
+
decipher.setAuthTag(tagBytes);
|
|
110
|
+
const decrypted = buffer.Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);
|
|
111
|
+
return decode(decrypted, "utf8");
|
|
112
|
+
} catch (error) {
|
|
113
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decrypt data with Crypto NodeJS", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function encryptObj(data, secretKey) {
|
|
117
|
+
const { result, error } = chunkSSMTQMF4_cjs.stringifyObj(data);
|
|
118
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
119
|
+
return encrypt(result, secretKey);
|
|
120
|
+
}
|
|
121
|
+
function decryptObj(encrypted, secretKey) {
|
|
122
|
+
const { result, error } = decrypt(encrypted, secretKey);
|
|
123
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
124
|
+
return chunkSSMTQMF4_cjs.parseToObj(result);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
exports.NODE_ALGORITHM = NODE_ALGORITHM;
|
|
128
|
+
exports.decode = decode;
|
|
129
|
+
exports.decrypt = decrypt;
|
|
130
|
+
exports.decryptObj = decryptObj;
|
|
131
|
+
exports.encode = encode;
|
|
132
|
+
exports.encrypt = encrypt;
|
|
133
|
+
exports.encryptObj = encryptObj;
|
|
134
|
+
exports.hash = hash;
|
|
135
|
+
exports.isNodeKey = isNodeKey;
|
|
136
|
+
exports.newSecretKey = newSecretKey;
|
|
137
|
+
exports.newUuid = newUuid;
|
|
138
|
+
//# sourceMappingURL=chunk-6EC6NPNV.cjs.map
|
|
139
|
+
//# sourceMappingURL=chunk-6EC6NPNV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/encode.ts","../src/node/encrypt.ts"],"names":["$ok","Buffer","$err","$stringifyError","nodeCrypto","$isStr","ENCRYPTED_NODE_REGEX","stringifyObj","parseToObj"],"mappings":"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","file":"chunk-6EC6NPNV.cjs","sourcesContent":["import { Buffer } from 'node:buffer';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { EncodingFormat } from '~/types';\r\n\r\nexport function encode(data: string, format: EncodingFormat = 'utf8'): Result<{ bytes: Buffer }> {\r\n try {\r\n return $ok({ bytes: Buffer.from(data, format) });\r\n } catch (error) {\r\n return $err({ message: 'Failed to encode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decode(data: Buffer, format: EncodingFormat = 'utf8'): Result<string> {\r\n try {\r\n return $ok(Buffer.from(data).toString(format));\r\n } catch (error) {\r\n return $err({ message: 'Failed to decode data', description: $stringifyError(error) });\r\n }\r\n}\r\n","import { Buffer } from 'node:buffer';\r\nimport nodeCrypto from 'node:crypto';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { NodeKey } from '~/types';\r\nimport { $isStr, ENCRYPTED_NODE_REGEX, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport const NODE_ALGORITHM = 'aes-256-gcm';\r\n\r\nexport function newUuid(): Result<string> {\r\n try {\r\n return $ok(nodeCrypto.randomUUID());\r\n } catch (error) {\r\n return $err({ message: 'Failed to generate UUID with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function isNodeKey(key: unknown): key is nodeCrypto.KeyObject {\r\n return key instanceof nodeCrypto.KeyObject;\r\n}\r\n\r\nexport function hash(data: string): Result<string> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for hashing', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n try {\r\n const hashed = nodeCrypto.createHash('sha256').update(data).digest();\r\n return decode(hashed, 'base64url');\r\n } catch (error) {\r\n return $err({ message: 'Failed to hash data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function newSecretKey(key: string | NodeKey): Result<{ secretKey: NodeKey }> {\r\n if (typeof key === 'string') {\r\n if (!$isStr(key, 1)) return $err({ message: 'Empty key for Crypto NodeJS', description: 'Invalid secret key' });\r\n\r\n try {\r\n const hashedKey = nodeCrypto.createHash('sha256').update(key).digest();\r\n const secretKey = nodeCrypto.createSecretKey(hashedKey);\r\n return $ok({ secretKey });\r\n } catch (error) {\r\n return $err({ message: 'Failed to create secret key with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!isNodeKey(key)) return $err({ message: 'Invalid secret key', description: 'Expected a crypto.KeyObject' });\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport function encrypt(data: string, secretKey: NodeKey): Result<string> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for encryption', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!isNodeKey(secretKey)) {\r\n return $err({ message: 'Invalid encryption key', description: 'Expected a crypto.KeyObject' });\r\n }\r\n\r\n try {\r\n const iv = nodeCrypto.randomBytes(12);\r\n const cipher = nodeCrypto.createCipheriv(NODE_ALGORITHM, secretKey, iv);\r\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\r\n const tag = cipher.getAuthTag();\r\n\r\n const { result: decodedIv, error: ivError } = decode(iv, 'base64url');\r\n const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, 'base64url');\r\n const { result: decodedTag, error: tagError } = decode(tag, 'base64url');\r\n if (ivError || encryptedError || tagError) {\r\n return $err({ message: 'Failed to encode encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);\r\n } catch (error) {\r\n return $err({ message: 'Failed to encrypt data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decrypt(encrypted: string, secretKey: NodeKey): Result<string> {\r\n if (ENCRYPTED_NODE_REGEX.test(encrypted) === false) {\r\n return $err({\r\n message: 'Invalid encrypted data format',\r\n description: 'Encrypted data must be in the format \"iv.encrypted.tag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedData, tag] = encrypted.split('.', 4);\r\n if (!$isStr(iv, 1) || !$isStr(encryptedData, 1) || !$isStr(tag, 1)) {\r\n return $err({\r\n message: 'Invalid parameters for decryption',\r\n description: 'IV, encrypted data, and tag must be non-empty strings',\r\n });\r\n }\r\n\r\n if (!isNodeKey(secretKey)) {\r\n return $err({ message: 'Invalid decryption key', description: 'Expected a crypto.KeyObject' });\r\n }\r\n\r\n const { bytes: ivBytes, error: ivError } = encode(iv, 'base64url');\r\n const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, 'base64url');\r\n const { bytes: tagBytes, error: tagError } = encode(tag, 'base64url');\r\n if (ivError || encryptedError || tagError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n try {\r\n const decipher = nodeCrypto.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);\r\n decipher.setAuthTag(tagBytes);\r\n\r\n const decrypted = Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);\r\n return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ message: 'Failed to decrypt data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function encryptObj(data: Record<string, unknown>, secretKey: NodeKey): Result<string> {\r\n const { result, error } = stringifyObj(data);\r\n if (error) return $err(error);\r\n return encrypt(result, secretKey);\r\n}\r\n\r\nexport function decryptObj(encrypted: string, secretKey: NodeKey): Result<{ result: Record<string, unknown> }> {\r\n const { result, error } = decrypt(encrypted, secretKey);\r\n if (error) return $err(error);\r\n return parseToObj(result);\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSSMTQMF4_cjs = require('./chunk-SSMTQMF4.cjs');
|
|
4
4
|
|
|
5
5
|
// src/web/encode.ts
|
|
6
6
|
var textEncoder = new TextEncoder();
|
|
@@ -9,21 +9,21 @@ function encode(data, format = "utf8") {
|
|
|
9
9
|
try {
|
|
10
10
|
switch (format) {
|
|
11
11
|
case "base64":
|
|
12
|
-
return
|
|
12
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: $fromBase64(data) });
|
|
13
13
|
case "base64url":
|
|
14
|
-
return
|
|
14
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: $fromBase64Url(data) });
|
|
15
15
|
case "hex":
|
|
16
|
-
return
|
|
16
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: $fromHex(data) });
|
|
17
17
|
case "utf8":
|
|
18
|
-
return
|
|
18
|
+
return chunkSSMTQMF4_cjs.$ok({ bytes: textEncoder.encode(data) });
|
|
19
19
|
default:
|
|
20
|
-
return
|
|
20
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
21
21
|
message: `Unsupported encode format: ${format}`,
|
|
22
22
|
description: "Use base64, base64url, hex, or utf8"
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
} catch (error) {
|
|
26
|
-
return
|
|
26
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
function decode(data, format = "utf8") {
|
|
@@ -31,21 +31,21 @@ function decode(data, format = "utf8") {
|
|
|
31
31
|
const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
32
32
|
switch (format) {
|
|
33
33
|
case "base64":
|
|
34
|
-
return
|
|
34
|
+
return chunkSSMTQMF4_cjs.$ok($toBase64(bytes));
|
|
35
35
|
case "base64url":
|
|
36
|
-
return
|
|
36
|
+
return chunkSSMTQMF4_cjs.$ok($toBase64Url(bytes));
|
|
37
37
|
case "hex":
|
|
38
|
-
return
|
|
38
|
+
return chunkSSMTQMF4_cjs.$ok($toHex(bytes));
|
|
39
39
|
case "utf8":
|
|
40
|
-
return
|
|
40
|
+
return chunkSSMTQMF4_cjs.$ok(textDecoder.decode(bytes));
|
|
41
41
|
default:
|
|
42
|
-
return
|
|
42
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
43
43
|
message: `Unsupported decode format: ${format}`,
|
|
44
44
|
description: "Use base64, base64url, hex, or utf8"
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
} catch (error) {
|
|
48
|
-
return
|
|
48
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decode data", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
function $toBase64(bytes) {
|
|
@@ -87,116 +87,112 @@ function $fromHex(data) {
|
|
|
87
87
|
return out;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
// src/web/
|
|
91
|
-
var
|
|
90
|
+
// src/web/encrypt.ts
|
|
91
|
+
var WEB_API_ALGORITHM = "AES-GCM";
|
|
92
92
|
function newUuid() {
|
|
93
93
|
try {
|
|
94
|
-
return
|
|
94
|
+
return chunkSSMTQMF4_cjs.$ok(crypto.randomUUID());
|
|
95
95
|
} catch (error) {
|
|
96
|
-
return
|
|
96
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to generate UUID with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
function
|
|
99
|
+
function isWebApiKey(key) {
|
|
100
100
|
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");
|
|
101
101
|
}
|
|
102
|
-
|
|
103
|
-
// src/web/encrypt.ts
|
|
104
|
-
var WEB_API_ALGORITHM = "AES-GCM";
|
|
105
102
|
async function hash(data) {
|
|
106
|
-
if (!
|
|
107
|
-
return
|
|
103
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
104
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
|
|
108
105
|
}
|
|
109
106
|
const { bytes, error } = encode(data, "utf8");
|
|
110
|
-
if (error) return
|
|
107
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
111
108
|
try {
|
|
112
109
|
const hashed = await crypto.subtle.digest("SHA-256", bytes);
|
|
113
110
|
return decode(hashed, "base64url");
|
|
114
111
|
} catch (error2) {
|
|
115
|
-
return
|
|
112
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to hash data with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error2) });
|
|
116
113
|
}
|
|
117
114
|
}
|
|
118
115
|
async function newSecretKey(key) {
|
|
119
116
|
if (typeof key === "string") {
|
|
120
|
-
if (!
|
|
117
|
+
if (!chunkSSMTQMF4_cjs.$isStr(key, 1)) return chunkSSMTQMF4_cjs.$err({ message: "Empty key for Crypto Web API", description: "Invalid secret key" });
|
|
121
118
|
const { bytes, error } = encode(key, "utf8");
|
|
122
|
-
if (error) return
|
|
119
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
123
120
|
try {
|
|
124
121
|
const hashedKey = await crypto.subtle.digest("SHA-256", bytes);
|
|
125
122
|
const secretKey = await crypto.subtle.importKey("raw", hashedKey, { name: WEB_API_ALGORITHM }, true, [
|
|
126
123
|
"encrypt",
|
|
127
124
|
"decrypt"
|
|
128
125
|
]);
|
|
129
|
-
return
|
|
126
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey });
|
|
130
127
|
} catch (error2) {
|
|
131
|
-
return
|
|
128
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to create secret key with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error2) });
|
|
132
129
|
}
|
|
133
130
|
}
|
|
134
|
-
if (
|
|
135
|
-
return
|
|
131
|
+
if (!isWebApiKey(key)) return chunkSSMTQMF4_cjs.$err({ message: "Invalid secret key", description: "Expected a webcrypto.CryptoKey" });
|
|
132
|
+
return chunkSSMTQMF4_cjs.$ok({ secretKey: key });
|
|
136
133
|
}
|
|
137
134
|
async function encrypt(data, secretKey) {
|
|
138
|
-
if (!
|
|
139
|
-
return
|
|
135
|
+
if (!chunkSSMTQMF4_cjs.$isStr(data)) {
|
|
136
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
|
|
140
137
|
}
|
|
141
|
-
if (
|
|
142
|
-
return
|
|
138
|
+
if (!isWebApiKey(secretKey)) {
|
|
139
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid encryption key", description: "Expected a webcrypto.CryptoKey" });
|
|
143
140
|
}
|
|
144
141
|
const { bytes, error } = encode(data, "utf8");
|
|
145
|
-
if (error) return
|
|
142
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
146
143
|
try {
|
|
147
144
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
148
145
|
const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv }, secretKey, bytes);
|
|
149
146
|
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
150
147
|
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
151
148
|
if (ivError || encryptedError) {
|
|
152
|
-
return
|
|
149
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
153
150
|
}
|
|
154
|
-
return
|
|
151
|
+
return chunkSSMTQMF4_cjs.$ok(`${decodedIv}.${decodedEncrypted}.`);
|
|
155
152
|
} catch (error2) {
|
|
156
|
-
return
|
|
153
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encrypt data with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error2) });
|
|
157
154
|
}
|
|
158
155
|
}
|
|
159
156
|
async function decrypt(encrypted, secretKey) {
|
|
160
|
-
if (
|
|
161
|
-
return
|
|
157
|
+
if (chunkSSMTQMF4_cjs.ENCRYPTED_WEB_REGEX.test(encrypted) === false) {
|
|
158
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
162
159
|
message: "Invalid encrypted data format",
|
|
163
160
|
description: 'Data must be in the format "iv.encryptedWithTag."'
|
|
164
161
|
});
|
|
165
162
|
}
|
|
166
163
|
const [iv, encryptedWithTag] = encrypted.split(".", 3);
|
|
167
|
-
if (!
|
|
168
|
-
return
|
|
164
|
+
if (!chunkSSMTQMF4_cjs.$isStr(iv, 1) || !chunkSSMTQMF4_cjs.$isStr(encryptedWithTag, 1)) {
|
|
165
|
+
return chunkSSMTQMF4_cjs.$err({
|
|
169
166
|
message: "Invalid parameters for decryption",
|
|
170
167
|
description: "IV and encrypted data must be non-empty strings"
|
|
171
168
|
});
|
|
172
169
|
}
|
|
173
|
-
if (
|
|
174
|
-
return
|
|
170
|
+
if (!isWebApiKey(secretKey)) {
|
|
171
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Invalid decryption key", description: "Expected a webcrypto.CryptoKey" });
|
|
175
172
|
}
|
|
176
173
|
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
177
174
|
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, "base64url");
|
|
178
175
|
if (ivError || encryptedError) {
|
|
179
|
-
return
|
|
176
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
180
177
|
}
|
|
181
178
|
try {
|
|
182
179
|
const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);
|
|
183
180
|
return decode(decrypted, "utf8");
|
|
184
181
|
} catch (error) {
|
|
185
|
-
return
|
|
182
|
+
return chunkSSMTQMF4_cjs.$err({ message: "Failed to decrypt data with Crypto Web API", description: chunkSSMTQMF4_cjs.$stringifyError(error) });
|
|
186
183
|
}
|
|
187
184
|
}
|
|
188
185
|
async function encryptObj(data, secretKey) {
|
|
189
|
-
const { result, error } =
|
|
190
|
-
if (error) return
|
|
186
|
+
const { result, error } = chunkSSMTQMF4_cjs.stringifyObj(data);
|
|
187
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
191
188
|
return await encrypt(result, secretKey);
|
|
192
189
|
}
|
|
193
190
|
async function decryptObj(encrypted, secretKey) {
|
|
194
191
|
const { result, error } = await decrypt(encrypted, secretKey);
|
|
195
|
-
if (error) return
|
|
196
|
-
return
|
|
192
|
+
if (error) return chunkSSMTQMF4_cjs.$err(error);
|
|
193
|
+
return chunkSSMTQMF4_cjs.parseToObj(result);
|
|
197
194
|
}
|
|
198
195
|
|
|
199
|
-
exports.ENCRYPTED_WEB_API_REGEX = ENCRYPTED_WEB_API_REGEX;
|
|
200
196
|
exports.WEB_API_ALGORITHM = WEB_API_ALGORITHM;
|
|
201
197
|
exports.decode = decode;
|
|
202
198
|
exports.decrypt = decrypt;
|
|
@@ -205,7 +201,8 @@ exports.encode = encode;
|
|
|
205
201
|
exports.encrypt = encrypt;
|
|
206
202
|
exports.encryptObj = encryptObj;
|
|
207
203
|
exports.hash = hash;
|
|
204
|
+
exports.isWebApiKey = isWebApiKey;
|
|
208
205
|
exports.newSecretKey = newSecretKey;
|
|
209
206
|
exports.newUuid = newUuid;
|
|
210
|
-
//# sourceMappingURL=chunk-
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
207
|
+
//# sourceMappingURL=chunk-DAMEE4F4.cjs.map
|
|
208
|
+
//# sourceMappingURL=chunk-DAMEE4F4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/encode.ts","../src/web/encrypt.ts"],"names":["$ok","$err","$stringifyError","$isStr","error","ENCRYPTED_WEB_REGEX","stringifyObj","parseToObj"],"mappings":"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","file":"chunk-DAMEE4F4.cjs","sourcesContent":["import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { EncodingFormat } from '~/types';\r\n\r\nconst textEncoder = new TextEncoder();\r\nconst textDecoder = new TextDecoder();\r\n\r\nexport function encode(data: string, format: EncodingFormat = 'utf8'): Result<{ bytes: Uint8Array }> {\r\n try {\r\n switch (format) {\r\n case 'base64':\r\n return $ok({ bytes: $fromBase64(data) });\r\n case 'base64url':\r\n return $ok({ bytes: $fromBase64Url(data) });\r\n case 'hex':\r\n return $ok({ bytes: $fromHex(data) });\r\n case 'utf8':\r\n return $ok({ bytes: textEncoder.encode(data) });\r\n default:\r\n return $err({\r\n message: `Unsupported encode format: ${format}`,\r\n description: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ message: 'Failed to encode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decode(data: ArrayBuffer | Uint8Array, format: EncodingFormat = 'utf8'): Result<string> {\r\n try {\r\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\r\n switch (format) {\r\n case 'base64':\r\n return $ok($toBase64(bytes));\r\n case 'base64url':\r\n return $ok($toBase64Url(bytes));\r\n case 'hex':\r\n return $ok($toHex(bytes));\r\n case 'utf8':\r\n return $ok(textDecoder.decode(bytes));\r\n default:\r\n return $err({\r\n message: `Unsupported decode format: ${format}`,\r\n description: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ message: 'Failed to decode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nfunction $toBase64(bytes: Uint8Array): string {\r\n let binary = '';\r\n const chunkSize = 0x8000; // 32KB per chunk\r\n for (let i = 0; i < bytes.length; i += chunkSize) {\r\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));\r\n }\r\n return btoa(binary);\r\n}\r\n\r\nfunction $fromBase64(data: string): Uint8Array {\r\n const binary = atob(data);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\nfunction $toBase64Url(bytes: Uint8Array): string {\r\n return $toBase64(bytes).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n}\r\n\r\nfunction $fromBase64Url(data: string): Uint8Array {\r\n let b64 = data.replace(/-/g, '+').replace(/_/g, '/');\r\n const padLen = (4 - (b64.length % 4)) % 4;\r\n b64 += '='.repeat(padLen);\r\n return $fromBase64(b64);\r\n}\r\n\r\nfunction $toHex(bytes: Uint8Array): string {\r\n return Array.from(bytes)\r\n .map((b) => b.toString(16).padStart(2, '0'))\r\n .join('');\r\n}\r\n\r\nfunction $fromHex(data: string): Uint8Array {\r\n const clean = data.startsWith('0x') ? data.slice(2) : data;\r\n if (clean.length % 2 !== 0) throw new Error('Invalid hex string');\r\n const out = new Uint8Array(clean.length / 2);\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);\r\n }\r\n return out;\r\n}\r\n","import { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { WebApiKey } from '~/types';\r\nimport { $isStr, ENCRYPTED_WEB_REGEX, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport const WEB_API_ALGORITHM = 'AES-GCM';\r\n\r\nexport function newUuid(): Result<string> {\r\n try {\r\n return $ok(crypto.randomUUID());\r\n } catch (error) {\r\n return $err({ message: 'Failed to generate UUID with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function isWebApiKey(key: unknown): key is WebApiKey {\r\n return (\r\n key !== null &&\r\n key !== undefined &&\r\n typeof key === 'object' &&\r\n 'type' in key &&\r\n typeof key.type === 'string' &&\r\n 'algorithm' in key &&\r\n typeof key.algorithm === 'object' &&\r\n 'extractable' in key &&\r\n typeof key.extractable === 'boolean' &&\r\n 'usages' in key &&\r\n Array.isArray(key.usages) &&\r\n key.usages.every((usage) => typeof usage === 'string')\r\n );\r\n}\r\n\r\nexport async function hash(data: string): Promise<Result<string>> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for hashing', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const hashed = await crypto.subtle.digest('SHA-256', bytes);\r\n return decode(hashed, 'base64url');\r\n } catch (error) {\r\n return $err({ message: 'Failed to hash data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function newSecretKey(key: string | WebApiKey): Promise<Result<{ secretKey: WebApiKey }>> {\r\n if (typeof key === 'string') {\r\n if (!$isStr(key, 1)) return $err({ message: 'Empty key for Crypto Web API', description: 'Invalid secret key' });\r\n\r\n const { bytes, error } = encode(key, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const hashedKey = await crypto.subtle.digest('SHA-256', bytes);\r\n const secretKey = await crypto.subtle.importKey('raw', hashedKey, { name: WEB_API_ALGORITHM }, true, [\r\n 'encrypt',\r\n 'decrypt',\r\n ]);\r\n return $ok({ secretKey });\r\n } catch (error) {\r\n return $err({ message: 'Failed to create secret key with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!isWebApiKey(key)) return $err({ message: 'Invalid secret key', description: 'Expected a webcrypto.CryptoKey' });\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport async function encrypt(data: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for encryption', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!isWebApiKey(secretKey)) {\r\n return $err({ message: 'Invalid encryption key', description: 'Expected a webcrypto.CryptoKey' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\r\n try {\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv: iv }, secretKey, bytes);\r\n\r\n const { result: decodedIv, error: ivError } = decode(iv, 'base64url');\r\n const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, 'base64url');\r\n\r\n if (ivError || encryptedError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.`);\r\n } catch (error) {\r\n return $err({ message: 'Failed to encrypt data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function decrypt(encrypted: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (ENCRYPTED_WEB_REGEX.test(encrypted) === false) {\r\n return $err({\r\n message: 'Invalid encrypted data format',\r\n description: 'Data must be in the format \"iv.encryptedWithTag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedWithTag] = encrypted.split('.', 3);\r\n if (!$isStr(iv, 1) || !$isStr(encryptedWithTag, 1)) {\r\n return $err({\r\n message: 'Invalid parameters for decryption',\r\n description: 'IV and encrypted data must be non-empty strings',\r\n });\r\n }\r\n\r\n if (!isWebApiKey(secretKey)) {\r\n return $err({ message: 'Invalid decryption key', description: 'Expected a webcrypto.CryptoKey' });\r\n }\r\n\r\n const { bytes: ivBytes, error: ivError } = encode(iv, 'base64url');\r\n const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, 'base64url');\r\n if (ivError || encryptedError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n try {\r\n const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);\r\n\r\n return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ message: 'Failed to decrypt data with Crypto Web API', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function encryptObj(data: Record<string, unknown>, secretKey: WebApiKey): Promise<Result<string>> {\r\n const { result, error } = stringifyObj(data);\r\n if (error) return $err(error);\r\n return await encrypt(result, secretKey);\r\n}\r\n\r\nexport async function decryptObj(\r\n encrypted: string,\r\n secretKey: WebApiKey,\r\n): Promise<Result<{ result: Record<string, unknown> }>> {\r\n const { result, error } = await decrypt(encrypted, secretKey);\r\n if (error) return $err(error);\r\n return parseToObj(result);\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { $ok, $err, $stringifyError, $isStr,
|
|
1
|
+
import { $ok, $err, $stringifyError, $isStr, ENCRYPTED_NODE_REGEX, stringifyObj, parseToObj } from './chunk-IHTNNCLY.js';
|
|
2
2
|
import { Buffer } from 'buffer';
|
|
3
|
-
import
|
|
3
|
+
import nodeCrypto from 'crypto';
|
|
4
4
|
|
|
5
5
|
function encode(data, format = "utf8") {
|
|
6
6
|
try {
|
|
@@ -16,26 +16,23 @@ function decode(data, format = "utf8") {
|
|
|
16
16
|
return $err({ message: "Failed to decode data", description: $stringifyError(error) });
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
var
|
|
19
|
+
var NODE_ALGORITHM = "aes-256-gcm";
|
|
20
20
|
function newUuid() {
|
|
21
21
|
try {
|
|
22
|
-
return $ok(
|
|
22
|
+
return $ok(nodeCrypto.randomUUID());
|
|
23
23
|
} catch (error) {
|
|
24
24
|
return $err({ message: "Failed to generate UUID with Crypto NodeJS", description: $stringifyError(error) });
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
return key instanceof
|
|
27
|
+
function isNodeKey(key) {
|
|
28
|
+
return key instanceof nodeCrypto.KeyObject;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
// src/node/encrypt.ts
|
|
32
|
-
var NODE_ALGORITHM = "aes-256-gcm";
|
|
33
30
|
function hash(data) {
|
|
34
31
|
if (!$isStr(data)) {
|
|
35
32
|
return $err({ message: "Empty data for hashing", description: "Data must be a non-empty string" });
|
|
36
33
|
}
|
|
37
34
|
try {
|
|
38
|
-
const hashed =
|
|
35
|
+
const hashed = nodeCrypto.createHash("sha256").update(data).digest();
|
|
39
36
|
return decode(hashed, "base64url");
|
|
40
37
|
} catch (error) {
|
|
41
38
|
return $err({ message: "Failed to hash data with Crypto NodeJS", description: $stringifyError(error) });
|
|
@@ -45,26 +42,26 @@ function newSecretKey(key) {
|
|
|
45
42
|
if (typeof key === "string") {
|
|
46
43
|
if (!$isStr(key, 1)) return $err({ message: "Empty key for Crypto NodeJS", description: "Invalid secret key" });
|
|
47
44
|
try {
|
|
48
|
-
const hashedKey =
|
|
49
|
-
const secretKey =
|
|
45
|
+
const hashedKey = nodeCrypto.createHash("sha256").update(key).digest();
|
|
46
|
+
const secretKey = nodeCrypto.createSecretKey(hashedKey);
|
|
50
47
|
return $ok({ secretKey });
|
|
51
48
|
} catch (error) {
|
|
52
49
|
return $err({ message: "Failed to create secret key with Crypto NodeJS", description: $stringifyError(error) });
|
|
53
50
|
}
|
|
54
51
|
}
|
|
55
|
-
if (
|
|
52
|
+
if (!isNodeKey(key)) return $err({ message: "Invalid secret key", description: "Expected a crypto.KeyObject" });
|
|
56
53
|
return $ok({ secretKey: key });
|
|
57
54
|
}
|
|
58
55
|
function encrypt(data, secretKey) {
|
|
59
56
|
if (!$isStr(data)) {
|
|
60
57
|
return $err({ message: "Empty data for encryption", description: "Data must be a non-empty string" });
|
|
61
58
|
}
|
|
62
|
-
if (
|
|
59
|
+
if (!isNodeKey(secretKey)) {
|
|
63
60
|
return $err({ message: "Invalid encryption key", description: "Expected a crypto.KeyObject" });
|
|
64
61
|
}
|
|
65
62
|
try {
|
|
66
|
-
const iv =
|
|
67
|
-
const cipher =
|
|
63
|
+
const iv = nodeCrypto.randomBytes(12);
|
|
64
|
+
const cipher = nodeCrypto.createCipheriv(NODE_ALGORITHM, secretKey, iv);
|
|
68
65
|
const encrypted = Buffer.concat([cipher.update(data, "utf8"), cipher.final()]);
|
|
69
66
|
const tag = cipher.getAuthTag();
|
|
70
67
|
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
@@ -92,7 +89,7 @@ function decrypt(encrypted, secretKey) {
|
|
|
92
89
|
description: "IV, encrypted data, and tag must be non-empty strings"
|
|
93
90
|
});
|
|
94
91
|
}
|
|
95
|
-
if (
|
|
92
|
+
if (!isNodeKey(secretKey)) {
|
|
96
93
|
return $err({ message: "Invalid decryption key", description: "Expected a crypto.KeyObject" });
|
|
97
94
|
}
|
|
98
95
|
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
@@ -102,7 +99,7 @@ function decrypt(encrypted, secretKey) {
|
|
|
102
99
|
return $err({ message: "Failed to encode IV or encrypted data", description: "Encoding error" });
|
|
103
100
|
}
|
|
104
101
|
try {
|
|
105
|
-
const decipher =
|
|
102
|
+
const decipher = nodeCrypto.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);
|
|
106
103
|
decipher.setAuthTag(tagBytes);
|
|
107
104
|
const decrypted = Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);
|
|
108
105
|
return decode(decrypted, "utf8");
|
|
@@ -111,16 +108,16 @@ function decrypt(encrypted, secretKey) {
|
|
|
111
108
|
}
|
|
112
109
|
}
|
|
113
110
|
function encryptObj(data, secretKey) {
|
|
114
|
-
const { result, error } =
|
|
111
|
+
const { result, error } = stringifyObj(data);
|
|
115
112
|
if (error) return $err(error);
|
|
116
113
|
return encrypt(result, secretKey);
|
|
117
114
|
}
|
|
118
115
|
function decryptObj(encrypted, secretKey) {
|
|
119
116
|
const { result, error } = decrypt(encrypted, secretKey);
|
|
120
117
|
if (error) return $err(error);
|
|
121
|
-
return
|
|
118
|
+
return parseToObj(result);
|
|
122
119
|
}
|
|
123
120
|
|
|
124
|
-
export {
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
export { NODE_ALGORITHM, decode, decrypt, decryptObj, encode, encrypt, encryptObj, hash, isNodeKey, newSecretKey, newUuid };
|
|
122
|
+
//# sourceMappingURL=chunk-HSRKAY2V.js.map
|
|
123
|
+
//# sourceMappingURL=chunk-HSRKAY2V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/encode.ts","../src/node/encrypt.ts"],"names":["Buffer"],"mappings":"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","file":"chunk-HSRKAY2V.js","sourcesContent":["import { Buffer } from 'node:buffer';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { EncodingFormat } from '~/types';\r\n\r\nexport function encode(data: string, format: EncodingFormat = 'utf8'): Result<{ bytes: Buffer }> {\r\n try {\r\n return $ok({ bytes: Buffer.from(data, format) });\r\n } catch (error) {\r\n return $err({ message: 'Failed to encode data', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decode(data: Buffer, format: EncodingFormat = 'utf8'): Result<string> {\r\n try {\r\n return $ok(Buffer.from(data).toString(format));\r\n } catch (error) {\r\n return $err({ message: 'Failed to decode data', description: $stringifyError(error) });\r\n }\r\n}\r\n","import { Buffer } from 'node:buffer';\r\nimport nodeCrypto from 'node:crypto';\r\nimport { $err, $ok, $stringifyError, type Result } from '~/error';\r\nimport type { NodeKey } from '~/types';\r\nimport { $isStr, ENCRYPTED_NODE_REGEX, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport const NODE_ALGORITHM = 'aes-256-gcm';\r\n\r\nexport function newUuid(): Result<string> {\r\n try {\r\n return $ok(nodeCrypto.randomUUID());\r\n } catch (error) {\r\n return $err({ message: 'Failed to generate UUID with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function isNodeKey(key: unknown): key is nodeCrypto.KeyObject {\r\n return key instanceof nodeCrypto.KeyObject;\r\n}\r\n\r\nexport function hash(data: string): Result<string> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for hashing', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n try {\r\n const hashed = nodeCrypto.createHash('sha256').update(data).digest();\r\n return decode(hashed, 'base64url');\r\n } catch (error) {\r\n return $err({ message: 'Failed to hash data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function newSecretKey(key: string | NodeKey): Result<{ secretKey: NodeKey }> {\r\n if (typeof key === 'string') {\r\n if (!$isStr(key, 1)) return $err({ message: 'Empty key for Crypto NodeJS', description: 'Invalid secret key' });\r\n\r\n try {\r\n const hashedKey = nodeCrypto.createHash('sha256').update(key).digest();\r\n const secretKey = nodeCrypto.createSecretKey(hashedKey);\r\n return $ok({ secretKey });\r\n } catch (error) {\r\n return $err({ message: 'Failed to create secret key with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!isNodeKey(key)) return $err({ message: 'Invalid secret key', description: 'Expected a crypto.KeyObject' });\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport function encrypt(data: string, secretKey: NodeKey): Result<string> {\r\n if (!$isStr(data)) {\r\n return $err({ message: 'Empty data for encryption', description: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!isNodeKey(secretKey)) {\r\n return $err({ message: 'Invalid encryption key', description: 'Expected a crypto.KeyObject' });\r\n }\r\n\r\n try {\r\n const iv = nodeCrypto.randomBytes(12);\r\n const cipher = nodeCrypto.createCipheriv(NODE_ALGORITHM, secretKey, iv);\r\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\r\n const tag = cipher.getAuthTag();\r\n\r\n const { result: decodedIv, error: ivError } = decode(iv, 'base64url');\r\n const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, 'base64url');\r\n const { result: decodedTag, error: tagError } = decode(tag, 'base64url');\r\n if (ivError || encryptedError || tagError) {\r\n return $err({ message: 'Failed to encode encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);\r\n } catch (error) {\r\n return $err({ message: 'Failed to encrypt data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decrypt(encrypted: string, secretKey: NodeKey): Result<string> {\r\n if (ENCRYPTED_NODE_REGEX.test(encrypted) === false) {\r\n return $err({\r\n message: 'Invalid encrypted data format',\r\n description: 'Encrypted data must be in the format \"iv.encrypted.tag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedData, tag] = encrypted.split('.', 4);\r\n if (!$isStr(iv, 1) || !$isStr(encryptedData, 1) || !$isStr(tag, 1)) {\r\n return $err({\r\n message: 'Invalid parameters for decryption',\r\n description: 'IV, encrypted data, and tag must be non-empty strings',\r\n });\r\n }\r\n\r\n if (!isNodeKey(secretKey)) {\r\n return $err({ message: 'Invalid decryption key', description: 'Expected a crypto.KeyObject' });\r\n }\r\n\r\n const { bytes: ivBytes, error: ivError } = encode(iv, 'base64url');\r\n const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, 'base64url');\r\n const { bytes: tagBytes, error: tagError } = encode(tag, 'base64url');\r\n if (ivError || encryptedError || tagError) {\r\n return $err({ message: 'Failed to encode IV or encrypted data', description: 'Encoding error' });\r\n }\r\n\r\n try {\r\n const decipher = nodeCrypto.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);\r\n decipher.setAuthTag(tagBytes);\r\n\r\n const decrypted = Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);\r\n return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ message: 'Failed to decrypt data with Crypto NodeJS', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function encryptObj(data: Record<string, unknown>, secretKey: NodeKey): Result<string> {\r\n const { result, error } = stringifyObj(data);\r\n if (error) return $err(error);\r\n return encrypt(result, secretKey);\r\n}\r\n\r\nexport function decryptObj(encrypted: string, secretKey: NodeKey): Result<{ result: Record<string, unknown> }> {\r\n const { result, error } = decrypt(encrypted, secretKey);\r\n if (error) return $err(error);\r\n return parseToObj(result);\r\n}\r\n"]}
|
|
@@ -13,13 +13,16 @@ function $stringifyError(error) {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
// src/utils.ts
|
|
16
|
+
var ENCRYPTED_REGEX = /^(?:[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?\.)$/;
|
|
17
|
+
var ENCRYPTED_NODE_REGEX = /^([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.$/;
|
|
18
|
+
var ENCRYPTED_WEB_REGEX = /^([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.$/;
|
|
16
19
|
function $isStr(value, min = 0) {
|
|
17
20
|
return (value !== null || value !== void 0) && typeof value === "string" && value.trim().length >= min;
|
|
18
21
|
}
|
|
19
22
|
function $isObj(value) {
|
|
20
23
|
return typeof value === "object" && value !== null && value !== void 0 && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
21
24
|
}
|
|
22
|
-
function
|
|
25
|
+
function stringifyObj(obj) {
|
|
23
26
|
if (!$isObj(obj)) return $err({ message: "Invalid object", description: "Input is not a plain object" });
|
|
24
27
|
try {
|
|
25
28
|
return $ok(JSON.stringify(obj));
|
|
@@ -27,7 +30,7 @@ function $stringifyObj(obj) {
|
|
|
27
30
|
return $err({ message: "Stringify error", description: $stringifyError(error) });
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
|
-
function
|
|
33
|
+
function parseToObj(str) {
|
|
31
34
|
if (!$isStr(str)) return $err({ message: "Invalid input", description: "Input is not a valid string" });
|
|
32
35
|
try {
|
|
33
36
|
const obj = JSON.parse(str);
|
|
@@ -40,6 +43,6 @@ function $parseToObj(str) {
|
|
|
40
43
|
}
|
|
41
44
|
}
|
|
42
45
|
|
|
43
|
-
export { $err, $isStr, $ok, $
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
45
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
export { $err, $isStr, $ok, $stringifyError, ENCRYPTED_NODE_REGEX, ENCRYPTED_REGEX, ENCRYPTED_WEB_REGEX, parseToObj, stringifyObj };
|
|
47
|
+
//# sourceMappingURL=chunk-IHTNNCLY.js.map
|
|
48
|
+
//# sourceMappingURL=chunk-IHTNNCLY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error.ts","../src/utils.ts"],"names":[],"mappings":";AAeO,SAAS,IAAO,MAAA,EAAuB;AAC5C,EAAA,IAAI,MAAA,CAAO,MAAM,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAI,MAAA,EAAsB;AACtE,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AACjC;AAIO,SAAS,KAAK,SAAA,EAA2F;AAC9G,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,SAAA,EAAU;AAC5C;AAEO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,IAAI,KAAA,YAAiB,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA;AACzC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;;;AC5BO,IAAM,eAAA,GAAkB;AACxB,IAAM,oBAAA,GAAuB;AAC7B,IAAM,mBAAA,GAAsB;AAE5B,SAAS,MAAA,CAAO,KAAA,EAAgB,GAAA,GAAM,CAAA,EAAoB;AAC/D,EAAA,OAAA,CAAQ,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,KAAc,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,IAAU,GAAA;AACxG;AAEO,SAAS,OAAO,KAAA,EAAkD;AACvE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,UAAU,MAAA,KACT,MAAA,CAAO,cAAA,CAAe,KAAK,MAAM,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA,KAAM,IAAA,CAAA;AAE3F;AAEO,SAAS,aAAa,GAAA,EAA8C;AACzE,EAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,gBAAA,EAAkB,WAAA,EAAa,6BAAA,EAA+B,CAAA;AAEvG,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,iBAAA,EAAmB,aAAa,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EACjF;AACF;AAEO,SAAS,WAAW,GAAA,EAA0D;AACnF,EAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,eAAA,EAAiB,WAAA,EAAa,6BAAA,EAA+B,CAAA;AAEtG,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG;AAChB,MAAA,OAAO,KAAK,EAAE,OAAA,EAAS,uBAAA,EAAyB,WAAA,EAAa,qCAAqC,CAAA;AAAA,IACpG;AAEA,IAAA,OAAO,GAAA,CAAI,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,EAAS,gBAAA,EAAkB,aAAa,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,EAChF;AACF","file":"chunk-IHTNNCLY.js","sourcesContent":["import { $isObj } from './utils';\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(typeOrErr: { message: string; description: string }): Result<never, ResultErr>;\r\nexport function $err(typeOrErr: ResultErr): Result<never, ResultErr>;\r\nexport function $err(typeOrErr: { message: string; description: string } | ResultErr): Result<never, ResultErr> {\r\n return { success: false, error: typeOrErr } as Result<never, ResultErr>;\r\n}\r\n\r\nexport function $stringifyError(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","import { $err, $ok, $stringifyError, type Result } from './error';\r\n\r\nexport const ENCRYPTED_REGEX = /^(?:[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)?\\.)$/;\r\nexport const ENCRYPTED_NODE_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\r\nexport const ENCRYPTED_WEB_REGEX = /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/;\r\n\r\nexport function $isStr(value: unknown, min = 0): value is string {\r\n return (value !== null || value !== undefined) && typeof value === 'string' && value.trim().length >= min;\r\n}\r\n\r\nexport function $isObj(value: unknown): value is Record<string, unknown> {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n value !== undefined &&\r\n (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\r\n );\r\n}\r\n\r\nexport function stringifyObj(obj: Record<string, unknown>): Result<string> {\r\n if (!$isObj(obj)) return $err({ message: 'Invalid object', description: 'Input is not a plain object' });\r\n\r\n try {\r\n return $ok(JSON.stringify(obj));\r\n } catch (error) {\r\n return $err({ message: 'Stringify error', description: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function parseToObj(str: string): Result<{ result: Record<string, unknown> }> {\r\n if (!$isStr(str)) return $err({ message: 'Invalid input', description: 'Input is not a valid string' });\r\n\r\n try {\r\n const obj = JSON.parse(str);\r\n if (!$isObj(obj)) {\r\n return $err({ message: 'Invalid object format', description: 'Parsed data is not a plain object' });\r\n }\r\n\r\n return $ok({ result: obj });\r\n } catch (error) {\r\n return $err({ message: 'Invalid format', description: $stringifyError(error) });\r\n }\r\n}\r\n"]}
|