@happyvertical/encryption 0.111.5 → 0.111.7

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/AGENT.md CHANGED
@@ -30,3 +30,12 @@ pnpm --filter @happyvertical/encryption typecheck
30
30
  - Requires: @happyvertical/logger, @happyvertical/utils, @openpgp/web-stream-tools, openpgp, tweetnacl, tweetnacl-util
31
31
  - Stability: stable (Primary package surface is described as implemented and production-oriented.)
32
32
  <!-- END AGENT:GENERATED -->
33
+
34
+
35
+ ## Vault snapshots
36
+
37
+ Import `sealVaultSnapshot` and `openVaultSnapshot` from
38
+ `@happyvertical/encryption/vault-snapshot` for bounded user-key-encrypted bytes. Supply trusted account, device, and sequence context when
39
+ opening, and scope the single key lookup to that account. The
40
+ [v1 wire specification](./README.md#version-1-wire-format) describes framing,
41
+ limits, and Kotlin interoperability vectors.
package/README.md CHANGED
@@ -137,6 +137,79 @@ const encrypted = await rsaEncryption.encryptText('Small message');
137
137
  const decrypted = await rsaEncryption.decryptText(encrypted);
138
138
  ```
139
139
 
140
+ ## Vault snapshot envelopes
141
+
142
+ ```typescript
143
+ import { openVaultSnapshot, sealVaultSnapshot } from '@happyvertical/encryption/vault-snapshot';
144
+ ```
145
+
146
+ `sealVaultSnapshot(snapshot, { key, keyId, context, compression })` and
147
+ `openVaultSnapshot(envelope, { context, resolveKey })` are synchronous Node.js
148
+ byte APIs. The key is a raw 32-byte user key dedicated to snapshot envelopes.
149
+ The key ID is an opaque 16-byte identifier encoded as 32 lowercase hexadecimal
150
+ digits in TypeScript. Supply the expected `{ accountId, deviceId, sequence }`
151
+ independently when opening. Scope `resolveKey(keyId)` to that account and return
152
+ `undefined` for an unknown ID. A syntactically valid envelope can trigger one
153
+ lookup with an untrusted ID. Opening returns bytes only after authentication and
154
+ validation succeed.
155
+
156
+ Compression is optional and defaults to `none`. Use `zlib` for snapshots where
157
+ revealing the resulting size is acceptable. Envelope length is public in both
158
+ modes, and compression can reveal relationships between attacker-controlled and
159
+ secret bytes. Account and device IDs and the sequence are encrypted. Callers
160
+ that require replay or rollback protection must track which sequences are
161
+ acceptable in their trusted state. Every seal generates a fresh random nonce.
162
+
163
+ ### Version 1 wire format
164
+
165
+ The envelope is a binary byte array with a 47-byte clear header followed by
166
+ the combined output of
167
+ [NaCl XSalsa20-Poly1305 secretbox](https://doc.libsodium.org/secret-key_cryptography/secretbox)
168
+ (`crypto_secretbox_easy` in libsodium). The output begins with its 16-byte
169
+ authentication tag and continues with the encrypted message to end of input.
170
+
171
+ | Header offset | Size | Value |
172
+ | --- | --- | --- |
173
+ | 0 | 4 | ASCII `HVSE` (`48 56 53 45`) |
174
+ | 4 | 1 | Version `01` |
175
+ | 5 | 1 | Algorithm `01` (XSalsa20-Poly1305 secretbox) |
176
+ | 6 | 1 | Compression `00` for raw bytes or `01` for zlib |
177
+ | 7 | 16 | Raw opaque key ID bytes, in the same order as the hex encoding |
178
+ | 23 | 24 | Secretbox nonce |
179
+
180
+ The authenticated message is this exact concatenation:
181
+
182
+ ```text
183
+ clear header (47 bytes)
184
+ account ID UTF-8 byte length (uint8) || account ID UTF-8 bytes
185
+ device ID UTF-8 byte length (uint8) || device ID UTF-8 bytes
186
+ sequence (uint64 big-endian)
187
+ payload (to end of message)
188
+ ```
189
+
190
+ Each ID is 1 to 255 bytes of valid UTF-8, with exact byte matching and no Unicode
191
+ normalization. For Kotlin, convert byte lengths to unsigned values and interpret
192
+ the eight sequence bytes as a big-endian `ULong` (TypeScript `bigint`).
193
+ Compression `01` is one [RFC 1950](https://www.rfc-editor.org/rfc/rfc1950)
194
+ zlib stream with DEFLATE, checksum and no preset dictionary. A JVM reader can
195
+ use `Inflater(false)` with an output limit and check `finished()` and zero
196
+ remaining input. Different compressors may produce different valid payload bytes.
197
+
198
+ Reject unknown header values, envelope lengths outside 122 to 8,454,774 bytes,
199
+ and payload lengths outside the mode limits. A v1 envelope holds at most
200
+ 8,388,608 decoded bytes (8 MiB). The raw payload has the same cap. The compressed
201
+ payload cap is 8,454,144 bytes. These are fixed v1 limits for a single in-memory
202
+ envelope. Open secretbox with the clear nonce and the one key identified by the
203
+ header. Compare the authenticated header and context prefix against the clear
204
+ header and independently supplied expected context, then decode the payload.
205
+ For zlib, reject truncated streams, dictionaries, invalid checksums, trailing
206
+ bytes and output above the decoded limit.
207
+
208
+ The [v1 interoperability vectors](./vault-snapshot-v1-vectors.json) were generated
209
+ with libsodium via PyNaCl and Python zlib. They include the test key, raw IDs and
210
+ sequence, encoded context, snapshot, nonce, encoded payload and full envelope
211
+ for both modes. The fixed keys and nonces are for testing.
212
+
140
213
  ## Common Use Cases
141
214
 
142
215
  ### Email Encryption (PGP/MIME)
@@ -0,0 +1,100 @@
1
+ import { n as DecryptError, o as InvalidKeyError, r as EncryptError, s as KeyError } from "./errors-Q_wX_NMz.js";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ //#region src/shared/base.ts
4
+ /**
5
+ * Base adapter class that provides common functionality for all encryption adapters
6
+ */
7
+ var BaseEncryption = class {
8
+ adapterType;
9
+ debug;
10
+ constructor(adapterType, debug = false) {
11
+ this.adapterType = adapterType;
12
+ this.debug = debug;
13
+ }
14
+ /**
15
+ * Get the adapter type
16
+ */
17
+ getAdapter() {
18
+ return this.adapterType;
19
+ }
20
+ /**
21
+ * Log debug messages if debug mode is enabled
22
+ */
23
+ log(message, ...args) {
24
+ if (this.debug) console.log(`[${this.adapterType}] ${message}`, ...args);
25
+ }
26
+ /**
27
+ * Validate that a key is provided
28
+ */
29
+ validateKey(key, keyType) {
30
+ if (!key) throw new KeyError(`${keyType} key is required but was not provided`, this.adapterType);
31
+ if (typeof key === "string" && key.trim().length === 0) throw new InvalidKeyError(`${keyType} key cannot be empty`, this.adapterType);
32
+ if (Buffer.isBuffer(key) && key.length === 0) throw new InvalidKeyError(`${keyType} key cannot be empty`, this.adapterType);
33
+ if (key instanceof Uint8Array && key.length === 0) throw new InvalidKeyError(`${keyType} key cannot be empty`, this.adapterType);
34
+ }
35
+ /**
36
+ * Validate encryption options
37
+ */
38
+ validateEncryptOptions(options) {
39
+ if (!options) return;
40
+ if (options.encoding && ![
41
+ "base64",
42
+ "hex",
43
+ "utf8"
44
+ ].includes(options.encoding)) throw new Error(`Invalid encoding: ${options.encoding}. Must be 'base64', 'hex', or 'utf8'`);
45
+ }
46
+ /**
47
+ * Validate decryption options
48
+ */
49
+ validateDecryptOptions(options) {
50
+ if (!options) return;
51
+ if (options.encoding && ![
52
+ "base64",
53
+ "hex",
54
+ "utf8"
55
+ ].includes(options.encoding)) throw new Error(`Invalid encoding: ${options.encoding}. Must be 'base64', 'hex', or 'utf8'`);
56
+ }
57
+ /**
58
+ * Convert Buffer to string based on encoding
59
+ */
60
+ bufferToString(buffer, encoding = "base64") {
61
+ return buffer.toString(encoding);
62
+ }
63
+ /**
64
+ * Convert string to Buffer based on encoding
65
+ */
66
+ stringToBuffer(str, encoding = "base64") {
67
+ return Buffer.from(str, encoding);
68
+ }
69
+ /**
70
+ * Wrap errors with adapter context
71
+ */
72
+ wrapError(error, operation) {
73
+ if (error instanceof Error) return error;
74
+ return /* @__PURE__ */ new Error(`${operation} failed in ${this.adapterType} adapter: ${String(error)}`);
75
+ }
76
+ async encryptFile(inputPath, outputPath, options) {
77
+ try {
78
+ this.log(`Encrypting file: ${inputPath} -> ${outputPath}`);
79
+ const input = await readFile(inputPath);
80
+ await writeFile(outputPath, await this.encryptBuffer(input, options));
81
+ this.log(`File encrypted successfully: ${outputPath}`);
82
+ } catch (error) {
83
+ throw new EncryptError(`Failed to encrypt file: ${error.message}`, this.adapterType, error);
84
+ }
85
+ }
86
+ async decryptFile(inputPath, outputPath, options) {
87
+ try {
88
+ this.log(`Decrypting file: ${inputPath} -> ${outputPath}`);
89
+ const input = await readFile(inputPath);
90
+ await writeFile(outputPath, await this.decryptBuffer(input, options));
91
+ this.log(`File decrypted successfully: ${outputPath}`);
92
+ } catch (error) {
93
+ throw new DecryptError(`Failed to decrypt file: ${error.message}`, this.adapterType, error);
94
+ }
95
+ }
96
+ };
97
+ //#endregion
98
+ export { BaseEncryption as t };
99
+
100
+ //# sourceMappingURL=base-COUQhj5x.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-COUQhj5x.js","names":[],"sources":["../../src/shared/base.ts"],"sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport type { Transform } from 'node:stream';\nimport {\n DecryptError,\n EncryptError,\n InvalidKeyError,\n KeyError,\n} from './errors.js';\nimport type {\n AdapterType,\n DecryptEmailOptions,\n DecryptedEmail,\n DecryptOptions,\n EmailMessage,\n EncryptEmailOptions,\n Encryption,\n EncryptionCapabilities,\n EncryptOptions,\n ExportKeyOptions,\n ImportKeyOptions,\n Key,\n KeyPair,\n KeyPairOptions,\n SignEmailOptions,\n SignOptions,\n VerificationResult,\n VerifyEmailOptions,\n VerifyOptions,\n} from './types.js';\n\n/**\n * Base adapter class that provides common functionality for all encryption adapters\n */\nexport abstract class BaseEncryption implements Encryption {\n protected readonly adapterType: AdapterType;\n protected readonly debug: boolean;\n\n constructor(adapterType: AdapterType, debug = false) {\n this.adapterType = adapterType;\n this.debug = debug;\n }\n\n /**\n * Get the adapter type\n */\n getAdapter(): AdapterType {\n return this.adapterType;\n }\n\n /**\n * Log debug messages if debug mode is enabled\n */\n protected log(message: string, ...args: unknown[]): void {\n if (this.debug) {\n console.log(`[${this.adapterType}] ${message}`, ...args);\n }\n }\n\n /**\n * Validate that a key is provided\n */\n protected validateKey(\n key: string | Buffer | Uint8Array | undefined,\n keyType: 'public' | 'private',\n ): void {\n if (!key) {\n throw new KeyError(\n `${keyType} key is required but was not provided`,\n this.adapterType,\n );\n }\n\n if (typeof key === 'string' && key.trim().length === 0) {\n throw new InvalidKeyError(\n `${keyType} key cannot be empty`,\n this.adapterType,\n );\n }\n\n if (Buffer.isBuffer(key) && key.length === 0) {\n throw new InvalidKeyError(\n `${keyType} key cannot be empty`,\n this.adapterType,\n );\n }\n\n if (key instanceof Uint8Array && key.length === 0) {\n throw new InvalidKeyError(\n `${keyType} key cannot be empty`,\n this.adapterType,\n );\n }\n }\n\n /**\n * Validate encryption options\n */\n protected validateEncryptOptions(options?: EncryptOptions): void {\n // Base validation - adapters can override\n if (!options) return;\n\n // Validate encoding if provided\n if (\n options.encoding &&\n !['base64', 'hex', 'utf8'].includes(options.encoding)\n ) {\n throw new Error(\n `Invalid encoding: ${options.encoding}. Must be 'base64', 'hex', or 'utf8'`,\n );\n }\n }\n\n /**\n * Validate decryption options\n */\n protected validateDecryptOptions(options?: DecryptOptions): void {\n // Base validation - adapters can override\n if (!options) return;\n\n // Validate encoding if provided\n if (\n options.encoding &&\n !['base64', 'hex', 'utf8'].includes(options.encoding)\n ) {\n throw new Error(\n `Invalid encoding: ${options.encoding}. Must be 'base64', 'hex', or 'utf8'`,\n );\n }\n }\n\n /**\n * Convert Buffer to string based on encoding\n */\n protected bufferToString(\n buffer: Buffer,\n encoding: 'base64' | 'hex' | 'utf8' = 'base64',\n ): string {\n return buffer.toString(encoding);\n }\n\n /**\n * Convert string to Buffer based on encoding\n */\n protected stringToBuffer(\n str: string,\n encoding: 'base64' | 'hex' | 'utf8' = 'base64',\n ): Buffer {\n return Buffer.from(str, encoding);\n }\n\n /**\n * Wrap errors with adapter context\n */\n protected wrapError(error: unknown, operation: string): Error {\n if (error instanceof Error) {\n return error;\n }\n return new Error(\n `${operation} failed in ${this.adapterType} adapter: ${String(error)}`,\n );\n }\n\n // =============================================================================\n // Text operations (must be implemented by adapters)\n // =============================================================================\n\n abstract encryptText(text: string, options?: EncryptOptions): Promise<string>;\n\n abstract decryptText(\n encrypted: string,\n options?: DecryptOptions,\n ): Promise<string>;\n\n // =============================================================================\n // File operations (default implementation using text/buffer methods)\n // =============================================================================\n\n async encryptFile(\n inputPath: string,\n outputPath: string,\n options?: EncryptOptions,\n ): Promise<void> {\n try {\n this.log(`Encrypting file: ${inputPath} -> ${outputPath}`);\n\n // Read input file\n const input = await readFile(inputPath);\n\n // Encrypt buffer\n const encrypted = await this.encryptBuffer(input, options);\n\n // Write output file\n await writeFile(outputPath, encrypted);\n\n this.log(`File encrypted successfully: ${outputPath}`);\n } catch (error) {\n throw new EncryptError(\n `Failed to encrypt file: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async decryptFile(\n inputPath: string,\n outputPath: string,\n options?: DecryptOptions,\n ): Promise<void> {\n try {\n this.log(`Decrypting file: ${inputPath} -> ${outputPath}`);\n\n // Read input file\n const input = await readFile(inputPath);\n\n // Decrypt buffer\n const decrypted = await this.decryptBuffer(input, options);\n\n // Write output file\n await writeFile(outputPath, decrypted);\n\n this.log(`File decrypted successfully: ${outputPath}`);\n } catch (error) {\n throw new DecryptError(\n `Failed to decrypt file: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n // =============================================================================\n // Buffer operations (must be implemented by adapters)\n // =============================================================================\n\n abstract encryptBuffer(\n buffer: Buffer,\n options?: EncryptOptions,\n ): Promise<Buffer>;\n\n abstract decryptBuffer(\n buffer: Buffer,\n options?: DecryptOptions,\n ): Promise<Buffer>;\n\n // =============================================================================\n // Stream operations (optional - not implemented by default)\n // =============================================================================\n\n encryptStream?(options?: EncryptOptions): Transform;\n\n decryptStream?(options?: DecryptOptions): Transform;\n\n // =============================================================================\n // Email operations (optional - mainly PGP)\n // =============================================================================\n\n encryptEmail?(\n message: EmailMessage,\n options?: EncryptEmailOptions,\n ): Promise<EmailMessage>;\n\n decryptEmail?(\n message: EmailMessage,\n options?: DecryptEmailOptions,\n ): Promise<DecryptedEmail>;\n\n signEmail?(\n message: EmailMessage,\n options?: SignEmailOptions,\n ): Promise<EmailMessage>;\n\n verifyEmail?(\n message: EmailMessage,\n options?: VerifyEmailOptions,\n ): Promise<VerificationResult>;\n\n // =============================================================================\n // Signing operations (optional - mainly PGP)\n // =============================================================================\n\n sign?(data: string | Buffer, options?: SignOptions): Promise<string | Buffer>;\n\n verify?(\n data: string | Buffer,\n signature: string | Buffer,\n options?: VerifyOptions,\n ): Promise<boolean>;\n\n // =============================================================================\n // Key management (must be implemented by adapters)\n // =============================================================================\n\n abstract generateKeyPair(options?: KeyPairOptions): Promise<KeyPair>;\n\n abstract importKey(\n key: string | Buffer,\n options?: ImportKeyOptions,\n ): Promise<Key>;\n\n abstract exportKey(\n key: Key,\n options?: ExportKeyOptions,\n ): Promise<string | Buffer>;\n\n // =============================================================================\n // Adapter capabilities (must be implemented by adapters)\n // =============================================================================\n\n abstract getCapabilities(): Promise<EncryptionCapabilities>;\n}\n"],"mappings":";;;;;;AAiCA,IAAsB,iBAAtB,MAA2D;CACzD;CACA;CAEA,YAAY,aAA0B,QAAQ,OAAO;EACnD,KAAK,cAAc;EACnB,KAAK,QAAQ;CACf;;;;CAKA,aAA0B;EACxB,OAAO,KAAK;CACd;;;;CAKA,IAAc,SAAiB,GAAG,MAAuB;EACvD,IAAI,KAAK,OACP,QAAQ,IAAI,IAAI,KAAK,YAAY,IAAI,WAAW,GAAG,IAAI;CAE3D;;;;CAKA,YACE,KACA,SACM;EACN,IAAI,CAAC,KACH,MAAM,IAAI,SACR,GAAG,QAAQ,wCACX,KAAK,WACP;EAGF,IAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,CAAC,CAAC,WAAW,GACnD,MAAM,IAAI,gBACR,GAAG,QAAQ,uBACX,KAAK,WACP;EAGF,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,WAAW,GACzC,MAAM,IAAI,gBACR,GAAG,QAAQ,uBACX,KAAK,WACP;EAGF,IAAI,eAAe,cAAc,IAAI,WAAW,GAC9C,MAAM,IAAI,gBACR,GAAG,QAAQ,uBACX,KAAK,WACP;CAEJ;;;;CAKA,uBAAiC,SAAgC;EAE/D,IAAI,CAAC,SAAS;EAGd,IACE,QAAQ,YACR,CAAC;GAAC;GAAU;GAAO;EAAM,CAAC,CAAC,SAAS,QAAQ,QAAQ,GAEpD,MAAM,IAAI,MACR,qBAAqB,QAAQ,SAAS,qCACxC;CAEJ;;;;CAKA,uBAAiC,SAAgC;EAE/D,IAAI,CAAC,SAAS;EAGd,IACE,QAAQ,YACR,CAAC;GAAC;GAAU;GAAO;EAAM,CAAC,CAAC,SAAS,QAAQ,QAAQ,GAEpD,MAAM,IAAI,MACR,qBAAqB,QAAQ,SAAS,qCACxC;CAEJ;;;;CAKA,eACE,QACA,WAAsC,UAC9B;EACR,OAAO,OAAO,SAAS,QAAQ;CACjC;;;;CAKA,eACE,KACA,WAAsC,UAC9B;EACR,OAAO,OAAO,KAAK,KAAK,QAAQ;CAClC;;;;CAKA,UAAoB,OAAgB,WAA0B;EAC5D,IAAI,iBAAiB,OACnB,OAAO;EAET,uBAAO,IAAI,MACT,GAAG,UAAU,aAAa,KAAK,YAAY,YAAY,OAAO,KAAK,GACrE;CACF;CAiBA,MAAM,YACJ,WACA,YACA,SACe;EACf,IAAI;GACF,KAAK,IAAI,oBAAoB,UAAU,MAAM,YAAY;GAGzD,MAAM,QAAQ,MAAM,SAAS,SAAS;GAMtC,MAAM,UAAU,YAAY,MAHJ,KAAK,cAAc,OAAO,OAAO,CAGpB;GAErC,KAAK,IAAI,gCAAgC,YAAY;EACvD,SAAS,OAAO;GACd,MAAM,IAAI,aACR,2BAA4B,MAAgB,WAC5C,KAAK,aACL,KACF;EACF;CACF;CAEA,MAAM,YACJ,WACA,YACA,SACe;EACf,IAAI;GACF,KAAK,IAAI,oBAAoB,UAAU,MAAM,YAAY;GAGzD,MAAM,QAAQ,MAAM,SAAS,SAAS;GAMtC,MAAM,UAAU,YAAY,MAHJ,KAAK,cAAc,OAAO,OAAO,CAGpB;GAErC,KAAK,IAAI,gCAAgC,YAAY;EACvD,SAAS,OAAO;GACd,MAAM,IAAI,aACR,2BAA4B,MAAgB,WAC5C,KAAK,aACL,KACF;EACF;CACF;AAiFF"}
@@ -0,0 +1,143 @@
1
+ //#region src/shared/errors.ts
2
+ /**
3
+ * Base error class for all encryption errors
4
+ */
5
+ var EncryptionError = class extends Error {
6
+ code;
7
+ adapter;
8
+ cause;
9
+ timestamp;
10
+ constructor(message, code, adapter, cause) {
11
+ super(message);
12
+ this.name = "EncryptionError";
13
+ this.code = code;
14
+ this.adapter = adapter;
15
+ this.cause = cause;
16
+ this.timestamp = /* @__PURE__ */ new Date();
17
+ if (Error.captureStackTrace) Error.captureStackTrace(this, this.constructor);
18
+ }
19
+ /**
20
+ * Convert error to JSON for logging/serialization
21
+ */
22
+ toJSON() {
23
+ return {
24
+ name: this.name,
25
+ message: this.message,
26
+ code: this.code,
27
+ adapter: this.adapter,
28
+ timestamp: this.timestamp.toISOString(),
29
+ stack: this.stack,
30
+ cause: this.cause
31
+ };
32
+ }
33
+ };
34
+ /**
35
+ * Key-related errors
36
+ */
37
+ var KeyError = class extends EncryptionError {
38
+ constructor(message, adapter, cause) {
39
+ super(message, "KEY_ERROR", adapter, cause);
40
+ this.name = "KeyError";
41
+ }
42
+ };
43
+ /**
44
+ * Invalid key format or content
45
+ */
46
+ var InvalidKeyError = class extends EncryptionError {
47
+ constructor(message, adapter, cause) {
48
+ super(message, "INVALID_KEY", adapter, cause);
49
+ this.name = "InvalidKeyError";
50
+ }
51
+ };
52
+ /**
53
+ * Key not found error
54
+ */
55
+ var KeyNotFoundError = class extends EncryptionError {
56
+ keyId;
57
+ constructor(message, keyId, adapter) {
58
+ super(message, "KEY_NOT_FOUND", adapter);
59
+ this.name = "KeyNotFoundError";
60
+ this.keyId = keyId;
61
+ }
62
+ toJSON() {
63
+ return {
64
+ ...super.toJSON(),
65
+ keyId: this.keyId
66
+ };
67
+ }
68
+ };
69
+ /**
70
+ * Passphrase-related errors
71
+ */
72
+ var PassphraseError = class extends EncryptionError {
73
+ constructor(message, adapter, cause) {
74
+ super(message, "PASSPHRASE_ERROR", adapter, cause);
75
+ this.name = "PassphraseError";
76
+ }
77
+ };
78
+ /**
79
+ * Encryption operation errors
80
+ */
81
+ var EncryptError = class extends EncryptionError {
82
+ constructor(message, adapter, cause) {
83
+ super(message, "ENCRYPT_ERROR", adapter, cause);
84
+ this.name = "EncryptError";
85
+ }
86
+ };
87
+ /**
88
+ * Decryption operation errors
89
+ */
90
+ var DecryptError = class extends EncryptionError {
91
+ constructor(message, adapter, cause) {
92
+ super(message, "DECRYPT_ERROR", adapter, cause);
93
+ this.name = "DecryptError";
94
+ }
95
+ };
96
+ /**
97
+ * Signature operation errors
98
+ */
99
+ var SignatureError = class extends EncryptionError {
100
+ constructor(message, adapter, cause) {
101
+ super(message, "SIGNATURE_ERROR", adapter, cause);
102
+ this.name = "SignatureError";
103
+ }
104
+ };
105
+ /**
106
+ * Verification operation errors
107
+ */
108
+ var VerificationError = class extends EncryptionError {
109
+ constructor(message, adapter, cause) {
110
+ super(message, "VERIFICATION_ERROR", adapter, cause);
111
+ this.name = "VerificationError";
112
+ }
113
+ };
114
+ /**
115
+ * Format-related errors
116
+ */
117
+ var FormatError = class extends EncryptionError {
118
+ constructor(message, adapter, cause) {
119
+ super(message, "FORMAT_ERROR", adapter, cause);
120
+ this.name = "FormatError";
121
+ }
122
+ };
123
+ /**
124
+ * Algorithm-related errors
125
+ */
126
+ var AlgorithmError = class extends EncryptionError {
127
+ algorithm;
128
+ constructor(message, algorithm, adapter) {
129
+ super(message, "ALGORITHM_ERROR", adapter);
130
+ this.name = "AlgorithmError";
131
+ this.algorithm = algorithm;
132
+ }
133
+ toJSON() {
134
+ return {
135
+ ...super.toJSON(),
136
+ algorithm: this.algorithm
137
+ };
138
+ }
139
+ };
140
+ //#endregion
141
+ export { FormatError as a, KeyNotFoundError as c, VerificationError as d, EncryptionError as i, PassphraseError as l, DecryptError as n, InvalidKeyError as o, EncryptError as r, KeyError as s, AlgorithmError as t, SignatureError as u };
142
+
143
+ //# sourceMappingURL=errors-Q_wX_NMz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors-Q_wX_NMz.js","names":[],"sources":["../../src/shared/errors.ts"],"sourcesContent":["/**\n * Base error class for all encryption errors\n */\nexport class EncryptionError extends Error {\n public readonly code: string;\n public readonly adapter?: string;\n public readonly cause?: unknown;\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n code: string,\n adapter?: string,\n cause?: unknown,\n ) {\n super(message);\n this.name = 'EncryptionError';\n this.code = code;\n this.adapter = adapter;\n this.cause = cause;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Convert error to JSON for logging/serialization\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n adapter: this.adapter,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause,\n };\n }\n}\n\n/**\n * Key-related errors\n */\nexport class KeyError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'KEY_ERROR', adapter, cause);\n this.name = 'KeyError';\n }\n}\n\n/**\n * Invalid key format or content\n */\nexport class InvalidKeyError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'INVALID_KEY', adapter, cause);\n this.name = 'InvalidKeyError';\n }\n}\n\n/**\n * Key not found error\n */\nexport class KeyNotFoundError extends EncryptionError {\n public readonly keyId?: string;\n\n constructor(message: string, keyId?: string, adapter?: string) {\n super(message, 'KEY_NOT_FOUND', adapter);\n this.name = 'KeyNotFoundError';\n this.keyId = keyId;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n keyId: this.keyId,\n };\n }\n}\n\n/**\n * Passphrase-related errors\n */\nexport class PassphraseError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'PASSPHRASE_ERROR', adapter, cause);\n this.name = 'PassphraseError';\n }\n}\n\n/**\n * Encryption operation errors\n */\nexport class EncryptError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'ENCRYPT_ERROR', adapter, cause);\n this.name = 'EncryptError';\n }\n}\n\n/**\n * Decryption operation errors\n */\nexport class DecryptError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'DECRYPT_ERROR', adapter, cause);\n this.name = 'DecryptError';\n }\n}\n\n/**\n * Signature operation errors\n */\nexport class SignatureError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'SIGNATURE_ERROR', adapter, cause);\n this.name = 'SignatureError';\n }\n}\n\n/**\n * Verification operation errors\n */\nexport class VerificationError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'VERIFICATION_ERROR', adapter, cause);\n this.name = 'VerificationError';\n }\n}\n\n/**\n * Format-related errors\n */\nexport class FormatError extends EncryptionError {\n constructor(message: string, adapter?: string, cause?: unknown) {\n super(message, 'FORMAT_ERROR', adapter, cause);\n this.name = 'FormatError';\n }\n}\n\n/**\n * Algorithm-related errors\n */\nexport class AlgorithmError extends EncryptionError {\n public readonly algorithm?: string;\n\n constructor(message: string, algorithm?: string, adapter?: string) {\n super(message, 'ALGORITHM_ERROR', adapter);\n this.name = 'AlgorithmError';\n this.algorithm = algorithm;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n algorithm: this.algorithm,\n };\n }\n}\n"],"mappings":";;;;AAGA,IAAa,kBAAb,cAAqC,MAAM;CACzC;CACA;CACA;CACA;CAEA,YACE,SACA,MACA,SACA,OACA;EACA,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,UAAU;EACf,KAAK,QAAQ;EACb,KAAK,4BAAY,IAAI,KAAK;EAG1B,IAAI,MAAM,mBACR,MAAM,kBAAkB,MAAM,KAAK,WAAW;CAElD;;;;CAKA,SAAkC;EAChC,OAAO;GACL,MAAM,KAAK;GACX,SAAS,KAAK;GACd,MAAM,KAAK;GACX,SAAS,KAAK;GACd,WAAW,KAAK,UAAU,YAAY;GACtC,OAAO,KAAK;GACZ,OAAO,KAAK;EACd;CACF;AACF;;;;AAKA,IAAa,WAAb,cAA8B,gBAAgB;CAC5C,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,aAAa,SAAS,KAAK;EAC1C,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,kBAAb,cAAqC,gBAAgB;CACnD,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,eAAe,SAAS,KAAK;EAC5C,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,mBAAb,cAAsC,gBAAgB;CACpD;CAEA,YAAY,SAAiB,OAAgB,SAAkB;EAC7D,MAAM,SAAS,iBAAiB,OAAO;EACvC,KAAK,OAAO;EACZ,KAAK,QAAQ;CACf;CAEA,SAA2C;EACzC,OAAO;GACL,GAAG,MAAM,OAAO;GAChB,OAAO,KAAK;EACd;CACF;AACF;;;;AAKA,IAAa,kBAAb,cAAqC,gBAAgB;CACnD,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,oBAAoB,SAAS,KAAK;EACjD,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,eAAb,cAAkC,gBAAgB;CAChD,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,iBAAiB,SAAS,KAAK;EAC9C,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,eAAb,cAAkC,gBAAgB;CAChD,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,iBAAiB,SAAS,KAAK;EAC9C,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,iBAAb,cAAoC,gBAAgB;CAClD,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,mBAAmB,SAAS,KAAK;EAChD,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,oBAAb,cAAuC,gBAAgB;CACrD,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,sBAAsB,SAAS,KAAK;EACnD,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,cAAb,cAAiC,gBAAgB;CAC/C,YAAY,SAAiB,SAAkB,OAAiB;EAC9D,MAAM,SAAS,gBAAgB,SAAS,KAAK;EAC7C,KAAK,OAAO;CACd;AACF;;;;AAKA,IAAa,iBAAb,cAAoC,gBAAgB;CAClD;CAEA,YAAY,SAAiB,WAAoB,SAAkB;EACjE,MAAM,SAAS,mBAAmB,OAAO;EACzC,KAAK,OAAO;EACZ,KAAK,YAAY;CACnB;CAEA,SAA2C;EACzC,OAAO;GACL,GAAG,MAAM,OAAO;GAChB,WAAW,KAAK;EAClB;CACF;AACF"}
@@ -1,4 +1,5 @@
1
- import { c as KeyError, d as SignatureError, i as EncryptError, r as DecryptError, s as InvalidKeyError, t as BaseEncryption } from "./base-qiu-WiZ0.js";
1
+ import { n as DecryptError, o as InvalidKeyError, r as EncryptError, s as KeyError, u as SignatureError } from "./errors-Q_wX_NMz.js";
2
+ import { t as BaseEncryption } from "./base-COUQhj5x.js";
2
3
  import nacl from "tweetnacl";
3
4
  import { decodeBase64, decodeUTF8, encodeBase64, encodeUTF8 } from "tweetnacl-util";
4
5
  //#region src/adapters/nacl.ts
@@ -331,4 +332,4 @@ var NaClEncryption = class extends BaseEncryption {
331
332
  //#endregion
332
333
  export { NaClEncryption };
333
334
 
334
- //# sourceMappingURL=nacl-BElkPprm.js.map
335
+ //# sourceMappingURL=nacl-Ct71p1KK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nacl-BElkPprm.js","names":[],"sources":["../../src/adapters/nacl.ts"],"sourcesContent":["import nacl from 'tweetnacl';\nimport {\n decodeBase64,\n decodeUTF8,\n encodeBase64,\n encodeUTF8,\n} from 'tweetnacl-util';\nimport { BaseEncryption } from '../shared/base.js';\nimport {\n DecryptError,\n EncryptError,\n InvalidKeyError,\n KeyError,\n SignatureError,\n} from '../shared/errors.js';\nimport type {\n DecryptOptions,\n EncryptionCapabilities,\n EncryptOptions,\n ExportKeyOptions,\n ImportKeyOptions,\n Key,\n KeyPair,\n KeyPairOptions,\n NaClOptions,\n SignOptions,\n VerifyOptions,\n} from '../shared/types.js';\n\n/**\n * NaCl/TweetNaCl encryption adapter\n *\n * Provides fast, modern cryptography using the NaCl library.\n * Supports both symmetric (secretbox) and asymmetric (box) encryption.\n *\n * @example\n * ```typescript\n * // Symmetric encryption\n * const nacl = new NaClEncryption({\n * type: 'nacl',\n * secretKey: secretKey\n * });\n *\n * const encrypted = await nacl.encryptText('Secret message');\n * const decrypted = await nacl.decryptText(encrypted);\n *\n * // Asymmetric encryption\n * const nacl = new NaClEncryption({\n * type: 'nacl',\n * publicKey: theirPublicKey,\n * secretKey: mySecretKey\n * });\n *\n * const encrypted = await nacl.encryptText('Secret message', {\n * recipientPublicKey: theirPublicKey\n * });\n * const decrypted = await nacl.decryptText(encrypted);\n * ```\n */\nexport class NaClEncryption extends BaseEncryption {\n private options: NaClOptions;\n private secretKey?: Uint8Array;\n private publicKey?: Uint8Array;\n\n constructor(options: NaClOptions) {\n super('nacl', options.debug);\n this.options = options;\n this.initializeKeys();\n }\n\n /**\n * Initialize keys from options\n */\n private initializeKeys(): void {\n const encoding = this.options.encoding || 'base64';\n\n // Initialize secret key for symmetric encryption\n if (this.options.secretKey) {\n this.secretKey = this.parseKey(this.options.secretKey, encoding);\n if (this.secretKey.length !== nacl.secretbox.keyLength) {\n throw new InvalidKeyError(\n `NaCl secret key must be ${nacl.secretbox.keyLength} bytes`,\n this.adapterType,\n );\n }\n }\n\n // Initialize public key for asymmetric encryption\n if (this.options.publicKey) {\n this.publicKey = this.parseKey(this.options.publicKey, encoding);\n if (this.publicKey.length !== nacl.box.publicKeyLength) {\n throw new InvalidKeyError(\n `NaCl public key must be ${nacl.box.publicKeyLength} bytes`,\n this.adapterType,\n );\n }\n }\n }\n\n /**\n * Parse key from various formats\n */\n private parseKey(\n key: Uint8Array | Buffer | string,\n encoding: 'base64' | 'hex' | 'utf8',\n ): Uint8Array {\n if (key instanceof Uint8Array) {\n return key;\n }\n\n if (Buffer.isBuffer(key)) {\n return new Uint8Array(key);\n }\n\n if (typeof key === 'string') {\n if (encoding === 'base64') {\n return decodeBase64(key);\n }\n if (encoding === 'hex') {\n return new Uint8Array(Buffer.from(key, 'hex'));\n }\n if (encoding === 'utf8') {\n return decodeUTF8(key);\n }\n }\n\n throw new InvalidKeyError('Invalid key format for NaCl', this.adapterType);\n }\n\n /**\n * Format key for output\n */\n private formatKey(\n key: Uint8Array,\n encoding: 'base64' | 'hex' | 'utf8' = 'base64',\n ): string {\n if (encoding === 'base64') {\n return encodeBase64(key);\n }\n if (encoding === 'hex') {\n return Buffer.from(key).toString('hex');\n }\n if (encoding === 'utf8') {\n return encodeUTF8(key);\n }\n return encodeBase64(key);\n }\n\n async encryptText(text: string, options?: EncryptOptions): Promise<string> {\n try {\n this.log('Encrypting text', { length: text.length });\n\n const message = decodeUTF8(text);\n\n // Check if asymmetric or symmetric encryption\n if (options?.recipientPublicKey) {\n // Asymmetric encryption (box)\n return this.encryptAsymmetric(message, options);\n }\n\n // Symmetric encryption (secretbox)\n return this.encryptSymmetric(message);\n } catch (error) {\n throw new EncryptError(\n `Failed to encrypt text: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async decryptText(\n encrypted: string,\n options?: DecryptOptions,\n ): Promise<string> {\n try {\n this.log('Decrypting text', { length: encrypted.length });\n\n // Decode the encrypted message\n const encryptedData = decodeBase64(encrypted);\n\n // Extract nonce and ciphertext\n const nonceLength = nacl.secretbox.nonceLength;\n const nonce = encryptedData.slice(0, nonceLength);\n const ciphertext = encryptedData.slice(nonceLength);\n\n let decrypted: Uint8Array | null;\n\n // Try asymmetric decryption first if we have keys\n if (this.publicKey && this.secretKey) {\n // Check if there's a public key in the message (for box)\n if (ciphertext.length > nacl.box.publicKeyLength) {\n const senderPublicKey = ciphertext.slice(0, nacl.box.publicKeyLength);\n const actualCiphertext = ciphertext.slice(nacl.box.publicKeyLength);\n\n decrypted = nacl.box.open(\n actualCiphertext,\n nonce,\n senderPublicKey,\n this.secretKey,\n );\n\n if (decrypted) {\n this.log('Text decrypted successfully (asymmetric)');\n return encodeUTF8(decrypted);\n }\n }\n }\n\n // Try symmetric decryption\n if (this.secretKey) {\n decrypted = nacl.secretbox.open(ciphertext, nonce, this.secretKey);\n\n if (decrypted) {\n this.log('Text decrypted successfully (symmetric)');\n return encodeUTF8(decrypted);\n }\n }\n\n throw new DecryptError(\n 'Decryption failed: invalid key or corrupted ciphertext',\n this.adapterType,\n );\n } catch (error) {\n if (error instanceof DecryptError) {\n throw error;\n }\n throw new DecryptError(\n `Failed to decrypt text: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async encryptBuffer(\n buffer: Buffer,\n options?: EncryptOptions,\n ): Promise<Buffer> {\n try {\n this.log('Encrypting buffer', { size: buffer.length });\n\n const message = new Uint8Array(buffer);\n\n // Check if asymmetric or symmetric encryption\n if (options?.recipientPublicKey) {\n // Asymmetric encryption (box)\n const encrypted = this.encryptAsymmetric(message, options);\n return Buffer.from(decodeBase64(encrypted));\n }\n\n // Symmetric encryption (secretbox)\n const encrypted = this.encryptSymmetric(message);\n return Buffer.from(decodeBase64(encrypted));\n } catch (error) {\n throw new EncryptError(\n `Failed to encrypt buffer: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async decryptBuffer(\n buffer: Buffer,\n options?: DecryptOptions,\n ): Promise<Buffer> {\n try {\n this.log('Decrypting buffer', { size: buffer.length });\n\n // Decode the base64 buffer\n const decoded = decodeBase64(buffer.toString('base64'));\n\n // Extract nonce and ciphertext\n const nonce = decoded.slice(0, nacl.secretbox.nonceLength);\n const ciphertext = decoded.slice(nacl.secretbox.nonceLength);\n\n let decrypted: Uint8Array | null = null;\n\n // Try asymmetric decryption first if we have keys\n if (this.publicKey && this.secretKey) {\n // Check if there's a public key in the message (for box)\n if (ciphertext.length > nacl.box.publicKeyLength) {\n const senderPublicKey = ciphertext.slice(0, nacl.box.publicKeyLength);\n const actualCiphertext = ciphertext.slice(nacl.box.publicKeyLength);\n\n decrypted = nacl.box.open(\n actualCiphertext,\n nonce,\n senderPublicKey,\n this.secretKey,\n );\n\n if (decrypted) {\n this.log('Buffer decrypted successfully (asymmetric)');\n return Buffer.from(decrypted);\n }\n }\n }\n\n // Try symmetric decryption\n if (this.secretKey) {\n decrypted = nacl.secretbox.open(ciphertext, nonce, this.secretKey);\n\n if (decrypted) {\n this.log('Buffer decrypted successfully (symmetric)');\n return Buffer.from(decrypted);\n }\n }\n\n throw new DecryptError(\n 'Decryption failed: invalid key or corrupted ciphertext',\n this.adapterType,\n );\n } catch (error) {\n if (error instanceof DecryptError) {\n throw error;\n }\n throw new DecryptError(\n `Failed to decrypt buffer: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n /**\n * Symmetric encryption using secretbox\n */\n private encryptSymmetric(message: Uint8Array): string {\n if (!this.secretKey) {\n throw new KeyError(\n 'Secret key required for symmetric encryption',\n this.adapterType,\n );\n }\n\n // Generate random nonce\n const nonce = nacl.randomBytes(nacl.secretbox.nonceLength);\n\n // Encrypt the message\n const ciphertext = nacl.secretbox(message, nonce, this.secretKey);\n\n // Combine nonce and ciphertext\n const encrypted = new Uint8Array(nonce.length + ciphertext.length);\n encrypted.set(nonce);\n encrypted.set(ciphertext, nonce.length);\n\n return encodeBase64(encrypted);\n }\n\n /**\n * Asymmetric encryption using box\n */\n private encryptAsymmetric(\n message: Uint8Array,\n options: EncryptOptions,\n ): string {\n if (!this.secretKey) {\n throw new KeyError(\n 'Secret key required for asymmetric encryption',\n this.adapterType,\n );\n }\n\n // Get recipient public key\n const recipientPublicKey = this.parseKey(\n options.recipientPublicKey as string | Uint8Array | Buffer,\n this.options.encoding || 'base64',\n );\n\n if (recipientPublicKey.length !== nacl.box.publicKeyLength) {\n throw new InvalidKeyError(\n `Recipient public key must be ${nacl.box.publicKeyLength} bytes`,\n this.adapterType,\n );\n }\n\n // Generate random nonce\n const nonce = nacl.randomBytes(nacl.box.nonceLength);\n\n // Encrypt the message\n const ciphertext = nacl.box(\n message,\n nonce,\n recipientPublicKey,\n this.secretKey,\n );\n\n // Include sender's public key in the message\n const senderPublicKey =\n this.publicKey ||\n nacl.box.keyPair.fromSecretKey(this.secretKey).publicKey;\n\n // Combine nonce, sender public key, and ciphertext\n const encrypted = new Uint8Array(\n nonce.length + senderPublicKey.length + ciphertext.length,\n );\n encrypted.set(nonce);\n encrypted.set(senderPublicKey, nonce.length);\n encrypted.set(ciphertext, nonce.length + senderPublicKey.length);\n\n return encodeBase64(encrypted);\n }\n\n async generateKeyPair(options?: KeyPairOptions): Promise<KeyPair> {\n try {\n this.log('Generating NaCl key pair', options);\n\n const keyType = options?.type || 'box';\n\n if (keyType === 'box' || keyType === 'ecdh') {\n // Generate encryption keypair\n const keypair = nacl.box.keyPair();\n\n this.log('Encryption key pair generated');\n\n return {\n publicKey: keypair.publicKey,\n privateKey: keypair.secretKey,\n };\n }\n\n if (keyType === 'ecdsa') {\n // Generate signing keypair\n const keypair = nacl.sign.keyPair();\n\n this.log('Signing key pair generated');\n\n return {\n publicKey: keypair.publicKey,\n privateKey: keypair.secretKey,\n };\n }\n\n throw new KeyError(\n `Unsupported key type for NaCl: ${keyType}. Use 'box' for encryption or 'sign' for signatures.`,\n this.adapterType,\n );\n } catch (error) {\n throw new KeyError(\n `Failed to generate NaCl key pair: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async importKey(\n key: string | Buffer,\n options?: ImportKeyOptions,\n ): Promise<Key> {\n try {\n this.log('Importing NaCl key');\n\n const encoding = this.options.encoding || 'base64';\n const keyData = typeof key === 'string' ? key : key.toString(encoding);\n const keyBytes = this.parseKey(keyData, encoding);\n\n const keyType = options?.type || 'public';\n const format = (options?.format || 'armored') as\n | 'armored'\n | 'binary'\n | 'pem'\n | 'der';\n\n // Validate key length\n const expectedLength =\n keyType === 'public'\n ? nacl.box.publicKeyLength\n : nacl.box.secretKeyLength;\n\n if (keyBytes.length !== expectedLength) {\n throw new InvalidKeyError(\n `NaCl ${keyType} key must be ${expectedLength} bytes`,\n this.adapterType,\n );\n }\n\n this.log('Key imported successfully');\n\n return {\n type: keyType as 'public' | 'private',\n format,\n data: keyData,\n algorithm: 'nacl',\n };\n } catch (error) {\n throw new InvalidKeyError(\n `Failed to import NaCl key: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async exportKey(\n key: Key,\n options?: ExportKeyOptions,\n ): Promise<string | Buffer> {\n try {\n this.log('Exporting NaCl key');\n\n const format = options?.format || key.format || 'armored';\n // Use NaCl encoding from options or default\n const encoding = this.options.encoding || 'base64';\n\n if (typeof key.data === 'string') {\n if (format === 'binary') {\n return Buffer.from(key.data, encoding);\n }\n return key.data;\n }\n\n if (Buffer.isBuffer(key.data)) {\n if (format === 'armored') {\n return key.data.toString(encoding);\n }\n return key.data;\n }\n\n if (key.data instanceof Uint8Array) {\n if (format === 'binary') {\n return Buffer.from(key.data);\n }\n return this.formatKey(key.data, encoding);\n }\n\n throw new InvalidKeyError(\n 'Invalid key data format for export',\n this.adapterType,\n );\n } catch (error) {\n throw new KeyError(\n `Failed to export NaCl key: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n /**\n * Sign data with signing key\n */\n async sign(\n data: string | Buffer,\n options?: SignOptions,\n ): Promise<string | Buffer> {\n try {\n this.log('Signing data');\n\n // Get signing key\n let signingKey: Uint8Array;\n\n if (options?.privateKey) {\n signingKey = this.parseKey(\n options.privateKey,\n this.options.encoding || 'base64',\n );\n } else if (this.secretKey) {\n signingKey = this.secretKey;\n } else {\n throw new KeyError('No signing key available', this.adapterType);\n }\n\n // Validate key length for signing\n if (signingKey.length !== nacl.sign.secretKeyLength) {\n throw new InvalidKeyError(\n `NaCl signing key must be ${nacl.sign.secretKeyLength} bytes`,\n this.adapterType,\n );\n }\n\n // Prepare message\n const message =\n typeof data === 'string' ? decodeUTF8(data) : new Uint8Array(data);\n\n // Sign the message\n const signed = nacl.sign(message, signingKey);\n\n this.log('Data signed successfully');\n\n if (typeof data === 'string') {\n return encodeBase64(signed);\n }\n\n return Buffer.from(signed);\n } catch (error) {\n throw new SignatureError(\n `Failed to sign data: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n /**\n * Verify signature\n */\n async verify(\n data: string | Buffer,\n signature: string | Buffer,\n options?: VerifyOptions,\n ): Promise<boolean> {\n try {\n this.log('Verifying signature');\n\n if (!options?.publicKey) {\n throw new KeyError(\n 'Public key required for signature verification',\n this.adapterType,\n );\n }\n\n // Get verification key\n const verificationKey = this.parseKey(\n options.publicKey,\n this.options.encoding || 'base64',\n );\n\n // Validate key length\n if (verificationKey.length !== nacl.sign.publicKeyLength) {\n throw new InvalidKeyError(\n `NaCl verification key must be ${nacl.sign.publicKeyLength} bytes`,\n this.adapterType,\n );\n }\n\n // Parse signed message\n const signedMessage =\n typeof signature === 'string'\n ? decodeBase64(signature)\n : new Uint8Array(signature);\n\n // Verify and open the signed message (extracts original message)\n const verified = nacl.sign.open(signedMessage, verificationKey);\n\n if (!verified) {\n this.log('Signature verification failed');\n return false;\n }\n\n // Compare extracted message with provided data\n const originalMessage =\n typeof data === 'string' ? decodeUTF8(data) : new Uint8Array(data);\n\n // Check if messages match\n if (verified.length !== originalMessage.length) {\n this.log('Signature verification failed: message mismatch');\n return false;\n }\n\n for (let i = 0; i < verified.length; i++) {\n if (verified[i] !== originalMessage[i]) {\n this.log('Signature verification failed: message mismatch');\n return false;\n }\n }\n\n this.log('Signature verified successfully');\n return true;\n } catch (error) {\n this.log('Signature verification failed', error);\n return false;\n }\n }\n\n async getCapabilities(): Promise<EncryptionCapabilities> {\n return {\n textEncryption: true,\n fileEncryption: true,\n bufferEncryption: true,\n streamEncryption: false,\n emailEncryption: false,\n signing: true,\n verification: true,\n keyGeneration: true,\n keyManagement: true,\n multipleRecipients: false,\n symmetricEncryption: true,\n asymmetricEncryption: true,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nacl-Ct71p1KK.js","names":[],"sources":["../../src/adapters/nacl.ts"],"sourcesContent":["import nacl from 'tweetnacl';\nimport {\n decodeBase64,\n decodeUTF8,\n encodeBase64,\n encodeUTF8,\n} from 'tweetnacl-util';\nimport { BaseEncryption } from '../shared/base.js';\nimport {\n DecryptError,\n EncryptError,\n InvalidKeyError,\n KeyError,\n SignatureError,\n} from '../shared/errors.js';\nimport type {\n DecryptOptions,\n EncryptionCapabilities,\n EncryptOptions,\n ExportKeyOptions,\n ImportKeyOptions,\n Key,\n KeyPair,\n KeyPairOptions,\n NaClOptions,\n SignOptions,\n VerifyOptions,\n} from '../shared/types.js';\n\n/**\n * NaCl/TweetNaCl encryption adapter\n *\n * Provides fast, modern cryptography using the NaCl library.\n * Supports both symmetric (secretbox) and asymmetric (box) encryption.\n *\n * @example\n * ```typescript\n * // Symmetric encryption\n * const nacl = new NaClEncryption({\n * type: 'nacl',\n * secretKey: secretKey\n * });\n *\n * const encrypted = await nacl.encryptText('Secret message');\n * const decrypted = await nacl.decryptText(encrypted);\n *\n * // Asymmetric encryption\n * const nacl = new NaClEncryption({\n * type: 'nacl',\n * publicKey: theirPublicKey,\n * secretKey: mySecretKey\n * });\n *\n * const encrypted = await nacl.encryptText('Secret message', {\n * recipientPublicKey: theirPublicKey\n * });\n * const decrypted = await nacl.decryptText(encrypted);\n * ```\n */\nexport class NaClEncryption extends BaseEncryption {\n private options: NaClOptions;\n private secretKey?: Uint8Array;\n private publicKey?: Uint8Array;\n\n constructor(options: NaClOptions) {\n super('nacl', options.debug);\n this.options = options;\n this.initializeKeys();\n }\n\n /**\n * Initialize keys from options\n */\n private initializeKeys(): void {\n const encoding = this.options.encoding || 'base64';\n\n // Initialize secret key for symmetric encryption\n if (this.options.secretKey) {\n this.secretKey = this.parseKey(this.options.secretKey, encoding);\n if (this.secretKey.length !== nacl.secretbox.keyLength) {\n throw new InvalidKeyError(\n `NaCl secret key must be ${nacl.secretbox.keyLength} bytes`,\n this.adapterType,\n );\n }\n }\n\n // Initialize public key for asymmetric encryption\n if (this.options.publicKey) {\n this.publicKey = this.parseKey(this.options.publicKey, encoding);\n if (this.publicKey.length !== nacl.box.publicKeyLength) {\n throw new InvalidKeyError(\n `NaCl public key must be ${nacl.box.publicKeyLength} bytes`,\n this.adapterType,\n );\n }\n }\n }\n\n /**\n * Parse key from various formats\n */\n private parseKey(\n key: Uint8Array | Buffer | string,\n encoding: 'base64' | 'hex' | 'utf8',\n ): Uint8Array {\n if (key instanceof Uint8Array) {\n return key;\n }\n\n if (Buffer.isBuffer(key)) {\n return new Uint8Array(key);\n }\n\n if (typeof key === 'string') {\n if (encoding === 'base64') {\n return decodeBase64(key);\n }\n if (encoding === 'hex') {\n return new Uint8Array(Buffer.from(key, 'hex'));\n }\n if (encoding === 'utf8') {\n return decodeUTF8(key);\n }\n }\n\n throw new InvalidKeyError('Invalid key format for NaCl', this.adapterType);\n }\n\n /**\n * Format key for output\n */\n private formatKey(\n key: Uint8Array,\n encoding: 'base64' | 'hex' | 'utf8' = 'base64',\n ): string {\n if (encoding === 'base64') {\n return encodeBase64(key);\n }\n if (encoding === 'hex') {\n return Buffer.from(key).toString('hex');\n }\n if (encoding === 'utf8') {\n return encodeUTF8(key);\n }\n return encodeBase64(key);\n }\n\n async encryptText(text: string, options?: EncryptOptions): Promise<string> {\n try {\n this.log('Encrypting text', { length: text.length });\n\n const message = decodeUTF8(text);\n\n // Check if asymmetric or symmetric encryption\n if (options?.recipientPublicKey) {\n // Asymmetric encryption (box)\n return this.encryptAsymmetric(message, options);\n }\n\n // Symmetric encryption (secretbox)\n return this.encryptSymmetric(message);\n } catch (error) {\n throw new EncryptError(\n `Failed to encrypt text: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async decryptText(\n encrypted: string,\n options?: DecryptOptions,\n ): Promise<string> {\n try {\n this.log('Decrypting text', { length: encrypted.length });\n\n // Decode the encrypted message\n const encryptedData = decodeBase64(encrypted);\n\n // Extract nonce and ciphertext\n const nonceLength = nacl.secretbox.nonceLength;\n const nonce = encryptedData.slice(0, nonceLength);\n const ciphertext = encryptedData.slice(nonceLength);\n\n let decrypted: Uint8Array | null;\n\n // Try asymmetric decryption first if we have keys\n if (this.publicKey && this.secretKey) {\n // Check if there's a public key in the message (for box)\n if (ciphertext.length > nacl.box.publicKeyLength) {\n const senderPublicKey = ciphertext.slice(0, nacl.box.publicKeyLength);\n const actualCiphertext = ciphertext.slice(nacl.box.publicKeyLength);\n\n decrypted = nacl.box.open(\n actualCiphertext,\n nonce,\n senderPublicKey,\n this.secretKey,\n );\n\n if (decrypted) {\n this.log('Text decrypted successfully (asymmetric)');\n return encodeUTF8(decrypted);\n }\n }\n }\n\n // Try symmetric decryption\n if (this.secretKey) {\n decrypted = nacl.secretbox.open(ciphertext, nonce, this.secretKey);\n\n if (decrypted) {\n this.log('Text decrypted successfully (symmetric)');\n return encodeUTF8(decrypted);\n }\n }\n\n throw new DecryptError(\n 'Decryption failed: invalid key or corrupted ciphertext',\n this.adapterType,\n );\n } catch (error) {\n if (error instanceof DecryptError) {\n throw error;\n }\n throw new DecryptError(\n `Failed to decrypt text: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async encryptBuffer(\n buffer: Buffer,\n options?: EncryptOptions,\n ): Promise<Buffer> {\n try {\n this.log('Encrypting buffer', { size: buffer.length });\n\n const message = new Uint8Array(buffer);\n\n // Check if asymmetric or symmetric encryption\n if (options?.recipientPublicKey) {\n // Asymmetric encryption (box)\n const encrypted = this.encryptAsymmetric(message, options);\n return Buffer.from(decodeBase64(encrypted));\n }\n\n // Symmetric encryption (secretbox)\n const encrypted = this.encryptSymmetric(message);\n return Buffer.from(decodeBase64(encrypted));\n } catch (error) {\n throw new EncryptError(\n `Failed to encrypt buffer: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async decryptBuffer(\n buffer: Buffer,\n options?: DecryptOptions,\n ): Promise<Buffer> {\n try {\n this.log('Decrypting buffer', { size: buffer.length });\n\n // Decode the base64 buffer\n const decoded = decodeBase64(buffer.toString('base64'));\n\n // Extract nonce and ciphertext\n const nonce = decoded.slice(0, nacl.secretbox.nonceLength);\n const ciphertext = decoded.slice(nacl.secretbox.nonceLength);\n\n let decrypted: Uint8Array | null = null;\n\n // Try asymmetric decryption first if we have keys\n if (this.publicKey && this.secretKey) {\n // Check if there's a public key in the message (for box)\n if (ciphertext.length > nacl.box.publicKeyLength) {\n const senderPublicKey = ciphertext.slice(0, nacl.box.publicKeyLength);\n const actualCiphertext = ciphertext.slice(nacl.box.publicKeyLength);\n\n decrypted = nacl.box.open(\n actualCiphertext,\n nonce,\n senderPublicKey,\n this.secretKey,\n );\n\n if (decrypted) {\n this.log('Buffer decrypted successfully (asymmetric)');\n return Buffer.from(decrypted);\n }\n }\n }\n\n // Try symmetric decryption\n if (this.secretKey) {\n decrypted = nacl.secretbox.open(ciphertext, nonce, this.secretKey);\n\n if (decrypted) {\n this.log('Buffer decrypted successfully (symmetric)');\n return Buffer.from(decrypted);\n }\n }\n\n throw new DecryptError(\n 'Decryption failed: invalid key or corrupted ciphertext',\n this.adapterType,\n );\n } catch (error) {\n if (error instanceof DecryptError) {\n throw error;\n }\n throw new DecryptError(\n `Failed to decrypt buffer: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n /**\n * Symmetric encryption using secretbox\n */\n private encryptSymmetric(message: Uint8Array): string {\n if (!this.secretKey) {\n throw new KeyError(\n 'Secret key required for symmetric encryption',\n this.adapterType,\n );\n }\n\n // Generate random nonce\n const nonce = nacl.randomBytes(nacl.secretbox.nonceLength);\n\n // Encrypt the message\n const ciphertext = nacl.secretbox(message, nonce, this.secretKey);\n\n // Combine nonce and ciphertext\n const encrypted = new Uint8Array(nonce.length + ciphertext.length);\n encrypted.set(nonce);\n encrypted.set(ciphertext, nonce.length);\n\n return encodeBase64(encrypted);\n }\n\n /**\n * Asymmetric encryption using box\n */\n private encryptAsymmetric(\n message: Uint8Array,\n options: EncryptOptions,\n ): string {\n if (!this.secretKey) {\n throw new KeyError(\n 'Secret key required for asymmetric encryption',\n this.adapterType,\n );\n }\n\n // Get recipient public key\n const recipientPublicKey = this.parseKey(\n options.recipientPublicKey as string | Uint8Array | Buffer,\n this.options.encoding || 'base64',\n );\n\n if (recipientPublicKey.length !== nacl.box.publicKeyLength) {\n throw new InvalidKeyError(\n `Recipient public key must be ${nacl.box.publicKeyLength} bytes`,\n this.adapterType,\n );\n }\n\n // Generate random nonce\n const nonce = nacl.randomBytes(nacl.box.nonceLength);\n\n // Encrypt the message\n const ciphertext = nacl.box(\n message,\n nonce,\n recipientPublicKey,\n this.secretKey,\n );\n\n // Include sender's public key in the message\n const senderPublicKey =\n this.publicKey ||\n nacl.box.keyPair.fromSecretKey(this.secretKey).publicKey;\n\n // Combine nonce, sender public key, and ciphertext\n const encrypted = new Uint8Array(\n nonce.length + senderPublicKey.length + ciphertext.length,\n );\n encrypted.set(nonce);\n encrypted.set(senderPublicKey, nonce.length);\n encrypted.set(ciphertext, nonce.length + senderPublicKey.length);\n\n return encodeBase64(encrypted);\n }\n\n async generateKeyPair(options?: KeyPairOptions): Promise<KeyPair> {\n try {\n this.log('Generating NaCl key pair', options);\n\n const keyType = options?.type || 'box';\n\n if (keyType === 'box' || keyType === 'ecdh') {\n // Generate encryption keypair\n const keypair = nacl.box.keyPair();\n\n this.log('Encryption key pair generated');\n\n return {\n publicKey: keypair.publicKey,\n privateKey: keypair.secretKey,\n };\n }\n\n if (keyType === 'ecdsa') {\n // Generate signing keypair\n const keypair = nacl.sign.keyPair();\n\n this.log('Signing key pair generated');\n\n return {\n publicKey: keypair.publicKey,\n privateKey: keypair.secretKey,\n };\n }\n\n throw new KeyError(\n `Unsupported key type for NaCl: ${keyType}. Use 'box' for encryption or 'sign' for signatures.`,\n this.adapterType,\n );\n } catch (error) {\n throw new KeyError(\n `Failed to generate NaCl key pair: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async importKey(\n key: string | Buffer,\n options?: ImportKeyOptions,\n ): Promise<Key> {\n try {\n this.log('Importing NaCl key');\n\n const encoding = this.options.encoding || 'base64';\n const keyData = typeof key === 'string' ? key : key.toString(encoding);\n const keyBytes = this.parseKey(keyData, encoding);\n\n const keyType = options?.type || 'public';\n const format = (options?.format || 'armored') as\n | 'armored'\n | 'binary'\n | 'pem'\n | 'der';\n\n // Validate key length\n const expectedLength =\n keyType === 'public'\n ? nacl.box.publicKeyLength\n : nacl.box.secretKeyLength;\n\n if (keyBytes.length !== expectedLength) {\n throw new InvalidKeyError(\n `NaCl ${keyType} key must be ${expectedLength} bytes`,\n this.adapterType,\n );\n }\n\n this.log('Key imported successfully');\n\n return {\n type: keyType as 'public' | 'private',\n format,\n data: keyData,\n algorithm: 'nacl',\n };\n } catch (error) {\n throw new InvalidKeyError(\n `Failed to import NaCl key: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n async exportKey(\n key: Key,\n options?: ExportKeyOptions,\n ): Promise<string | Buffer> {\n try {\n this.log('Exporting NaCl key');\n\n const format = options?.format || key.format || 'armored';\n // Use NaCl encoding from options or default\n const encoding = this.options.encoding || 'base64';\n\n if (typeof key.data === 'string') {\n if (format === 'binary') {\n return Buffer.from(key.data, encoding);\n }\n return key.data;\n }\n\n if (Buffer.isBuffer(key.data)) {\n if (format === 'armored') {\n return key.data.toString(encoding);\n }\n return key.data;\n }\n\n if (key.data instanceof Uint8Array) {\n if (format === 'binary') {\n return Buffer.from(key.data);\n }\n return this.formatKey(key.data, encoding);\n }\n\n throw new InvalidKeyError(\n 'Invalid key data format for export',\n this.adapterType,\n );\n } catch (error) {\n throw new KeyError(\n `Failed to export NaCl key: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n /**\n * Sign data with signing key\n */\n async sign(\n data: string | Buffer,\n options?: SignOptions,\n ): Promise<string | Buffer> {\n try {\n this.log('Signing data');\n\n // Get signing key\n let signingKey: Uint8Array;\n\n if (options?.privateKey) {\n signingKey = this.parseKey(\n options.privateKey,\n this.options.encoding || 'base64',\n );\n } else if (this.secretKey) {\n signingKey = this.secretKey;\n } else {\n throw new KeyError('No signing key available', this.adapterType);\n }\n\n // Validate key length for signing\n if (signingKey.length !== nacl.sign.secretKeyLength) {\n throw new InvalidKeyError(\n `NaCl signing key must be ${nacl.sign.secretKeyLength} bytes`,\n this.adapterType,\n );\n }\n\n // Prepare message\n const message =\n typeof data === 'string' ? decodeUTF8(data) : new Uint8Array(data);\n\n // Sign the message\n const signed = nacl.sign(message, signingKey);\n\n this.log('Data signed successfully');\n\n if (typeof data === 'string') {\n return encodeBase64(signed);\n }\n\n return Buffer.from(signed);\n } catch (error) {\n throw new SignatureError(\n `Failed to sign data: ${(error as Error).message}`,\n this.adapterType,\n error,\n );\n }\n }\n\n /**\n * Verify signature\n */\n async verify(\n data: string | Buffer,\n signature: string | Buffer,\n options?: VerifyOptions,\n ): Promise<boolean> {\n try {\n this.log('Verifying signature');\n\n if (!options?.publicKey) {\n throw new KeyError(\n 'Public key required for signature verification',\n this.adapterType,\n );\n }\n\n // Get verification key\n const verificationKey = this.parseKey(\n options.publicKey,\n this.options.encoding || 'base64',\n );\n\n // Validate key length\n if (verificationKey.length !== nacl.sign.publicKeyLength) {\n throw new InvalidKeyError(\n `NaCl verification key must be ${nacl.sign.publicKeyLength} bytes`,\n this.adapterType,\n );\n }\n\n // Parse signed message\n const signedMessage =\n typeof signature === 'string'\n ? decodeBase64(signature)\n : new Uint8Array(signature);\n\n // Verify and open the signed message (extracts original message)\n const verified = nacl.sign.open(signedMessage, verificationKey);\n\n if (!verified) {\n this.log('Signature verification failed');\n return false;\n }\n\n // Compare extracted message with provided data\n const originalMessage =\n typeof data === 'string' ? decodeUTF8(data) : new Uint8Array(data);\n\n // Check if messages match\n if (verified.length !== originalMessage.length) {\n this.log('Signature verification failed: message mismatch');\n return false;\n }\n\n for (let i = 0; i < verified.length; i++) {\n if (verified[i] !== originalMessage[i]) {\n this.log('Signature verification failed: message mismatch');\n return false;\n }\n }\n\n this.log('Signature verified successfully');\n return true;\n } catch (error) {\n this.log('Signature verification failed', error);\n return false;\n }\n }\n\n async getCapabilities(): Promise<EncryptionCapabilities> {\n return {\n textEncryption: true,\n fileEncryption: true,\n bufferEncryption: true,\n streamEncryption: false,\n emailEncryption: false,\n signing: true,\n verification: true,\n keyGeneration: true,\n keyManagement: true,\n multipleRecipients: false,\n symmetricEncryption: true,\n asymmetricEncryption: true,\n };\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { c as KeyError, d as SignatureError, i as EncryptError, r as DecryptError, s as InvalidKeyError, t as BaseEncryption } from "./base-qiu-WiZ0.js";
1
+ import { n as DecryptError, o as InvalidKeyError, r as EncryptError, s as KeyError, u as SignatureError } from "./errors-Q_wX_NMz.js";
2
+ import { t as BaseEncryption } from "./base-COUQhj5x.js";
2
3
  import * as crypto from "node:crypto";
3
4
  //#region src/adapters/node.ts
4
5
  /**
@@ -418,4 +419,4 @@ var NodeCryptoEncryption = class extends BaseEncryption {
418
419
  //#endregion
419
420
  export { NodeCryptoEncryption };
420
421
 
421
- //# sourceMappingURL=node-Bg7R5Icq.js.map
422
+ //# sourceMappingURL=node-9IJG40yb.js.map