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.
Files changed (102) hide show
  1. package/README.md +223 -0
  2. package/dist/bin/bitchat.d.ts +7 -0
  3. package/dist/bin/bitchat.d.ts.map +1 -0
  4. package/dist/bin/bitchat.js +69 -0
  5. package/dist/bin/bitchat.js.map +1 -0
  6. package/dist/client.d.ts +77 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +411 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/crypto/index.d.ts +6 -0
  11. package/dist/crypto/index.d.ts.map +1 -0
  12. package/dist/crypto/index.js +6 -0
  13. package/dist/crypto/index.js.map +1 -0
  14. package/dist/crypto/noise.d.ts +72 -0
  15. package/dist/crypto/noise.d.ts.map +1 -0
  16. package/dist/crypto/noise.js +470 -0
  17. package/dist/crypto/noise.js.map +1 -0
  18. package/dist/crypto/signing.d.ts +34 -0
  19. package/dist/crypto/signing.d.ts.map +1 -0
  20. package/dist/crypto/signing.js +56 -0
  21. package/dist/crypto/signing.js.map +1 -0
  22. package/dist/index.d.ts +32 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +48 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mesh/deduplicator.d.ts +48 -0
  27. package/dist/mesh/deduplicator.d.ts.map +1 -0
  28. package/dist/mesh/deduplicator.js +107 -0
  29. package/dist/mesh/deduplicator.js.map +1 -0
  30. package/dist/mesh/index.d.ts +6 -0
  31. package/dist/mesh/index.d.ts.map +1 -0
  32. package/dist/mesh/index.js +6 -0
  33. package/dist/mesh/index.js.map +1 -0
  34. package/dist/mesh/router.d.ts +90 -0
  35. package/dist/mesh/router.d.ts.map +1 -0
  36. package/dist/mesh/router.js +204 -0
  37. package/dist/mesh/router.js.map +1 -0
  38. package/dist/protocol/binary.d.ts +37 -0
  39. package/dist/protocol/binary.d.ts.map +1 -0
  40. package/dist/protocol/binary.js +310 -0
  41. package/dist/protocol/binary.js.map +1 -0
  42. package/dist/protocol/constants.d.ts +30 -0
  43. package/dist/protocol/constants.d.ts.map +1 -0
  44. package/dist/protocol/constants.js +37 -0
  45. package/dist/protocol/constants.js.map +1 -0
  46. package/dist/protocol/index.d.ts +8 -0
  47. package/dist/protocol/index.d.ts.map +1 -0
  48. package/dist/protocol/index.js +8 -0
  49. package/dist/protocol/index.js.map +1 -0
  50. package/dist/protocol/packets.d.ts +38 -0
  51. package/dist/protocol/packets.d.ts.map +1 -0
  52. package/dist/protocol/packets.js +177 -0
  53. package/dist/protocol/packets.js.map +1 -0
  54. package/dist/protocol/types.d.ts +134 -0
  55. package/dist/protocol/types.d.ts.map +1 -0
  56. package/dist/protocol/types.js +108 -0
  57. package/dist/protocol/types.js.map +1 -0
  58. package/dist/session/index.d.ts +5 -0
  59. package/dist/session/index.d.ts.map +1 -0
  60. package/dist/session/index.js +5 -0
  61. package/dist/session/index.js.map +1 -0
  62. package/dist/session/manager.d.ts +113 -0
  63. package/dist/session/manager.d.ts.map +1 -0
  64. package/dist/session/manager.js +371 -0
  65. package/dist/session/manager.js.map +1 -0
  66. package/dist/transport/ble.d.ts +92 -0
  67. package/dist/transport/ble.d.ts.map +1 -0
  68. package/dist/transport/ble.js +434 -0
  69. package/dist/transport/ble.js.map +1 -0
  70. package/dist/transport/index.d.ts +5 -0
  71. package/dist/transport/index.d.ts.map +1 -0
  72. package/dist/transport/index.js +5 -0
  73. package/dist/transport/index.js.map +1 -0
  74. package/dist/ui/index.d.ts +2 -0
  75. package/dist/ui/index.d.ts.map +1 -0
  76. package/dist/ui/index.js +2 -0
  77. package/dist/ui/index.js.map +1 -0
  78. package/dist/ui/server.d.ts +16 -0
  79. package/dist/ui/server.d.ts.map +1 -0
  80. package/dist/ui/server.js +510 -0
  81. package/dist/ui/server.js.map +1 -0
  82. package/package.json +79 -0
  83. package/src/bin/bitchat.ts +87 -0
  84. package/src/client.ts +519 -0
  85. package/src/crypto/index.ts +22 -0
  86. package/src/crypto/noise.ts +574 -0
  87. package/src/crypto/signing.ts +66 -0
  88. package/src/index.ts +95 -0
  89. package/src/mesh/deduplicator.ts +129 -0
  90. package/src/mesh/index.ts +6 -0
  91. package/src/mesh/router.ts +258 -0
  92. package/src/protocol/binary.ts +345 -0
  93. package/src/protocol/constants.ts +43 -0
  94. package/src/protocol/index.ts +15 -0
  95. package/src/protocol/packets.ts +223 -0
  96. package/src/protocol/types.ts +182 -0
  97. package/src/session/index.ts +9 -0
  98. package/src/session/manager.ts +476 -0
  99. package/src/transport/ble.ts +553 -0
  100. package/src/transport/index.ts +10 -0
  101. package/src/ui/index.ts +1 -0
  102. 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"}