mobilecoder-mcp 2.0.1 → 2.1.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.
package/dist/agent.d.ts CHANGED
@@ -3,16 +3,27 @@ export declare class ZKRelayAgent {
3
3
  private ptyProcess;
4
4
  private secretCode;
5
5
  private roomId;
6
- private encryptionKey;
6
+ private masterKey;
7
+ private sessionKey;
8
+ private sessionCounter;
9
+ private seenNonces;
10
+ private nonceCleanupInterval;
11
+ private keyRotationInterval;
7
12
  private spinner;
8
13
  constructor();
9
14
  private setupSecurity;
15
+ private deriveSessionKey;
16
+ private rotateKey;
17
+ private startSecurityMaintenance;
10
18
  private initPTY;
11
19
  private connectToRelay;
20
+ private encrypt;
21
+ private decrypt;
12
22
  private handleIncomingMessage;
13
23
  private handleToolCall;
14
24
  private sendSecurePayload;
15
25
  private sendEnvInfo;
16
26
  private printBanner;
27
+ destroy(): void;
17
28
  }
18
29
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAaA,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAwC;;IASvD,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,cAAc;IAwCtB,OAAO,CAAC,qBAAqB;YAwDf,cAAc;IAyC5B,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;CAYtB"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAoBA,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,oBAAoB,CAA+B;IAC3D,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,OAAO,CAAC,OAAO,CAAwC;;IAUvD,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,cAAc;IAwCtB,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,OAAO;IAyBf,OAAO,CAAC,qBAAqB;YAyEf,cAAc;IAyC5B,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;IAeZ,OAAO;CAMjB"}
package/dist/agent.js CHANGED
@@ -1,34 +1,72 @@
1
1
  import { io } from 'socket.io-client';
2
2
  import * as os from 'os';
3
3
  import * as pty from 'node-pty';
4
- import CryptoJS from 'crypto-js';
4
+ import * as crypto from 'crypto';
5
5
  import chalk from 'chalk';
6
6
  import ora from 'ora';
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
9
  // 🚨 BURAYI KENDİ DOMAIN ADRESİNLE DEĞİŞTİR!
10
10
  const RELAY_SERVER_URL = 'https://api.mobilecoder.xyz';
