@pan-sec/notebooklm-mcp 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/SECURITY.md +539 -0
  4. package/dist/auth/auth-manager.d.ts +137 -0
  5. package/dist/auth/auth-manager.d.ts.map +1 -0
  6. package/dist/auth/auth-manager.js +984 -0
  7. package/dist/auth/auth-manager.js.map +1 -0
  8. package/dist/auth/mcp-auth.d.ts +102 -0
  9. package/dist/auth/mcp-auth.d.ts.map +1 -0
  10. package/dist/auth/mcp-auth.js +286 -0
  11. package/dist/auth/mcp-auth.js.map +1 -0
  12. package/dist/config.d.ts +89 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +216 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/errors.d.ts +26 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +41 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/index.d.ts +32 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +371 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/library/notebook-library.d.ts +70 -0
  25. package/dist/library/notebook-library.d.ts.map +1 -0
  26. package/dist/library/notebook-library.js +279 -0
  27. package/dist/library/notebook-library.js.map +1 -0
  28. package/dist/library/types.d.ts +67 -0
  29. package/dist/library/types.d.ts.map +1 -0
  30. package/dist/library/types.js +8 -0
  31. package/dist/library/types.js.map +1 -0
  32. package/dist/resources/resource-handlers.d.ts +22 -0
  33. package/dist/resources/resource-handlers.d.ts.map +1 -0
  34. package/dist/resources/resource-handlers.js +216 -0
  35. package/dist/resources/resource-handlers.js.map +1 -0
  36. package/dist/session/browser-session.d.ts +108 -0
  37. package/dist/session/browser-session.d.ts.map +1 -0
  38. package/dist/session/browser-session.js +621 -0
  39. package/dist/session/browser-session.js.map +1 -0
  40. package/dist/session/session-manager.d.ts +77 -0
  41. package/dist/session/session-manager.d.ts.map +1 -0
  42. package/dist/session/session-manager.js +314 -0
  43. package/dist/session/session-manager.js.map +1 -0
  44. package/dist/session/session-timeout.d.ts +122 -0
  45. package/dist/session/session-timeout.d.ts.map +1 -0
  46. package/dist/session/session-timeout.js +281 -0
  47. package/dist/session/session-timeout.js.map +1 -0
  48. package/dist/session/shared-context-manager.d.ts +107 -0
  49. package/dist/session/shared-context-manager.d.ts.map +1 -0
  50. package/dist/session/shared-context-manager.js +447 -0
  51. package/dist/session/shared-context-manager.js.map +1 -0
  52. package/dist/tools/definitions/ask-question.d.ts +8 -0
  53. package/dist/tools/definitions/ask-question.d.ts.map +1 -0
  54. package/dist/tools/definitions/ask-question.js +211 -0
  55. package/dist/tools/definitions/ask-question.js.map +1 -0
  56. package/dist/tools/definitions/notebook-management.d.ts +3 -0
  57. package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
  58. package/dist/tools/definitions/notebook-management.js +243 -0
  59. package/dist/tools/definitions/notebook-management.js.map +1 -0
  60. package/dist/tools/definitions/session-management.d.ts +3 -0
  61. package/dist/tools/definitions/session-management.d.ts.map +1 -0
  62. package/dist/tools/definitions/session-management.js +41 -0
  63. package/dist/tools/definitions/session-management.js.map +1 -0
  64. package/dist/tools/definitions/system.d.ts +3 -0
  65. package/dist/tools/definitions/system.d.ts.map +1 -0
  66. package/dist/tools/definitions/system.js +143 -0
  67. package/dist/tools/definitions/system.js.map +1 -0
  68. package/dist/tools/definitions.d.ts +12 -0
  69. package/dist/tools/definitions.d.ts.map +1 -0
  70. package/dist/tools/definitions.js +26 -0
  71. package/dist/tools/definitions.js.map +1 -0
  72. package/dist/tools/handlers.d.ts +213 -0
  73. package/dist/tools/handlers.d.ts.map +1 -0
  74. package/dist/tools/handlers.js +813 -0
  75. package/dist/tools/handlers.js.map +1 -0
  76. package/dist/tools/index.d.ts +8 -0
  77. package/dist/tools/index.d.ts.map +1 -0
  78. package/dist/tools/index.js +8 -0
  79. package/dist/tools/index.js.map +1 -0
  80. package/dist/types.d.ts +82 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +5 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/utils/audit-logger.d.ts +140 -0
  85. package/dist/utils/audit-logger.d.ts.map +1 -0
  86. package/dist/utils/audit-logger.js +361 -0
  87. package/dist/utils/audit-logger.js.map +1 -0
  88. package/dist/utils/cert-pinning.d.ts +97 -0
  89. package/dist/utils/cert-pinning.d.ts.map +1 -0
  90. package/dist/utils/cert-pinning.js +328 -0
  91. package/dist/utils/cert-pinning.js.map +1 -0
  92. package/dist/utils/cleanup-manager.d.ts +133 -0
  93. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  94. package/dist/utils/cleanup-manager.js +673 -0
  95. package/dist/utils/cleanup-manager.js.map +1 -0
  96. package/dist/utils/cli-handler.d.ts +16 -0
  97. package/dist/utils/cli-handler.d.ts.map +1 -0
  98. package/dist/utils/cli-handler.js +102 -0
  99. package/dist/utils/cli-handler.js.map +1 -0
  100. package/dist/utils/crypto.d.ts +175 -0
  101. package/dist/utils/crypto.d.ts.map +1 -0
  102. package/dist/utils/crypto.js +612 -0
  103. package/dist/utils/crypto.js.map +1 -0
  104. package/dist/utils/logger.d.ts +61 -0
  105. package/dist/utils/logger.d.ts.map +1 -0
  106. package/dist/utils/logger.js +92 -0
  107. package/dist/utils/logger.js.map +1 -0
  108. package/dist/utils/page-utils.d.ts +54 -0
  109. package/dist/utils/page-utils.d.ts.map +1 -0
  110. package/dist/utils/page-utils.js +405 -0
  111. package/dist/utils/page-utils.js.map +1 -0
  112. package/dist/utils/response-validator.d.ts +98 -0
  113. package/dist/utils/response-validator.d.ts.map +1 -0
  114. package/dist/utils/response-validator.js +352 -0
  115. package/dist/utils/response-validator.js.map +1 -0
  116. package/dist/utils/secrets-scanner.d.ts +126 -0
  117. package/dist/utils/secrets-scanner.d.ts.map +1 -0
  118. package/dist/utils/secrets-scanner.js +443 -0
  119. package/dist/utils/secrets-scanner.js.map +1 -0
  120. package/dist/utils/secure-memory.d.ts +130 -0
  121. package/dist/utils/secure-memory.d.ts.map +1 -0
  122. package/dist/utils/secure-memory.js +279 -0
  123. package/dist/utils/secure-memory.js.map +1 -0
  124. package/dist/utils/security.d.ts +83 -0
  125. package/dist/utils/security.d.ts.map +1 -0
  126. package/dist/utils/security.js +272 -0
  127. package/dist/utils/security.js.map +1 -0
  128. package/dist/utils/settings-manager.d.ts +37 -0
  129. package/dist/utils/settings-manager.d.ts.map +1 -0
  130. package/dist/utils/settings-manager.js +125 -0
  131. package/dist/utils/settings-manager.js.map +1 -0
  132. package/dist/utils/stealth-utils.d.ts +135 -0
  133. package/dist/utils/stealth-utils.d.ts.map +1 -0
  134. package/dist/utils/stealth-utils.js +398 -0
  135. package/dist/utils/stealth-utils.js.map +1 -0
  136. package/dist/utils/tool-validation.d.ts +93 -0
  137. package/dist/utils/tool-validation.d.ts.map +1 -0
  138. package/dist/utils/tool-validation.js +277 -0
  139. package/dist/utils/tool-validation.js.map +1 -0
  140. package/docs/SECURITY_IMPLEMENTATION_PLAN.md +437 -0
  141. package/docs/configuration.md +94 -0
  142. package/docs/tools.md +34 -0
  143. package/docs/troubleshooting.md +59 -0
  144. package/docs/usage-guide.md +245 -0
  145. package/package.json +82 -0
