@antseed/node 0.2.108 → 0.2.110
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/discovery/announcer.d.ts.map +1 -1
- package/dist/discovery/announcer.js +3 -1
- package/dist/discovery/announcer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +27 -34
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +58 -31
- package/dist/node.js.map +1 -1
- package/dist/p2p/connection-auth.d.ts +44 -3
- package/dist/p2p/connection-auth.d.ts.map +1 -1
- package/dist/p2p/connection-auth.js +142 -10
- package/dist/p2p/connection-auth.js.map +1 -1
- package/dist/p2p/connection-manager.d.ts +19 -3
- package/dist/p2p/connection-manager.d.ts.map +1 -1
- package/dist/p2p/connection-manager.js +288 -31
- package/dist/p2p/connection-manager.js.map +1 -1
- package/dist/p2p/secure-channel.d.ts +58 -0
- package/dist/p2p/secure-channel.d.ts.map +1 -0
- package/dist/p2p/secure-channel.js +126 -0
- package/dist/p2p/secure-channel.js.map +1 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-auth.js","sourceRoot":"","sources":["../../src/p2p/connection-auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connection-auth.js","sourceRoot":"","sources":["../../src/p2p/connection-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,16 @@ import { type PeerId } from "../types/peer.js";
|
|
|
5
5
|
import { ConnectionState, type ConnectionConfig } from "../types/connection.js";
|
|
6
6
|
import { type IceConfig } from "./ice-config.js";
|
|
7
7
|
import type { Wallet } from "ethers";
|
|
8
|
+
import { type TransportCrypto } from "./secure-channel.js";
|
|
8
9
|
export interface PeerEndpoint {
|
|
9
10
|
host: string;
|
|
10
11
|
port: number;
|
|
11
12
|
}
|
|
12
13
|
type MetadataProvider = () => object | null;
|
|
14
|
+
export interface ConnectionManagerOptions {
|
|
15
|
+
/** Refuse plaintext TCP and unsigned SDP in both directions. Default false (legacy interop). */
|
|
16
|
+
requireSecureTransport?: boolean;
|
|
17
|
+
}
|
|
13
18
|
/** Represents a single P2P connection. */
|
|
14
19
|
export declare class PeerConnection extends EventEmitter {
|
|
15
20
|
readonly remotePeerId: PeerId;
|
|
@@ -22,6 +27,7 @@ export declare class PeerConnection extends EventEmitter {
|
|
|
22
27
|
private _rawSocket;
|
|
23
28
|
private _signalingSocket;
|
|
24
29
|
private _remoteCapabilities;
|
|
30
|
+
private _crypto;
|
|
25
31
|
constructor(config: ConnectionConfig);
|
|
26
32
|
get state(): ConnectionState;
|
|
27
33
|
setRemoteCapabilities(capabilities: Iterable<string>): void;
|
|
@@ -29,7 +35,10 @@ export declare class PeerConnection extends EventEmitter {
|
|
|
29
35
|
attachRtcPeer(rtc: NativeRtcPeerConnection): void;
|
|
30
36
|
attachSignalingSocket(socket: Socket): void;
|
|
31
37
|
attachDataChannel(channel: NativeDataChannel): void;
|
|
32
|
-
|
|
38
|
+
/** True for encrypted TCP framing or a (DTLS) data channel; false for legacy plaintext TCP. */
|
|
39
|
+
get isEncryptedTransport(): boolean;
|
|
40
|
+
get transportDescription(): "webrtc" | "tcp-encrypted" | "tcp-plaintext";
|
|
41
|
+
attachRawSocket(socket: Socket, initialData?: Uint8Array, crypto?: TransportCrypto): void;
|
|
33
42
|
fail(err: Error): void;
|
|
34
43
|
/** Transition to a new state and emit event. */
|
|
35
44
|
setState(newState: ConnectionState): void;
|
|
@@ -55,13 +64,17 @@ export declare class ConnectionManager extends EventEmitter {
|
|
|
55
64
|
private _server;
|
|
56
65
|
private _transportMode;
|
|
57
66
|
private _metadataProvider;
|
|
67
|
+
private _requireSecureTransport;
|
|
58
68
|
private _ipConnectionCounts;
|
|
59
69
|
private readonly _introReplayGuard;
|
|
60
70
|
private static _knownEndpoints;
|
|
61
71
|
private static _detectedTransportMode;
|
|
62
|
-
constructor(iceConfig?: IceConfig);
|
|
63
|
-
static init(iceConfig?: IceConfig): Promise<ConnectionManager>;
|
|
72
|
+
constructor(iceConfig?: IceConfig, options?: ConnectionManagerOptions);
|
|
73
|
+
static init(iceConfig?: IceConfig, options?: ConnectionManagerOptions): Promise<ConnectionManager>;
|
|
64
74
|
get iceConfig(): IceConfig;
|
|
75
|
+
/** True when node-datachannel loaded and the probe succeeded. */
|
|
76
|
+
get supportsWebRtc(): boolean;
|
|
77
|
+
private _localCapabilities;
|
|
65
78
|
get connections(): ReadonlyMap<PeerId, PeerConnection>;
|
|
66
79
|
getListeningPort(): number | null;
|
|
67
80
|
setMetadataProvider(provider: MetadataProvider): void;
|
|
@@ -89,8 +102,11 @@ export declare class ConnectionManager extends EventEmitter {
|
|
|
89
102
|
closeAll(): void;
|
|
90
103
|
private _createWebRtcConnection;
|
|
91
104
|
private _createTcpConnection;
|
|
105
|
+
/** Buffer until the first newline, then detach and hand over line + remaining bytes. */
|
|
106
|
+
private _readSingleLine;
|
|
92
107
|
private _handleInboundSocket;
|
|
93
108
|
private _serveHttpMetadata;
|
|
109
|
+
private _acceptEncryptedTcpInbound;
|
|
94
110
|
private _acceptTcpInbound;
|
|
95
111
|
private _acceptWebRtcInbound;
|
|
96
112
|
private _wireRtcPeer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/p2p/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/p2p/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
2
4
|
import net from "node:net";
|
|
3
5
|
import { ConnectionState } from "../types/connection.js";
|
|
4
|
-
import { CONNECTION_CAPABILITY_RESPONSE_AUTH_V1, CONNECTION_CAPABILITY_COOPERATIVE_CLOSE_V1, } from "../types/protocol.js";
|
|
6
|
+
import { CONNECTION_CAPABILITY_RESPONSE_AUTH_V1, CONNECTION_CAPABILITY_COOPERATIVE_CLOSE_V1, CONNECTION_CAPABILITY_SIGNED_SDP_V1, CONNECTION_CAPABILITY_TCP_ENC_V1, CONNECTION_CAPABILITY_WEBRTC_V1, } from "../types/protocol.js";
|
|
5
7
|
import { getDefaultIceConfig } from "./ice-config.js";
|
|
6
|
-
import { NonceReplayGuard, buildConnectionAuthEnvelope, verifyConnectionAuthEnvelope, } from "./connection-auth.js";
|
|
8
|
+
import { NonceReplayGuard, buildConnectionAuthEnvelope, buildSdpAuthEnvelope, buildTcpEncAck, buildTcpEncOffer, verifyConnectionAuthEnvelope, verifySdpAuthEnvelope, verifyTcpEncAck, verifyTcpEncOffer, } from "./connection-auth.js";
|
|
9
|
+
import { createTransportCrypto, deriveSessionKeys, generateEphemeralKeyPair, } from "./secure-channel.js";
|
|
7
10
|
let _nodeDatachannel = null;
|
|
8
11
|
async function loadNodeDatachannel() {
|
|
9
12
|
if (_nodeDatachannel)
|
|
@@ -11,6 +14,29 @@ async function loadNodeDatachannel() {
|
|
|
11
14
|
_nodeDatachannel = await import("node-datachannel");
|
|
12
15
|
return _nodeDatachannel;
|
|
13
16
|
}
|
|
17
|
+
const NDC_PROBE_SOURCE = "const m = require(process.argv[1]);" +
|
|
18
|
+
"const pc = new m.PeerConnection('antseed-probe', { iceServers: [] });" +
|
|
19
|
+
"const dc = pc.createDataChannel('probe', { ordered: true });" +
|
|
20
|
+
"dc.close(); pc.close();" +
|
|
21
|
+
"process.exit(0);";
|
|
22
|
+
/**
|
|
23
|
+
* Exercise node-datachannel in a disposable child process first: a broken
|
|
24
|
+
* native build can segfault, which no in-process try/catch survives. A dead
|
|
25
|
+
* or hung child just means TCP fallback instead of a crashed node.
|
|
26
|
+
*/
|
|
27
|
+
function probeNodeDatachannelSafely() {
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
let modulePath;
|
|
30
|
+
try {
|
|
31
|
+
modulePath = createRequire(import.meta.url).resolve("node-datachannel");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
resolve(false);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
execFile(process.execPath, ["-e", NDC_PROBE_SOURCE, modulePath], { timeout: 10_000 }, (err) => resolve(!err));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
14
40
|
function getNodeDatachannel() {
|
|
15
41
|
if (!_nodeDatachannel)
|
|
16
42
|
throw new Error("node-datachannel not loaded");
|
|
@@ -24,6 +50,8 @@ const TCP_KEEPALIVE_INITIAL_DELAY_MS = 10_000;
|
|
|
24
50
|
const LOCAL_CONNECTION_CAPABILITIES = [
|
|
25
51
|
CONNECTION_CAPABILITY_RESPONSE_AUTH_V1,
|
|
26
52
|
CONNECTION_CAPABILITY_COOPERATIVE_CLOSE_V1,
|
|
53
|
+
CONNECTION_CAPABILITY_SIGNED_SDP_V1,
|
|
54
|
+
CONNECTION_CAPABILITY_TCP_ENC_V1,
|
|
27
55
|
];
|
|
28
56
|
/** Represents a single P2P connection. */
|
|
29
57
|
export class PeerConnection extends EventEmitter {
|
|
@@ -37,6 +65,7 @@ export class PeerConnection extends EventEmitter {
|
|
|
37
65
|
_rawSocket = null;
|
|
38
66
|
_signalingSocket = null;
|
|
39
67
|
_remoteCapabilities = new Set();
|
|
68
|
+
_crypto = null;
|
|
40
69
|
constructor(config) {
|
|
41
70
|
super();
|
|
42
71
|
this.remotePeerId = config.remotePeerId;
|
|
@@ -83,11 +112,40 @@ export class PeerConnection extends EventEmitter {
|
|
|
83
112
|
}
|
|
84
113
|
});
|
|
85
114
|
}
|
|
86
|
-
|
|
115
|
+
/** True for encrypted TCP framing or a (DTLS) data channel; false for legacy plaintext TCP. */
|
|
116
|
+
get isEncryptedTransport() {
|
|
117
|
+
return this._crypto !== null || this._dataChannel !== null;
|
|
118
|
+
}
|
|
119
|
+
get transportDescription() {
|
|
120
|
+
if (this._dataChannel !== null)
|
|
121
|
+
return "webrtc";
|
|
122
|
+
if (this._crypto !== null)
|
|
123
|
+
return "tcp-encrypted";
|
|
124
|
+
return "tcp-plaintext";
|
|
125
|
+
}
|
|
126
|
+
attachRawSocket(socket, initialData, crypto) {
|
|
87
127
|
this._rawSocket = socket;
|
|
128
|
+
this._crypto = crypto ?? null;
|
|
88
129
|
socket.setKeepAlive(true, TCP_KEEPALIVE_INITIAL_DELAY_MS);
|
|
130
|
+
const deliver = (chunk) => {
|
|
131
|
+
if (!this._crypto) {
|
|
132
|
+
this.emit("message", chunk);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let messages;
|
|
136
|
+
try {
|
|
137
|
+
messages = this._crypto.decryptor.push(chunk);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
this.fail(err instanceof Error ? err : new Error(String(err)));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
for (const message of messages) {
|
|
144
|
+
this.emit("message", message);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
89
147
|
socket.on("data", (chunk) => {
|
|
90
|
-
|
|
148
|
+
deliver(new Uint8Array(chunk));
|
|
91
149
|
});
|
|
92
150
|
socket.on("error", (err) => {
|
|
93
151
|
this.fail(err);
|
|
@@ -103,7 +161,7 @@ export class PeerConnection extends EventEmitter {
|
|
|
103
161
|
}
|
|
104
162
|
if (initialData && initialData.length > 0) {
|
|
105
163
|
queueMicrotask(() => {
|
|
106
|
-
|
|
164
|
+
deliver(initialData);
|
|
107
165
|
});
|
|
108
166
|
}
|
|
109
167
|
}
|
|
@@ -158,6 +216,19 @@ export class PeerConnection extends EventEmitter {
|
|
|
158
216
|
this.fail(err);
|
|
159
217
|
throw err;
|
|
160
218
|
}
|
|
219
|
+
if (this._crypto) {
|
|
220
|
+
let frame;
|
|
221
|
+
try {
|
|
222
|
+
frame = this._crypto.encryptor.encrypt(data);
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
const wrapped = err instanceof Error ? err : new Error(String(err));
|
|
226
|
+
this.fail(wrapped);
|
|
227
|
+
throw wrapped;
|
|
228
|
+
}
|
|
229
|
+
this._rawSocket.write(frame);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
161
232
|
this._rawSocket.write(Buffer.from(data));
|
|
162
233
|
}
|
|
163
234
|
/** Close the connection gracefully. */
|
|
@@ -228,27 +299,40 @@ export class ConnectionManager extends EventEmitter {
|
|
|
228
299
|
_server = null;
|
|
229
300
|
_transportMode;
|
|
230
301
|
_metadataProvider = null;
|
|
302
|
+
_requireSecureTransport;
|
|
231
303
|
_ipConnectionCounts = new Map();
|
|
232
304
|
_introReplayGuard = new NonceReplayGuard();
|
|
233
305
|
static _knownEndpoints = new Map();
|
|
234
306
|
static _detectedTransportMode = null;
|
|
235
|
-
constructor(iceConfig) {
|
|
307
|
+
constructor(iceConfig, options) {
|
|
236
308
|
super();
|
|
237
309
|
this._iceConfig = iceConfig ?? getDefaultIceConfig();
|
|
238
310
|
this._transportMode = ConnectionManager._detectTransportMode();
|
|
311
|
+
this._requireSecureTransport = options?.requireSecureTransport ?? false;
|
|
239
312
|
}
|
|
240
|
-
static async init(iceConfig) {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
313
|
+
static async init(iceConfig, options) {
|
|
314
|
+
if (_nodeDatachannel || await probeNodeDatachannelSafely()) {
|
|
315
|
+
try {
|
|
316
|
+
await loadNodeDatachannel();
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// node-datachannel not available — TCP fallback will be used
|
|
320
|
+
}
|
|
246
321
|
}
|
|
247
|
-
return new ConnectionManager(iceConfig);
|
|
322
|
+
return new ConnectionManager(iceConfig, options);
|
|
248
323
|
}
|
|
249
324
|
get iceConfig() {
|
|
250
325
|
return this._iceConfig;
|
|
251
326
|
}
|
|
327
|
+
/** True when node-datachannel loaded and the probe succeeded. */
|
|
328
|
+
get supportsWebRtc() {
|
|
329
|
+
return this._transportMode === "webrtc";
|
|
330
|
+
}
|
|
331
|
+
_localCapabilities() {
|
|
332
|
+
return this.supportsWebRtc
|
|
333
|
+
? [...LOCAL_CONNECTION_CAPABILITIES, CONNECTION_CAPABILITY_WEBRTC_V1]
|
|
334
|
+
: [...LOCAL_CONNECTION_CAPABILITIES];
|
|
335
|
+
}
|
|
252
336
|
get connections() {
|
|
253
337
|
return this._connections;
|
|
254
338
|
}
|
|
@@ -338,6 +422,9 @@ export class ConnectionManager extends EventEmitter {
|
|
|
338
422
|
throw new Error(`Connection to ${config.remotePeerId} already exists`);
|
|
339
423
|
}
|
|
340
424
|
const conn = new PeerConnection(config);
|
|
425
|
+
if (config.remoteCapabilities && config.remoteCapabilities.length > 0) {
|
|
426
|
+
conn.setRemoteCapabilities(config.remoteCapabilities);
|
|
427
|
+
}
|
|
341
428
|
this._registerConnection(config.remotePeerId, conn);
|
|
342
429
|
conn.startTimeout();
|
|
343
430
|
if (!this._localPeerId) {
|
|
@@ -360,7 +447,14 @@ export class ConnectionManager extends EventEmitter {
|
|
|
360
447
|
return conn;
|
|
361
448
|
}
|
|
362
449
|
ConnectionManager.registerPeerEndpoint(config.remotePeerId, endpoint);
|
|
363
|
-
|
|
450
|
+
// Encrypted TCP is preferred: data channels cap messages at ~256 KiB
|
|
451
|
+
// (breaking 1 MiB protocol chunks) and set up slower. WebRTC is for peers
|
|
452
|
+
// that cannot do TCP at all; legacy peers crash-guard `hello` away, so
|
|
453
|
+
// unknown peers also get TCP.
|
|
454
|
+
const useWebRtc = this._transportMode === "webrtc"
|
|
455
|
+
&& conn.hasRemoteCapability(CONNECTION_CAPABILITY_WEBRTC_V1)
|
|
456
|
+
&& !conn.hasRemoteCapability(CONNECTION_CAPABILITY_TCP_ENC_V1);
|
|
457
|
+
if (useWebRtc) {
|
|
364
458
|
this._createWebRtcConnection(config, conn, endpoint);
|
|
365
459
|
}
|
|
366
460
|
else {
|
|
@@ -403,10 +497,11 @@ export class ConnectionManager extends EventEmitter {
|
|
|
403
497
|
this._applySignalToRtc(rtc, msg, conn);
|
|
404
498
|
}, (err) => conn.fail(err), "");
|
|
405
499
|
signalingSocket.once("connect", () => {
|
|
500
|
+
const capabilities = this._localCapabilities();
|
|
406
501
|
this._sendLine(signalingSocket, {
|
|
407
502
|
type: "hello",
|
|
408
|
-
auth: buildConnectionAuthEnvelope("hello", this._localPeerId, this._localWallet),
|
|
409
|
-
capabilities
|
|
503
|
+
auth: buildConnectionAuthEnvelope("hello", this._localPeerId, this._localWallet, Date.now(), { capabilities }),
|
|
504
|
+
capabilities,
|
|
410
505
|
});
|
|
411
506
|
rtc = this._createRtcPeer(config.remotePeerId);
|
|
412
507
|
conn.attachRtcPeer(rtc);
|
|
@@ -429,13 +524,61 @@ export class ConnectionManager extends EventEmitter {
|
|
|
429
524
|
}
|
|
430
525
|
_createTcpConnection(config, conn, endpoint) {
|
|
431
526
|
const socket = net.connect({ host: endpoint.host, port: endpoint.port });
|
|
527
|
+
// Once offered, the handshake fails closed on timeout — never a plaintext downgrade.
|
|
528
|
+
const useEncryption = this._requireSecureTransport || conn.hasRemoteCapability(CONNECTION_CAPABILITY_TCP_ENC_V1);
|
|
432
529
|
socket.once("connect", () => {
|
|
530
|
+
const capabilities = this._localCapabilities();
|
|
531
|
+
if (!useEncryption) {
|
|
532
|
+
// Legacy plaintext path keeps the v1 envelope old responders can verify.
|
|
533
|
+
this._sendLine(socket, {
|
|
534
|
+
type: "intro",
|
|
535
|
+
auth: buildConnectionAuthEnvelope("intro", this._localPeerId, this._localWallet),
|
|
536
|
+
capabilities,
|
|
537
|
+
});
|
|
538
|
+
conn.attachRawSocket(socket);
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
const ephemeral = generateEphemeralKeyPair();
|
|
542
|
+
// v2 envelope binds capabilities and the enc key, so stripping either
|
|
543
|
+
// downgrades to an unverifiable signature instead of plaintext.
|
|
544
|
+
const auth = buildConnectionAuthEnvelope("intro", this._localPeerId, this._localWallet, Date.now(), { capabilities, encPub: ephemeral.publicKeyHex });
|
|
433
545
|
this._sendLine(socket, {
|
|
434
546
|
type: "intro",
|
|
435
|
-
auth
|
|
436
|
-
capabilities
|
|
547
|
+
auth,
|
|
548
|
+
capabilities,
|
|
549
|
+
enc: buildTcpEncOffer(this._localWallet, this._localPeerId, auth.ts, auth.nonce, ephemeral.publicKeyHex),
|
|
550
|
+
});
|
|
551
|
+
// Everything after the enc-ack line is encrypted frames.
|
|
552
|
+
this._readSingleLine(socket, (line, remaining) => {
|
|
553
|
+
let ack;
|
|
554
|
+
try {
|
|
555
|
+
ack = JSON.parse(line);
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
conn.fail(new Error(`Peer ${config.remotePeerId} sent an invalid enc-ack`));
|
|
559
|
+
socket.destroy();
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
const verified = verifyTcpEncAck({
|
|
563
|
+
ack,
|
|
564
|
+
expectedPeerId: config.remotePeerId,
|
|
565
|
+
initiatorNonce: auth.nonce,
|
|
566
|
+
});
|
|
567
|
+
if (!verified.ok) {
|
|
568
|
+
conn.fail(new Error(`Encrypted transport handshake with ${config.remotePeerId} failed: ${verified.reason}`));
|
|
569
|
+
socket.destroy();
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
const keys = deriveSessionKeys(ephemeral.privateKey, ack.pub, {
|
|
573
|
+
initiatorPeerId: this._localPeerId,
|
|
574
|
+
responderPeerId: config.remotePeerId,
|
|
575
|
+
initiatorNonce: auth.nonce,
|
|
576
|
+
responderNonce: ack.nonce,
|
|
577
|
+
initiatorPubHex: ephemeral.publicKeyHex,
|
|
578
|
+
responderPubHex: ack.pub,
|
|
579
|
+
}, true);
|
|
580
|
+
conn.attachRawSocket(socket, remaining.length > 0 ? new Uint8Array(remaining) : undefined, createTransportCrypto(keys));
|
|
437
581
|
});
|
|
438
|
-
conn.attachRawSocket(socket);
|
|
439
582
|
});
|
|
440
583
|
socket.on("error", (err) => {
|
|
441
584
|
if (conn.state === ConnectionState.Connecting) {
|
|
@@ -448,21 +591,53 @@ export class ConnectionManager extends EventEmitter {
|
|
|
448
591
|
}
|
|
449
592
|
});
|
|
450
593
|
}
|
|
451
|
-
|
|
594
|
+
/** Buffer until the first newline, then detach and hand over line + remaining bytes. */
|
|
595
|
+
_readSingleLine(socket, onLine) {
|
|
452
596
|
let buffer = Buffer.alloc(0);
|
|
453
|
-
const timeout = setTimeout(() => {
|
|
454
|
-
socket.destroy();
|
|
455
|
-
}, INITIAL_LINE_TIMEOUT_MS);
|
|
456
597
|
const onData = (chunk) => {
|
|
457
|
-
|
|
598
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
599
|
+
const lineBreak = buffer.indexOf(0x0a); // '\n'
|
|
600
|
+
if (lineBreak < 0) {
|
|
601
|
+
if (buffer.length > MAX_INITIAL_LINE_BYTES) {
|
|
602
|
+
socket.off("data", onData);
|
|
603
|
+
socket.destroy();
|
|
604
|
+
}
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
// Only the line itself is size-limited — the same chunk may carry
|
|
608
|
+
// payload bytes (e.g. an encrypted frame right after the enc-ack).
|
|
609
|
+
if (lineBreak > MAX_INITIAL_LINE_BYTES) {
|
|
458
610
|
socket.off("data", onData);
|
|
459
|
-
clearTimeout(timeout);
|
|
460
611
|
socket.destroy();
|
|
461
612
|
return;
|
|
462
613
|
}
|
|
614
|
+
socket.off("data", onData);
|
|
615
|
+
const line = buffer.subarray(0, lineBreak).toString("utf8").trim();
|
|
616
|
+
const remaining = buffer.subarray(lineBreak + 1);
|
|
617
|
+
onLine(line, remaining);
|
|
618
|
+
};
|
|
619
|
+
socket.on("data", onData);
|
|
620
|
+
}
|
|
621
|
+
_handleInboundSocket(socket) {
|
|
622
|
+
let buffer = Buffer.alloc(0);
|
|
623
|
+
const timeout = setTimeout(() => {
|
|
624
|
+
socket.destroy();
|
|
625
|
+
}, INITIAL_LINE_TIMEOUT_MS);
|
|
626
|
+
const onData = (chunk) => {
|
|
463
627
|
buffer = Buffer.concat([buffer, chunk]);
|
|
464
628
|
const lineBreak = buffer.indexOf(0x0a); // '\n'
|
|
465
629
|
if (lineBreak < 0) {
|
|
630
|
+
if (buffer.length > MAX_INITIAL_LINE_BYTES) {
|
|
631
|
+
socket.off("data", onData);
|
|
632
|
+
clearTimeout(timeout);
|
|
633
|
+
socket.destroy();
|
|
634
|
+
}
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
if (lineBreak > MAX_INITIAL_LINE_BYTES) {
|
|
638
|
+
socket.off("data", onData);
|
|
639
|
+
clearTimeout(timeout);
|
|
640
|
+
socket.destroy();
|
|
466
641
|
return;
|
|
467
642
|
}
|
|
468
643
|
socket.off("data", onData);
|
|
@@ -486,9 +661,14 @@ export class ConnectionManager extends EventEmitter {
|
|
|
486
661
|
socket.destroy();
|
|
487
662
|
return;
|
|
488
663
|
}
|
|
664
|
+
const wireEncPub = intro.type === "intro" && typeof intro.enc?.pub === "string"
|
|
665
|
+
? intro.enc.pub
|
|
666
|
+
: null;
|
|
489
667
|
const verified = verifyConnectionAuthEnvelope({
|
|
490
668
|
type: intro.type,
|
|
491
669
|
auth: intro.auth,
|
|
670
|
+
wireCapabilities: intro.capabilities,
|
|
671
|
+
wireEncPub,
|
|
492
672
|
replayGuard: this._introReplayGuard,
|
|
493
673
|
});
|
|
494
674
|
if (!verified.ok || !verified.peerId) {
|
|
@@ -497,10 +677,23 @@ export class ConnectionManager extends EventEmitter {
|
|
|
497
677
|
}
|
|
498
678
|
const remoteCapabilities = normalizeCapabilities(intro.capabilities);
|
|
499
679
|
if (intro.type === "intro") {
|
|
680
|
+
if (intro.enc) {
|
|
681
|
+
this._acceptEncryptedTcpInbound(socket, verified.peerId, intro, remaining, remoteCapabilities);
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
if (this._requireSecureTransport) {
|
|
685
|
+
socket.destroy();
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
500
688
|
this._acceptTcpInbound(socket, verified.peerId, remaining, remoteCapabilities);
|
|
501
689
|
return;
|
|
502
690
|
}
|
|
503
691
|
if (intro.type === "hello") {
|
|
692
|
+
if (this._transportMode !== "webrtc") {
|
|
693
|
+
// No working WebRTC stack — refuse instead of crashing on rtc creation.
|
|
694
|
+
socket.destroy();
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
504
697
|
this._acceptWebRtcInbound(socket, verified.peerId, remaining.toString("utf8"), remoteCapabilities);
|
|
505
698
|
return;
|
|
506
699
|
}
|
|
@@ -571,7 +764,36 @@ export class ConnectionManager extends EventEmitter {
|
|
|
571
764
|
`\r\n` +
|
|
572
765
|
body);
|
|
573
766
|
}
|
|
574
|
-
|
|
767
|
+
_acceptEncryptedTcpInbound(socket, remotePeerId, intro, remainingData, remoteCapabilities) {
|
|
768
|
+
if (!this._localPeerId || !this._localWallet) {
|
|
769
|
+
// No wallet — cannot sign a valid ack.
|
|
770
|
+
socket.destroy();
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
const offerVerified = verifyTcpEncOffer({
|
|
774
|
+
offer: intro.enc,
|
|
775
|
+
peerId: remotePeerId,
|
|
776
|
+
introTs: intro.auth.ts,
|
|
777
|
+
introNonce: intro.auth.nonce,
|
|
778
|
+
});
|
|
779
|
+
if (!offerVerified.ok) {
|
|
780
|
+
socket.destroy();
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
const ephemeral = generateEphemeralKeyPair();
|
|
784
|
+
const ack = buildTcpEncAck(this._localWallet, this._localPeerId, ephemeral.publicKeyHex, intro.auth.nonce);
|
|
785
|
+
this._sendLine(socket, ack);
|
|
786
|
+
const keys = deriveSessionKeys(ephemeral.privateKey, intro.enc.pub, {
|
|
787
|
+
initiatorPeerId: remotePeerId,
|
|
788
|
+
responderPeerId: this._localPeerId,
|
|
789
|
+
initiatorNonce: intro.auth.nonce,
|
|
790
|
+
responderNonce: ack.nonce,
|
|
791
|
+
initiatorPubHex: intro.enc.pub,
|
|
792
|
+
responderPubHex: ephemeral.publicKeyHex,
|
|
793
|
+
}, false);
|
|
794
|
+
this._acceptTcpInbound(socket, remotePeerId, remainingData, remoteCapabilities, createTransportCrypto(keys));
|
|
795
|
+
}
|
|
796
|
+
_acceptTcpInbound(socket, remotePeerId, remainingData, remoteCapabilities, crypto) {
|
|
575
797
|
const existing = this._connections.get(remotePeerId);
|
|
576
798
|
if (existing && existing.state !== ConnectionState.Closed && existing.state !== ConnectionState.Failed) {
|
|
577
799
|
// Replace stale/ghost connections from the same peer instead of rejecting
|
|
@@ -584,7 +806,7 @@ export class ConnectionManager extends EventEmitter {
|
|
|
584
806
|
});
|
|
585
807
|
conn.setRemoteCapabilities(remoteCapabilities);
|
|
586
808
|
this._registerConnection(remotePeerId, conn);
|
|
587
|
-
conn.attachRawSocket(socket, remainingData.length > 0 ? new Uint8Array(remainingData) : undefined);
|
|
809
|
+
conn.attachRawSocket(socket, remainingData.length > 0 ? new Uint8Array(remainingData) : undefined, crypto);
|
|
588
810
|
this.emit("connection", conn);
|
|
589
811
|
}
|
|
590
812
|
_acceptWebRtcInbound(socket, remotePeerId, initialSignalingBuffer, remoteCapabilities) {
|
|
@@ -601,9 +823,17 @@ export class ConnectionManager extends EventEmitter {
|
|
|
601
823
|
conn.setRemoteCapabilities(remoteCapabilities);
|
|
602
824
|
conn.attachSignalingSocket(socket);
|
|
603
825
|
this._registerConnection(remotePeerId, conn);
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
826
|
+
let rtc;
|
|
827
|
+
try {
|
|
828
|
+
rtc = this._createRtcPeer(remotePeerId);
|
|
829
|
+
conn.attachRtcPeer(rtc);
|
|
830
|
+
this._wireRtcPeer(conn, rtc, socket, false);
|
|
831
|
+
}
|
|
832
|
+
catch (err) {
|
|
833
|
+
conn.fail(err instanceof Error ? err : new Error(String(err)));
|
|
834
|
+
socket.destroy();
|
|
835
|
+
return;
|
|
836
|
+
}
|
|
607
837
|
this._attachSignalingParser(socket, (msg) => {
|
|
608
838
|
this._applySignalToRtc(rtc, msg, conn);
|
|
609
839
|
}, (err) => conn.fail(err), initialSignalingBuffer);
|
|
@@ -619,10 +849,16 @@ export class ConnectionManager extends EventEmitter {
|
|
|
619
849
|
}
|
|
620
850
|
_wireRtcPeer(conn, rtc, signalingSocket, isInitiator) {
|
|
621
851
|
rtc.onLocalDescription((sdp, descriptionType) => {
|
|
852
|
+
const normalizedType = this._normalizeDescriptionType(descriptionType);
|
|
853
|
+
// Signing the SDP binds its DTLS fingerprint to our identity.
|
|
854
|
+
const auth = this._localPeerId && this._localWallet
|
|
855
|
+
? buildSdpAuthEnvelope(this._localPeerId, this._localWallet, normalizedType, sdp)
|
|
856
|
+
: undefined;
|
|
622
857
|
this._sendLine(signalingSocket, {
|
|
623
858
|
type: "sdp",
|
|
624
859
|
sdp,
|
|
625
|
-
descriptionType:
|
|
860
|
+
descriptionType: normalizedType,
|
|
861
|
+
...(auth ? { auth } : {}),
|
|
626
862
|
});
|
|
627
863
|
});
|
|
628
864
|
rtc.onLocalCandidate((candidate, mid) => {
|
|
@@ -667,9 +903,30 @@ export class ConnectionManager extends EventEmitter {
|
|
|
667
903
|
_applySignalToRtc(rtc, signal, conn) {
|
|
668
904
|
try {
|
|
669
905
|
if (signal.type === "sdp") {
|
|
906
|
+
if (signal.auth) {
|
|
907
|
+
const verified = verifySdpAuthEnvelope({
|
|
908
|
+
auth: signal.auth,
|
|
909
|
+
expectedPeerId: conn.remotePeerId,
|
|
910
|
+
descriptionType: signal.descriptionType,
|
|
911
|
+
sdp: signal.sdp,
|
|
912
|
+
replayGuard: this._introReplayGuard,
|
|
913
|
+
});
|
|
914
|
+
if (!verified.ok) {
|
|
915
|
+
conn.fail(new Error(`SDP signature from ${conn.remotePeerId} rejected: ${verified.reason}`));
|
|
916
|
+
return;
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
else if (this._requireSecureTransport
|
|
920
|
+
|| conn.hasRemoteCapability(CONNECTION_CAPABILITY_SIGNED_SDP_V1)) {
|
|
921
|
+
// Peer is known to sign its SDP — unsigned means a stripped signature.
|
|
922
|
+
conn.fail(new Error(`Peer ${conn.remotePeerId} sent unsigned SDP`));
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
670
925
|
rtc.setRemoteDescription(signal.sdp, signal.descriptionType);
|
|
671
926
|
}
|
|
672
927
|
else {
|
|
928
|
+
// Candidates stay unsigned: DTLS still verifies the cert against the
|
|
929
|
+
// signed SDP fingerprint, so tampering can only break connectivity.
|
|
673
930
|
rtc.addRemoteCandidate(signal.candidate, signal.mid);
|
|
674
931
|
}
|
|
675
932
|
}
|