11
+ // Security Constants
12
+ const PBKDF2_ITERATIONS = 100000;
13
+ const KEY_LENGTH = 32; // 256 bits
14
+ const SALT = 'mobilecoder-salt-v2';
15
+ const KEY_ROTATION_INTERVAL = 600000; // 10 minutes
16
+ const MESSAGE_MAX_AGE = 300000; // 5 minutes
11
17
  export class ZKRelayAgent {
12
18
  socket;
13
19
  ptyProcess;
14
20
  secretCode;
15
21
  roomId;
16
- encryptionKey;
22
+ // 🔐 Güçlendirilmiş Güvenlik Değişkenleri
23
+ masterKey;
24
+ sessionKey;
25
+ sessionCounter = 0;
26
+ seenNonces = new Set();
27
+ nonceCleanupInterval = null;
28
+ keyRotationInterval = null;
17
29
  spinner = ora('Initializing Secure Tunnel...');
18
30
  constructor() {
19
31
  this.setupSecurity();
20
32
  this.initPTY();
21
33
  this.connectToRelay();
34
+ this.startSecurityMaintenance();
22
35
  }
23
- // 1. Güvenlik Katmanı: Kod Üret ve Anahtar Türet
36
+ // 1. Güvenlik Katmanı: PBKDF2 ile Güçlendirilmiş Anahtar Türetme
24
37
  setupSecurity() {
25
38
  // 6 Haneli rastgele kod (Kullanıcının göreceği)
26
39
  const randomNum = Math.floor(100000 + Math.random() * 900000);
27
40
  this.secretCode = randomNum.toString();
28
41
  // Oda ID'si: Kodun Hash'i (Sunucu sadece bunu görür, kodu göremez)
29
- this.roomId = CryptoJS.SHA256(this.secretCode).toString();
30
- // Şifreleme Anahtarı: Kodun kendisi (AES-256 için kullanılacak)
31
- this.encryptionKey = this.secretCode;
42
+ this.roomId = crypto.createHash('sha256').update(this.secretCode).digest('hex');
43
+ // 🔐 PBKDF2 ile Master Key Türetme (Brute-force'a karşı savunma)
44
+ this.masterKey = crypto.pbkdf2Sync(this.secretCode, SALT, PBKDF2_ITERATIONS, KEY_LENGTH, 'sha256');
45
+ // Session Key (PFS için rotasyonlu)
46
+ this.sessionKey = this.deriveSessionKey(0);
47
+ }
48
+ // 🔐 Session Key Türetme (Perfect Forward Secrecy)
49
+ deriveSessionKey(counter) {
50
+ return crypto.pbkdf2Sync(this.masterKey, `session-${counter}`, 10000, KEY_LENGTH, 'sha256');
51
+ }
52
+ // 🔄 Key Rotation (Her 10 dakikada bir)
53
+ rotateKey() {
54
+ this.sessionCounter++;
55
+ this.sessionKey = this.deriveSessionKey(this.sessionCounter);
56
+ console.log(chalk.cyan(`🔄 Session key rotated to #${this.sessionCounter}`));
57
+ // Notify peer about key rotation
58
+ this.sendSecurePayload('key_rotation', { counter: this.sessionCounter });
59
+ }
60
+ // 🧹 Güvenlik Bakımı
61
+ startSecurityMaintenance() {
62
+ // Nonce temizliği (5 dakikadan eski nonce'ları sil)
63
+ this.nonceCleanupInterval = setInterval(() => {
64
+ this.seenNonces.clear();
65
+ }, MESSAGE_MAX_AGE);
66
+ // Key rotation
67
+ this.keyRotationInterval = setInterval(() => {
68
+ this.rotateKey();
69
+ }, KEY_ROTATION_INTERVAL);
32
70
  }
33
71
  // 2. Terminal (PTY) Başlatma
34
72
  initPTY() {
@@ -76,21 +114,67 @@ export class ZKRelayAgent {
76
114
  // console.error(err);
77
115
  });
78
116
  }
117
+ // 🔐 AES-256-CBC ile Şifreleme (Nonce tabanlı)
118
+ encrypt(data) {
119
+ const nonce = crypto.randomBytes(16);
120
+ const cipher = crypto.createCipheriv('aes-256-cbc', this.sessionKey, nonce);
121
+ const encrypted = Buffer.concat([
122
+ cipher.update(data, 'utf8'),
123
+ cipher.final()
124
+ ]);
125
+ return {
126
+ nonce: nonce.toString('base64'),
127
+ data: encrypted.toString('base64'),
128
+ timestamp: Date.now()
129
+ };
130
+ }
131
+ // 🔐 AES-256-CBC ile Şifre Çözme (Replay Attack Korumalı)
132
+ decrypt(packet) {
133
+ // Timestamp kontrolü (5 dakikadan eski mesajları reddet)
134
+ if (Date.now() - packet.timestamp > MESSAGE_MAX_AGE) {
135
+ throw new Error('Message too old - potential replay attack');
136
+ }
137
+ // Nonce uniqueness kontrolü (Replay attack önleme)
138
+ if (this.seenNonces.has(packet.nonce)) {
139
+ throw new Error('Replay attack detected - duplicate nonce');
140
+ }
141
+ this.seenNonces.add(packet.nonce);
142
+ const decipher = crypto.createDecipheriv('aes-256-cbc', this.sessionKey, Buffer.from(packet.nonce, 'base64'));
143
+ return Buffer.concat([
144
+ decipher.update(Buffer.from(packet.data, 'base64')),
145
+ decipher.final()
146
+ ]).toString('utf8');
147
+ }
79
148
  // Gelen veriyi çöz ve işle
