cipher-kit 0.0.7 → 0.0.9
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-UYBB4K56.js → chunk-FTE4MPWV.js} +52 -42
- package/dist/chunk-FTE4MPWV.js.map +1 -0
- package/dist/{chunk-PKIT6YQN.js → chunk-GOCDVHG7.js} +38 -34
- package/dist/chunk-GOCDVHG7.js.map +1 -0
- package/dist/chunk-HPWXLVXW.cjs +225 -0
- package/dist/chunk-HPWXLVXW.cjs.map +1 -0
- package/dist/chunk-KLCBAR7C.cjs +156 -0
- package/dist/chunk-KLCBAR7C.cjs.map +1 -0
- package/dist/{chunk-F52DT5C4.js → chunk-LO5ITHDI.js} +20 -11
- package/dist/chunk-LO5ITHDI.js.map +1 -0
- package/dist/{chunk-IMSNCUFU.cjs → chunk-M5QWZAR4.cjs} +25 -10
- package/dist/chunk-M5QWZAR4.cjs.map +1 -0
- package/dist/index.cjs +30 -26
- package/dist/index.d.cts +6 -8
- package/dist/index.d.ts +6 -8
- package/dist/index.js +3 -3
- package/dist/node.cjs +21 -21
- package/dist/node.d.cts +4 -5
- package/dist/node.d.ts +4 -5
- package/dist/node.js +2 -2
- package/dist/{types-C7UlGfO2.d.cts → utils-Bryp07ny.d.cts} +7 -5
- package/dist/{types-C7UlGfO2.d.ts → utils-Bryp07ny.d.ts} +7 -5
- package/dist/web-api.cjs +21 -21
- package/dist/web-api.d.cts +3 -4
- package/dist/web-api.d.ts +3 -4
- package/dist/web-api.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-65XPPPAR.cjs +0 -216
- package/dist/chunk-65XPPPAR.cjs.map +0 -1
- package/dist/chunk-F52DT5C4.js.map +0 -1
- package/dist/chunk-IMSNCUFU.cjs.map +0 -1
- package/dist/chunk-PKIT6YQN.js.map +0 -1
- package/dist/chunk-RF735UV3.cjs +0 -153
- package/dist/chunk-RF735UV3.cjs.map +0 -1
- package/dist/chunk-UYBB4K56.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __export, $isStr, $err, $stringifyError, $ok, stringifyObj, WEB_API_ALGORITHM, parseToObj, isInWebApiEncryptionFormat } from './chunk-
|
|
1
|
+
import { __export, $isStr, $err, $stringifyError, $ok, stringifyObj, isWebApiKey, WEB_API_ALGORITHM, parseToObj, isInWebApiEncryptionFormat } from './chunk-LO5ITHDI.js';
|
|
2
2
|
|
|
3
3
|
// src/web/encode.ts
|
|
4
4
|
var textEncoder = new TextEncoder();
|
|
@@ -15,10 +15,13 @@ function encode(data, format = "utf8") {
|
|
|
15
15
|
case "utf8":
|
|
16
16
|
return $ok({ bytes: textEncoder.encode(data) });
|
|
17
17
|
default:
|
|
18
|
-
return $err({
|
|
18
|
+
return $err({
|
|
19
|
+
msg: `Crypto Web API: Unsupported encode format: ${format}`,
|
|
20
|
+
desc: "Use base64, base64url, hex, or utf8"
|
|
21
|
+
});
|
|
19
22
|
}
|
|
20
23
|
} catch (error) {
|
|
21
|
-
return $err({ msg: "Failed to encode data", desc: $stringifyError(error) });
|
|
24
|
+
return $err({ msg: "Crypto Web API: Failed to encode data", desc: $stringifyError(error) });
|
|
22
25
|
}
|
|
23
26
|
}
|
|
24
27
|
function decode(data, format = "utf8") {
|
|
@@ -34,10 +37,13 @@ function decode(data, format = "utf8") {
|
|
|
34
37
|
case "utf8":
|
|
35
38
|
return $ok(textDecoder.decode(bytes));
|
|
36
39
|
default:
|
|
37
|
-
return $err({
|
|
40
|
+
return $err({
|
|
41
|
+
msg: `Crypto Web API: Unsupported decode format: ${format}`,
|
|
42
|
+
desc: "Use base64, base64url, hex, or utf8"
|
|
43
|
+
});
|
|
38
44
|
}
|
|
39
45
|
} catch (error) {
|
|
40
|
-
return $err({ msg: "Failed to decode data", desc: $stringifyError(error) });
|
|
46
|
+
return $err({ msg: "Crypto Web API: Failed to decode data", desc: $stringifyError(error) });
|
|
41
47
|
}
|
|
42
48
|
}
|
|
43
49
|
function $toBase64(bytes) {
|
|
@@ -84,15 +90,12 @@ function generateUuid() {
|
|
|
84
90
|
try {
|
|
85
91
|
return $ok(crypto.randomUUID());
|
|
86
92
|
} catch (error) {
|
|
87
|
-
return $err({ msg: "Failed to generate UUID
|
|
93
|
+
return $err({ msg: "Crypto Web API: Failed to generate UUID", desc: $stringifyError(error) });
|
|
88
94
|
}
|
|
89
95
|
}
|
|
90
|
-
function isWebApiKey(key) {
|
|
91
|
-
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");
|
|
92
|
-
}
|
|
93
96
|
async function hash(data) {
|
|
94
|
-
if (!$isStr(data)) {
|
|
95
|
-
return $err({ msg: "Empty data for hashing", desc: "Data must be a non-empty string" });
|
|
97
|
+
if (!$isStr(data, 0)) {
|
|
98
|
+
return $err({ msg: "Crypto Web API: Empty data for hashing", desc: "Data must be a non-empty string" });
|
|
96
99
|
}
|
|
97
100
|
const { bytes, error } = encode(data, "utf8");
|
|
98
101
|
if (error) return $err(error);
|
|
@@ -100,77 +103,85 @@ async function hash(data) {
|
|
|
100
103
|
const hashed = await crypto.subtle.digest("SHA-256", bytes);
|
|
101
104
|
return decode(hashed, "base64url");
|
|
102
105
|
} catch (error2) {
|
|
103
|
-
return $err({ msg: "Failed to hash data
|
|
106
|
+
return $err({ msg: "Crypto Web API: Failed to hash data", desc: $stringifyError(error2) });
|
|
104
107
|
}
|
|
105
108
|
}
|
|
106
109
|
async function createSecretKey(key) {
|
|
107
110
|
if (typeof key === "string") {
|
|
108
|
-
if (!$isStr(key, 1)) return $err({ msg: "Empty key for Crypto Web API", desc: "Invalid secret key" });
|
|
109
|
-
const { bytes, error } = encode(key, "utf8");
|
|
110
|
-
if (error) return $err(error);
|
|
111
111
|
try {
|
|
112
|
+
if (!$isStr(key)) return $err({ msg: "Crypto Web API: Empty key", desc: "Key must be a non-empty string" });
|
|
113
|
+
const { bytes, error } = encode(key, "utf8");
|
|
114
|
+
if (error) return $err(error);
|
|
112
115
|
const hashedKey = await crypto.subtle.digest("SHA-256", bytes);
|
|
113
116
|
const secretKey = await crypto.subtle.importKey("raw", hashedKey, { name: WEB_API_ALGORITHM }, true, [
|
|
114
117
|
"encrypt",
|
|
115
118
|
"decrypt"
|
|
116
119
|
]);
|
|
117
120
|
return $ok({ secretKey });
|
|
118
|
-
} catch (
|
|
119
|
-
return $err({ msg: "Failed to create secret key
|
|
121
|
+
} catch (error) {
|
|
122
|
+
return $err({ msg: "Crypto Web API: Failed to create secret key", desc: $stringifyError(error) });
|
|
120
123
|
}
|
|
121
124
|
}
|
|
122
|
-
if (!isWebApiKey(key))
|
|
125
|
+
if (!isWebApiKey(key)) {
|
|
126
|
+
return $err({ msg: "Crypto Web API: Invalid secret key", desc: "Expected a WebApiKey(webcrypto.CryptoKey)" });
|
|
127
|
+
}
|
|
123
128
|
return $ok({ secretKey: key });
|
|
124
129
|
}
|
|
125
130
|
async function encrypt(data, secretKey) {
|
|
126
|
-
if (!$isStr(data)) {
|
|
127
|
-
return $err({ msg: "Empty data for encryption", desc: "Data must be a non-empty string" });
|
|
128
|
-
}
|
|
129
|
-
if (!isWebApiKey(secretKey)) {
|
|
130
|
-
return $err({ msg: "Invalid encryption key", desc: "Expected a webcrypto.CryptoKey" });
|
|
131
|
-
}
|
|
132
|
-
const { bytes, error } = encode(data, "utf8");
|
|
133
|
-
if (error) return $err(error);
|
|
134
131
|
try {
|
|
132
|
+
if (!$isStr(data)) {
|
|
133
|
+
return $err({ msg: "Crypto Web API: Empty data for encryption", desc: "Data must be a non-empty string" });
|
|
134
|
+
}
|
|
135
|
+
if (!isWebApiKey(secretKey)) {
|
|
136
|
+
return $err({ msg: "Crypto Web API: Invalid encryption key", desc: "Expected a NodeKey(crypto.KeyObject)" });
|
|
137
|
+
}
|
|
138
|
+
const { bytes, error } = encode(data, "utf8");
|
|
139
|
+
if (error) return $err(error);
|
|
135
140
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
136
141
|
const encrypted = await crypto.subtle.encrypt({ name: WEB_API_ALGORITHM, iv }, secretKey, bytes);
|
|
137
142
|
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
138
143
|
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
139
144
|
if (ivError || encryptedError) {
|
|
140
|
-
return $err({
|
|
145
|
+
return $err({
|
|
146
|
+
msg: "Crypto Web API: Failed to encode IV or encrypted data",
|
|
147
|
+
desc: `Decoding error: ${ivError || encryptedError}`
|
|
148
|
+
});
|
|
141
149
|
}
|
|
142
150
|
return $ok(`${decodedIv}.${decodedEncrypted}.`);
|
|
143
|
-
} catch (
|
|
144
|
-
return $err({ msg: "Failed to encrypt data
|
|
151
|
+
} catch (error) {
|
|
152
|
+
return $err({ msg: "Crypto Web API: Failed to encrypt data", desc: $stringifyError(error) });
|
|
145
153
|
}
|
|
146
154
|
}
|
|
147
155
|
async function decrypt(encrypted, secretKey) {
|
|
148
156
|
if (isInWebApiEncryptionFormat(encrypted) === false) {
|
|
149
157
|
return $err({
|
|
150
|
-
msg: "Invalid encrypted data format",
|
|
151
|
-
desc: '
|
|
158
|
+
msg: "Crypto Web API: Invalid encrypted data format",
|
|
159
|
+
desc: 'Encrypted data must be in the format "iv.encryptedData.tag."'
|
|
152
160
|
});
|
|
153
161
|
}
|
|
154
162
|
const [iv, encryptedWithTag] = encrypted.split(".", 3);
|
|
155
|
-
if (!$isStr(iv
|
|
163
|
+
if (!$isStr(iv) || !$isStr(encryptedWithTag)) {
|
|
156
164
|
return $err({
|
|
157
|
-
msg: "Invalid
|
|
158
|
-
desc: "
|
|
165
|
+
msg: "Crypto Web API: Invalid encrypted data",
|
|
166
|
+
desc: "Encrypted data must contain valid IV, encrypted and tag components"
|
|
159
167
|
});
|
|
160
168
|
}
|
|
161
169
|
if (!isWebApiKey(secretKey)) {
|
|
162
|
-
return $err({ msg: "Invalid decryption key", desc: "Expected a
|
|
170
|
+
return $err({ msg: "Crypto Web API: Invalid decryption key", desc: "Expected a crypto.KeyObject" });
|
|
163
171
|
}
|
|
164
172
|
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
165
173
|
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, "base64url");
|
|
166
174
|
if (ivError || encryptedError) {
|
|
167
|
-
return $err({
|
|
175
|
+
return $err({
|
|
176
|
+
msg: "Crypto Web API: Failed to decode IV or encrypted data",
|
|
177
|
+
desc: `Encoding error: ${ivError || encryptedError}`
|
|
178
|
+
});
|
|
168
179
|
}
|
|
169
180
|
try {
|
|
170
181
|
const decrypted = await crypto.subtle.decrypt({ name: WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);
|
|
171
182
|
return decode(decrypted, "utf8");
|
|
172
183
|
} catch (error) {
|
|
173
|
-
return $err({ msg: "Failed to decrypt data
|
|
184
|
+
return $err({ msg: "Crypto Web API: Failed to decrypt data", desc: $stringifyError(error) });
|
|
174
185
|
}
|
|
175
186
|
}
|
|
176
187
|
async function encryptObj(data, secretKey) {
|
|
@@ -195,10 +206,9 @@ __export(export_exports, {
|
|
|
195
206
|
encrypt: () => encrypt,
|
|
196
207
|
encryptObj: () => encryptObj,
|
|
197
208
|
generateUuid: () => generateUuid,
|
|
198
|
-
hash: () => hash
|
|
199
|
-
isWebApiKey: () => isWebApiKey
|
|
209
|
+
hash: () => hash
|
|
200
210
|
});
|
|
201
211
|
|
|
202
|
-
export { createSecretKey, decode, decrypt, decryptObj, encode, encrypt, encryptObj, export_exports, generateUuid, hash
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
212
|
+
export { createSecretKey, decode, decrypt, decryptObj, encode, encrypt, encryptObj, export_exports, generateUuid, hash };
|
|
213
|
+
//# sourceMappingURL=chunk-FTE4MPWV.js.map
|
|
214
|
+
//# sourceMappingURL=chunk-FTE4MPWV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/encode.ts","../src/web/encrypt.ts","../src/web/export.ts"],"names":["error"],"mappings":"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","file":"chunk-FTE4MPWV.js","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 msg: `Crypto Web API: Unsupported encode format: ${format}`,\r\n desc: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ msg: 'Crypto Web API: Failed to encode data', desc: $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 msg: `Crypto Web API: Unsupported decode format: ${format}`,\r\n desc: 'Use base64, base64url, hex, or utf8',\r\n });\r\n }\r\n } catch (error) {\r\n return $err({ msg: 'Crypto Web API: Failed to decode data', desc: $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, isInWebApiEncryptionFormat, isWebApiKey, parseToObj, stringifyObj, WEB_API_ALGORITHM } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport function generateUuid(): Result<string> {\r\n try {\r\n return $ok(crypto.randomUUID());\r\n } catch (error) {\r\n return $err({ msg: 'Crypto Web API: Failed to generate UUID', desc: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function hash(data: string): Promise<Result<string>> {\r\n if (!$isStr(data, 0)) {\r\n return $err({ msg: 'Crypto Web API: Empty data for hashing', desc: '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({ msg: 'Crypto Web API: Failed to hash data', desc: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function createSecretKey(key: string | WebApiKey): Promise<Result<{ secretKey: WebApiKey }>> {\r\n if (typeof key === 'string') {\r\n try {\r\n if (!$isStr(key)) return $err({ msg: 'Crypto Web API: Empty key', desc: 'Key must be a non-empty string' });\r\n const { bytes, error } = encode(key, 'utf8');\r\n if (error) return $err(error);\r\n\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({ msg: 'Crypto Web API: Failed to create secret key', desc: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!isWebApiKey(key)) {\r\n return $err({ msg: 'Crypto Web API: Invalid secret key', desc: 'Expected a WebApiKey(webcrypto.CryptoKey)' });\r\n }\r\n\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport async function encrypt(data: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n try {\r\n if (!$isStr(data)) {\r\n return $err({ msg: 'Crypto Web API: Empty data for encryption', desc: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!isWebApiKey(secretKey)) {\r\n return $err({ msg: 'Crypto Web API: Invalid encryption key', desc: 'Expected a NodeKey(crypto.KeyObject)' });\r\n }\r\n\r\n const { bytes, error } = encode(data, 'utf8');\r\n if (error) return $err(error);\r\n\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({\r\n msg: 'Crypto Web API: Failed to encode IV or encrypted data',\r\n desc: `Decoding error: ${ivError || encryptedError}`,\r\n });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.`);\r\n } catch (error) {\r\n return $err({ msg: 'Crypto Web API: Failed to encrypt data', desc: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport async function decrypt(encrypted: string, secretKey: WebApiKey): Promise<Result<string>> {\r\n if (isInWebApiEncryptionFormat(encrypted) === false) {\r\n return $err({\r\n msg: 'Crypto Web API: Invalid encrypted data format',\r\n desc: 'Encrypted data must be in the format \"iv.encryptedData.tag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedWithTag] = encrypted.split('.', 3);\r\n if (!$isStr(iv) || !$isStr(encryptedWithTag)) {\r\n return $err({\r\n msg: 'Crypto Web API: Invalid encrypted data',\r\n desc: 'Encrypted data must contain valid IV, encrypted and tag components',\r\n });\r\n }\r\n\r\n if (!isWebApiKey(secretKey)) {\r\n return $err({ msg: 'Crypto Web API: Invalid decryption key', desc: '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(encryptedWithTag, 'base64url');\r\n if (ivError || encryptedError) {\r\n return $err({\r\n msg: 'Crypto Web API: Failed to decode IV or encrypted data',\r\n desc: `Encoding error: ${ivError || encryptedError}`,\r\n });\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 return decode(decrypted, 'utf8');\r\n } catch (error) {\r\n return $err({ msg: 'Crypto Web API: Failed to decrypt data', desc: $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","export { decode, encode } from './encode';\r\nexport { createSecretKey, decrypt, decryptObj, encrypt, encryptObj, generateUuid, hash } from './encrypt';\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __export, $isStr, $err, $stringifyError, $ok, stringifyObj, NODE_ALGORITHM, parseToObj, isInNodeEncryptionFormat } from './chunk-
|
|
1
|
+
import { __export, $isStr, $err, $stringifyError, $ok, stringifyObj, isNodeKey, NODE_ALGORITHM, parseToObj, isInNodeEncryptionFormat } from './chunk-LO5ITHDI.js';
|
|
2
2
|
import { Buffer } from 'buffer';
|
|
3
3
|
import nodeCrypto from 'crypto';
|
|
4
4
|
|
|
@@ -6,59 +6,58 @@ function encode(data, format = "utf8") {
|
|
|
6
6
|
try {
|
|
7
7
|
return $ok({ bytes: Buffer.from(data, format) });
|
|
8
8
|
} catch (error) {
|
|
9
|
-
return $err({ msg: "Failed to encode data", desc: $stringifyError(error) });
|
|
9
|
+
return $err({ msg: "Crypto NodeJS: Failed to encode data", desc: $stringifyError(error) });
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
function decode(data, format = "utf8") {
|
|
13
13
|
try {
|
|
14
14
|
return $ok(Buffer.from(data).toString(format));
|
|
15
15
|
} catch (error) {
|
|
16
|
-
return $err({ msg: "Failed to decode data", desc: $stringifyError(error) });
|
|
16
|
+
return $err({ msg: "Crypto NodeJS: Failed to decode data", desc: $stringifyError(error) });
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
function generateUuid() {
|
|
20
20
|
try {
|
|
21
21
|
return $ok(nodeCrypto.randomUUID());
|
|
22
22
|
} catch (error) {
|
|
23
|
-
return $err({ msg: "Failed to generate UUID
|
|
23
|
+
return $err({ msg: "Crypto NodeJS: Failed to generate UUID", desc: $stringifyError(error) });
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
function isNodeKey(key) {
|
|
27
|
-
return key instanceof nodeCrypto.KeyObject;
|
|
28
|
-
}
|
|
29
26
|
function hash(data) {
|
|
30
|
-
if (!$isStr(data)) {
|
|
31
|
-
return $err({ msg: "Empty data for hashing", desc: "Data must be a non-empty string" });
|
|
27
|
+
if (!$isStr(data, 0)) {
|
|
28
|
+
return $err({ msg: "Crypto NodeJS: Empty data for hashing", desc: "Data must be a non-empty string" });
|
|
32
29
|
}
|
|
33
30
|
try {
|
|
34
31
|
const hashed = nodeCrypto.createHash("sha256").update(data).digest();
|
|
35
32
|
return decode(hashed, "base64url");
|
|
36
33
|
} catch (error) {
|
|
37
|
-
return $err({ msg: "Failed to hash data with Crypto NodeJS", desc: $stringifyError(error) });
|
|
34
|
+
return $err({ msg: "Crypto NodeJS: Failed to hash data with Crypto NodeJS", desc: $stringifyError(error) });
|
|
38
35
|
}
|
|
39
36
|
}
|
|
40
37
|
function createSecretKey(key) {
|
|
41
38
|
if (typeof key === "string") {
|
|
42
|
-
if (!$isStr(key, 1)) return $err({ msg: "Empty key for Crypto NodeJS", desc: "Invalid secret key" });
|
|
43
39
|
try {
|
|
40
|
+
if (!$isStr(key)) return $err({ msg: "Crypto NodeJS: Empty key", desc: "Key must be a non-empty string" });
|
|
44
41
|
const hashedKey = nodeCrypto.createHash("sha256").update(key).digest();
|
|
45
42
|
const secretKey = nodeCrypto.createSecretKey(hashedKey);
|
|
46
43
|
return $ok({ secretKey });
|
|
47
44
|
} catch (error) {
|
|
48
|
-
return $err({ msg: "Failed to create secret key
|
|
45
|
+
return $err({ msg: "Crypto NodeJS: Failed to create secret key", desc: $stringifyError(error) });
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
|
-
if (!isNodeKey(key))
|
|
48
|
+
if (!isNodeKey(key)) {
|
|
49
|
+
return $err({ msg: "Crypto NodeJS: Invalid secret key", desc: "Expected a NodeKey(crypto.KeyObject)" });
|
|
50
|
+
}
|
|
52
51
|
return $ok({ secretKey: key });
|
|
53
52
|
}
|
|
54
53
|
function encrypt(data, secretKey) {
|
|
55
|
-
if (!$isStr(data)) {
|
|
56
|
-
return $err({ msg: "Empty data for encryption", desc: "Data must be a non-empty string" });
|
|
57
|
-
}
|
|
58
|
-
if (!isNodeKey(secretKey)) {
|
|
59
|
-
return $err({ msg: "Invalid encryption key", desc: "Expected a crypto.KeyObject" });
|
|
60
|
-
}
|
|
61
54
|
try {
|
|
55
|
+
if (!$isStr(data)) {
|
|
56
|
+
return $err({ msg: "Crypto NodeJS: Empty data for encryption", desc: "Data must be a non-empty string" });
|
|
57
|
+
}
|
|
58
|
+
if (!isNodeKey(secretKey)) {
|
|
59
|
+
return $err({ msg: "Crypto NodeJS: Invalid encryption key", desc: "Expected a NodeKey(crypto.KeyObject)" });
|
|
60
|
+
}
|
|
62
61
|
const iv = nodeCrypto.randomBytes(12);
|
|
63
62
|
const cipher = nodeCrypto.createCipheriv(NODE_ALGORITHM, secretKey, iv);
|
|
64
63
|
const encrypted = Buffer.concat([cipher.update(data, "utf8"), cipher.final()]);
|
|
@@ -67,35 +66,41 @@ function encrypt(data, secretKey) {
|
|
|
67
66
|
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
68
67
|
const { result: decodedTag, error: tagError } = decode(tag, "base64url");
|
|
69
68
|
if (ivError || encryptedError || tagError) {
|
|
70
|
-
return $err({
|
|
69
|
+
return $err({
|
|
70
|
+
msg: "Crypto NodeJS: Failed to encode IV or encrypted data",
|
|
71
|
+
desc: `Decoding error: ${ivError || encryptedError || tagError}`
|
|
72
|
+
});
|
|
71
73
|
}
|
|
72
74
|
return $ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);
|
|
73
75
|
} catch (error) {
|
|
74
|
-
return $err({ msg: "Failed to encrypt data
|
|
76
|
+
return $err({ msg: "Crypto NodeJS: Failed to encrypt data", desc: $stringifyError(error) });
|
|
75
77
|
}
|
|
76
78
|
}
|
|
77
79
|
function decrypt(encrypted, secretKey) {
|
|
78
80
|
if (isInNodeEncryptionFormat(encrypted) === false) {
|
|
79
81
|
return $err({
|
|
80
|
-
msg: "Invalid encrypted data format",
|
|
81
|
-
desc: 'Encrypted data must be in the format "iv.
|
|
82
|
+
msg: "Crypto NodeJS: Invalid encrypted data format",
|
|
83
|
+
desc: 'Encrypted data must be in the format "iv.encryptedData.tag."'
|
|
82
84
|
});
|
|
83
85
|
}
|
|
84
86
|
const [iv, encryptedData, tag] = encrypted.split(".", 4);
|
|
85
|
-
if (!$isStr(iv
|
|
87
|
+
if (!$isStr(iv) || !$isStr(encryptedData) || !$isStr(tag)) {
|
|
86
88
|
return $err({
|
|
87
|
-
msg: "Invalid
|
|
88
|
-
desc: "IV, encrypted data, and tag
|
|
89
|
+
msg: "Crypto NodeJS: Invalid encrypted data",
|
|
90
|
+
desc: "Encrypted data must contain valid IV, encrypted data, and tag components"
|
|
89
91
|
});
|
|
90
92
|
}
|
|
91
93
|
if (!isNodeKey(secretKey)) {
|
|
92
|
-
return $err({ msg: "Invalid decryption key", desc: "Expected a crypto.KeyObject" });
|
|
94
|
+
return $err({ msg: "Crypto NodeJS: Invalid decryption key", desc: "Expected a crypto.KeyObject" });
|
|
93
95
|
}
|
|
94
96
|
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
95
97
|
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedData, "base64url");
|
|
96
98
|
const { bytes: tagBytes, error: tagError } = encode(tag, "base64url");
|
|
97
99
|
if (ivError || encryptedError || tagError) {
|
|
98
|
-
return $err({
|
|
100
|
+
return $err({
|
|
101
|
+
msg: "Crypto NodeJS: Failed to decode IV or encrypted data",
|
|
102
|
+
desc: `Encoding error: ${ivError || encryptedError || tagError}`
|
|
103
|
+
});
|
|
99
104
|
}
|
|
100
105
|
try {
|
|
101
106
|
const decipher = nodeCrypto.createDecipheriv(NODE_ALGORITHM, secretKey, ivBytes);
|
|
@@ -103,7 +108,7 @@ function decrypt(encrypted, secretKey) {
|
|
|
103
108
|
const decrypted = Buffer.concat([decipher.update(encryptedBytes), decipher.final()]);
|
|
104
109
|
return decode(decrypted, "utf8");
|
|
105
110
|
} catch (error) {
|
|
106
|
-
return $err({ msg: "Failed to decrypt data
|
|
111
|
+
return $err({ msg: "Crypto NodeJS: Failed to decrypt data", desc: $stringifyError(error) });
|
|
107
112
|
}
|
|
108
113
|
}
|
|
109
114
|
function encryptObj(data, secretKey) {
|
|
@@ -128,10 +133,9 @@ __export(export_exports, {
|
|
|
128
133
|
encrypt: () => encrypt,
|
|
129
134
|
encryptObj: () => encryptObj,
|
|
130
135
|
generateUuid: () => generateUuid,
|
|
131
|
-
hash: () => hash
|
|
132
|
-
isNodeKey: () => isNodeKey
|
|
136
|
+
hash: () => hash
|
|
133
137
|
});
|
|
134
138
|
|
|
135
|
-
export { createSecretKey, decode, decrypt, decryptObj, encode, encrypt, encryptObj, export_exports, generateUuid, hash
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
137
|
-
//# sourceMappingURL=chunk-
|
|
139
|
+
export { createSecretKey, decode, decrypt, decryptObj, encode, encrypt, encryptObj, export_exports, generateUuid, hash };
|
|
140
|
+
//# sourceMappingURL=chunk-GOCDVHG7.js.map
|
|
141
|
+
//# sourceMappingURL=chunk-GOCDVHG7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/encode.ts","../src/node/encrypt.ts","../src/node/export.ts"],"names":["Buffer"],"mappings":"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","file":"chunk-GOCDVHG7.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({ msg: 'Crypto NodeJS: Failed to encode data', desc: $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({ msg: 'Crypto NodeJS: Failed to decode data', desc: $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, isInNodeEncryptionFormat, isNodeKey, NODE_ALGORITHM, parseToObj, stringifyObj } from '~/utils';\r\nimport { decode, encode } from './encode';\r\n\r\nexport function generateUuid(): Result<string> {\r\n try {\r\n return $ok(nodeCrypto.randomUUID());\r\n } catch (error) {\r\n return $err({ msg: 'Crypto NodeJS: Failed to generate UUID', desc: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function hash(data: string): Result<string> {\r\n if (!$isStr(data, 0)) {\r\n return $err({ msg: 'Crypto NodeJS: Empty data for hashing', desc: '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({ msg: 'Crypto NodeJS: Failed to hash data with Crypto NodeJS', desc: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function createSecretKey(key: string | NodeKey): Result<{ secretKey: NodeKey }> {\r\n if (typeof key === 'string') {\r\n try {\r\n if (!$isStr(key)) return $err({ msg: 'Crypto NodeJS: Empty key', desc: 'Key must be a non-empty string' });\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({ msg: 'Crypto NodeJS: Failed to create secret key', desc: $stringifyError(error) });\r\n }\r\n }\r\n\r\n if (!isNodeKey(key)) {\r\n return $err({ msg: 'Crypto NodeJS: Invalid secret key', desc: 'Expected a NodeKey(crypto.KeyObject)' });\r\n }\r\n\r\n return $ok({ secretKey: key });\r\n}\r\n\r\nexport function encrypt(data: string, secretKey: NodeKey): Result<string> {\r\n try {\r\n if (!$isStr(data)) {\r\n return $err({ msg: 'Crypto NodeJS: Empty data for encryption', desc: 'Data must be a non-empty string' });\r\n }\r\n\r\n if (!isNodeKey(secretKey)) {\r\n return $err({ msg: 'Crypto NodeJS: Invalid encryption key', desc: 'Expected a NodeKey(crypto.KeyObject)' });\r\n }\r\n\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({\r\n msg: 'Crypto NodeJS: Failed to encode IV or encrypted data',\r\n desc: `Decoding error: ${ivError || encryptedError || tagError}`,\r\n });\r\n }\r\n\r\n return $ok(`${decodedIv}.${decodedEncrypted}.${decodedTag}.`);\r\n } catch (error) {\r\n return $err({ msg: 'Crypto NodeJS: Failed to encrypt data', desc: $stringifyError(error) });\r\n }\r\n}\r\n\r\nexport function decrypt(encrypted: string, secretKey: NodeKey): Result<string> {\r\n if (isInNodeEncryptionFormat(encrypted) === false) {\r\n return $err({\r\n msg: 'Crypto NodeJS: Invalid encrypted data format',\r\n desc: 'Encrypted data must be in the format \"iv.encryptedData.tag.\"',\r\n });\r\n }\r\n\r\n const [iv, encryptedData, tag] = encrypted.split('.', 4);\r\n if (!$isStr(iv) || !$isStr(encryptedData) || !$isStr(tag)) {\r\n return $err({\r\n msg: 'Crypto NodeJS: Invalid encrypted data',\r\n desc: 'Encrypted data must contain valid IV, encrypted data, and tag components',\r\n });\r\n }\r\n\r\n if (!isNodeKey(secretKey)) {\r\n return $err({ msg: 'Crypto NodeJS: Invalid decryption key', desc: '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({\r\n msg: 'Crypto NodeJS: Failed to decode IV or encrypted data',\r\n desc: `Encoding error: ${ivError || encryptedError || tagError}`,\r\n });\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({ msg: 'Crypto NodeJS: Failed to decrypt data', desc: $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","export { decode, encode } from './encode';\r\nexport { createSecretKey, decrypt, decryptObj, encrypt, encryptObj, generateUuid, hash } from './encrypt';\r\n"]}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkM5QWZAR4_cjs = require('./chunk-M5QWZAR4.cjs');
|
|
4
|
+
|
|
5
|
+
// src/web/encode.ts
|
|
6
|
+
var textEncoder = new TextEncoder();
|
|
7
|
+
var textDecoder = new TextDecoder();
|
|
8
|
+
function encode(data, format = "utf8") {
|
|
9
|
+
try {
|
|
10
|
+
switch (format) {
|
|
11
|
+
case "base64":
|
|
12
|
+
return chunkM5QWZAR4_cjs.$ok({ bytes: $fromBase64(data) });
|
|
13
|
+
case "base64url":
|
|
14
|
+
return chunkM5QWZAR4_cjs.$ok({ bytes: $fromBase64Url(data) });
|
|
15
|
+
case "hex":
|
|
16
|
+
return chunkM5QWZAR4_cjs.$ok({ bytes: $fromHex(data) });
|
|
17
|
+
case "utf8":
|
|
18
|
+
return chunkM5QWZAR4_cjs.$ok({ bytes: textEncoder.encode(data) });
|
|
19
|
+
default:
|
|
20
|
+
return chunkM5QWZAR4_cjs.$err({
|
|
21
|
+
msg: `Crypto Web API: Unsupported encode format: ${format}`,
|
|
22
|
+
desc: "Use base64, base64url, hex, or utf8"
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
} catch (error) {
|
|
26
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to encode data", desc: chunkM5QWZAR4_cjs.$stringifyError(error) });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function decode(data, format = "utf8") {
|
|
30
|
+
try {
|
|
31
|
+
const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
32
|
+
switch (format) {
|
|
33
|
+
case "base64":
|
|
34
|
+
return chunkM5QWZAR4_cjs.$ok($toBase64(bytes));
|
|
35
|
+
case "base64url":
|
|
36
|
+
return chunkM5QWZAR4_cjs.$ok($toBase64Url(bytes));
|
|
37
|
+
case "hex":
|
|
38
|
+
return chunkM5QWZAR4_cjs.$ok($toHex(bytes));
|
|
39
|
+
case "utf8":
|
|
40
|
+
return chunkM5QWZAR4_cjs.$ok(textDecoder.decode(bytes));
|
|
41
|
+
default:
|
|
42
|
+
return chunkM5QWZAR4_cjs.$err({
|
|
43
|
+
msg: `Crypto Web API: Unsupported decode format: ${format}`,
|
|
44
|
+
desc: "Use base64, base64url, hex, or utf8"
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
} catch (error) {
|
|
48
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to decode data", desc: chunkM5QWZAR4_cjs.$stringifyError(error) });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function $toBase64(bytes) {
|
|
52
|
+
let binary = "";
|
|
53
|
+
const chunkSize = 32768;
|
|
54
|
+
for (let i = 0; i < bytes.length; i += chunkSize) {
|
|
55
|
+
binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
|
|
56
|
+
}
|
|
57
|
+
return btoa(binary);
|
|
58
|
+
}
|
|
59
|
+
function $fromBase64(data) {
|
|
60
|
+
const binary = atob(data);
|
|
61
|
+
const len = binary.length;
|
|
62
|
+
const bytes = new Uint8Array(len);
|
|
63
|
+
for (let i = 0; i < len; i++) {
|
|
64
|
+
bytes[i] = binary.charCodeAt(i);
|
|
65
|
+
}
|
|
66
|
+
return bytes;
|
|
67
|
+
}
|
|
68
|
+
function $toBase64Url(bytes) {
|
|
69
|
+
return $toBase64(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
70
|
+
}
|
|
71
|
+
function $fromBase64Url(data) {
|
|
72
|
+
let b64 = data.replace(/-/g, "+").replace(/_/g, "/");
|
|
73
|
+
const padLen = (4 - b64.length % 4) % 4;
|
|
74
|
+
b64 += "=".repeat(padLen);
|
|
75
|
+
return $fromBase64(b64);
|
|
76
|
+
}
|
|
77
|
+
function $toHex(bytes) {
|
|
78
|
+
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
79
|
+
}
|
|
80
|
+
function $fromHex(data) {
|
|
81
|
+
const clean = data.startsWith("0x") ? data.slice(2) : data;
|
|
82
|
+
if (clean.length % 2 !== 0) throw new Error("Invalid hex string");
|
|
83
|
+
const out = new Uint8Array(clean.length / 2);
|
|
84
|
+
for (let i = 0; i < out.length; i++) {
|
|
85
|
+
out[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/web/encrypt.ts
|
|
91
|
+
function generateUuid() {
|
|
92
|
+
try {
|
|
93
|
+
return chunkM5QWZAR4_cjs.$ok(crypto.randomUUID());
|
|
94
|
+
} catch (error) {
|
|
95
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to generate UUID", desc: chunkM5QWZAR4_cjs.$stringifyError(error) });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function hash(data) {
|
|
99
|
+
if (!chunkM5QWZAR4_cjs.$isStr(data, 0)) {
|
|
100
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Empty data for hashing", desc: "Data must be a non-empty string" });
|
|
101
|
+
}
|
|
102
|
+
const { bytes, error } = encode(data, "utf8");
|
|
103
|
+
if (error) return chunkM5QWZAR4_cjs.$err(error);
|
|
104
|
+
try {
|
|
105
|
+
const hashed = await crypto.subtle.digest("SHA-256", bytes);
|
|
106
|
+
return decode(hashed, "base64url");
|
|
107
|
+
} catch (error2) {
|
|
108
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to hash data", desc: chunkM5QWZAR4_cjs.$stringifyError(error2) });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function createSecretKey(key) {
|
|
112
|
+
if (typeof key === "string") {
|
|
113
|
+
try {
|
|
114
|
+
if (!chunkM5QWZAR4_cjs.$isStr(key)) return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Empty key", desc: "Key must be a non-empty string" });
|
|
115
|
+
const { bytes, error } = encode(key, "utf8");
|
|
116
|
+
if (error) return chunkM5QWZAR4_cjs.$err(error);
|
|
117
|
+
const hashedKey = await crypto.subtle.digest("SHA-256", bytes);
|
|
118
|
+
const secretKey = await crypto.subtle.importKey("raw", hashedKey, { name: chunkM5QWZAR4_cjs.WEB_API_ALGORITHM }, true, [
|
|
119
|
+
"encrypt",
|
|
120
|
+
"decrypt"
|
|
121
|
+
]);
|
|
122
|
+
return chunkM5QWZAR4_cjs.$ok({ secretKey });
|
|
123
|
+
} catch (error) {
|
|
124
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to create secret key", desc: chunkM5QWZAR4_cjs.$stringifyError(error) });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!chunkM5QWZAR4_cjs.isWebApiKey(key)) {
|
|
128
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Invalid secret key", desc: "Expected a WebApiKey(webcrypto.CryptoKey)" });
|
|
129
|
+
}
|
|
130
|
+
return chunkM5QWZAR4_cjs.$ok({ secretKey: key });
|
|
131
|
+
}
|
|
132
|
+
async function encrypt(data, secretKey) {
|
|
133
|
+
try {
|
|
134
|
+
if (!chunkM5QWZAR4_cjs.$isStr(data)) {
|
|
135
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Empty data for encryption", desc: "Data must be a non-empty string" });
|
|
136
|
+
}
|
|
137
|
+
if (!chunkM5QWZAR4_cjs.isWebApiKey(secretKey)) {
|
|
138
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Invalid encryption key", desc: "Expected a NodeKey(crypto.KeyObject)" });
|
|
139
|
+
}
|
|
140
|
+
const { bytes, error } = encode(data, "utf8");
|
|
141
|
+
if (error) return chunkM5QWZAR4_cjs.$err(error);
|
|
142
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
143
|
+
const encrypted = await crypto.subtle.encrypt({ name: chunkM5QWZAR4_cjs.WEB_API_ALGORITHM, iv }, secretKey, bytes);
|
|
144
|
+
const { result: decodedIv, error: ivError } = decode(iv, "base64url");
|
|
145
|
+
const { result: decodedEncrypted, error: encryptedError } = decode(encrypted, "base64url");
|
|
146
|
+
if (ivError || encryptedError) {
|
|
147
|
+
return chunkM5QWZAR4_cjs.$err({
|
|
148
|
+
msg: "Crypto Web API: Failed to encode IV or encrypted data",
|
|
149
|
+
desc: `Decoding error: ${ivError || encryptedError}`
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return chunkM5QWZAR4_cjs.$ok(`${decodedIv}.${decodedEncrypted}.`);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to encrypt data", desc: chunkM5QWZAR4_cjs.$stringifyError(error) });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function decrypt(encrypted, secretKey) {
|
|
158
|
+
if (chunkM5QWZAR4_cjs.isInWebApiEncryptionFormat(encrypted) === false) {
|
|
159
|
+
return chunkM5QWZAR4_cjs.$err({
|
|
160
|
+
msg: "Crypto Web API: Invalid encrypted data format",
|
|
161
|
+
desc: 'Encrypted data must be in the format "iv.encryptedData.tag."'
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
const [iv, encryptedWithTag] = encrypted.split(".", 3);
|
|
165
|
+
if (!chunkM5QWZAR4_cjs.$isStr(iv) || !chunkM5QWZAR4_cjs.$isStr(encryptedWithTag)) {
|
|
166
|
+
return chunkM5QWZAR4_cjs.$err({
|
|
167
|
+
msg: "Crypto Web API: Invalid encrypted data",
|
|
168
|
+
desc: "Encrypted data must contain valid IV, encrypted and tag components"
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
if (!chunkM5QWZAR4_cjs.isWebApiKey(secretKey)) {
|
|
172
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Invalid decryption key", desc: "Expected a crypto.KeyObject" });
|
|
173
|
+
}
|
|
174
|
+
const { bytes: ivBytes, error: ivError } = encode(iv, "base64url");
|
|
175
|
+
const { bytes: encryptedBytes, error: encryptedError } = encode(encryptedWithTag, "base64url");
|
|
176
|
+
if (ivError || encryptedError) {
|
|
177
|
+
return chunkM5QWZAR4_cjs.$err({
|
|
178
|
+
msg: "Crypto Web API: Failed to decode IV or encrypted data",
|
|
179
|
+
desc: `Encoding error: ${ivError || encryptedError}`
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const decrypted = await crypto.subtle.decrypt({ name: chunkM5QWZAR4_cjs.WEB_API_ALGORITHM, iv: ivBytes }, secretKey, encryptedBytes);
|
|
184
|
+
return decode(decrypted, "utf8");
|
|
185
|
+
} catch (error) {
|
|
186
|
+
return chunkM5QWZAR4_cjs.$err({ msg: "Crypto Web API: Failed to decrypt data", desc: chunkM5QWZAR4_cjs.$stringifyError(error) });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function encryptObj(data, secretKey) {
|
|
190
|
+
const { result, error } = chunkM5QWZAR4_cjs.stringifyObj(data);
|
|
191
|
+
if (error) return chunkM5QWZAR4_cjs.$err(error);
|
|
192
|
+
return await encrypt(result, secretKey);
|
|
193
|
+
}
|
|
194
|
+
async function decryptObj(encrypted, secretKey) {
|
|
195
|
+
const { result, error } = await decrypt(encrypted, secretKey);
|
|
196
|
+
if (error) return chunkM5QWZAR4_cjs.$err(error);
|
|
197
|
+
return chunkM5QWZAR4_cjs.parseToObj(result);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// src/web/export.ts
|
|
201
|
+
var export_exports = {};
|
|
202
|
+
chunkM5QWZAR4_cjs.__export(export_exports, {
|
|
203
|
+
createSecretKey: () => createSecretKey,
|
|
204
|
+
decode: () => decode,
|
|
205
|
+
decrypt: () => decrypt,
|
|
206
|
+
decryptObj: () => decryptObj,
|
|
207
|
+
encode: () => encode,
|
|
208
|
+
encrypt: () => encrypt,
|
|
209
|
+
encryptObj: () => encryptObj,
|
|
210
|
+
generateUuid: () => generateUuid,
|
|
211
|
+
hash: () => hash
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
exports.createSecretKey = createSecretKey;
|
|
215
|
+
exports.decode = decode;
|
|
216
|
+
exports.decrypt = decrypt;
|
|
217
|
+
exports.decryptObj = decryptObj;
|
|
218
|
+
exports.encode = encode;
|
|
219
|
+
exports.encrypt = encrypt;
|
|
220
|
+
exports.encryptObj = encryptObj;
|
|
221
|
+
exports.export_exports = export_exports;
|
|
222
|
+
exports.generateUuid = generateUuid;
|
|
223
|
+
exports.hash = hash;
|
|
224
|
+
//# sourceMappingURL=chunk-HPWXLVXW.cjs.map
|
|
225
|
+
//# sourceMappingURL=chunk-HPWXLVXW.cjs.map
|