@@ -0,0 +1,612 @@
1
+ /**
2
+ * Post-Quantum Cryptographic Utilities for NotebookLM MCP Server
3
+ *
4
+ * Provides quantum-resistant encryption at rest using hybrid encryption:
5
+ * - ML-KEM-768 (Kyber) for post-quantum key encapsulation
6
+ * - ChaCha20-Poly1305 for symmetric encryption (NOT AES-GCM)
7
+ * - PBKDF2 for key derivation from passwords
8
+ * - Machine-derived keys (fallback)
9
+ *
10
+ * Why ChaCha20-Poly1305 over AES-GCM:
11
+ * - Constant-time by design (no cache timing side-channels)
12
+ * - Faster in software without hardware AES-NI
13
+ * - Simpler construction, less prone to implementation errors
14
+ * - Used by Google, Cloudflare for TLS
15
+ *
16
+ * This hybrid approach ensures:
17
+ * 1. Current security via ChaCha20-Poly1305
18
+ * 2. Future quantum resistance via ML-KEM-768
19
+ *
20
+ * Added by Pantheon Security for hardened fork.
21
+ */
22
+ import crypto from "crypto";
23
+ import fs from "fs";
24
+ import path from "path";
25
+ import os from "os";
26
+ import { ml_kem768 } from "@noble/post-quantum/ml-kem";
27
+ import { log } from "./logger.js";
28
+ import { audit } from "./audit-logger.js";
29
+ /**
30
+ * Constants
31
+ */
32
+ const ALGORITHM = "chacha20-poly1305";
33
+ const PQ_ALGORITHM = "ML-KEM-768";
34
+ const KEY_LENGTH = 32; // 256 bits
35
+ const NONCE_LENGTH = 12; // 96 bits for ChaCha20
36
+ const SALT_LENGTH = 32;
37
+ const CURRENT_VERSION = 3; // Version 3 = Post-Quantum + ChaCha20-Poly1305
38
+ const CLASSICAL_VERSION = 2; // Version 2 = ChaCha20-Poly1305 classical
39
+ // Legacy versions for migration (detected by presence of 'iv' and 'tag' fields)
40
+ // LEGACY_PQ_VERSION = 2 (old PQ with AES-GCM)
41
+ // LEGACY_CLASSICAL_VERSION = 1 (old classical with AES-GCM)
42
+ /**
43
+ * Get encryption configuration from environment
44
+ */
45
+ function getEncryptionConfig() {
46
+ return {
47
+ enabled: process.env.NLMCP_ENCRYPTION_ENABLED !== "false",
48
+ key: process.env.NLMCP_ENCRYPTION_KEY,
49
+ keyFile: process.env.NLMCP_ENCRYPTION_KEY_FILE,
50
+ useMachineKey: process.env.NLMCP_USE_MACHINE_KEY !== "false",
51
+ pbkdf2Iterations: parseInt(process.env.NLMCP_PBKDF2_ITERATIONS || "100000", 10),
52
+ usePostQuantum: process.env.NLMCP_USE_POST_QUANTUM !== "false",
53
+ };
54
+ }
55
+ /**
56
+ * Derive a key from a passphrase using PBKDF2
57
+ */
58
+ export function deriveKey(passphrase, salt, iterations = 100000) {
59
+ return crypto.pbkdf2Sync(passphrase, salt, iterations, KEY_LENGTH, "sha256");
60
+ }
61
+ /**
62
+ * Generate a machine-derived key based on hardware/OS identifiers
63
+ *
64
+ * Note: This provides obscurity, not true security. It's a fallback
65
+ * when no user key is provided.
66
+ */
67
+ export function getMachineKey() {
68
+ const components = [
69
+ os.hostname(),
70
+ os.platform(),
71
+ os.arch(),
72
+ os.cpus()[0]?.model || "unknown",
73
+ os.homedir(),
74
+ ];
75
+ // Create a deterministic key from machine components
76
+ const combined = components.join("|");
77
+ const hash = crypto.createHash("sha256").update(combined).digest("hex");
78
+ return hash;
79
+ }
80
+ /**
81
+ * Generate ML-KEM key pair for post-quantum encryption
82
+ */
83
+ export function generatePQKeyPair() {
84
+ const keys = ml_kem768.keygen();
85
+ return {
86
+ publicKey: keys.publicKey,
87
+ secretKey: keys.secretKey,
88
+ };
89
+ }
90
+ /**
91
+ * Encrypt data using hybrid post-quantum encryption
92
+ * ML-KEM-768 + ChaCha20-Poly1305
93
+ *
94
+ * Process:
95
+ * 1. Encapsulate a shared secret using recipient's public key (ML-KEM-768)
96
+ * 2. Derive ChaCha20 key from shared secret + salt
97
+ * 3. Encrypt data with ChaCha20-Poly1305 (AEAD)
98
+ */
99
+ export function encryptPQ(data, recipientPublicKey) {
100
+ // Step 1: Encapsulate a shared secret using ML-KEM
101
+ const { cipherText: encapsulatedKey, sharedSecret } = ml_kem768.encapsulate(recipientPublicKey);
102
+ // Step 2: Generate nonce and salt
103
+ const salt = crypto.randomBytes(SALT_LENGTH);
104
+ const nonce = crypto.randomBytes(NONCE_LENGTH);
105
+ // Step 3: Derive ChaCha20 key from shared secret + salt
106
+ const chachaKey = crypto.createHash("sha256")
107
+ .update(Buffer.from(sharedSecret))
108
+ .update(salt)
109
+ .digest();
110
+ // Step 4: Encrypt with ChaCha20-Poly1305
111
+ const cipher = crypto.createCipheriv(ALGORITHM, chachaKey, nonce, {
112
+ authTagLength: 16,
113
+ });
114
+ const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data, "utf-8");
115
+ const encrypted = Buffer.concat([cipher.update(dataBuffer), cipher.final()]);
116
+ const authTag = cipher.getAuthTag();
117
+ // Combine ciphertext + auth tag (standard practice for ChaCha20-Poly1305)
118
+ const ciphertextWithTag = Buffer.concat([encrypted, authTag]);
119
+ // Clear sensitive data from memory
120
+ chachaKey.fill(0);
121
+ return {
122
+ version: CURRENT_VERSION,
123
+ algorithm: ALGORITHM,
124
+ pqAlgorithm: PQ_ALGORITHM,
125
+ encapsulatedKey: Buffer.from(encapsulatedKey).toString("base64"),
126
+ nonce: nonce.toString("base64"),
127
+ salt: salt.toString("base64"),
128
+ ciphertext: ciphertextWithTag.toString("base64"),
129
+ };
130
+ }
131
+ /**
132
+ * Decrypt data using hybrid post-quantum decryption
133
+ * ML-KEM-768 + ChaCha20-Poly1305
134
+ */
135
+ export function decryptPQ(encryptedData, recipientSecretKey) {
136
+ if (encryptedData.version !== CURRENT_VERSION) {
137
+ throw new Error(`Unsupported PQ encryption version: ${encryptedData.version}`);
138
+ }
139
+ // Step 1: Decapsulate the shared secret
140
+ const encapsulatedKey = new Uint8Array(Buffer.from(encryptedData.encapsulatedKey, "base64"));
141
+ const sharedSecret = ml_kem768.decapsulate(encapsulatedKey, recipientSecretKey);
142
+ // Step 2: Derive ChaCha20 key
143
+ const salt = Buffer.from(encryptedData.salt, "base64");
144
+ const chachaKey = crypto.createHash("sha256")
145
+ .update(Buffer.from(sharedSecret))
146
+ .update(salt)
147
+ .digest();
148
+ // Step 3: Split ciphertext and auth tag
149
+ const ciphertextWithTag = Buffer.from(encryptedData.ciphertext, "base64");
150
+ const ciphertext = ciphertextWithTag.subarray(0, -16);
151
+ const authTag = ciphertextWithTag.subarray(-16);
152
+ // Step 4: Decrypt with ChaCha20-Poly1305
153
+ const nonce = Buffer.from(encryptedData.nonce, "base64");
154
+ const decipher = crypto.createDecipheriv(ALGORITHM, chachaKey, nonce, {
155
+ authTagLength: 16,
156
+ });
157
+ decipher.setAuthTag(authTag);
158
+ const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
159
+ // Clear sensitive data from memory
160
+ chachaKey.fill(0);
161
+ return decrypted;
162
+ }
163
+ /**
164
+ * Classical ChaCha20-Poly1305 encryption (fallback)
165
+ */
166
+ export function encryptClassical(data, key) {
167
+ const nonce = crypto.randomBytes(NONCE_LENGTH);
168
+ const salt = crypto.randomBytes(SALT_LENGTH);
169
+ const cipher = crypto.createCipheriv(ALGORITHM, key, nonce, {
170
+ authTagLength: 16,
171
+ });
172
+ const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data, "utf-8");
173
+ const encrypted = Buffer.concat([cipher.update(dataBuffer), cipher.final()]);
174
+ const authTag = cipher.getAuthTag();
175
+ // Combine ciphertext + auth tag
176
+ const ciphertextWithTag = Buffer.concat([encrypted, authTag]);
177
+ return {
178
+ version: CLASSICAL_VERSION,
179
+ algorithm: ALGORITHM,
180
+ nonce: nonce.toString("base64"),
181
+ salt: salt.toString("base64"),
182
+ ciphertext: ciphertextWithTag.toString("base64"),
183
+ };
184
+ }
185
+ /**
186
+ * Classical ChaCha20-Poly1305 decryption (fallback)
187
+ */
188
+ export function decryptClassical(encryptedData, key) {
189
+ if (encryptedData.version !== CLASSICAL_VERSION) {
190
+ throw new Error(`Unsupported classical encryption version: ${encryptedData.version}`);
191
+ }
192
+ const nonce = Buffer.from(encryptedData.nonce, "base64");
193
+ const ciphertextWithTag = Buffer.from(encryptedData.ciphertext, "base64");
194
+ const ciphertext = ciphertextWithTag.subarray(0, -16);
195
+ const authTag = ciphertextWithTag.subarray(-16);
196
+ const decipher = crypto.createDecipheriv(ALGORITHM, key, nonce, {
197
+ authTagLength: 16,
198
+ });
199
+ decipher.setAuthTag(authTag);
200
+ const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
201
+ return decrypted;
202
+ }
203
+ /**
204
+ * Decrypt legacy AES-GCM encrypted data (for migration)
205
+ */
206
+ function decryptLegacyAES(encryptedData, key, pqSecretKey) {
207
+ let aesKey;
208
+ // Check if this is PQ encrypted (has encapsulatedKey)
209
+ if (encryptedData.encapsulatedKey && pqSecretKey) {
210
+ const encapsulatedKey = new Uint8Array(Buffer.from(encryptedData.encapsulatedKey, "base64"));
211
+ const sharedSecret = ml_kem768.decapsulate(encapsulatedKey, pqSecretKey);
212
+ const salt = Buffer.from(encryptedData.salt, "base64");
213
+ aesKey = crypto.createHash("sha256")
214
+ .update(Buffer.from(sharedSecret))
215
+ .update(salt)
216
+ .digest();
217
+ }
218
+ else {
219
+ aesKey = key;
220
+ }
221
+ const iv = Buffer.from(encryptedData.iv, "base64");
222
+ const tag = Buffer.from(encryptedData.tag, "base64");
223
+ const ciphertext = Buffer.from(encryptedData.ciphertext, "base64");
224
+ const decipher = crypto.createDecipheriv("aes-256-gcm", aesKey, iv, {
225
+ authTagLength: 16,
226
+ });
227
+ decipher.setAuthTag(tag);
228
+ const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
229
+ // Clear key if we derived it
230
+ if (encryptedData.encapsulatedKey) {
231
+ aesKey.fill(0);
232
+ }
233
+ return decrypted;
234
+ }
235
+ /**
236
+ * Check if encrypted data is legacy AES-GCM format
237
+ */
238
+ function isLegacyFormat(data) {
239
+ return data && data.iv !== undefined && data.tag !== undefined;
240
+ }
241
+ /**
242
+ * Post-Quantum Secure Storage Class
243
+ *
244
+ * Provides encrypted file storage using hybrid post-quantum encryption
245
+ * with ChaCha20-Poly1305 (NOT AES-GCM).
246
+ */
247
+ export class SecureStorage {
248
+ config;
249
+ classicalKey = null;
250
+ pqKeyPair = null;
251
+ initialized = false;
252
+ keyStorePath;
253
+ constructor(config) {
254
+ this.config = { ...getEncryptionConfig(), ...config };
255
+ this.keyStorePath = path.join(process.env.NLMCP_CONFIG_DIR || path.join(os.homedir(), ".notebooklm-mcp"), "pq-keys.enc");
256
+ }
257
+ /**
258
+ * Initialize the secure storage (derive/load keys)
259
+ */
260
+ async initialize() {
261
+ if (this.initialized)
262
+ return;
263
+ if (!this.config.enabled) {
264
+ log.info("🔓 Encryption is disabled");
265
+ this.initialized = true;
266
+ return;
267
+ }
268
+ log.info("🔐 Initializing post-quantum secure storage (ChaCha20-Poly1305)...");
269
+ try {
270
+ // Initialize classical key for backward compatibility
271
+ await this.initializeClassicalKey();
272
+ // Initialize post-quantum keys if enabled
273
+ if (this.config.usePostQuantum) {
274
+ await this.initializePQKeys();
275
+ }
276
+ this.initialized = true;
277
+ }
278
+ catch (error) {
279
+ log.error(` ❌ Failed to initialize encryption: ${error}`);
280
+ this.config.enabled = false;
281
+ await audit.security("encryption_init_failed", "error", { error: String(error) });
282
+ }
283
+ }
284
+ /**
285
+ * Initialize classical encryption key
286
+ */
287
+ async initializeClassicalKey() {
288
+ // Priority 1: Environment variable key
289
+ if (this.config.key) {
290
+ this.classicalKey = Buffer.from(this.config.key, "base64");
291
+ if (this.classicalKey.length !== KEY_LENGTH) {
292
+ throw new Error(`Invalid key length: expected ${KEY_LENGTH} bytes, got ${this.classicalKey.length}`);
293
+ }
294
+ log.success(" ✅ Using classical key from environment");
295
+ await audit.security("encryption_init", "info", { key_source: "environment", algorithm: ALGORITHM });
296
+ return;
297
+ }
298
+ // Priority 2: Key file
299
+ if (this.config.keyFile && fs.existsSync(this.config.keyFile)) {
300
+ const keyBase64 = fs.readFileSync(this.config.keyFile, "utf-8").trim();
301
+ this.classicalKey = Buffer.from(keyBase64, "base64");
302
+ if (this.classicalKey.length !== KEY_LENGTH) {
303
+ throw new Error(`Invalid key length in file: expected ${KEY_LENGTH} bytes`);
304
+ }
305
+ log.success(" ✅ Using classical key from file");
306
+ await audit.security("encryption_init", "info", { key_source: "file", algorithm: ALGORITHM });
307
+ return;
308
+ }
309
+ // Priority 3: Machine-derived key (fallback)
310
+ if (this.config.useMachineKey) {
311
+ const machineKey = getMachineKey();
312
+ const salt = Buffer.from("notebooklm-mcp-secure-salt-v3", "utf-8");
313
+ this.classicalKey = deriveKey(machineKey, salt, this.config.pbkdf2Iterations);
314
+ log.warning(" ⚠️ Using machine-derived classical key (less secure)");
315
+ log.info(" Set NLMCP_ENCRYPTION_KEY for better security");
316
+ await audit.security("encryption_init", "warning", { key_source: "machine_derived", algorithm: ALGORITHM });
317
+ return;
318
+ }
319
+ // No key available
320
+ log.warning(" ⚠️ No classical encryption key available");
321
+ this.config.enabled = false;
322
+ await audit.security("encryption_disabled", "warning", { reason: "no_key_available" });
323
+ }
324
+ /**
325
+ * Initialize post-quantum keys
326
+ */
327
+ async initializePQKeys() {
328
+ // Try to load existing PQ keys (may be in legacy or new format)
329
+ if (fs.existsSync(this.keyStorePath) && this.classicalKey) {
330
+ try {
331
+ const content = fs.readFileSync(this.keyStorePath, "utf-8");
332
+ const encrypted = JSON.parse(content);
333
+ let decrypted;
334
+ // Check if legacy AES-GCM format
335
+ if (isLegacyFormat(encrypted)) {
336
+ log.info(" 🔄 Migrating PQ keys from AES-GCM to ChaCha20-Poly1305...");
337
+ decrypted = decryptLegacyAES(encrypted, this.classicalKey);
338
+ }
339
+ else {
340
+ decrypted = decryptClassical(encrypted, this.classicalKey);
341
+ }
342
+ const keys = JSON.parse(decrypted.toString("utf-8"));
343
+ this.pqKeyPair = {
344
+ publicKey: new Uint8Array(Buffer.from(keys.publicKey, "base64")),
345
+ secretKey: new Uint8Array(Buffer.from(keys.secretKey, "base64")),
346
+ };
347
+ // Re-save with new format if it was legacy
348
+ if (isLegacyFormat(encrypted)) {
349
+ await this.savePQKeys();
350
+ log.success(" ✅ PQ keys migrated to ChaCha20-Poly1305");
351
+ }
352
+ else {
353
+ log.success(" ✅ Loaded existing ML-KEM-768 key pair");
354
+ }
355
+ await audit.security("pq_keys_loaded", "info", { algorithm: ALGORITHM });
356
+ return;
357
+ }
358
+ catch (error) {
359
+ log.warning(` ⚠️ Failed to load PQ keys, generating new: ${error}`);
360
+ }
361
+ }
362
+ // Generate new PQ key pair
363
+ log.info(" 🔑 Generating new ML-KEM-768 key pair...");
364
+ this.pqKeyPair = generatePQKeyPair();
365
+ // Save encrypted PQ keys
366
+ await this.savePQKeys();
367
+ log.success(" ✅ Generated and saved ML-KEM-768 key pair");
368
+ await audit.security("pq_keys_generated", "info", { algorithm: ALGORITHM });
369
+ }
370
+ /**
371
+ * Save PQ keys with ChaCha20-Poly1305 encryption
372
+ */
373
+ async savePQKeys() {
374
+ if (!this.classicalKey || !this.pqKeyPair)
375
+ return;
376
+ const keysJson = JSON.stringify({
377
+ publicKey: Buffer.from(this.pqKeyPair.publicKey).toString("base64"),
378
+ secretKey: Buffer.from(this.pqKeyPair.secretKey).toString("base64"),
379
+ });
380
+ const encrypted = encryptClassical(keysJson, this.classicalKey);
381
+ const dir = path.dirname(this.keyStorePath);
382
+ if (!fs.existsSync(dir)) {
383
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
384
+ }
385
+ fs.writeFileSync(this.keyStorePath, JSON.stringify(encrypted, null, 2), {
386
+ mode: 0o600,
387
+ });
388
+ }
389
+ /**
390
+ * Save data to an encrypted file
391
+ */
392
+ async save(filePath, data) {
393
+ await this.initialize();
394
+ const dataStr = typeof data === "string" ? data : JSON.stringify(data, null, 2);
395
+ const dir = path.dirname(filePath);
396
+ // Ensure directory exists
397
+ if (!fs.existsSync(dir)) {
398
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
399
+ }
400
+ if (!this.config.enabled) {
401
+ // Save unencrypted
402
+ fs.writeFileSync(filePath, dataStr, { mode: 0o600 });
403
+ log.info(`📝 Saved (unencrypted): ${path.basename(filePath)}`);
404
+ return;
405
+ }
406
+ let encrypted;
407
+ let encryptedPath;
408
+ // Use post-quantum encryption if available
409
+ if (this.config.usePostQuantum && this.pqKeyPair) {
410
+ encrypted = encryptPQ(dataStr, this.pqKeyPair.publicKey);
411
+ encryptedPath = filePath + ".pqenc";
412
+ log.info(`🔐 Saved with ML-KEM-768 + ChaCha20-Poly1305: ${path.basename(encryptedPath)}`);
413
+ }
414
+ else if (this.classicalKey) {
415
+ encrypted = encryptClassical(dataStr, this.classicalKey);
416
+ encryptedPath = filePath + ".enc";
417
+ log.info(`🔐 Saved with ChaCha20-Poly1305: ${path.basename(encryptedPath)}`);
418
+ }
419
+ else {
420
+ // Save unencrypted as fallback
421
+ fs.writeFileSync(filePath, dataStr, { mode: 0o600 });
422
+ log.warning(`⚠️ Saved unencrypted (no keys): ${path.basename(filePath)}`);
423
+ return;
424
+ }
425
+ fs.writeFileSync(encryptedPath, JSON.stringify(encrypted, null, 2), {
426
+ mode: 0o600,
427
+ });
428
+ // Remove unencrypted and other encrypted versions if they exist
429
+ const extensions = ["", ".enc", ".pqenc"];
430
+ for (const ext of extensions) {
431
+ const oldPath = filePath + ext;
432
+ if (oldPath !== encryptedPath && fs.existsSync(oldPath)) {
433
+ fs.unlinkSync(oldPath);
434
+ }
435
+ }
436
+ }
437
+ /**
438
+ * Load data from an encrypted file
439
+ */
440
+ async load(filePath) {
441
+ await this.initialize();
442
+ // Check for PQ encrypted version first
443
+ const pqEncryptedPath = filePath + ".pqenc";
444
+ if (this.pqKeyPair && fs.existsSync(pqEncryptedPath)) {
445
+ try {
446
+ const content = fs.readFileSync(pqEncryptedPath, "utf-8");
447
+ const encrypted = JSON.parse(content);
448
+ let decrypted;
449
+ // Check if legacy AES-GCM format
450
+ if (isLegacyFormat(encrypted)) {
451
+ log.info(`🔄 Migrating ${path.basename(pqEncryptedPath)} from AES-GCM to ChaCha20-Poly1305...`);
452
+ decrypted = decryptLegacyAES(encrypted, this.classicalKey, this.pqKeyPair.secretKey);
453
+ // Re-save with new format
454
+ await this.save(filePath, decrypted.toString("utf-8"));
455
+ log.success(` ✅ Migration complete`);
456
+ }
457
+ else {
458
+ decrypted = decryptPQ(encrypted, this.pqKeyPair.secretKey);
459
+ }
460
+ log.info(`🔓 Loaded (ML-KEM-768 + ChaCha20): ${path.basename(pqEncryptedPath)}`);
461
+ return decrypted.toString("utf-8");
462
+ }
463
+ catch (error) {
464
+ log.error(`❌ Failed to decrypt ${pqEncryptedPath}: ${error}`);
465
+ await audit.security("decryption_failed", "error", {
466
+ file: pqEncryptedPath,
467
+ type: "post-quantum",
468
+ error: String(error),
469
+ });
470
+ return null;
471
+ }
472
+ }
473
+ // Check for classical encrypted version
474
+ const classicalEncryptedPath = filePath + ".enc";
475
+ if (this.classicalKey && fs.existsSync(classicalEncryptedPath)) {
476
+ try {
477
+ const content = fs.readFileSync(classicalEncryptedPath, "utf-8");
478
+ const encrypted = JSON.parse(content);
479
+ let decrypted;
480
+ // Check if legacy AES-GCM format
481
+ if (isLegacyFormat(encrypted)) {
482
+ log.info(`🔄 Migrating ${path.basename(classicalEncryptedPath)} from AES-GCM to ChaCha20-Poly1305...`);
483
+ decrypted = decryptLegacyAES(encrypted, this.classicalKey);
484
+ }
485
+ else {
486
+ decrypted = decryptClassical(encrypted, this.classicalKey);
487
+ }
488
+ log.info(`🔓 Loaded (ChaCha20-Poly1305): ${path.basename(classicalEncryptedPath)}`);
489
+ // Migrate to PQ encryption if enabled
490
+ if (this.config.usePostQuantum && this.pqKeyPair) {
491
+ log.info(`🔄 Upgrading ${path.basename(filePath)} to post-quantum encryption`);
492
+ await this.save(filePath, decrypted.toString("utf-8"));
493
+ }
494
+ else if (isLegacyFormat(encrypted)) {
495
+ // Re-save with ChaCha20-Poly1305 if it was legacy AES
496
+ await this.save(filePath, decrypted.toString("utf-8"));
497
+ log.success(` ✅ Migration complete`);
498
+ }
499
+ return decrypted.toString("utf-8");
500
+ }
501
+ catch (error) {
502
+ log.error(`❌ Failed to decrypt ${classicalEncryptedPath}: ${error}`);
503
+ await audit.security("decryption_failed", "error", {
504
+ file: classicalEncryptedPath,
505
+ type: "classical",
506
+ error: String(error),
507
+ });
508
+ return null;
509
+ }
510
+ }
511
+ // Fall back to unencrypted version
512
+ if (fs.existsSync(filePath)) {
513
+ const content = fs.readFileSync(filePath, "utf-8");
514
+ log.info(`📝 Loaded (unencrypted): ${path.basename(filePath)}`);
515
+ // Migrate to encrypted storage if enabled
516
+ if (this.config.enabled && (this.pqKeyPair || this.classicalKey)) {
517
+ log.info(`🔄 Encrypting ${path.basename(filePath)} with ChaCha20-Poly1305`);
518
+ await this.save(filePath, content);
519
+ }
520
+ return content;
521
+ }
522
+ return null;
523
+ }
524
+ /**
525
+ * Load JSON data from an encrypted file
526
+ */
527
+ async loadJSON(filePath) {
528
+ const content = await this.load(filePath);
529
+ if (!content)
530
+ return null;
531
+ try {
532
+ return JSON.parse(content);
533
+ }
534
+ catch (error) {
535
+ log.error(`❌ Failed to parse JSON from ${filePath}: ${error}`);
536
+ return null;
537
+ }
538
+ }
539
+ /**
540
+ * Delete an encrypted file
541
+ */
542
+ async delete(filePath) {
543
+ let deleted = false;
544
+ const extensions = ["", ".enc", ".pqenc"];
545
+ for (const ext of extensions) {
546
+ const fullPath = filePath + ext;
547
+ if (fs.existsSync(fullPath)) {
548
+ fs.unlinkSync(fullPath);
549
+ deleted = true;
550
+ }
551
+ }
552
+ return deleted;
553
+ }
554
+ /**
555
+ * Check if a file exists (any encrypted or unencrypted version)
556
+ */
557
+ exists(filePath) {
558
+ return (fs.existsSync(filePath) ||
559
+ fs.existsSync(filePath + ".enc") ||
560
+ fs.existsSync(filePath + ".pqenc"));
561
+ }
562
+ /**
563
+ * Get encryption status
564
+ */
565
+ getStatus() {
566
+ let classicalKeySource = "none";
567
+ if (this.config.enabled && this.classicalKey) {
568
+ if (this.config.key)
569
+ classicalKeySource = "environment";
570
+ else if (this.config.keyFile)
571
+ classicalKeySource = "file";
572
+ else
573
+ classicalKeySource = "machine_derived";
574
+ }
575
+ return {
576
+ enabled: this.config.enabled,
577
+ classicalKeySource,
578
+ postQuantumEnabled: this.config.usePostQuantum && this.pqKeyPair !== null,
579
+ algorithm: ALGORITHM,
580
+ pqAlgorithm: this.pqKeyPair ? PQ_ALGORITHM : null,
581
+ };
582
+ }
583
+ /**
584
+ * Generate a new random encryption key (classical)
585
+ */
586
+ static generateKey() {
587
+ const key = crypto.randomBytes(KEY_LENGTH);
588
+ return key.toString("base64");
589
+ }
590
+ /**
591
+ * Export public key for sharing (e.g., for external encryption)
592
+ */
593
+ getPublicKey() {
594
+ if (!this.pqKeyPair)
595
+ return null;
596
+ return Buffer.from(this.pqKeyPair.publicKey).toString("base64");
597
+ }
598
+ }
599
+ /**
600
+ * Global secure storage instance
601
+ */
602
+ let globalSecureStorage = null;
603
+ /**
604
+ * Get or create the global secure storage
605
+ */
606
+ export function getSecureStorage() {
607
+ if (!globalSecureStorage) {
608
+ globalSecureStorage = new SecureStorage();
609
+ }
610
+ return globalSecureStorage;
611
+ }
612
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}