80
149
  handleIncomingMessage(encryptedPayload) {
81
150
  try {
82
- // Payload might be wrapped { e: ... } or string
83
- let ciphertext = encryptedPayload;
84
- if (typeof encryptedPayload === 'object' && encryptedPayload.e) {
85
- ciphertext = encryptedPayload.e;
151
+ let decryptedText;
152
+ // Yeni format: { nonce, data, timestamp }
153
+ if (typeof encryptedPayload === 'object' && encryptedPayload.nonce) {
154
+ decryptedText = this.decrypt(encryptedPayload);
86
155
  }
87
- const bytes = CryptoJS.AES.decrypt(ciphertext, this.encryptionKey);
88
- const originalText = bytes.toString(CryptoJS.enc.Utf8);
89
- if (!originalText)
156
+ // Legacy format: { e: ciphertext } (CryptoJS uyumluluğu)
157
+ else if (typeof encryptedPayload === 'object' && encryptedPayload.e) {
158
+ // Legacy CryptoJS decrypt fallback
159
+ const CryptoJS = require('crypto-js');
160
+ const bytes = CryptoJS.AES.decrypt(encryptedPayload.e, this.secretCode);
161
+ decryptedText = bytes.toString(CryptoJS.enc.Utf8);
162
+ }
163
+ else {
164
+ return;
165
+ }
166
+ if (!decryptedText)
90
167
  return;
91
168
  // Veri JSON mu? (Resize komutu vs olabilir)
92
169
  try {
93
- const cmd = JSON.parse(originalText);
170
+ const cmd = JSON.parse(decryptedText);
171
+ // Handle key rotation from peer
172
+ if (cmd.type === 'key_rotation') {
173
+ this.sessionCounter = cmd.counter;
174
+ this.sessionKey = this.deriveSessionKey(this.sessionCounter);
175
+ console.log(chalk.cyan(`🔄 Key synced to session #${this.sessionCounter}`));
176
+ return;
177
+ }
94
178
  // 1. Terminal Input (Keystrokes)
95
179
  if (cmd.type === 'input') {
96
180
  this.ptyProcess.write(cmd.data);
@@ -119,11 +203,12 @@ export class ZKRelayAgent {
119
203
  }
120
204
  catch (e) {
121
205
  // JSON değilse saf terminal girdisidir
122
- this.ptyProcess.write(originalText);
206
+ this.ptyProcess.write(decryptedText);
123
207
  }
124
208
  }
125
209
  catch (error) {
126
210
  // Şifre çözülemezse (Yanlış anahtar vb.) sessizce yut
211
+ console.error(chalk.red('Decryption failed:'), error.message);
127
212
  }
128
213
  }
129
214
  async handleToolCall(tool, args, id) {
@@ -163,13 +248,9 @@ export class ZKRelayAgent {
163
248
  // Veriyi şifrele ve gönder
164
249
  sendSecurePayload(type, data) {
165
250
  let payloadStr = '';
166
- if (type === 'meta' || type === 'tool_result') {
251
+ if (type === 'meta' || type === 'tool_result' || type === 'key_rotation') {
167
252
  // Standardize format
168
- // For tool_result, data already contains id/result/error
169
- // We wrap it in the top level object structure expected by client
170
- // Client expects: { type: 'result', id: ..., result: ... } OR { type: 'error', id: ..., error: ... }
171
253
  if (type === 'tool_result') {
172
- // data is { id, result } or { id, error, type: 'error' }
173
254
  if (data.type === 'error') {
174
255
  payloadStr = JSON.stringify({ ...data });
175
256
  }
@@ -177,6 +258,9 @@ export class ZKRelayAgent {
177
258
  payloadStr = JSON.stringify({ type: 'result', ...data });
178
259
  }
179
260
  }
261
+ else if (type === 'key_rotation') {
262
+ payloadStr = JSON.stringify({ type: 'key_rotation', ...data });
263
+ }
180
264
  else {
181
265
  payloadStr = JSON.stringify(data);
182
266
  }
@@ -193,10 +277,11 @@ export class ZKRelayAgent {
193
277
  // Fallback if empty (shouldn't happen with above logic)
194
278
  if (!payloadStr)
195
279
  payloadStr = JSON.stringify(data);
196
- const encrypted = CryptoJS.AES.encrypt(payloadStr, this.encryptionKey).toString();
280
+ // 🔐 Yeni şifreleme formatı ile gönder
281
+ const encrypted = this.encrypt(payloadStr);
197
282
  this.socket.emit('relay_data', {
198
283
  room: this.roomId,
199
- payload: { e: encrypted }
284
+ payload: encrypted
200
285
  });
201
286
  }
202
287
  sendEnvInfo() {
@@ -210,8 +295,9 @@ export class ZKRelayAgent {
210
295
  this.sendSecurePayload('meta', info);
211
296
  }
212
297
  printBanner() {
213
- console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0.1 '));
214
- console.log(chalk.gray('Secure, End-to-End Encrypted Terminal Bridge\n'));
298
+ console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.1.0 '));
299
+ console.log(chalk.gray('🔐 PBKDF2-SHA256 + AES-256-CBC + Nonce-Based Replay Protection'));
300
+ console.log(chalk.gray('🔄 Perfect Forward Secrecy with 10-min Key Rotation\n'));
215
301
  console.log(chalk.yellow('┌──────────────────────────────────────┐'));
216
302
  console.log(chalk.yellow('│ 🔑 CONNECTION CODE (ENTER ON APP) │'));
217
303
  console.log(chalk.yellow('│ │'));
@@ -220,5 +306,16 @@ export class ZKRelayAgent {
220
306
  console.log(chalk.yellow('└──────────────────────────────────────┘'));
221
307
  console.log(chalk.cyan('\nWaiting for mobile connection...'));
222
308
  }
309
+ // Cleanup
310
+ destroy() {
311
+ if (this.nonceCleanupInterval)
312
+ clearInterval(this.nonceCleanupInterval);
313
+ if (this.keyRotationInterval)
314
+ clearInterval(this.keyRotationInterval);
315
+ if (this.socket)
316
+ this.socket.disconnect();
317
+ if (this.ptyProcess)
318
+ this.ptyProcess.kill();
319
+ }
223
320
  }
224
321
  //# sourceMappingURL=agent.js.map
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobilecoder-mcp",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Secure Zero-Knowledge Terminal Relay for MobileCoder",
5
5
  "main": "dist/agent.js",
6
6
  "bin": {
package/src/agent.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import { io, Socket } from 'socket.io-client';
3
3
  import * as os from 'os';
4
4
  import * as pty from 'node-pty';
5
- import CryptoJS from 'crypto-js';
5
+ import * as crypto from 'crypto';
6
6
  import chalk from 'chalk';
7
7
  import ora from 'ora';
8
8
  import * as fs from 'fs';
@@ -11,31 +11,90 @@ import * as path from 'path';
11
11
  // 🚨 BURAYI KENDİ DOMAIN ADRESİNLE DEĞİŞTİR!
12
12
  const RELAY_SERVER_URL = 'https://api.mobilecoder.xyz';
13
13
 
14
+ // Security Constants
15
+ const PBKDF2_ITERATIONS = 100000;
16
+ const KEY_LENGTH = 32; // 256 bits
17
+ const SALT = 'mobilecoder-salt-v2';
18
+ const KEY_ROTATION_INTERVAL = 600000; // 10 minutes
19
+ const MESSAGE_MAX_AGE = 300000; // 5 minutes
20
+
14
21
  export class ZKRelayAgent {
15
22
  private socket: Socket;
16
23
  private ptyProcess: any;
17
24
  private secretCode: string;
18
25
  private roomId: string;
19
- private encryptionKey: string;
26
+
27
+ // 🔐 Güçlendirilmiş Güvenlik Değişkenleri
28
+ private masterKey: Buffer;
29
+ private sessionKey: Buffer;
30
+ private sessionCounter: number = 0;
31
+ private seenNonces: Set<string> = new Set();
32
+ private nonceCleanupInterval: NodeJS.Timeout | null = null;
33
+ private keyRotationInterval: NodeJS.Timeout | null = null;
34
+
20
35
  private spinner = ora('Initializing Secure Tunnel...');
21
36
 
22
37
  constructor() {
23
38
  this.setupSecurity();
24
39
  this.initPTY();
25
40
  this.connectToRelay();
41
+ this.startSecurityMaintenance();
26
42
  }
27
43
 
28
- // 1. Güvenlik Katmanı: Kod Üret ve Anahtar Türet
44
+ // 1. Güvenlik Katmanı: PBKDF2 ile Güçlendirilmiş Anahtar Türetme
29
45
  private setupSecurity() {
30
46
  // 6 Haneli rastgele kod (Kullanıcının göreceği)
31
47
  const randomNum = Math.floor(100000 + Math.random() * 900000);
32
48
  this.secretCode = randomNum.toString();
33
49
 
34
50
  // Oda ID'si: Kodun Hash'i (Sunucu sadece bunu görür, kodu göremez)
35
- this.roomId = CryptoJS.SHA256(this.secretCode).toString();
51
+ this.roomId = crypto.createHash('sha256').update(this.secretCode).digest('hex');
52
+
53
+ // 🔐 PBKDF2 ile Master Key Türetme (Brute-force'a karşı savunma)
54
+ this.masterKey = crypto.pbkdf2Sync(
55
+ this.secretCode,
56
+ SALT,
57
+ PBKDF2_ITERATIONS,
58
+ KEY_LENGTH,
59
+ 'sha256'
60
+ );
61
+
62
+ // Session Key (PFS için rotasyonlu)
63
+ this.sessionKey = this.deriveSessionKey(0);
64
+ }
36
65
 
37
- // Şifreleme Anahtarı: Kodun kendisi (AES-256 için kullanılacak)
38
- this.encryptionKey = this.secretCode;
66
+ // 🔐 Session Key Türetme (Perfect Forward Secrecy)
67
+ private deriveSessionKey(counter: number): Buffer {
68
+ return crypto.pbkdf2Sync(
69
+ this.masterKey,
70
+ `session-${counter}`,
71
+ 10000,
72
+ KEY_LENGTH,
73
+ 'sha256'
74
+ );
75
+ }
76
+
77
+ // 🔄 Key Rotation (Her 10 dakikada bir)
78
+ private rotateKey() {
79
+ this.sessionCounter++;
80
+ this.sessionKey = this.deriveSessionKey(this.sessionCounter);
81
+ console.log(chalk.cyan(`🔄 Session key rotated to #${this.sessionCounter}`));
82
+
83
+ // Notify peer about key rotation
84
+ this.sendSecurePayload('key_rotation', { counter: this.sessionCounter });
85
+ }
86
+
87
+ // 🧹 Güvenlik Bakımı
88
+ private startSecurityMaintenance() {
89
+ // Nonce temizliği (5 dakikadan eski nonce'ları sil)
90
+ this.nonceCleanupInterval = setInterval(() => {
91
+ this.seenNonces.clear();
92
+ }, MESSAGE_MAX_AGE);
93
+
94
+ // Key rotation
95
+ this.keyRotationInterval = setInterval(() => {
96
+ this.rotateKey();
97
+ }, KEY_ROTATION_INTERVAL);
39
98
  }
40
99
 
41
100
  // 2. Terminal (PTY) Başlatma
@@ -96,23 +155,81 @@ export class ZKRelayAgent {
96
155
  });
97
156
  }
98
157
 
158
+ // 🔐 AES-256-CBC ile Şifreleme (Nonce tabanlı)
159
+ private encrypt(data: string): { nonce: string; data: string; timestamp: number } {
160
+ const nonce = crypto.randomBytes(16);
161
+ const cipher = crypto.createCipheriv('aes-256-cbc', this.sessionKey, nonce);
162
+
163
+ const encrypted = Buffer.concat([
164
+ cipher.update(data, 'utf8'),
165
+ cipher.final()
166
+ ]);
167
+
168
+ return {
169
+ nonce: nonce.toString('base64'),
170
+ data: encrypted.toString('base64'),
171
+ timestamp: Date.now()
172
+ };
173
+ }
174
+
175
+ // 🔐 AES-256-CBC ile Şifre Çözme (Replay Attack Korumalı)
176
+ private decrypt(packet: { nonce: string; data: string; timestamp: number }): string {
177
+ // Timestamp kontrolü (5 dakikadan eski mesajları reddet)
178
+ if (Date.now() - packet.timestamp > MESSAGE_MAX_AGE) {
179
+ throw new Error('Message too old - potential replay attack');
180
+ }
181
+
182
+ // Nonce uniqueness kontrolü (Replay attack önleme)
183
+ if (this.seenNonces.has(packet.nonce)) {
184
+ throw new Error('Replay attack detected - duplicate nonce');
185
+ }
186
+ this.seenNonces.add(packet.nonce);
187
+
188
+ const decipher = crypto.createDecipheriv(
189
+ 'aes-256-cbc',
190
+ this.sessionKey,
191
+ Buffer.from(packet.nonce, 'base64')
192
+ );
193
+
194
+ return Buffer.concat([
195
+ decipher.update(Buffer.from(packet.data, 'base64')),
196
+ decipher.final()
197
+ ]).toString('utf8');
198
+ }
199
+
99
200
  // Gelen veriyi çöz ve işle
100
201
  private handleIncomingMessage(encryptedPayload: any) {
101
202
  try {
102
- // Payload might be wrapped { e: ... } or string
103
- let ciphertext = encryptedPayload;
104
- if (typeof encryptedPayload === 'object' && encryptedPayload.e) {
105
- ciphertext = encryptedPayload.e;
106
- }
203
+ let decryptedText: string;
107
204
 
108
- const bytes = CryptoJS.AES.decrypt(ciphertext, this.encryptionKey);
109
- const originalText = bytes.toString(CryptoJS.enc.Utf8);
205
+ // Yeni format: { nonce, data, timestamp }
206
+ if (typeof encryptedPayload === 'object' && encryptedPayload.nonce) {
207
+ decryptedText = this.decrypt(encryptedPayload);
208
+ }
209
+ // Legacy format: { e: ciphertext } (CryptoJS uyumluluğu)
210
+ else if (typeof encryptedPayload === 'object' && encryptedPayload.e) {
211
+ // Legacy CryptoJS decrypt fallback
212
+ const CryptoJS = require('crypto-js');
213
+ const bytes = CryptoJS.AES.decrypt(encryptedPayload.e, this.secretCode);
214
+ decryptedText = bytes.toString(CryptoJS.enc.Utf8);
215
+ }
216
+ else {
217
+ return;
218
+ }
110
219
 
111
- if (!originalText) return;
220
+ if (!decryptedText) return;
112
221
 
113
222
  // Veri JSON mu? (Resize komutu vs olabilir)
114
223
  try {
115
- const cmd = JSON.parse(originalText);
224
+ const cmd = JSON.parse(decryptedText);
225
+
226
+ // Handle key rotation from peer
227
+ if (cmd.type === 'key_rotation') {
228
+ this.sessionCounter = cmd.counter;
229
+ this.sessionKey = this.deriveSessionKey(this.sessionCounter);
230
+ console.log(chalk.cyan(`🔄 Key synced to session #${this.sessionCounter}`));
231
+ return;
232
+ }
116
233
 
117
234
  // 1. Terminal Input (Keystrokes)
118
235
  if (cmd.type === 'input') {
@@ -146,10 +263,11 @@ export class ZKRelayAgent {
146
263
 
147
264
  } catch (e) {
148
265
  // JSON değilse saf terminal girdisidir
149
- this.ptyProcess.write(originalText);
266
+ this.ptyProcess.write(decryptedText);
150
267
  }
151
268
  } catch (error) {
152
269
  // Şifre çözülemezse (Yanlış anahtar vb.) sessizce yut
270
+ console.error(chalk.red('Decryption failed:'), (error as Error).message);
153
271
  }
154
272
  }
155
273
 
@@ -197,18 +315,16 @@ export class ZKRelayAgent {
197
315
  private sendSecurePayload(type: string, data: any) {
198
316
  let payloadStr = '';
199
317
 
200
- if (type === 'meta' || type === 'tool_result') {
318
+ if (type === 'meta' || type === 'tool_result' || type === 'key_rotation') {
201
319
  // Standardize format
202
- // For tool_result, data already contains id/result/error
203
- // We wrap it in the top level object structure expected by client
204
- // Client expects: { type: 'result', id: ..., result: ... } OR { type: 'error', id: ..., error: ... }
205
320
  if (type === 'tool_result') {
206
- // data is { id, result } or { id, error, type: 'error' }
207
321
  if (data.type === 'error') {
208
322
  payloadStr = JSON.stringify({ ...data });
209
323
  } else {
210
324
  payloadStr = JSON.stringify({ type: 'result', ...data });
211
325
  }
326
+ } else if (type === 'key_rotation') {
327
+ payloadStr = JSON.stringify({ type: 'key_rotation', ...data });
212
328
  } else {
213
329
  payloadStr = JSON.stringify(data);
214
330
  }
@@ -224,11 +340,12 @@ export class ZKRelayAgent {
224
340
  // Fallback if empty (shouldn't happen with above logic)
225
341
  if (!payloadStr) payloadStr = JSON.stringify(data);
226
342
 
227
- const encrypted = CryptoJS.AES.encrypt(payloadStr, this.encryptionKey).toString();
343
+ // 🔐 Yeni şifreleme formatı ile gönder
344
+ const encrypted = this.encrypt(payloadStr);
228
345
 
229
346
  this.socket.emit('relay_data', {
230
347
  room: this.roomId,
231
- payload: { e: encrypted }
348
+ payload: encrypted
232
349
  });
233
350
  }
234
351
 
@@ -244,8 +361,9 @@ export class ZKRelayAgent {
244
361
  }
245
362
 
246
363
  private printBanner() {
247
- console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0.1 '));
248
- console.log(chalk.gray('Secure, End-to-End Encrypted Terminal Bridge\n'));
364
+ console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.1.0 '));
365
+ console.log(chalk.gray('🔐 PBKDF2-SHA256 + AES-256-CBC + Nonce-Based Replay Protection'));
366
+ console.log(chalk.gray('🔄 Perfect Forward Secrecy with 10-min Key Rotation\n'));
249
367
 
250
368
  console.log(chalk.yellow('┌──────────────────────────────────────┐'));
251
369
  console.log(chalk.yellow('│ 🔑 CONNECTION CODE (ENTER ON APP) │'));
@@ -255,4 +373,12 @@ export class ZKRelayAgent {
255
373
  console.log(chalk.yellow('└──────────────────────────────────────┘'));
256
374
  console.log(chalk.cyan('\nWaiting for mobile connection...'));
257
375
  }
376
+
377
+ // Cleanup
378
+ public destroy() {
379
+ if (this.nonceCleanupInterval) clearInterval(this.nonceCleanupInterval);
380
+ if (this.keyRotationInterval) clearInterval(this.keyRotationInterval);
381
+ if (this.socket) this.socket.disconnect();
382
+ if (this.ptyProcess) this.ptyProcess.kill();
383
+ }
258
384
  }