bitchat-node 0.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/README.md +223 -0
- package/dist/bin/bitchat.d.ts +7 -0
- package/dist/bin/bitchat.d.ts.map +1 -0
- package/dist/bin/bitchat.js +69 -0
- package/dist/bin/bitchat.js.map +1 -0
- package/dist/client.d.ts +77 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +411 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/noise.d.ts +72 -0
- package/dist/crypto/noise.d.ts.map +1 -0
- package/dist/crypto/noise.js +470 -0
- package/dist/crypto/noise.js.map +1 -0
- package/dist/crypto/signing.d.ts +34 -0
- package/dist/crypto/signing.d.ts.map +1 -0
- package/dist/crypto/signing.js +56 -0
- package/dist/crypto/signing.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/mesh/deduplicator.d.ts +48 -0
- package/dist/mesh/deduplicator.d.ts.map +1 -0
- package/dist/mesh/deduplicator.js +107 -0
- package/dist/mesh/deduplicator.js.map +1 -0
- package/dist/mesh/index.d.ts +6 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +6 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/router.d.ts +90 -0
- package/dist/mesh/router.d.ts.map +1 -0
- package/dist/mesh/router.js +204 -0
- package/dist/mesh/router.js.map +1 -0
- package/dist/protocol/binary.d.ts +37 -0
- package/dist/protocol/binary.d.ts.map +1 -0
- package/dist/protocol/binary.js +310 -0
- package/dist/protocol/binary.js.map +1 -0
- package/dist/protocol/constants.d.ts +30 -0
- package/dist/protocol/constants.d.ts.map +1 -0
- package/dist/protocol/constants.js +37 -0
- package/dist/protocol/constants.js.map +1 -0
- package/dist/protocol/index.d.ts +8 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +8 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/packets.d.ts +38 -0
- package/dist/protocol/packets.d.ts.map +1 -0
- package/dist/protocol/packets.js +177 -0
- package/dist/protocol/packets.js.map +1 -0
- package/dist/protocol/types.d.ts +134 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +108 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/session/index.d.ts +5 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +5 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +113 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +371 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/transport/ble.d.ts +92 -0
- package/dist/transport/ble.d.ts.map +1 -0
- package/dist/transport/ble.js +434 -0
- package/dist/transport/ble.js.map +1 -0
- package/dist/transport/index.d.ts +5 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +5 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/server.d.ts +16 -0
- package/dist/ui/server.d.ts.map +1 -0
- package/dist/ui/server.js +510 -0
- package/dist/ui/server.js.map +1 -0
- package/package.json +79 -0
- package/src/bin/bitchat.ts +87 -0
- package/src/client.ts +519 -0
- package/src/crypto/index.ts +22 -0
- package/src/crypto/noise.ts +574 -0
- package/src/crypto/signing.ts +66 -0
- package/src/index.ts +95 -0
- package/src/mesh/deduplicator.ts +129 -0
- package/src/mesh/index.ts +6 -0
- package/src/mesh/router.ts +258 -0
- package/src/protocol/binary.ts +345 -0
- package/src/protocol/constants.ts +43 -0
- package/src/protocol/index.ts +15 -0
- package/src/protocol/packets.ts +223 -0
- package/src/protocol/types.ts +182 -0
- package/src/session/index.ts +9 -0
- package/src/session/manager.ts +476 -0
- package/src/transport/ble.ts +553 -0
- package/src/transport/index.ts +10 -0
- package/src/ui/index.ts +1 -0
- package/src/ui/server.ts +569 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitchat Client
|
|
3
|
+
* High-level API for Bitchat mesh networking
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { sign, verify } from './crypto/signing.js';
|
|
7
|
+
import { MeshRouter } from './mesh/router.js';
|
|
8
|
+
import { decode, encode, encodeForSigning, makeDeduplicationID } from './protocol/binary.js';
|
|
9
|
+
import { DEFAULT_TTL } from './protocol/constants.js';
|
|
10
|
+
import { decodeAnnouncement, encodeAnnouncement } from './protocol/packets.js';
|
|
11
|
+
import { MessageType, NoisePayloadType, } from './protocol/types.js';
|
|
12
|
+
import { SessionManager } from './session/manager.js';
|
|
13
|
+
import { BLETransport } from './transport/ble.js';
|
|
14
|
+
/**
|
|
15
|
+
* Bitchat mesh network client
|
|
16
|
+
*/
|
|
17
|
+
export class BitchatClient extends EventEmitter {
|
|
18
|
+
config;
|
|
19
|
+
transport;
|
|
20
|
+
router;
|
|
21
|
+
sessions;
|
|
22
|
+
running = false;
|
|
23
|
+
// Our identity
|
|
24
|
+
nickname;
|
|
25
|
+
peerID;
|
|
26
|
+
fingerprint;
|
|
27
|
+
/** Get the client configuration */
|
|
28
|
+
getConfig() {
|
|
29
|
+
return this.config;
|
|
30
|
+
}
|
|
31
|
+
constructor(config) {
|
|
32
|
+
super();
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.nickname = config.nickname;
|
|
35
|
+
// Initialize session manager (handles keys and Noise sessions)
|
|
36
|
+
this.sessions = new SessionManager({}, {
|
|
37
|
+
static: config.staticKeyPair,
|
|
38
|
+
signing: config.signingKeyPair,
|
|
39
|
+
});
|
|
40
|
+
this.peerID = this.sessions.myPeerID;
|
|
41
|
+
this.fingerprint = this.sessions.fingerprint;
|
|
42
|
+
// Initialize router
|
|
43
|
+
this.router = new MeshRouter();
|
|
44
|
+
this.router.setMyPeerID(this.peerID);
|
|
45
|
+
// Initialize transport
|
|
46
|
+
this.transport = new BLETransport({
|
|
47
|
+
testnet: config.testnet ?? false,
|
|
48
|
+
});
|
|
49
|
+
// Wire up event handlers
|
|
50
|
+
this.setupEventHandlers();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Start the client
|
|
54
|
+
*/
|
|
55
|
+
async start() {
|
|
56
|
+
if (this.running)
|
|
57
|
+
return;
|
|
58
|
+
try {
|
|
59
|
+
// Start transport
|
|
60
|
+
await this.transport.start();
|
|
61
|
+
this.running = true;
|
|
62
|
+
this.emit('ready');
|
|
63
|
+
// Send initial announce
|
|
64
|
+
setTimeout(() => this.sendAnnounce(), 1000);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.emit('error', error, 'start');
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Stop the client
|
|
73
|
+
*/
|
|
74
|
+
async stop() {
|
|
75
|
+
if (!this.running)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
// Send leave message
|
|
79
|
+
await this.sendLeave();
|
|
80
|
+
// Stop transport
|
|
81
|
+
await this.transport.stop();
|
|
82
|
+
// Clean up
|
|
83
|
+
this.router.destroy();
|
|
84
|
+
this.sessions.destroy();
|
|
85
|
+
this.running = false;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
this.emit('error', error, 'stop');
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Send a public message to the mesh
|
|
94
|
+
*/
|
|
95
|
+
async sendPublicMessage(content) {
|
|
96
|
+
console.log('[Client] sendPublicMessage:', content);
|
|
97
|
+
const messageID = crypto.randomUUID();
|
|
98
|
+
const timestamp = BigInt(Date.now());
|
|
99
|
+
const packet = {
|
|
100
|
+
version: 1,
|
|
101
|
+
type: MessageType.MESSAGE,
|
|
102
|
+
ttl: DEFAULT_TTL,
|
|
103
|
+
timestamp,
|
|
104
|
+
senderID: this.peerID,
|
|
105
|
+
payload: new TextEncoder().encode(content),
|
|
106
|
+
isRSR: false,
|
|
107
|
+
};
|
|
108
|
+
// Sign the packet
|
|
109
|
+
const dataToSign = encodeForSigning(packet);
|
|
110
|
+
const signature = sign(dataToSign, this.sessions.signingKeyPair.secretKey);
|
|
111
|
+
packet.signature = signature;
|
|
112
|
+
// Send via router (to noble links) and transport (to bleno subscribers)
|
|
113
|
+
console.log('[Client] Sending to router...');
|
|
114
|
+
await this.router.sendPacket(packet);
|
|
115
|
+
console.log('[Client] Encoding packet...');
|
|
116
|
+
const encoded = encode(packet);
|
|
117
|
+
console.log('[Client] Broadcasting via transport, size:', encoded.length);
|
|
118
|
+
await this.transport.broadcast(encoded);
|
|
119
|
+
console.log('[Client] Broadcast complete');
|
|
120
|
+
return messageID;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Send a private message to a specific peer
|
|
124
|
+
*/
|
|
125
|
+
async sendPrivateMessage(content, toPeerID) {
|
|
126
|
+
const messageID = crypto.randomUUID();
|
|
127
|
+
// Check if we have a session
|
|
128
|
+
if (!this.sessions.hasSession(toPeerID)) {
|
|
129
|
+
// Need to establish session first
|
|
130
|
+
if (!this.sessions.hasHandshakeInProgress(toPeerID)) {
|
|
131
|
+
// Initiate handshake
|
|
132
|
+
const handshakeMsg = this.sessions.initiateHandshake(toPeerID);
|
|
133
|
+
await this.sendHandshakePacket(toPeerID, handshakeMsg);
|
|
134
|
+
}
|
|
135
|
+
// Queue message for after handshake
|
|
136
|
+
const payload = this.buildPrivateMessagePayload(content, messageID);
|
|
137
|
+
this.sessions.queueMessage(toPeerID, payload);
|
|
138
|
+
return messageID;
|
|
139
|
+
}
|
|
140
|
+
// Encrypt and send
|
|
141
|
+
await this.sendEncryptedMessage(toPeerID, content, messageID);
|
|
142
|
+
return messageID;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get list of connected peers
|
|
146
|
+
*/
|
|
147
|
+
getConnectedPeers() {
|
|
148
|
+
return this.sessions.getAllPeers().filter((p) => p.isConnected);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get peer info
|
|
152
|
+
*/
|
|
153
|
+
getPeerInfo(peerID) {
|
|
154
|
+
return this.sessions.getPeerInfo(peerID);
|
|
155
|
+
}
|
|
156
|
+
// --- Private methods ---
|
|
157
|
+
setupEventHandlers() {
|
|
158
|
+
// Transport events
|
|
159
|
+
this.transport.on('ready', () => {
|
|
160
|
+
// Add links to router as they're discovered
|
|
161
|
+
});
|
|
162
|
+
this.transport.on('link:connected', (link) => {
|
|
163
|
+
this.router.addLink(link);
|
|
164
|
+
});
|
|
165
|
+
this.transport.on('link:disconnected', (linkId) => {
|
|
166
|
+
this.router.removeLink(linkId);
|
|
167
|
+
});
|
|
168
|
+
this.transport.on('data', (data, link) => {
|
|
169
|
+
this.handleIncomingData(data, link);
|
|
170
|
+
});
|
|
171
|
+
this.transport.on('error', (error, context) => {
|
|
172
|
+
this.emit('error', error, `transport:${context}`);
|
|
173
|
+
});
|
|
174
|
+
// Router events
|
|
175
|
+
this.router.on('packet', (packet, fromLink) => {
|
|
176
|
+
this.handlePacket(packet, fromLink);
|
|
177
|
+
});
|
|
178
|
+
// Session events
|
|
179
|
+
this.sessions.on('session:established', (peerID, _session) => {
|
|
180
|
+
const peer = this.sessions.getPeerInfo(peerID);
|
|
181
|
+
if (peer) {
|
|
182
|
+
this.emit('peer:updated', peer);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
this.sessions.on('handshake:message', async (peerID, encrypted) => {
|
|
186
|
+
// Send queued encrypted message
|
|
187
|
+
const packet = {
|
|
188
|
+
version: 1,
|
|
189
|
+
type: MessageType.NOISE_ENCRYPTED,
|
|
190
|
+
ttl: DEFAULT_TTL,
|
|
191
|
+
timestamp: BigInt(Date.now()),
|
|
192
|
+
senderID: this.peerID,
|
|
193
|
+
recipientID: peerID,
|
|
194
|
+
payload: encrypted,
|
|
195
|
+
isRSR: false,
|
|
196
|
+
};
|
|
197
|
+
await this.router.sendToPeer(packet, peerID);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
async handleIncomingData(data, link) {
|
|
201
|
+
const packet = decode(data);
|
|
202
|
+
if (!packet)
|
|
203
|
+
return;
|
|
204
|
+
await this.router.handlePacket(packet, link);
|
|
205
|
+
}
|
|
206
|
+
handlePacket(packet, fromLink) {
|
|
207
|
+
switch (packet.type) {
|
|
208
|
+
case MessageType.ANNOUNCE:
|
|
209
|
+
this.handleAnnounce(packet, fromLink);
|
|
210
|
+
break;
|
|
211
|
+
case MessageType.MESSAGE:
|
|
212
|
+
this.handlePublicMessage(packet);
|
|
213
|
+
break;
|
|
214
|
+
case MessageType.LEAVE:
|
|
215
|
+
this.handleLeave(packet);
|
|
216
|
+
break;
|
|
217
|
+
case MessageType.NOISE_HANDSHAKE:
|
|
218
|
+
this.handleHandshake(packet);
|
|
219
|
+
break;
|
|
220
|
+
case MessageType.NOISE_ENCRYPTED:
|
|
221
|
+
this.handleEncrypted(packet);
|
|
222
|
+
break;
|
|
223
|
+
default:
|
|
224
|
+
// Unknown type - already relayed by router
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
handleAnnounce(packet, fromLink) {
|
|
229
|
+
const peerID = packet.senderID;
|
|
230
|
+
// Decode TLV announcement payload
|
|
231
|
+
const announcement = decodeAnnouncement(packet.payload);
|
|
232
|
+
const nickname = announcement?.nickname ?? 'anon';
|
|
233
|
+
// Verify signature if present
|
|
234
|
+
if (packet.signature && announcement?.signingPublicKey) {
|
|
235
|
+
const dataToSign = encodeForSigning(packet);
|
|
236
|
+
const isValid = verify(dataToSign, packet.signature, announcement.signingPublicKey);
|
|
237
|
+
if (!isValid) {
|
|
238
|
+
console.warn('[Announce] Invalid signature from', nickname, peerID.toHex().slice(0, 8));
|
|
239
|
+
return; // Reject invalid announces
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Check if this is a NEW peer or an existing one
|
|
243
|
+
const existingPeer = this.sessions.getPeerInfo(peerID);
|
|
244
|
+
const isNewPeer = !existingPeer || !existingPeer.isConnected;
|
|
245
|
+
// Update peer info
|
|
246
|
+
this.sessions.updatePeerInfo(peerID, {
|
|
247
|
+
nickname,
|
|
248
|
+
isConnected: true,
|
|
249
|
+
lastSeen: new Date(),
|
|
250
|
+
// Store keys if available
|
|
251
|
+
noisePublicKey: announcement?.noisePublicKey,
|
|
252
|
+
signingPublicKey: announcement?.signingPublicKey,
|
|
253
|
+
});
|
|
254
|
+
// Associate peer ID with link
|
|
255
|
+
if (fromLink) {
|
|
256
|
+
fromLink.setPeerID(peerID);
|
|
257
|
+
}
|
|
258
|
+
const peer = this.sessions.getPeerInfo(peerID);
|
|
259
|
+
if (peer) {
|
|
260
|
+
// Only emit 'peer:connected' for NEW peers, not repeat announces
|
|
261
|
+
if (isNewPeer) {
|
|
262
|
+
this.emit('peer:connected', peer);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// Existing peer sent another announce - just update internally
|
|
266
|
+
this.emit('peer:updated', peer);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
handlePublicMessage(packet) {
|
|
271
|
+
const content = new TextDecoder().decode(packet.payload);
|
|
272
|
+
const peer = this.sessions.getPeerInfo(packet.senderID);
|
|
273
|
+
const message = {
|
|
274
|
+
id: makeDeduplicationID(packet),
|
|
275
|
+
sender: packet.senderID,
|
|
276
|
+
senderNickname: peer?.nickname ?? 'anon',
|
|
277
|
+
content,
|
|
278
|
+
timestamp: new Date(Number(packet.timestamp)),
|
|
279
|
+
isPrivate: false,
|
|
280
|
+
deliveryStatus: { type: 'delivered', to: this.peerID, at: new Date() },
|
|
281
|
+
};
|
|
282
|
+
this.emit('message', message);
|
|
283
|
+
}
|
|
284
|
+
handleLeave(packet) {
|
|
285
|
+
const peerID = packet.senderID;
|
|
286
|
+
this.sessions.updatePeerInfo(peerID, {
|
|
287
|
+
isConnected: false,
|
|
288
|
+
});
|
|
289
|
+
this.emit('peer:disconnected', peerID);
|
|
290
|
+
}
|
|
291
|
+
async handleHandshake(packet) {
|
|
292
|
+
const peerID = packet.senderID;
|
|
293
|
+
const response = this.sessions.handleHandshakeMessage(peerID, packet.payload);
|
|
294
|
+
if (response) {
|
|
295
|
+
await this.sendHandshakePacket(peerID, response);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
handleEncrypted(packet) {
|
|
299
|
+
const peerID = packet.senderID;
|
|
300
|
+
try {
|
|
301
|
+
const decrypted = this.sessions.decrypt(peerID, packet.payload);
|
|
302
|
+
// First byte is payload type
|
|
303
|
+
const payloadType = decrypted[0];
|
|
304
|
+
const payloadData = decrypted.subarray(1);
|
|
305
|
+
switch (payloadType) {
|
|
306
|
+
case NoisePayloadType.PRIVATE_MESSAGE:
|
|
307
|
+
this.handlePrivateMessage(peerID, payloadData, packet.timestamp);
|
|
308
|
+
break;
|
|
309
|
+
case NoisePayloadType.READ_RECEIPT:
|
|
310
|
+
// TODO: Handle read receipt
|
|
311
|
+
break;
|
|
312
|
+
case NoisePayloadType.DELIVERED:
|
|
313
|
+
// TODO: Handle delivery confirmation
|
|
314
|
+
break;
|
|
315
|
+
default:
|
|
316
|
+
// Unknown payload type
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
this.emit('error', error, 'decrypt');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
handlePrivateMessage(senderID, payload, timestamp) {
|
|
325
|
+
const content = new TextDecoder().decode(payload);
|
|
326
|
+
const peer = this.sessions.getPeerInfo(senderID);
|
|
327
|
+
const message = {
|
|
328
|
+
id: `${senderID.toHex()}-${timestamp}-private`,
|
|
329
|
+
sender: senderID,
|
|
330
|
+
senderNickname: peer?.nickname ?? 'anon',
|
|
331
|
+
content,
|
|
332
|
+
timestamp: new Date(Number(timestamp)),
|
|
333
|
+
isPrivate: true,
|
|
334
|
+
deliveryStatus: { type: 'delivered', to: this.peerID, at: new Date() },
|
|
335
|
+
};
|
|
336
|
+
this.emit('message', message);
|
|
337
|
+
}
|
|
338
|
+
async sendAnnounce() {
|
|
339
|
+
// Encode announcement with TLV format
|
|
340
|
+
const payload = encodeAnnouncement({
|
|
341
|
+
nickname: this.nickname,
|
|
342
|
+
noisePublicKey: this.sessions.staticKeyPair.publicKey,
|
|
343
|
+
signingPublicKey: this.sessions.signingKeyPair.publicKey,
|
|
344
|
+
directNeighbors: this.router.getConnectedPeerIDs().map((p) => p.toBytes()),
|
|
345
|
+
});
|
|
346
|
+
const packet = {
|
|
347
|
+
version: 1,
|
|
348
|
+
type: MessageType.ANNOUNCE,
|
|
349
|
+
ttl: DEFAULT_TTL,
|
|
350
|
+
timestamp: BigInt(Date.now()),
|
|
351
|
+
senderID: this.peerID,
|
|
352
|
+
payload,
|
|
353
|
+
isRSR: false,
|
|
354
|
+
};
|
|
355
|
+
// Sign the announce packet
|
|
356
|
+
const dataToSign = encodeForSigning(packet);
|
|
357
|
+
const signature = sign(dataToSign, this.sessions.signingKeyPair.secretKey);
|
|
358
|
+
packet.signature = signature;
|
|
359
|
+
await this.router.sendPacket(packet);
|
|
360
|
+
const encoded = encode(packet);
|
|
361
|
+
await this.transport.broadcast(encoded);
|
|
362
|
+
}
|
|
363
|
+
async sendLeave() {
|
|
364
|
+
const packet = {
|
|
365
|
+
version: 1,
|
|
366
|
+
type: MessageType.LEAVE,
|
|
367
|
+
ttl: DEFAULT_TTL,
|
|
368
|
+
timestamp: BigInt(Date.now()),
|
|
369
|
+
senderID: this.peerID,
|
|
370
|
+
payload: new Uint8Array(0),
|
|
371
|
+
isRSR: false,
|
|
372
|
+
};
|
|
373
|
+
await this.router.sendPacket(packet);
|
|
374
|
+
}
|
|
375
|
+
async sendHandshakePacket(toPeerID, message) {
|
|
376
|
+
const packet = {
|
|
377
|
+
version: 1,
|
|
378
|
+
type: MessageType.NOISE_HANDSHAKE,
|
|
379
|
+
ttl: DEFAULT_TTL,
|
|
380
|
+
timestamp: BigInt(Date.now()),
|
|
381
|
+
senderID: this.peerID,
|
|
382
|
+
recipientID: toPeerID,
|
|
383
|
+
payload: message,
|
|
384
|
+
isRSR: false,
|
|
385
|
+
};
|
|
386
|
+
await this.router.sendToPeer(packet, toPeerID);
|
|
387
|
+
}
|
|
388
|
+
buildPrivateMessagePayload(content, _messageID) {
|
|
389
|
+
const contentBytes = new TextEncoder().encode(content);
|
|
390
|
+
const payload = new Uint8Array(1 + contentBytes.length);
|
|
391
|
+
payload[0] = NoisePayloadType.PRIVATE_MESSAGE;
|
|
392
|
+
payload.set(contentBytes, 1);
|
|
393
|
+
return payload;
|
|
394
|
+
}
|
|
395
|
+
async sendEncryptedMessage(toPeerID, content, messageID) {
|
|
396
|
+
const payload = this.buildPrivateMessagePayload(content, messageID);
|
|
397
|
+
const encrypted = this.sessions.encrypt(toPeerID, payload);
|
|
398
|
+
const packet = {
|
|
399
|
+
version: 1,
|
|
400
|
+
type: MessageType.NOISE_ENCRYPTED,
|
|
401
|
+
ttl: DEFAULT_TTL,
|
|
402
|
+
timestamp: BigInt(Date.now()),
|
|
403
|
+
senderID: this.peerID,
|
|
404
|
+
recipientID: toPeerID,
|
|
405
|
+
payload: encrypted,
|
|
406
|
+
isRSR: false,
|
|
407
|
+
};
|
|
408
|
+
await this.router.sendToPeer(packet, toPeerID);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crypto module exports
|
|
3
|
+
*/
|
|
4
|
+
export { CipherState, generateKeyPair, HandshakeState, type NoiseKeyPair, type NoiseRole, NoiseSession, } from './noise.js';
|
|
5
|
+
export { fingerprint, formatFingerprint, generateSigningKeyPair, type SigningKeyPair, sha256, sign, verify, } from './signing.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crypto/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,cAAc,EACnB,MAAM,EACN,IAAI,EACJ,MAAM,GACP,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crypto module exports
|
|
3
|
+
*/
|
|
4
|
+
export { CipherState, generateKeyPair, HandshakeState, NoiseSession, } from './noise.js';
|
|
5
|
+
export { fingerprint, formatFingerprint, generateSigningKeyPair, sha256, sign, verify, } from './signing.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/crypto/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EAGd,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EAEtB,MAAM,EACN,IAAI,EACJ,MAAM,GACP,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noise Protocol Implementation
|
|
3
|
+
* Implements Noise_XX_25519_ChaChaPoly_SHA256 per the Noise spec
|
|
4
|
+
* From: bitchat/Noise/NoiseProtocol.swift
|
|
5
|
+
*
|
|
6
|
+
* @see http://www.noiseprotocol.org/noise.html
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Manages symmetric encryption with nonce tracking and replay protection
|
|
10
|
+
*/
|
|
11
|
+
export declare class CipherState {
|
|
12
|
+
private key;
|
|
13
|
+
private nonce;
|
|
14
|
+
private readonly useExtractedNonce;
|
|
15
|
+
private highestReceivedNonce;
|
|
16
|
+
private replayWindow;
|
|
17
|
+
constructor(key?: Uint8Array, useExtractedNonce?: boolean);
|
|
18
|
+
initializeKey(key: Uint8Array): void;
|
|
19
|
+
hasKey(): boolean;
|
|
20
|
+
private makeNonceBytes;
|
|
21
|
+
private isValidNonce;
|
|
22
|
+
private markNonceAsSeen;
|
|
23
|
+
encrypt(plaintext: Uint8Array, ad?: Uint8Array): Uint8Array;
|
|
24
|
+
decrypt(ciphertext: Uint8Array, ad?: Uint8Array): Uint8Array;
|
|
25
|
+
clear(): void;
|
|
26
|
+
}
|
|
27
|
+
export type NoiseRole = 'initiator' | 'responder';
|
|
28
|
+
export interface NoiseKeyPair {
|
|
29
|
+
publicKey: Uint8Array;
|
|
30
|
+
secretKey: Uint8Array;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Orchestrates the XX handshake
|
|
34
|
+
*/
|
|
35
|
+
export declare class HandshakeState {
|
|
36
|
+
private readonly role;
|
|
37
|
+
private readonly symmetricState;
|
|
38
|
+
private currentPattern;
|
|
39
|
+
private localStaticPrivate;
|
|
40
|
+
private localStaticPublic;
|
|
41
|
+
private localEphemeralPrivate?;
|
|
42
|
+
private localEphemeralPublic?;
|
|
43
|
+
private remoteStaticPublic?;
|
|
44
|
+
private remoteEphemeralPublic?;
|
|
45
|
+
constructor(role: NoiseRole, localStaticKeyPair: NoiseKeyPair, prologue?: Uint8Array);
|
|
46
|
+
writeMessage(payload?: Uint8Array): Uint8Array;
|
|
47
|
+
readMessage(message: Uint8Array): Uint8Array;
|
|
48
|
+
private performDH;
|
|
49
|
+
isComplete(): boolean;
|
|
50
|
+
getRemoteStaticPublicKey(): Uint8Array | undefined;
|
|
51
|
+
getHandshakeHash(): Uint8Array;
|
|
52
|
+
split(useExtractedNonce?: boolean): {
|
|
53
|
+
send: CipherState;
|
|
54
|
+
receive: CipherState;
|
|
55
|
+
hash: Uint8Array;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* An established Noise session for transport encryption
|
|
60
|
+
*/
|
|
61
|
+
export declare class NoiseSession {
|
|
62
|
+
private sendCipher;
|
|
63
|
+
private receiveCipher;
|
|
64
|
+
readonly handshakeHash: Uint8Array;
|
|
65
|
+
readonly remotePublicKey: Uint8Array;
|
|
66
|
+
constructor(sendCipher: CipherState, receiveCipher: CipherState, handshakeHash: Uint8Array, remotePublicKey: Uint8Array);
|
|
67
|
+
encrypt(plaintext: Uint8Array): Uint8Array;
|
|
68
|
+
decrypt(ciphertext: Uint8Array): Uint8Array;
|
|
69
|
+
clear(): void;
|
|
70
|
+
}
|
|
71
|
+
export declare function generateKeyPair(): NoiseKeyPair;
|
|
72
|
+
//# sourceMappingURL=noise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../src/crypto/noise.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiDH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAG5C,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,YAAY,CAAmC;gBAE3C,GAAG,CAAC,EAAE,UAAU,EAAE,iBAAiB,UAAQ;IAKvD,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAKpC,MAAM,IAAI,OAAO;IAIjB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,GAAE,UAA6B,GAAG,UAAU;IAsB7E,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,GAAE,UAA6B,GAAG,UAAU;IAsC9E,KAAK,IAAI,IAAI;CASd;AAqFD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAKlD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,qBAAqB,CAAC,CAAa;IAC3C,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAC1C,OAAO,CAAC,kBAAkB,CAAC,CAAa;IACxC,OAAO,CAAC,qBAAqB,CAAC,CAAa;gBAGzC,IAAI,EAAE,SAAS,EACf,kBAAkB,EAAE,YAAY,EAChC,QAAQ,GAAE,UAA6B;IAUzC,YAAY,CAAC,OAAO,GAAE,UAA6B,GAAG,UAAU;IA6EhE,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IA+C5C,OAAO,CAAC,SAAS;IAyCjB,UAAU,IAAI,OAAO;IAIrB,wBAAwB,IAAI,UAAU,GAAG,SAAS;IAIlD,gBAAgB,IAAI,UAAU;IAI9B,KAAK,CAAC,iBAAiB,UAAO,GAAG;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE;CAa/F;AAMD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,aAAa,CAAc;IACnC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;gBAGnC,UAAU,EAAE,WAAW,EACvB,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE,UAAU,EACzB,eAAe,EAAE,UAAU;IAQ7B,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAI1C,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAI3C,KAAK,IAAI,IAAI;CAId;AAMD,wBAAgB,eAAe,IAAI,YAAY,CAE9C"}
|