forkoff 1.0.8 → 1.0.10
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/E2EE-COMPLETE.md +290 -0
- package/README.md +11 -0
- package/dist/__tests__/crypto/e2e-integration.test.d.ts +17 -0
- package/dist/__tests__/crypto/e2e-integration.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/e2e-integration.test.js +338 -0
- package/dist/__tests__/crypto/e2e-integration.test.js.map +1 -0
- package/dist/__tests__/crypto/e2eeManager.test.d.ts +2 -0
- package/dist/__tests__/crypto/e2eeManager.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/e2eeManager.test.js +242 -0
- package/dist/__tests__/crypto/e2eeManager.test.js.map +1 -0
- package/dist/__tests__/crypto/encryption.test.d.ts +2 -0
- package/dist/__tests__/crypto/encryption.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/encryption.test.js +116 -0
- package/dist/__tests__/crypto/encryption.test.js.map +1 -0
- package/dist/__tests__/crypto/keyExchange.test.d.ts +2 -0
- package/dist/__tests__/crypto/keyExchange.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/keyExchange.test.js +84 -0
- package/dist/__tests__/crypto/keyExchange.test.js.map +1 -0
- package/dist/__tests__/crypto/keyGeneration.test.d.ts +2 -0
- package/dist/__tests__/crypto/keyGeneration.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/keyGeneration.test.js +61 -0
- package/dist/__tests__/crypto/keyGeneration.test.js.map +1 -0
- package/dist/__tests__/crypto/keyStorage.test.d.ts +2 -0
- package/dist/__tests__/crypto/keyStorage.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/keyStorage.test.js +133 -0
- package/dist/__tests__/crypto/keyStorage.test.js.map +1 -0
- package/dist/__tests__/crypto/websocketIntegration.test.d.ts +2 -0
- package/dist/__tests__/crypto/websocketIntegration.test.d.ts.map +1 -0
- package/dist/__tests__/crypto/websocketIntegration.test.js +259 -0
- package/dist/__tests__/crypto/websocketIntegration.test.js.map +1 -0
- package/dist/__tests__/tools/claude-process.test.d.ts +8 -0
- package/dist/__tests__/tools/claude-process.test.d.ts.map +1 -0
- package/dist/__tests__/tools/claude-process.test.js +224 -0
- package/dist/__tests__/tools/claude-process.test.js.map +1 -0
- package/dist/crypto/e2eeManager.d.ts +82 -0
- package/dist/crypto/e2eeManager.d.ts.map +1 -0
- package/dist/crypto/e2eeManager.js +270 -0
- package/dist/crypto/e2eeManager.js.map +1 -0
- package/dist/crypto/encryption.d.ts +19 -0
- package/dist/crypto/encryption.d.ts.map +1 -0
- package/dist/crypto/encryption.js +111 -0
- package/dist/crypto/encryption.js.map +1 -0
- package/dist/crypto/keyExchange.d.ts +24 -0
- package/dist/crypto/keyExchange.d.ts.map +1 -0
- package/dist/crypto/keyExchange.js +119 -0
- package/dist/crypto/keyExchange.js.map +1 -0
- package/dist/crypto/keyGeneration.d.ts +18 -0
- package/dist/crypto/keyGeneration.d.ts.map +1 -0
- package/dist/crypto/keyGeneration.js +99 -0
- package/dist/crypto/keyGeneration.js.map +1 -0
- package/dist/crypto/keyStorage.d.ts +39 -0
- package/dist/crypto/keyStorage.d.ts.map +1 -0
- package/dist/crypto/keyStorage.js +117 -0
- package/dist/crypto/keyStorage.js.map +1 -0
- package/dist/crypto/sessionPersistence.d.ts +33 -0
- package/dist/crypto/sessionPersistence.d.ts.map +1 -0
- package/dist/crypto/sessionPersistence.js +173 -0
- package/dist/crypto/sessionPersistence.js.map +1 -0
- package/dist/crypto/types.d.ts +35 -0
- package/dist/crypto/types.d.ts.map +1 -0
- package/dist/crypto/types.js +8 -0
- package/dist/crypto/types.js.map +1 -0
- package/dist/crypto/websocketE2EE.d.ts +47 -0
- package/dist/crypto/websocketE2EE.d.ts.map +1 -0
- package/dist/crypto/websocketE2EE.js +144 -0
- package/dist/crypto/websocketE2EE.js.map +1 -0
- package/dist/index.js +103 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/claude-process.d.ts +19 -3
- package/dist/tools/claude-process.d.ts.map +1 -1
- package/dist/tools/claude-process.js +107 -164
- package/dist/tools/claude-process.js.map +1 -1
- package/dist/websocket.d.ts +33 -1
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +30 -1
- package/dist/websocket.js.map +1 -1
- package/jest.config.js +15 -0
- package/package.json +9 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/crypto/e2e-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2eeManager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/crypto/e2eeManager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const e2eeManager_1 = require("../../crypto/e2eeManager");
|
|
40
|
+
const keyStorage = __importStar(require("../../crypto/keyStorage"));
|
|
41
|
+
const keyGeneration = __importStar(require("../../crypto/keyGeneration"));
|
|
42
|
+
// Mock keytar to avoid actual OS keychain operations
|
|
43
|
+
jest.mock('keytar');
|
|
44
|
+
// Mock axios for API calls
|
|
45
|
+
jest.mock('axios');
|
|
46
|
+
const axios_1 = __importDefault(require("axios"));
|
|
47
|
+
const mockAxios = axios_1.default;
|
|
48
|
+
describe('CLI E2EE Manager', () => {
|
|
49
|
+
let manager;
|
|
50
|
+
const deviceId = 'device-123';
|
|
51
|
+
const apiUrl = 'https://api.forkoff.app/api';
|
|
52
|
+
// Mock axios instance
|
|
53
|
+
const mockAxiosInstance = {
|
|
54
|
+
put: jest.fn(),
|
|
55
|
+
get: jest.fn(),
|
|
56
|
+
};
|
|
57
|
+
beforeEach(async () => {
|
|
58
|
+
jest.clearAllMocks();
|
|
59
|
+
keyStorage.clearSessionKeys();
|
|
60
|
+
// Mock axios.create to return our mock instance
|
|
61
|
+
mockAxios.create = jest.fn().mockReturnValue(mockAxiosInstance);
|
|
62
|
+
// Mock successful API responses
|
|
63
|
+
mockAxiosInstance.put.mockResolvedValue({ data: { success: true, keyVersion: 1 } });
|
|
64
|
+
mockAxiosInstance.get.mockResolvedValue({
|
|
65
|
+
data: {
|
|
66
|
+
publicKey: 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE=',
|
|
67
|
+
keyVersion: 1,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('Initialization', () => {
|
|
72
|
+
it('generates new keys if none stored', async () => {
|
|
73
|
+
jest.spyOn(keyStorage, 'getPrivateKey').mockResolvedValue(null);
|
|
74
|
+
const storeKeySpy = jest
|
|
75
|
+
.spyOn(keyStorage, 'storePrivateKey')
|
|
76
|
+
.mockResolvedValue();
|
|
77
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
78
|
+
await manager.initialize();
|
|
79
|
+
expect(storeKeySpy).toHaveBeenCalled();
|
|
80
|
+
expect(manager.isInitialized()).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('initializes with stored keys if they exist', async () => {
|
|
83
|
+
const existingPrivateKey = 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE=';
|
|
84
|
+
jest
|
|
85
|
+
.spyOn(keyStorage, 'getPrivateKey')
|
|
86
|
+
.mockResolvedValue(existingPrivateKey);
|
|
87
|
+
const generateSpy = jest.spyOn(keyGeneration, 'generateKeyPair');
|
|
88
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
89
|
+
await manager.initialize();
|
|
90
|
+
// Should NOT generate new keys
|
|
91
|
+
expect(generateSpy).not.toHaveBeenCalled();
|
|
92
|
+
expect(manager.isInitialized()).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('uploads public key to backend on initialization', async () => {
|
|
95
|
+
jest.spyOn(keyStorage, 'getPrivateKey').mockResolvedValue(null);
|
|
96
|
+
jest.spyOn(keyStorage, 'storePrivateKey').mockResolvedValue();
|
|
97
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
98
|
+
await manager.initialize();
|
|
99
|
+
expect(mockAxiosInstance.put).toHaveBeenCalledWith(`${apiUrl}/devices/${deviceId}/public-key`, expect.objectContaining({ publicKey: expect.any(String) }));
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('Key Exchange', () => {
|
|
103
|
+
beforeEach(async () => {
|
|
104
|
+
jest.spyOn(keyStorage, 'getPrivateKey').mockResolvedValue(null);
|
|
105
|
+
jest.spyOn(keyStorage, 'storePrivateKey').mockResolvedValue();
|
|
106
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
107
|
+
await manager.initialize();
|
|
108
|
+
});
|
|
109
|
+
it('initiates key exchange with target device', async () => {
|
|
110
|
+
const targetDeviceId = 'device-456';
|
|
111
|
+
const initPayload = await manager.initiateKeyExchange(targetDeviceId);
|
|
112
|
+
expect(initPayload).toHaveProperty('senderDeviceId', deviceId);
|
|
113
|
+
expect(initPayload).toHaveProperty('ephemeralPublicKey');
|
|
114
|
+
expect(typeof initPayload.ephemeralPublicKey).toBe('string');
|
|
115
|
+
});
|
|
116
|
+
it('handles incoming key exchange init', async () => {
|
|
117
|
+
const senderDeviceId = 'device-456';
|
|
118
|
+
const ephemeralPublicKey = 'AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=';
|
|
119
|
+
const ackPayload = await manager.handleKeyExchangeInit(senderDeviceId, ephemeralPublicKey);
|
|
120
|
+
expect(ackPayload).toHaveProperty('recipientDeviceId', deviceId);
|
|
121
|
+
expect(ackPayload).toHaveProperty('ephemeralPublicKey');
|
|
122
|
+
expect(manager.hasSessionKey(senderDeviceId)).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('handles incoming key exchange ack', async () => {
|
|
125
|
+
const targetDeviceId = 'device-456';
|
|
126
|
+
// First initiate
|
|
127
|
+
await manager.initiateKeyExchange(targetDeviceId);
|
|
128
|
+
// Then handle ack
|
|
129
|
+
const ephemeralPublicKey = 'AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=';
|
|
130
|
+
await manager.handleKeyExchangeAck(targetDeviceId, ephemeralPublicKey);
|
|
131
|
+
expect(manager.hasSessionKey(targetDeviceId)).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('Message Encryption', () => {
|
|
135
|
+
beforeEach(async () => {
|
|
136
|
+
jest.spyOn(keyStorage, 'getPrivateKey').mockResolvedValue(null);
|
|
137
|
+
jest.spyOn(keyStorage, 'storePrivateKey').mockResolvedValue();
|
|
138
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
139
|
+
await manager.initialize();
|
|
140
|
+
// Set up session
|
|
141
|
+
const targetDeviceId = 'device-456';
|
|
142
|
+
await manager.initiateKeyExchange(targetDeviceId);
|
|
143
|
+
const ephemeralPublicKey = 'AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=';
|
|
144
|
+
await manager.handleKeyExchangeAck(targetDeviceId, ephemeralPublicKey);
|
|
145
|
+
});
|
|
146
|
+
it('encrypts outgoing messages', () => {
|
|
147
|
+
const targetDeviceId = 'device-456';
|
|
148
|
+
const plaintext = 'Hello, World!';
|
|
149
|
+
const sessionId = 'session-abc';
|
|
150
|
+
const encryptedMessage = manager.encryptMessage(plaintext, targetDeviceId, sessionId);
|
|
151
|
+
expect(encryptedMessage).toHaveProperty('senderDeviceId', deviceId);
|
|
152
|
+
expect(encryptedMessage).toHaveProperty('recipientDeviceId', targetDeviceId);
|
|
153
|
+
expect(encryptedMessage).toHaveProperty('sessionId', sessionId);
|
|
154
|
+
expect(encryptedMessage).toHaveProperty('payload');
|
|
155
|
+
expect(encryptedMessage.payload).toHaveProperty('ciphertext');
|
|
156
|
+
expect(encryptedMessage.payload).toHaveProperty('nonce');
|
|
157
|
+
expect(encryptedMessage.payload).toHaveProperty('authTag');
|
|
158
|
+
expect(encryptedMessage).toHaveProperty('messageCounter');
|
|
159
|
+
expect(encryptedMessage).toHaveProperty('timestamp');
|
|
160
|
+
});
|
|
161
|
+
it('increments message counter on send', () => {
|
|
162
|
+
const targetDeviceId = 'device-456';
|
|
163
|
+
const sessionId = 'session-abc';
|
|
164
|
+
const msg1 = manager.encryptMessage('Message 1', targetDeviceId, sessionId);
|
|
165
|
+
const msg2 = manager.encryptMessage('Message 2', targetDeviceId, sessionId);
|
|
166
|
+
expect(msg2.messageCounter).toBe(msg1.messageCounter + 1);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('Message Decryption', () => {
|
|
170
|
+
beforeEach(async () => {
|
|
171
|
+
jest.spyOn(keyStorage, 'getPrivateKey').mockResolvedValue(null);
|
|
172
|
+
jest.spyOn(keyStorage, 'storePrivateKey').mockResolvedValue();
|
|
173
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
174
|
+
await manager.initialize();
|
|
175
|
+
// Set up session (as recipient)
|
|
176
|
+
const senderDeviceId = 'device-456';
|
|
177
|
+
const ephemeralPublicKey = 'AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=';
|
|
178
|
+
await manager.handleKeyExchangeInit(senderDeviceId, ephemeralPublicKey);
|
|
179
|
+
});
|
|
180
|
+
it('decrypts incoming messages', () => {
|
|
181
|
+
const senderDeviceId = 'device-456';
|
|
182
|
+
const plaintext = 'Secret message';
|
|
183
|
+
const sessionId = 'session-abc';
|
|
184
|
+
// Get the session key
|
|
185
|
+
const sessionKeys = keyStorage.getSessionKey(senderDeviceId);
|
|
186
|
+
if (!sessionKeys) {
|
|
187
|
+
throw new Error('Session key not found');
|
|
188
|
+
}
|
|
189
|
+
// Manually create an encrypted message (simulating what the sender would send)
|
|
190
|
+
const { encrypt } = require('../../crypto/encryption');
|
|
191
|
+
const encryptedPayload = encrypt(plaintext, sessionKeys.encryptionKey);
|
|
192
|
+
const encryptedMessage = {
|
|
193
|
+
senderDeviceId,
|
|
194
|
+
recipientDeviceId: deviceId,
|
|
195
|
+
sessionId,
|
|
196
|
+
payload: encryptedPayload,
|
|
197
|
+
messageCounter: 1, // First message from sender
|
|
198
|
+
timestamp: new Date().toISOString(),
|
|
199
|
+
};
|
|
200
|
+
// Decrypt (simulating receiving from sender)
|
|
201
|
+
const decrypted = manager.decryptMessage(encryptedMessage, senderDeviceId);
|
|
202
|
+
expect(decrypted).toBe(plaintext);
|
|
203
|
+
});
|
|
204
|
+
it('rejects messages with invalid counter (replay protection)', () => {
|
|
205
|
+
const senderDeviceId = 'device-456';
|
|
206
|
+
const sessionId = 'session-abc';
|
|
207
|
+
const msg1 = manager.encryptMessage('Message 1', senderDeviceId, sessionId);
|
|
208
|
+
const msg2 = manager.encryptMessage('Message 2', senderDeviceId, sessionId);
|
|
209
|
+
// Decrypt msg2 first
|
|
210
|
+
manager.decryptMessage(msg2, senderDeviceId);
|
|
211
|
+
// Try to decrypt msg1 (older counter) - should fail
|
|
212
|
+
expect(() => manager.decryptMessage(msg1, senderDeviceId)).toThrow(/counter/i);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
describe('Session Management', () => {
|
|
216
|
+
beforeEach(async () => {
|
|
217
|
+
jest.spyOn(keyStorage, 'getPrivateKey').mockResolvedValue(null);
|
|
218
|
+
jest.spyOn(keyStorage, 'storePrivateKey').mockResolvedValue();
|
|
219
|
+
manager = new e2eeManager_1.E2EEManager(deviceId, apiUrl, 'mock-token');
|
|
220
|
+
await manager.initialize();
|
|
221
|
+
});
|
|
222
|
+
it('tracks active sessions by device ID', async () => {
|
|
223
|
+
const device1 = 'device-456';
|
|
224
|
+
const device2 = 'device-789';
|
|
225
|
+
await manager.initiateKeyExchange(device1);
|
|
226
|
+
await manager.initiateKeyExchange(device2);
|
|
227
|
+
const ephemeralKey1 = 'AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=';
|
|
228
|
+
const ephemeralKey2 = 'AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM=';
|
|
229
|
+
await manager.handleKeyExchangeAck(device1, ephemeralKey1);
|
|
230
|
+
await manager.handleKeyExchangeAck(device2, ephemeralKey2);
|
|
231
|
+
expect(manager.hasSessionKey(device1)).toBe(true);
|
|
232
|
+
expect(manager.hasSessionKey(device2)).toBe(true);
|
|
233
|
+
});
|
|
234
|
+
it('cleans up session keys on disconnect', () => {
|
|
235
|
+
const targetDeviceId = 'device-456';
|
|
236
|
+
keyStorage.storeSessionKey(targetDeviceId, new Uint8Array(32), 'session-abc');
|
|
237
|
+
manager.cleanup();
|
|
238
|
+
expect(keyStorage.getSessionKey(targetDeviceId)).toBeNull();
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=e2eeManager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2eeManager.test.js","sourceRoot":"","sources":["../../../src/__tests__/crypto/e2eeManager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/crypto/encryption.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const encryption_1 = require("../../crypto/encryption");
|
|
4
|
+
describe('CLI Encryption/Decryption', () => {
|
|
5
|
+
const testKey = new Uint8Array(32).fill(1); // 32-byte AES-256 key
|
|
6
|
+
describe('Basic Encryption', () => {
|
|
7
|
+
it('encrypts plaintext to EncryptedPayload', () => {
|
|
8
|
+
const plaintext = 'Hello, World!';
|
|
9
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
10
|
+
expect(encrypted).toHaveProperty('ciphertext');
|
|
11
|
+
expect(encrypted).toHaveProperty('nonce');
|
|
12
|
+
expect(encrypted).toHaveProperty('authTag');
|
|
13
|
+
expect(typeof encrypted.ciphertext).toBe('string');
|
|
14
|
+
expect(typeof encrypted.nonce).toBe('string');
|
|
15
|
+
expect(typeof encrypted.authTag).toBe('string');
|
|
16
|
+
});
|
|
17
|
+
it('nonce is 12 bytes', () => {
|
|
18
|
+
const plaintext = 'Test message';
|
|
19
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
20
|
+
const nonceBytes = Buffer.from(encrypted.nonce, 'base64');
|
|
21
|
+
expect(nonceBytes.length).toBe(12);
|
|
22
|
+
});
|
|
23
|
+
it('authTag is 16 bytes', () => {
|
|
24
|
+
const plaintext = 'Test message';
|
|
25
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
26
|
+
const authTagBytes = Buffer.from(encrypted.authTag, 'base64');
|
|
27
|
+
expect(authTagBytes.length).toBe(16);
|
|
28
|
+
});
|
|
29
|
+
it('encrypted ciphertext is different from plaintext', () => {
|
|
30
|
+
const plaintext = 'Secret message';
|
|
31
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
32
|
+
const ciphertext = Buffer.from(encrypted.ciphertext, 'base64').toString('utf8');
|
|
33
|
+
expect(ciphertext).not.toBe(plaintext);
|
|
34
|
+
});
|
|
35
|
+
it('same plaintext produces different ciphertext (random nonce)', () => {
|
|
36
|
+
const plaintext = 'Same message';
|
|
37
|
+
const encrypted1 = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
38
|
+
const encrypted2 = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
39
|
+
// Nonces should be different (random)
|
|
40
|
+
expect(encrypted1.nonce).not.toBe(encrypted2.nonce);
|
|
41
|
+
// Ciphertexts should be different (due to different nonces)
|
|
42
|
+
expect(encrypted1.ciphertext).not.toBe(encrypted2.ciphertext);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('Decryption', () => {
|
|
46
|
+
it('decrypts EncryptedPayload back to original plaintext', () => {
|
|
47
|
+
const plaintext = 'Hello, World!';
|
|
48
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
49
|
+
const decrypted = (0, encryption_1.decrypt)(encrypted, testKey);
|
|
50
|
+
expect(decrypted).toBe(plaintext);
|
|
51
|
+
});
|
|
52
|
+
it('encrypt-decrypt round trip preserves message content', () => {
|
|
53
|
+
const messages = [
|
|
54
|
+
'Simple message',
|
|
55
|
+
'Message with numbers 12345',
|
|
56
|
+
'Special chars: !@#$%^&*()',
|
|
57
|
+
'',
|
|
58
|
+
];
|
|
59
|
+
messages.forEach((message) => {
|
|
60
|
+
const encrypted = (0, encryption_1.encrypt)(message, testKey);
|
|
61
|
+
const decrypted = (0, encryption_1.decrypt)(encrypted, testKey);
|
|
62
|
+
expect(decrypted).toBe(message);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it('encrypt-decrypt round trip preserves unicode/emoji', () => {
|
|
66
|
+
const plaintext = 'Hello 世界 🌍🚀✨';
|
|
67
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
68
|
+
const decrypted = (0, encryption_1.decrypt)(encrypted, testKey);
|
|
69
|
+
expect(decrypted).toBe(plaintext);
|
|
70
|
+
});
|
|
71
|
+
it('encrypt-decrypt round trip preserves large messages (10KB)', () => {
|
|
72
|
+
const plaintext = 'A'.repeat(10 * 1024); // 10KB of 'A'
|
|
73
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
74
|
+
const decrypted = (0, encryption_1.decrypt)(encrypted, testKey);
|
|
75
|
+
expect(decrypted).toBe(plaintext);
|
|
76
|
+
expect(decrypted.length).toBe(10 * 1024);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('Security Properties', () => {
|
|
80
|
+
it('decryption with wrong key fails', () => {
|
|
81
|
+
const plaintext = 'Secret message';
|
|
82
|
+
const correctKey = new Uint8Array(32).fill(1);
|
|
83
|
+
const wrongKey = new Uint8Array(32).fill(2);
|
|
84
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, correctKey);
|
|
85
|
+
expect(() => (0, encryption_1.decrypt)(encrypted, wrongKey)).toThrow();
|
|
86
|
+
});
|
|
87
|
+
it('decryption with tampered ciphertext fails', () => {
|
|
88
|
+
const plaintext = 'Secret message';
|
|
89
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
90
|
+
// Tamper with ciphertext
|
|
91
|
+
const tamperedCiphertext = Buffer.from(encrypted.ciphertext, 'base64');
|
|
92
|
+
tamperedCiphertext[0] ^= 0xFF; // Flip bits
|
|
93
|
+
encrypted.ciphertext = tamperedCiphertext.toString('base64');
|
|
94
|
+
expect(() => (0, encryption_1.decrypt)(encrypted, testKey)).toThrow();
|
|
95
|
+
});
|
|
96
|
+
it('decryption with tampered nonce fails', () => {
|
|
97
|
+
const plaintext = 'Secret message';
|
|
98
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
99
|
+
// Tamper with nonce
|
|
100
|
+
const tamperedNonce = Buffer.from(encrypted.nonce, 'base64');
|
|
101
|
+
tamperedNonce[0] ^= 0xFF;
|
|
102
|
+
encrypted.nonce = tamperedNonce.toString('base64');
|
|
103
|
+
expect(() => (0, encryption_1.decrypt)(encrypted, testKey)).toThrow();
|
|
104
|
+
});
|
|
105
|
+
it('decryption with tampered authTag fails', () => {
|
|
106
|
+
const plaintext = 'Secret message';
|
|
107
|
+
const encrypted = (0, encryption_1.encrypt)(plaintext, testKey);
|
|
108
|
+
// Tamper with authTag
|
|
109
|
+
const tamperedAuthTag = Buffer.from(encrypted.authTag, 'base64');
|
|
110
|
+
tamperedAuthTag[0] ^= 0xFF;
|
|
111
|
+
encrypted.authTag = tamperedAuthTag.toString('base64');
|
|
112
|
+
expect(() => (0, encryption_1.decrypt)(encrypted, testKey)).toThrow();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=encryption.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.test.js","sourceRoot":"","sources":["../../../src/__tests__/crypto/encryption.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyExchange.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/crypto/keyExchange.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const keyExchange_1 = require("../../crypto/keyExchange");
|
|
4
|
+
const keyGeneration_1 = require("../../crypto/keyGeneration");
|
|
5
|
+
describe('CLI Key Exchange', () => {
|
|
6
|
+
describe('computeSharedSecret', () => {
|
|
7
|
+
it('computes shared secret from X25519 key exchange', () => {
|
|
8
|
+
const aliceKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
9
|
+
const bobKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
10
|
+
const sharedSecret = (0, keyExchange_1.computeSharedSecret)(aliceKeyPair.privateKey, bobKeyPair.publicKey);
|
|
11
|
+
expect(sharedSecret).toBeInstanceOf(Uint8Array);
|
|
12
|
+
expect(sharedSecret.length).toBe(32); // X25519 produces 32-byte shared secret
|
|
13
|
+
});
|
|
14
|
+
it('shared secret is same on both sides (Alice and Bob)', () => {
|
|
15
|
+
const aliceKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
16
|
+
const bobKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
17
|
+
// Alice computes shared secret using her private key and Bob's public key
|
|
18
|
+
const aliceSharedSecret = (0, keyExchange_1.computeSharedSecret)(aliceKeyPair.privateKey, bobKeyPair.publicKey);
|
|
19
|
+
// Bob computes shared secret using his private key and Alice's public key
|
|
20
|
+
const bobSharedSecret = (0, keyExchange_1.computeSharedSecret)(bobKeyPair.privateKey, aliceKeyPair.publicKey);
|
|
21
|
+
// Both should arrive at the same shared secret
|
|
22
|
+
expect(aliceSharedSecret).toEqual(bobSharedSecret);
|
|
23
|
+
});
|
|
24
|
+
it('different key pairs produce different shared secrets', () => {
|
|
25
|
+
const alice1KeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
26
|
+
const alice2KeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
27
|
+
const bobKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
28
|
+
const sharedSecret1 = (0, keyExchange_1.computeSharedSecret)(alice1KeyPair.privateKey, bobKeyPair.publicKey);
|
|
29
|
+
const sharedSecret2 = (0, keyExchange_1.computeSharedSecret)(alice2KeyPair.privateKey, bobKeyPair.publicKey);
|
|
30
|
+
expect(sharedSecret1).not.toEqual(sharedSecret2);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('deriveSessionKey', () => {
|
|
34
|
+
it('derives session encryption key from shared secret', () => {
|
|
35
|
+
const sharedSecret = new Uint8Array(32).fill(1);
|
|
36
|
+
const sessionKey = (0, keyExchange_1.deriveSessionKey)(sharedSecret);
|
|
37
|
+
expect(sessionKey).toBeInstanceOf(Uint8Array);
|
|
38
|
+
expect(sessionKey.length).toBe(32); // AES-256 requires 32 bytes
|
|
39
|
+
});
|
|
40
|
+
it('derived key is 32 bytes (AES-256)', () => {
|
|
41
|
+
const aliceKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
42
|
+
const bobKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
43
|
+
const sharedSecret = (0, keyExchange_1.computeSharedSecret)(aliceKeyPair.privateKey, bobKeyPair.publicKey);
|
|
44
|
+
const sessionKey = (0, keyExchange_1.deriveSessionKey)(sharedSecret);
|
|
45
|
+
expect(sessionKey.length).toBe(32);
|
|
46
|
+
});
|
|
47
|
+
it('same shared secret produces same session key (deterministic)', () => {
|
|
48
|
+
const sharedSecret = new Uint8Array(32).fill(1);
|
|
49
|
+
const sessionKey1 = (0, keyExchange_1.deriveSessionKey)(sharedSecret);
|
|
50
|
+
const sessionKey2 = (0, keyExchange_1.deriveSessionKey)(sharedSecret);
|
|
51
|
+
expect(sessionKey1).toEqual(sessionKey2);
|
|
52
|
+
});
|
|
53
|
+
it('different shared secrets produce different session keys', () => {
|
|
54
|
+
const sharedSecret1 = new Uint8Array(32).fill(1);
|
|
55
|
+
const sharedSecret2 = new Uint8Array(32).fill(2);
|
|
56
|
+
const sessionKey1 = (0, keyExchange_1.deriveSessionKey)(sharedSecret1);
|
|
57
|
+
const sessionKey2 = (0, keyExchange_1.deriveSessionKey)(sharedSecret2);
|
|
58
|
+
expect(sessionKey1).not.toEqual(sessionKey2);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('performKeyExchange (end-to-end)', () => {
|
|
62
|
+
it('completes full key exchange flow', () => {
|
|
63
|
+
const aliceKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
64
|
+
const bobKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
65
|
+
// Alice initiates key exchange
|
|
66
|
+
const aliceSessionKey = (0, keyExchange_1.performKeyExchange)(aliceKeyPair.privateKey, bobKeyPair.publicKey);
|
|
67
|
+
// Bob responds to key exchange
|
|
68
|
+
const bobSessionKey = (0, keyExchange_1.performKeyExchange)(bobKeyPair.privateKey, aliceKeyPair.publicKey);
|
|
69
|
+
// Both should derive the same session key
|
|
70
|
+
expect(aliceSessionKey).toEqual(bobSessionKey);
|
|
71
|
+
expect(aliceSessionKey.length).toBe(32);
|
|
72
|
+
});
|
|
73
|
+
it('session keys are suitable for AES-256-GCM encryption', () => {
|
|
74
|
+
const aliceKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
75
|
+
const bobKeyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
76
|
+
const sessionKey = (0, keyExchange_1.performKeyExchange)(aliceKeyPair.privateKey, bobKeyPair.publicKey);
|
|
77
|
+
// Verify it's a valid Uint8Array with correct length
|
|
78
|
+
expect(sessionKey).toBeInstanceOf(Uint8Array);
|
|
79
|
+
expect(sessionKey.length).toBe(32);
|
|
80
|
+
expect(sessionKey.byteLength).toBe(32);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=keyExchange.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyExchange.test.js","sourceRoot":"","sources":["../../../src/__tests__/crypto/keyExchange.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyGeneration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/crypto/keyGeneration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const keyGeneration_1 = require("../../crypto/keyGeneration");
|
|
4
|
+
describe('CLI Key Generation', () => {
|
|
5
|
+
describe('generateKeyPair', () => {
|
|
6
|
+
it('generates X25519 key pair with 32-byte public key', () => {
|
|
7
|
+
const keyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
8
|
+
const publicKeyBytes = Buffer.from(keyPair.publicKey, 'base64');
|
|
9
|
+
expect(publicKeyBytes.length).toBe(32);
|
|
10
|
+
});
|
|
11
|
+
it('generates X25519 key pair with 32-byte private key', () => {
|
|
12
|
+
const keyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
13
|
+
const privateKeyBytes = Buffer.from(keyPair.privateKey, 'base64');
|
|
14
|
+
expect(privateKeyBytes.length).toBe(32);
|
|
15
|
+
});
|
|
16
|
+
it('generated keys are Base64-encoded strings', () => {
|
|
17
|
+
const keyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
18
|
+
// Should be valid Base64 strings
|
|
19
|
+
expect(typeof keyPair.publicKey).toBe('string');
|
|
20
|
+
expect(typeof keyPair.privateKey).toBe('string');
|
|
21
|
+
// Should decode without error
|
|
22
|
+
expect(() => Buffer.from(keyPair.publicKey, 'base64')).not.toThrow();
|
|
23
|
+
expect(() => Buffer.from(keyPair.privateKey, 'base64')).not.toThrow();
|
|
24
|
+
// Re-encoding should match original
|
|
25
|
+
expect(Buffer.from(keyPair.publicKey, 'base64').toString('base64')).toBe(keyPair.publicKey);
|
|
26
|
+
expect(Buffer.from(keyPair.privateKey, 'base64').toString('base64')).toBe(keyPair.privateKey);
|
|
27
|
+
});
|
|
28
|
+
it('public and private keys are different', () => {
|
|
29
|
+
const keyPair = (0, keyGeneration_1.generateKeyPair)();
|
|
30
|
+
expect(keyPair.publicKey).not.toBe(keyPair.privateKey);
|
|
31
|
+
});
|
|
32
|
+
it('generates unique key pairs on each call', () => {
|
|
33
|
+
const keyPair1 = (0, keyGeneration_1.generateKeyPair)();
|
|
34
|
+
const keyPair2 = (0, keyGeneration_1.generateKeyPair)();
|
|
35
|
+
expect(keyPair1.publicKey).not.toBe(keyPair2.publicKey);
|
|
36
|
+
expect(keyPair1.privateKey).not.toBe(keyPair2.privateKey);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('generateKeyPairFromSeed', () => {
|
|
40
|
+
it('key pair generation is deterministic when given seed', () => {
|
|
41
|
+
const seed = Buffer.alloc(32, 1); // All bytes set to 1
|
|
42
|
+
const keyPair1 = (0, keyGeneration_1.generateKeyPairFromSeed)(seed);
|
|
43
|
+
const keyPair2 = (0, keyGeneration_1.generateKeyPairFromSeed)(seed);
|
|
44
|
+
expect(keyPair1.publicKey).toBe(keyPair2.publicKey);
|
|
45
|
+
expect(keyPair1.privateKey).toBe(keyPair2.privateKey);
|
|
46
|
+
});
|
|
47
|
+
it('different seeds produce different keys', () => {
|
|
48
|
+
const seed1 = Buffer.alloc(32, 1);
|
|
49
|
+
const seed2 = Buffer.alloc(32, 2);
|
|
50
|
+
const keyPair1 = (0, keyGeneration_1.generateKeyPairFromSeed)(seed1);
|
|
51
|
+
const keyPair2 = (0, keyGeneration_1.generateKeyPairFromSeed)(seed2);
|
|
52
|
+
expect(keyPair1.publicKey).not.toBe(keyPair2.publicKey);
|
|
53
|
+
expect(keyPair1.privateKey).not.toBe(keyPair2.privateKey);
|
|
54
|
+
});
|
|
55
|
+
it('seed must be 32 bytes', () => {
|
|
56
|
+
const shortSeed = Buffer.alloc(16);
|
|
57
|
+
expect(() => (0, keyGeneration_1.generateKeyPairFromSeed)(shortSeed)).toThrow();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=keyGeneration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyGeneration.test.js","sourceRoot":"","sources":["../../../src/__tests__/crypto/keyGeneration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyStorage.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/crypto/keyStorage.test.ts"],"names":[],"mappings":""}
|