@antseed/node 0.2.108 → 0.2.109

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.
@@ -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
- attachRawSocket(socket: Socket, initialData?: Uint8Array): void;
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":"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"}
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
- attachRawSocket(socket, initialData) {
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
- this.emit("message", new Uint8Array(chunk));
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
- this.emit("message", initialData);
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
- try {
242
- await loadNodeDatachannel();
243
- }
244
- catch {
245
- // node-datachannel not available — TCP fallback will be used
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
- if (this._transportMode === "webrtc") {
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: [...LOCAL_CONNECTION_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: buildConnectionAuthEnvelope("intro", this._localPeerId, this._localWallet),
436
- capabilities: [...LOCAL_CONNECTION_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
- _handleInboundSocket(socket) {
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
- if (buffer.length + chunk.length > MAX_INITIAL_LINE_BYTES) {
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
- _acceptTcpInbound(socket, remotePeerId, remainingData, remoteCapabilities) {
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
- const rtc = this._createRtcPeer(remotePeerId);
605
- conn.attachRtcPeer(rtc);
606
- this._wireRtcPeer(conn, rtc, socket, false);
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: this._normalizeDescriptionType(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
  }