werift 0.24.0 → 0.24.1
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/lib/common/src/binary.js +2 -3
- package/lib/common/src/binary.js.map +1 -1
- package/lib/ice/src/ice.js +4 -9
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
- package/lib/ice/src/internal/selectAddresses.js +40 -0
- package/lib/ice/src/internal/selectAddresses.js.map +1 -0
- package/lib/ice/src/utils.js +2 -31
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/ice-server/src/stun/attributes.js +9 -47
- package/lib/ice-server/src/stun/attributes.js.map +1 -1
- package/lib/ice-server/src/stun/ip.d.ts +12 -0
- package/lib/ice-server/src/stun/ip.js +88 -0
- package/lib/ice-server/src/stun/ip.js.map +1 -0
- package/lib/index.mjs +217 -130
- package/lib/nonstandard/index.mjs +121 -54
- package/lib/rtp/src/codec/av1.js +11 -5
- package/lib/rtp/src/codec/av1.js.map +1 -1
- package/lib/rtp/src/codec/leb128.d.ts +5 -0
- package/lib/rtp/src/codec/leb128.js +24 -0
- package/lib/rtp/src/codec/leb128.js.map +1 -0
- package/lib/rtp/src/rtp/rtx.js +4 -6
- package/lib/rtp/src/rtp/rtx.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +2 -0
- package/lib/rtp/src/srtp/context/context.js +12 -12
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/sctp/src/param.js +31 -15
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.js +10 -9
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.js +2 -3
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/sdp.js +1 -35
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +17 -16
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +1 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from \"crypto\";\nimport AES from \"aes-js\";\n\nimport type { CipherAesBase } from \"../cipher\";\nimport { CipherAesCtr } from \"../cipher/ctr\";\nimport { CipherAesGcm } from \"../cipher/gcm\";\nimport {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n type SrtpProfile,\n} from \"../const\";\n\nexport class Context {\n srtpSSRCStates: { [ssrc: number]: SrtpSsrcState } = {};\n srtpSessionKey: Buffer;\n srtpSessionSalt: Buffer;\n srtpSessionAuthTag: Buffer;\n srtpSessionAuth: ReturnType<typeof createHmac>;\n srtcpSSRCStates: { [ssrc: number]: SrtcpSSRCState } = {};\n srtcpSessionKey: Buffer;\n srtcpSessionSalt: Buffer;\n srtcpSessionAuthTag: Buffer;\n srtcpSessionAuth: ReturnType<typeof createHmac>;\n\n cipher: CipherAesBase;\n\n constructor(\n public masterKey: Buffer,\n public masterSalt: Buffer,\n public profile: SrtpProfile,\n ) {\n {\n // aes-js plaintext require 16byte\n // so need to padding to 14 byte\n const diff = 14 - masterSalt.length;\n if (diff > 0) {\n this.masterSalt = Buffer.concat([masterSalt, Buffer.alloc(diff)]);\n }\n }\n\n this.srtpSessionKey = this.generateSessionKey(0);\n this.srtpSessionSalt = this.generateSessionSalt(2);\n this.srtpSessionAuthTag = this.generateSessionAuthTag(1);\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n\n this.srtcpSessionKey = this.generateSessionKey(3);\n this.srtcpSessionSalt = this.generateSessionSalt(5);\n this.srtcpSessionAuthTag = this.generateSessionAuthTag(4);\n this.srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n this.cipher = new CipherAesCtr(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt,\n this.srtpSessionAuthTag,\n this.srtcpSessionAuthTag,\n );\n break;\n case ProtectionProfileAeadAes128Gcm:\n this.cipher = new CipherAesGcm(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt,\n );\n break;\n }\n }\n\n generateSessionKey(label: number) {\n let sessionKey = Buffer.from(this.masterSalt);\n\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionKey.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];\n }\n\n sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);\n const block = new AES.AES(this.masterKey);\n return Buffer.from(block.encrypt(sessionKey) as ArrayBuffer);\n }\n\n generateSessionSalt(label: number) {\n let sessionSalt: Buffer = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionSalt.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];\n }\n sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);\n const block = new AES.AES(this.masterKey);\n sessionSalt = Buffer.from(block.encrypt(sessionSalt) as ArrayBuffer);\n return sessionSalt.subarray(0, 14);\n }\n\n generateSessionAuthTag(label: number) {\n const sessionAuthTag = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionAuthTag.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionAuthTag[j] = sessionAuthTag[j] ^ labelAndIndexOverKdr[i];\n }\n let firstRun: Buffer = Buffer.concat([\n sessionAuthTag,\n Buffer.from([0x00, 0x00]),\n ]);\n let secondRun: Buffer = Buffer.concat([\n sessionAuthTag,\n Buffer.from([0x00, 0x01]),\n ]);\n const block = new AES.AES(this.masterKey);\n firstRun = Buffer.from(block.encrypt(firstRun) as ArrayBuffer);\n secondRun = Buffer.from(block.encrypt(secondRun) as ArrayBuffer);\n return Buffer.concat([firstRun, secondRun.subarray(0, 4)]);\n }\n\n getSrtpSsrcState(ssrc: number) {\n let s = this.srtpSSRCStates[ssrc];\n if (s) return s;\n s = {\n ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.srtpSSRCStates[ssrc] = s;\n return s;\n }\n\n getSrtcpSsrcState(ssrc: number) {\n let s = this.srtcpSSRCStates[ssrc];\n if (s) return s;\n s = {\n srtcpIndex: 0,\n ssrc,\n };\n this.srtcpSSRCStates[ssrc] = s;\n return s;\n }\n\n // 3.3.1. Packet Index Determination, and ROC, s_l Update\n // In particular, out-of-order RTP packets with\n // sequence numbers close to 2^16 or zero must be properly handled.\n updateRolloverCount(sequenceNumber: number, s: SrtpSsrcState) {\n if (!s.rolloverHasProcessed) {\n s.rolloverHasProcessed = true;\n } else if (sequenceNumber === 0) {\n if (s.lastSequenceNumber > MaxROCDisorder) {\n s.rolloverCounter++;\n }\n } else if (\n s.lastSequenceNumber < MaxROCDisorder &&\n sequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n // https://github.com/shinyoshiaki/werift-webrtc/issues/94\n if (s.rolloverCounter > 0) {\n s.rolloverCounter--;\n }\n } else if (\n sequenceNumber < MaxROCDisorder &&\n s.lastSequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n s.rolloverCounter++;\n }\n s.lastSequenceNumber = sequenceNumber;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return this.srtpSessionAuth\n .update(buf)\n .update(rocRaw)\n .digest()\n .slice(0, 10);\n }\n\n index(ssrc: number) {\n const s = this.srtcpSSRCStates[ssrc];\n if (!s) {\n return 0;\n }\n return s.srtcpIndex;\n }\n\n setIndex(ssrc: number, index: number) {\n const s = this.getSrtcpSsrcState(ssrc);\n s.srtcpIndex = index % 0x7fffffff;\n }\n}\n\nexport interface SrtpSsrcState {\n ssrc: number;\n rolloverCounter: number;\n rolloverHasProcessed?: boolean;\n lastSequenceNumber: number;\n}\n\nexport type SrtcpSSRCState = {\n srtcpIndex: number;\n ssrc: number;\n};\n\nconst MaxROCDisorder = 100;\nconst MaxSequenceNumber = 65535;\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createHmac } from \"crypto\";\n\nimport type { CipherAesBase } from \"../cipher\";\nimport { CipherAesCtr } from \"../cipher/ctr\";\nimport { CipherAesGcm } from \"../cipher/gcm\";\nimport {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n type SrtpProfile,\n} from \"../const\";\n\n/** AES-128-ECB single-block encrypt for SRTP KDF (no padding). */\nexport function aes128EcbEncrypt(key: Buffer, plaintext: Buffer): Buffer {\n const cipher = createCipheriv(\"aes-128-ecb\", key, null);\n cipher.setAutoPadding(false);\n return Buffer.concat([cipher.update(plaintext), cipher.final()]);\n}\n\nexport class Context {\n srtpSSRCStates: { [ssrc: number]: SrtpSsrcState } = {};\n srtpSessionKey: Buffer;\n srtpSessionSalt: Buffer;\n srtpSessionAuthTag: Buffer;\n srtpSessionAuth: ReturnType<typeof createHmac>;\n srtcpSSRCStates: { [ssrc: number]: SrtcpSSRCState } = {};\n srtcpSessionKey: Buffer;\n srtcpSessionSalt: Buffer;\n srtcpSessionAuthTag: Buffer;\n srtcpSessionAuth: ReturnType<typeof createHmac>;\n\n cipher: CipherAesBase;\n\n constructor(\n public masterKey: Buffer,\n public masterSalt: Buffer,\n public profile: SrtpProfile,\n ) {\n {\n // AES-ECB plaintext require 16byte\n // so need to padding to 14 byte\n const diff = 14 - masterSalt.length;\n if (diff > 0) {\n this.masterSalt = Buffer.concat([masterSalt, Buffer.alloc(diff)]);\n }\n }\n\n this.srtpSessionKey = this.generateSessionKey(0);\n this.srtpSessionSalt = this.generateSessionSalt(2);\n this.srtpSessionAuthTag = this.generateSessionAuthTag(1);\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n\n this.srtcpSessionKey = this.generateSessionKey(3);\n this.srtcpSessionSalt = this.generateSessionSalt(5);\n this.srtcpSessionAuthTag = this.generateSessionAuthTag(4);\n this.srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n this.cipher = new CipherAesCtr(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt,\n this.srtpSessionAuthTag,\n this.srtcpSessionAuthTag,\n );\n break;\n case ProtectionProfileAeadAes128Gcm:\n this.cipher = new CipherAesGcm(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt,\n );\n break;\n }\n }\n\n generateSessionKey(label: number) {\n let sessionKey = Buffer.from(this.masterSalt);\n\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionKey.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];\n }\n\n sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);\n return aes128EcbEncrypt(this.masterKey, sessionKey);\n }\n\n generateSessionSalt(label: number) {\n let sessionSalt: Buffer = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionSalt.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];\n }\n sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);\n sessionSalt = aes128EcbEncrypt(this.masterKey, sessionSalt);\n return sessionSalt.subarray(0, 14);\n }\n\n generateSessionAuthTag(label: number) {\n const sessionAuthTag = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionAuthTag.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionAuthTag[j] = sessionAuthTag[j] ^ labelAndIndexOverKdr[i];\n }\n let firstRun: Buffer = Buffer.concat([\n sessionAuthTag,\n Buffer.from([0x00, 0x00]),\n ]);\n let secondRun: Buffer = Buffer.concat([\n sessionAuthTag,\n Buffer.from([0x00, 0x01]),\n ]);\n firstRun = aes128EcbEncrypt(this.masterKey, firstRun);\n secondRun = aes128EcbEncrypt(this.masterKey, secondRun);\n return Buffer.concat([firstRun, secondRun.subarray(0, 4)]);\n }\n\n getSrtpSsrcState(ssrc: number) {\n let s = this.srtpSSRCStates[ssrc];\n if (s) return s;\n s = {\n ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.srtpSSRCStates[ssrc] = s;\n return s;\n }\n\n getSrtcpSsrcState(ssrc: number) {\n let s = this.srtcpSSRCStates[ssrc];\n if (s) return s;\n s = {\n srtcpIndex: 0,\n ssrc,\n };\n this.srtcpSSRCStates[ssrc] = s;\n return s;\n }\n\n // 3.3.1. Packet Index Determination, and ROC, s_l Update\n // In particular, out-of-order RTP packets with\n // sequence numbers close to 2^16 or zero must be properly handled.\n updateRolloverCount(sequenceNumber: number, s: SrtpSsrcState) {\n if (!s.rolloverHasProcessed) {\n s.rolloverHasProcessed = true;\n } else if (sequenceNumber === 0) {\n if (s.lastSequenceNumber > MaxROCDisorder) {\n s.rolloverCounter++;\n }\n } else if (\n s.lastSequenceNumber < MaxROCDisorder &&\n sequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n // https://github.com/shinyoshiaki/werift-webrtc/issues/94\n if (s.rolloverCounter > 0) {\n s.rolloverCounter--;\n }\n } else if (\n sequenceNumber < MaxROCDisorder &&\n s.lastSequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n s.rolloverCounter++;\n }\n s.lastSequenceNumber = sequenceNumber;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return this.srtpSessionAuth\n .update(buf)\n .update(rocRaw)\n .digest()\n .slice(0, 10);\n }\n\n index(ssrc: number) {\n const s = this.srtcpSSRCStates[ssrc];\n if (!s) {\n return 0;\n }\n return s.srtcpIndex;\n }\n\n setIndex(ssrc: number, index: number) {\n const s = this.getSrtcpSsrcState(ssrc);\n s.srtcpIndex = index % 0x7fffffff;\n }\n}\n\nexport interface SrtpSsrcState {\n ssrc: number;\n rolloverCounter: number;\n rolloverHasProcessed?: boolean;\n lastSequenceNumber: number;\n}\n\nexport type SrtcpSSRCState = {\n srtcpIndex: number;\n ssrc: number;\n};\n\nconst MaxROCDisorder = 100;\nconst MaxSequenceNumber = 65535;\n"]}
|
package/lib/sctp/src/param.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RECONFIG_PARAM_BY_TYPES = exports.ReconfigResponseParam = exports.reconfigResult = exports.StreamAddOutgoingParam = exports.OutgoingSSNResetRequestParam = void 0;
|
|
4
|
-
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
5
2
|
// This parameter is used by the sender to request the reset of some or
|
|
6
3
|
// all outgoing streams.
|
|
7
4
|
// 0 1 2 3
|
|
@@ -21,6 +18,8 @@ const jspack_1 = require("@shinyoshiaki/jspack");
|
|
|
21
18
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
22
19
|
// | Stream Number N-1 (optional) | Stream Number N (optional) |
|
|
23
20
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.RECONFIG_PARAM_BY_TYPES = exports.ReconfigResponseParam = exports.reconfigResult = exports.StreamAddOutgoingParam = exports.OutgoingSSNResetRequestParam = void 0;
|
|
24
23
|
class OutgoingSSNResetRequestParam {
|
|
25
24
|
constructor(requestSequence, responseSequence, lastTsn, streams) {
|
|
26
25
|
Object.defineProperty(this, "requestSequence", {
|
|
@@ -52,21 +51,27 @@ class OutgoingSSNResetRequestParam {
|
|
|
52
51
|
return OutgoingSSNResetRequestParam.type;
|
|
53
52
|
}
|
|
54
53
|
get bytes() {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
// !LLL — requestSequence / responseSequence / lastTsn (big-endian uint32)
|
|
55
|
+
const data = Buffer.allocUnsafe(12);
|
|
56
|
+
data.writeUInt32BE(this.requestSequence, 0);
|
|
57
|
+
data.writeUInt32BE(this.responseSequence, 4);
|
|
58
|
+
data.writeUInt32BE(this.lastTsn, 8);
|
|
60
59
|
return Buffer.concat([
|
|
61
60
|
data,
|
|
62
|
-
...this.streams.map((stream) =>
|
|
61
|
+
...this.streams.map((stream) => {
|
|
62
|
+
const buf = Buffer.allocUnsafe(2);
|
|
63
|
+
buf.writeUInt16BE(stream, 0);
|
|
64
|
+
return buf;
|
|
65
|
+
}),
|
|
63
66
|
]);
|
|
64
67
|
}
|
|
65
68
|
static parse(data) {
|
|
66
|
-
const
|
|
69
|
+
const requestSequence = data.readUInt32BE(0);
|
|
70
|
+
const responseSequence = data.readUInt32BE(4);
|
|
71
|
+
const lastTsn = data.readUInt32BE(8);
|
|
67
72
|
const stream = [];
|
|
68
73
|
for (let pos = 12; pos < data.length; pos += 2) {
|
|
69
|
-
stream.push(
|
|
74
|
+
stream.push(data.readUInt16BE(pos));
|
|
70
75
|
}
|
|
71
76
|
return new OutgoingSSNResetRequestParam(requestSequence, responseSequence, lastTsn, stream);
|
|
72
77
|
}
|
|
@@ -97,10 +102,16 @@ class StreamAddOutgoingParam {
|
|
|
97
102
|
return StreamAddOutgoingParam.type;
|
|
98
103
|
}
|
|
99
104
|
get bytes() {
|
|
100
|
-
|
|
105
|
+
// !LHH — requestSequence / newStreams / reserved
|
|
106
|
+
const buf = Buffer.allocUnsafe(8);
|
|
107
|
+
buf.writeUInt32BE(this.requestSequence, 0);
|
|
108
|
+
buf.writeUInt16BE(this.newStreams, 4);
|
|
109
|
+
buf.writeUInt16BE(0, 6);
|
|
110
|
+
return buf;
|
|
101
111
|
}
|
|
102
112
|
static parse(data) {
|
|
103
|
-
const
|
|
113
|
+
const requestSequence = data.readUInt32BE(0);
|
|
114
|
+
const newStreams = data.readUInt16BE(4);
|
|
104
115
|
return new StreamAddOutgoingParam(requestSequence, newStreams);
|
|
105
116
|
}
|
|
106
117
|
}
|
|
@@ -150,10 +161,15 @@ class ReconfigResponseParam {
|
|
|
150
161
|
return ReconfigResponseParam.type;
|
|
151
162
|
}
|
|
152
163
|
get bytes() {
|
|
153
|
-
|
|
164
|
+
// !LL — responseSequence / result
|
|
165
|
+
const buf = Buffer.allocUnsafe(8);
|
|
166
|
+
buf.writeUInt32BE(this.responseSequence, 0);
|
|
167
|
+
buf.writeUInt32BE(this.result, 4);
|
|
168
|
+
return buf;
|
|
154
169
|
}
|
|
155
170
|
static parse(data) {
|
|
156
|
-
const
|
|
171
|
+
const requestSequence = data.readUInt32BE(0);
|
|
172
|
+
const result = data.readUInt32BE(4);
|
|
157
173
|
return new ReconfigResponseParam(requestSequence, result);
|
|
158
174
|
}
|
|
159
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param.js","sourceRoot":"","sources":["../../../../sctp/src/param.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"param.js","sourceRoot":"","sources":["../../../../sctp/src/param.ts"],"names":[],"mappings":"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","sourcesContent":["// This parameter is used by the sender to request the reset of some or\n// all outgoing streams.\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Parameter Type = 13 | Parameter Length = 16 + 2 * N |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Re-configuration Request Sequence Number |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Re-configuration Response Sequence Number |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Sender's Last Assigned TSN |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Stream Number 1 (optional) | Stream Number 2 (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// / ...... /\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Stream Number N-1 (optional) | Stream Number N (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport class OutgoingSSNResetRequestParam {\n static type = 13; // Outgoing SSN Reset Request Parameter\n\n constructor(\n public requestSequence: number,\n public responseSequence: number,\n public lastTsn: number,\n public streams: number[],\n ) {}\n\n get type() {\n return OutgoingSSNResetRequestParam.type;\n }\n\n get bytes() {\n // !LLL — requestSequence / responseSequence / lastTsn (big-endian uint32)\n const data = Buffer.allocUnsafe(12);\n data.writeUInt32BE(this.requestSequence, 0);\n data.writeUInt32BE(this.responseSequence, 4);\n data.writeUInt32BE(this.lastTsn, 8);\n\n return Buffer.concat([\n data,\n ...this.streams.map((stream) => {\n const buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(stream, 0);\n return buf;\n }),\n ]);\n }\n\n static parse(data: Buffer) {\n const requestSequence = data.readUInt32BE(0);\n const responseSequence = data.readUInt32BE(4);\n const lastTsn = data.readUInt32BE(8);\n const stream: number[] = [];\n\n for (let pos = 12; pos < data.length; pos += 2) {\n stream.push(data.readUInt16BE(pos));\n }\n\n return new OutgoingSSNResetRequestParam(\n requestSequence,\n responseSequence,\n lastTsn,\n stream,\n );\n }\n}\n\nexport class StreamAddOutgoingParam {\n static type = 17; // Add Outgoing Streams Request Parameter\n\n constructor(\n public requestSequence: number,\n public newStreams: number,\n ) {}\n\n get type() {\n return StreamAddOutgoingParam.type;\n }\n\n get bytes() {\n // !LHH — requestSequence / newStreams / reserved\n const buf = Buffer.allocUnsafe(8);\n buf.writeUInt32BE(this.requestSequence, 0);\n buf.writeUInt16BE(this.newStreams, 4);\n buf.writeUInt16BE(0, 6);\n return buf;\n }\n\n static parse(data: Buffer) {\n const requestSequence = data.readUInt32BE(0);\n const newStreams = data.readUInt16BE(4);\n return new StreamAddOutgoingParam(requestSequence, newStreams);\n }\n}\n\n// This parameter is used by the receiver of a Re-configuration Request\n// Parameter to respond to the request.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Parameter Type = 16 | Parameter Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Re-configuration Response Sequence Number |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Result |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Sender's Next TSN (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Receiver's Next TSN (optional) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport const reconfigResult = {\n ReconfigResultSuccessPerformed: 1,\n BadSequenceNumber: 5,\n} as const;\ntype ReconfigResult = (typeof reconfigResult)[keyof typeof reconfigResult];\n\nexport class ReconfigResponseParam {\n static type = 16; // Re-configuration Response Parameter\n constructor(\n public responseSequence: number,\n public result: ReconfigResult,\n ) {}\n\n get type() {\n return ReconfigResponseParam.type;\n }\n\n get bytes() {\n // !LL — responseSequence / result\n const buf = Buffer.allocUnsafe(8);\n buf.writeUInt32BE(this.responseSequence, 0);\n buf.writeUInt32BE(this.result, 4);\n return buf;\n }\n\n static parse(data: Buffer) {\n const requestSequence = data.readUInt32BE(0);\n const result = data.readUInt32BE(4);\n return new ReconfigResponseParam(requestSequence, result as ReconfigResult);\n }\n}\n\nexport type StreamParam =\n | OutgoingSSNResetRequestParam\n | StreamAddOutgoingParam\n | ReconfigResponseParam;\n\nexport type StreamParamType =\n | typeof OutgoingSSNResetRequestParam\n | typeof StreamAddOutgoingParam\n | typeof ReconfigResponseParam;\n\nexport const RECONFIG_PARAM_BY_TYPES: { [type: number]: StreamParamType } = {\n 13: OutgoingSSNResetRequestParam, // Outgoing SSN Reset Request Parameter\n 16: ReconfigResponseParam, // Re-configuration Response Parameter\n 17: StreamAddOutgoingParam, // Add Outgoing Streams Request Parameter\n};\n"]}
|
package/lib/sctp/src/sctp.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RTCSctpCapabilities = exports.InboundStream = exports.SCTP = void 0;
|
|
4
4
|
const crypto_1 = require("crypto");
|
|
5
|
-
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
6
5
|
const chunk_1 = require("./chunk");
|
|
7
6
|
const const_1 = require("./const");
|
|
8
7
|
const helper_1 = require("./helper");
|
|
@@ -627,10 +626,9 @@ class SCTP {
|
|
|
627
626
|
return;
|
|
628
627
|
if (this.flightSize === 0 && this.outboundQueue.length === 0) {
|
|
629
628
|
const heartbeat = new chunk_1.HeartbeatChunk();
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
]);
|
|
629
|
+
const heartbeatTime = Buffer.allocUnsafe(4);
|
|
630
|
+
heartbeatTime.writeUInt32BE(Math.floor(Date.now() / 1000), 0);
|
|
631
|
+
heartbeat.params.push([1, heartbeatTime]);
|
|
634
632
|
await this.sendChunk(heartbeat).catch((err) => {
|
|
635
633
|
log("send heartbeat failed", err.message);
|
|
636
634
|
});
|
|
@@ -777,8 +775,11 @@ class SCTP {
|
|
|
777
775
|
ack.inboundStreams = this._inboundStreamsCount;
|
|
778
776
|
ack.initialTsn = this.localTsn;
|
|
779
777
|
this.setExtensions(ack.params);
|
|
780
|
-
|
|
781
|
-
|
|
778
|
+
// cookie timestamp は秒単位の整数 (小数を混入させない)
|
|
779
|
+
const time = Math.floor(Date.now() / 1000);
|
|
780
|
+
const cookieTime = Buffer.allocUnsafe(4);
|
|
781
|
+
cookieTime.writeUInt32BE(time, 0);
|
|
782
|
+
let cookie = cookieTime;
|
|
782
783
|
cookie = Buffer.concat([
|
|
783
784
|
cookie,
|
|
784
785
|
(0, crypto_1.createHmac)("sha1", this.hmacKey).update(cookie).digest(),
|
|
@@ -872,8 +873,8 @@ class SCTP {
|
|
|
872
873
|
log("x State cookie is invalid");
|
|
873
874
|
return;
|
|
874
875
|
}
|
|
875
|
-
const now = Date.now() / 1000;
|
|
876
|
-
const stamp =
|
|
876
|
+
const now = Math.floor(Date.now() / 1000);
|
|
877
|
+
const stamp = cookie.readUInt32BE(0);
|
|
877
878
|
if (stamp < now - COOKIE_LIFETIME || stamp > now) {
|
|
878
879
|
const error = new chunk_1.ErrorChunk(0, undefined);
|
|
879
880
|
error.params.push([
|