werift 0.12.8 → 0.13.2
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.d.ts +9 -0
- package/lib/common/src/binary.js +37 -1
- package/lib/common/src/binary.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +6 -2
- package/lib/dtls/src/context/srtp.js +9 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +3 -3
- package/lib/dtls/src/socket.js +6 -8
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/ice/src/utils.d.ts +1 -0
- package/lib/ice/src/utils.js +5 -1
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/base.d.ts +8 -0
- package/lib/rtp/src/codec/base.js +16 -0
- package/lib/rtp/src/codec/base.js.map +1 -0
- package/lib/rtp/src/codec/h264.d.ts +23 -2
- package/lib/rtp/src/codec/h264.js +66 -3
- package/lib/rtp/src/codec/h264.js.map +1 -1
- package/lib/rtp/src/codec/opus.d.ts +9 -0
- package/lib/rtp/src/codec/opus.js +18 -0
- package/lib/rtp/src/codec/opus.js.map +1 -0
- package/lib/rtp/src/codec/vp8.d.ts +18 -11
- package/lib/rtp/src/codec/vp8.js +51 -29
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/codec/vp9.d.ts +38 -10
- package/lib/rtp/src/codec/vp9.js +115 -26
- package/lib/rtp/src/codec/vp9.js.map +1 -1
- package/lib/rtp/src/index.d.ts +2 -0
- package/lib/rtp/src/index.js +2 -0
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/sdes.d.ts +2 -2
- package/lib/rtp/src/rtcp/sdes.js.map +1 -1
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtcp/sr.js +36 -0
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.d.ts +2 -0
- package/lib/rtp/src/rtp/rtp.js +2 -0
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +17 -0
- package/lib/rtp/src/srtp/cipher/ctr.js +103 -0
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -0
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +15 -0
- package/lib/rtp/src/srtp/cipher/gcm.js +106 -0
- package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -0
- package/lib/rtp/src/srtp/cipher/index.d.ts +14 -0
- package/lib/rtp/src/srtp/cipher/index.js +25 -0
- package/lib/rtp/src/srtp/cipher/index.js.map +1 -0
- package/lib/rtp/src/srtp/const.d.ts +5 -0
- package/lib/rtp/src/srtp/const.js +23 -0
- package/lib/rtp/src/srtp/const.js.map +1 -0
- package/lib/rtp/src/srtp/context/context.d.ts +13 -11
- package/lib/rtp/src/srtp/context/context.js +23 -23
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -2
- package/lib/rtp/src/srtp/context/srtcp.js +10 -34
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +4 -3
- package/lib/rtp/src/srtp/context/srtp.js +9 -28
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtp.js +2 -2
- package/lib/rtp/src/srtp/srtp.js.map +1 -1
- package/lib/webrtc/src/const.d.ts +4 -3
- package/lib/webrtc/src/const.js +5 -4
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/helper.d.ts +2 -2
- package/lib/webrtc/src/helper.js +2 -2
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +6 -2
- package/lib/webrtc/src/index.js +6 -2
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.d.ts +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.js +0 -0
- package/lib/webrtc/src/media/extension/rtcpFeedback.js.map +1 -0
- package/lib/webrtc/src/{extension → media/extension}/rtpExtension.d.ts +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtpExtension.js +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -0
- package/lib/webrtc/src/media/{nack.d.ts → receiver/nack.d.ts} +2 -2
- package/lib/webrtc/src/media/{nack.js → receiver/nack.js} +2 -2
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -0
- package/lib/webrtc/src/media/{statistics.d.ts → receiver/statistics.d.ts} +1 -1
- package/lib/webrtc/src/media/{statistics.js → receiver/statistics.js} +1 -1
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -0
- package/lib/webrtc/src/media/router.js +1 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +4 -2
- package/lib/webrtc/src/media/rtpReceiver.js +13 -6
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +4 -4
- package/lib/webrtc/src/media/rtpSender.js +12 -6
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.d.ts +0 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.js +0 -0
- package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.d.ts +0 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.js +0 -0
- package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -0
- package/lib/webrtc/src/media/track.d.ts +3 -0
- package/lib/webrtc/src/media/track.js +2 -0
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/jitterBuffer.d.ts +12 -0
- package/lib/webrtc/src/nonstandard/jitterBuffer.js +48 -0
- package/lib/webrtc/src/nonstandard/jitterBuffer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/lipsync.d.ts +20 -0
- package/lib/webrtc/src/nonstandard/lipsync.js +39 -0
- package/lib/webrtc/src/nonstandard/lipsync.js.map +1 -0
- package/lib/webrtc/src/nonstandard/recorder.d.ts +18 -0
- package/lib/webrtc/src/nonstandard/recorder.js +25 -0
- package/lib/webrtc/src/nonstandard/recorder.js.map +1 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.d.ts +18 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.js +60 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +15 -0
- package/lib/webrtc/src/nonstandard/userMedia.js +67 -0
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/webm.d.ts +24 -0
- package/lib/webrtc/src/nonstandard/webm.js +308 -0
- package/lib/webrtc/src/nonstandard/webm.js.map +1 -0
- package/lib/webrtc/src/peerConnection.js +1 -0
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +2 -1
- package/lib/webrtc/src/transport/dtls.js +7 -3
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +3 -0
- package/lib/webrtc/src/utils.js +13 -9
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +5 -4
- package/src/const.ts +8 -3
- package/src/helper.ts +4 -4
- package/src/index.ts +6 -2
- package/src/{extension → media/extension}/rtcpFeedback.ts +1 -1
- package/src/{extension → media/extension}/rtpExtension.ts +1 -1
- package/src/media/{nack.ts → receiver/nack.ts} +3 -3
- package/src/media/{statistics.ts → receiver/statistics.ts} +2 -2
- package/src/media/router.ts +1 -1
- package/src/media/rtpReceiver.ts +11 -7
- package/src/media/rtpSender.ts +19 -9
- package/src/media/{senderBWE → sender}/cumulativeResult.ts +0 -0
- package/src/media/{senderBWE → sender}/senderBWE.ts +0 -0
- package/src/media/track.ts +6 -0
- package/src/nonstandard/jitterBuffer.ts +47 -0
- package/src/nonstandard/lipsync.ts +55 -0
- package/src/nonstandard/recorder.ts +26 -0
- package/src/nonstandard/sampleBuilder.ts +71 -0
- package/src/nonstandard/userMedia.ts +74 -0
- package/src/nonstandard/webm.ts +421 -0
- package/src/peerConnection.ts +3 -1
- package/src/transport/dtls.ts +12 -4
- package/src/utils.ts +20 -12
- package/lib/webrtc/src/extension/rtcpFeedback.js.map +0 -1
- package/lib/webrtc/src/extension/rtpExtension.js.map +0 -1
- package/lib/webrtc/src/media/nack.js.map +0 -1
- package/lib/webrtc/src/media/senderBWE/cumulativeResult.js.map +0 -1
- package/lib/webrtc/src/media/senderBWE/senderBWE.js.map +0 -1
- package/lib/webrtc/src/media/statistics.js.map +0 -1
package/lib/rtp/src/rtcp/rr.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
export declare class RtcpRrPacket {
|
|
3
3
|
ssrc: number;
|
|
4
4
|
reports: RtcpReceiverInfo[];
|
|
5
|
-
static type
|
|
6
|
-
type
|
|
5
|
+
static readonly type = 201;
|
|
6
|
+
readonly type = 201;
|
|
7
7
|
constructor(props?: Partial<RtcpRrPacket>);
|
|
8
8
|
serialize(): Buffer;
|
|
9
9
|
static deSerialize(data: Buffer, count: number): RtcpRrPacket;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rr.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,6CAAiE;AACjE,iCAA6C;AAE7C,MAAa,YAAY;IAMvB,YAAY,QAA+B,EAAE;QAL7C,SAAI,GAAW,CAAC,CAAC;QACjB,YAAO,GAAuB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"rr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rr.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,6CAAiE;AACjE,iCAA6C;AAE7C,MAAa,YAAY;IAMvB,YAAY,QAA+B,EAAE;QAL7C,SAAI,GAAW,CAAC,CAAC;QACjB,YAAO,GAAuB,EAAE,CAAC;QAExB,SAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAGhC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,IAAI,OAAO,GAAG,kBAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YACtB,OAAO;YACP,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,OAAO,0BAAmB,CAAC,SAAS,CAClC,YAAY,CAAC,IAAI,EACjB,IAAI,CAAC,OAAO,CAAC,MAAM,EACnB,OAAO,EACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,KAAa;QAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,cAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,GAAG,IAAI,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;;AAjCH,oCAkCC;AA/BiB,iBAAI,GAAG,GAAG,CAAC;AAiC7B,MAAa,gBAAgB;IAS3B,YAAY,QAAmC,EAAE;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,kBAAY,CACjB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrB;YACE,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,MAAM;YACX,IAAI,CAAC,GAAG;YACR,IAAI,CAAC,IAAI;SACV,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,MAAM,CACJ,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,MAAM,EACN,GAAG,EACH,IAAI,EACL,GAAG,kBAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9C,OAAO,IAAI,gBAAgB,CAAC;YAC1B,IAAI;YACJ,YAAY;YACZ,WAAW;YACX,eAAe;YACf,MAAM;YACN,GAAG;YACH,IAAI;SACL,CAAC,CAAC;IACL,CAAC;CACF;AAjDD,4CAiDC","sourcesContent":["import { range } from \"lodash\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\nexport class RtcpRrPacket {\n ssrc: number = 0;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 201;\n readonly type = RtcpRrPacket.type;\n\n constructor(props: Partial<RtcpRrPacket> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n let payload = bufferWriter([4], [this.ssrc]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpRrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(data: Buffer, count: number) {\n const [ssrc] = bufferReader(data, [4]);\n let pos = 4;\n const reports: RtcpReceiverInfo[] = [];\n range(count).forEach(() => {\n reports.push(RtcpReceiverInfo.deSerialize(data.slice(pos, pos + 24)));\n pos += 24;\n });\n return new RtcpRrPacket({ ssrc, reports });\n }\n}\n\nexport class RtcpReceiverInfo {\n ssrc!: number;\n fractionLost!: number;\n packetsLost!: number;\n highestSequence!: number;\n jitter!: number;\n lsr!: number;\n dlsr!: number;\n\n constructor(props: Partial<RtcpReceiverInfo> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n return bufferWriter(\n [4, 1, 3, 4, 4, 4, 4],\n [\n this.ssrc,\n this.fractionLost,\n this.packetsLost,\n this.highestSequence,\n this.jitter,\n this.lsr,\n this.dlsr,\n ]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [\n ssrc,\n fractionLost,\n packetsLost,\n highestSequence,\n jitter,\n lsr,\n dlsr,\n ] = bufferReader(data, [4, 1, 3, 4, 4, 4, 4]);\n\n return new RtcpReceiverInfo({\n ssrc,\n fractionLost,\n packetsLost,\n highestSequence,\n jitter,\n lsr,\n dlsr,\n });\n }\n}\n"]}
|
|
@@ -4,8 +4,8 @@ import { GenericNack } from "./nack";
|
|
|
4
4
|
import { TransportWideCC } from "./twcc";
|
|
5
5
|
declare type Feedback = GenericNack | TransportWideCC;
|
|
6
6
|
export declare class RtcpTransportLayerFeedback {
|
|
7
|
-
static type
|
|
8
|
-
type
|
|
7
|
+
static readonly type = 205;
|
|
8
|
+
readonly type = 205;
|
|
9
9
|
feedback: Feedback;
|
|
10
10
|
header: RtcpHeader;
|
|
11
11
|
constructor(props?: Partial<RtcpTransportLayerFeedback>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,iCAAqC;AACrC,iCAAyC;AAEzC,MAAM,GAAG,GAAG,eAAK,CAAC,6BAA6B,CAAC,CAAC;AAIjD,MAAa,0BAA0B;IAMrC,YAAY,QAA6C,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,iCAAqC;AACrC,iCAAyC;AAEzC,MAAM,GAAG,GAAG,eAAK,CAAC,6BAA6B,CAAC,CAAC;AAIjD,MAAa,0BAA0B;IAMrC,YAAY,QAA6C,EAAE;QAJlD,SAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC;QAK9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,MAAkB;QACjD,IAAI,QAA8B,CAAC;QAEnC,QAAQ,MAAM,CAAC,KAAK,EAAE;YACpB,KAAK,kBAAW,CAAC,KAAK;gBACpB,QAAQ,GAAG,kBAAW,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,sBAAe,CAAC,KAAK;gBACxB,QAAQ,GAAG,sBAAe,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACrD,MAAM;YACR;gBACE,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM;SACT;QAED,OAAO,IAAI,0BAA0B,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;;AA/BH,gEAgCC;AA/BiB,+BAAI,GAAG,GAAG,CAAC","sourcesContent":["import debug from \"debug\";\n\nimport { RtcpHeader } from \"../header\";\nimport { GenericNack } from \"./nack\";\nimport { TransportWideCC } from \"./twcc\";\n\nconst log = debug(\"werift/rtp/rtcp/rtpfb/index\");\n\ntype Feedback = GenericNack | TransportWideCC;\n\nexport class RtcpTransportLayerFeedback {\n static readonly type = 205;\n readonly type = RtcpTransportLayerFeedback.type;\n feedback!: Feedback;\n header!: RtcpHeader;\n\n constructor(props: Partial<RtcpTransportLayerFeedback> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n const payload = this.feedback.serialize();\n return payload;\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n let feedback: Feedback | undefined;\n\n switch (header.count) {\n case GenericNack.count:\n feedback = GenericNack.deSerialize(data, header);\n break;\n case TransportWideCC.count:\n feedback = TransportWideCC.deSerialize(data, header);\n break;\n default:\n log(\"unknown rtpfb packet\", header.count);\n break;\n }\n\n return new RtcpTransportLayerFeedback({ feedback, header });\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { RtcpHeader } from "./header";
|
|
3
3
|
export declare class RtcpSourceDescriptionPacket {
|
|
4
|
-
static type
|
|
5
|
-
type
|
|
4
|
+
static readonly type = 202;
|
|
5
|
+
readonly type = 202;
|
|
6
6
|
chunks: SourceDescriptionChunk[];
|
|
7
7
|
constructor(props: Partial<RtcpSourceDescriptionPacket>);
|
|
8
8
|
get length(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdes.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sdes.ts"],"names":[],"mappings":";;;AAAA,6CAAmD;AAEnD,iCAA6C;AAE7C,MAAa,2BAA2B;IAKtC,YAAY,KAA2C;
|
|
1
|
+
{"version":3,"file":"sdes.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sdes.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferWriter } from \"../../../common/src\";\nimport { RtcpHeader } from \"./header\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\nexport class RtcpSourceDescriptionPacket {\n static readonly type = 202;\n readonly type = RtcpSourceDescriptionPacket.type;\n chunks: SourceDescriptionChunk[] = [];\n\n constructor(props: Partial<RtcpSourceDescriptionPacket>) {\n Object.assign(this, props);\n }\n\n get length() {\n let length = 0;\n this.chunks.forEach((chunk) => (length += chunk.length));\n return length;\n }\n\n serialize() {\n let payload = Buffer.concat(this.chunks.map((chunk) => chunk.serialize()));\n while (payload.length % 4)\n payload = Buffer.concat([payload, Buffer.from([0])]);\n return RtcpPacketConverter.serialize(\n this.type,\n this.chunks.length,\n payload,\n payload.length / 4\n );\n }\n\n static deSerialize(payload: Buffer, header: RtcpHeader) {\n const chunks: SourceDescriptionChunk[] = [];\n for (let i = 0; i < payload.length; ) {\n const chunk = SourceDescriptionChunk.deSerialize(payload.slice(i));\n chunks.push(chunk);\n i += chunk.length;\n }\n\n return new RtcpSourceDescriptionPacket({ chunks });\n }\n}\n\nexport class SourceDescriptionChunk {\n source!: number;\n items: SourceDescriptionItem[] = [];\n\n constructor(props: Partial<SourceDescriptionChunk> = {}) {\n Object.assign(this, props);\n }\n\n get length() {\n let length = 4;\n this.items.forEach((item) => (length += item.length));\n length += 1;\n length += getPadding(length);\n return length;\n }\n\n serialize() {\n const data = Buffer.concat([\n bufferWriter([4], [this.source]),\n Buffer.concat(this.items.map((item) => item.serialize())),\n ]);\n\n const res = Buffer.concat([data, Buffer.alloc(getPadding(data.length))]);\n return res;\n }\n\n static deSerialize(data: Buffer) {\n const source = data.readUInt32BE();\n const items: SourceDescriptionItem[] = [];\n for (let i = 4; i < data.length; ) {\n const type = data[i];\n if (type === 0) break;\n\n const item = SourceDescriptionItem.deSerialize(data.slice(i));\n items.push(item);\n i += item.length;\n }\n\n return new SourceDescriptionChunk({ source, items });\n }\n}\n\nexport class SourceDescriptionItem {\n type!: number;\n text!: string;\n\n constructor(props: Partial<SourceDescriptionItem>) {\n Object.assign(this, props);\n }\n\n get length() {\n return 1 + 1 + Buffer.from(this.text).length;\n }\n\n serialize() {\n const text = Buffer.from(this.text);\n return Buffer.concat([\n bufferWriter([1, 1], [this.type, text.length]),\n text,\n ]);\n }\n\n static deSerialize(data: Buffer) {\n const type = data[0];\n const octetCount = data[1];\n const text = data.slice(2, 2 + octetCount).toString();\n return new SourceDescriptionItem({ type, text });\n }\n}\n\nfunction getPadding(len: number) {\n if (len % 4 == 0) {\n return 0;\n }\n return 4 - (len % 4);\n}\n"]}
|
package/lib/rtp/src/rtcp/sr.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export declare class RtcpSrPacket {
|
|
|
4
4
|
ssrc: number;
|
|
5
5
|
senderInfo: RtcpSenderInfo;
|
|
6
6
|
reports: RtcpReceiverInfo[];
|
|
7
|
-
static type
|
|
8
|
-
type
|
|
7
|
+
static readonly type = 200;
|
|
8
|
+
readonly type = 200;
|
|
9
9
|
constructor(props: Pick<RtcpSrPacket, "senderInfo"> & Partial<RtcpSrPacket>);
|
|
10
10
|
serialize(): Buffer;
|
|
11
11
|
static deSerialize(payload: Buffer, count: number): RtcpSrPacket;
|
package/lib/rtp/src/rtcp/sr.js
CHANGED
|
@@ -5,6 +5,42 @@ const lodash_1 = require("lodash");
|
|
|
5
5
|
const src_1 = require("../../../common/src");
|
|
6
6
|
const rr_1 = require("./rr");
|
|
7
7
|
const rtcp_1 = require("./rtcp");
|
|
8
|
+
// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.1
|
|
9
|
+
// 0 1 2 3
|
|
10
|
+
// 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
|
|
11
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
12
|
+
// header |V=2|P| RC | PT=SR=200 | length |
|
|
13
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
14
|
+
// | SSRC of sender |
|
|
15
|
+
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
16
|
+
// sender | NTP timestamp, most significant word |
|
|
17
|
+
// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
18
|
+
// | NTP timestamp, least significant word |
|
|
19
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
20
|
+
// | RTP timestamp |
|
|
21
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
22
|
+
// | sender's packet count |
|
|
23
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
24
|
+
// | sender's octet count |
|
|
25
|
+
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
26
|
+
// report | SSRC_1 (SSRC of first source) |
|
|
27
|
+
// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
28
|
+
// 1 | fraction lost | cumulative number of packets lost |
|
|
29
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
30
|
+
// | extended highest sequence number received |
|
|
31
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
32
|
+
// | interarrival jitter |
|
|
33
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
34
|
+
// | last SR (LSR) |
|
|
35
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
36
|
+
// | delay since last SR (DLSR) |
|
|
37
|
+
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
38
|
+
// report | SSRC_2 (SSRC of second source) |
|
|
39
|
+
// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
40
|
+
// 2 : ... :
|
|
41
|
+
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
42
|
+
// | profile-specific extensions |
|
|
43
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
8
44
|
class RtcpSrPacket {
|
|
9
45
|
constructor(props) {
|
|
10
46
|
this.ssrc = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sr.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,6CAAiE;AACjE,6BAAwC;AACxC,iCAA6C;AAE7C,MAAa,YAAY;IAOvB,YAAY,KAA+D;QAN3E,SAAI,GAAW,CAAC,CAAC;QAEjB,YAAO,GAAuB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sr.ts"],"names":[],"mappings":"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","sourcesContent":["import { range } from \"lodash\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpReceiverInfo } from \"./rr\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\n// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.1\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// header |V=2|P| RC | PT=SR=200 | length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | SSRC of sender |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// sender | NTP timestamp, most significant word |\n// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | NTP timestamp, least significant word |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | RTP timestamp |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's packet count |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's octet count |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_1 (SSRC of first source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 1 | fraction lost | cumulative number of packets lost |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | extended highest sequence number received |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | interarrival jitter |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | last SR (LSR) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | delay since last SR (DLSR) |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_2 (SSRC of second source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 2 : ... :\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// | profile-specific extensions |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport class RtcpSrPacket {\n ssrc: number = 0;\n senderInfo!: RtcpSenderInfo;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 200;\n readonly type = RtcpSrPacket.type;\n\n constructor(props: Pick<RtcpSrPacket, \"senderInfo\"> & Partial<RtcpSrPacket>) {\n Object.assign(this, props);\n }\n\n serialize() {\n let payload = Buffer.alloc(4);\n payload.writeUInt32BE(this.ssrc);\n payload = Buffer.concat([payload, this.senderInfo.serialize()]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpSrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(payload: Buffer, count: number) {\n const ssrc = payload.readUInt32BE();\n const senderInfo = RtcpSenderInfo.deSerialize(payload.slice(4, 24));\n let pos = 24;\n const reports: RtcpReceiverInfo[] = [];\n for (const _ of range(count)) {\n reports.push(RtcpReceiverInfo.deSerialize(payload.slice(pos, pos + 24)));\n pos += 24;\n }\n return new RtcpSrPacket({ ssrc, senderInfo, reports });\n }\n}\n\nexport class RtcpSenderInfo {\n ntpTimestamp!: bigint;\n rtpTimestamp!: number;\n packetCount!: number;\n octetCount!: number;\n\n constructor(props: Partial<RtcpSenderInfo> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n return bufferWriter(\n [8, 4, 4, 4],\n [this.ntpTimestamp, this.rtpTimestamp, this.packetCount, this.octetCount]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [ntpTimestamp, rtpTimestamp, packetCount, octetCount] = bufferReader(\n data,\n [8, 4, 4, 4]\n );\n\n return new RtcpSenderInfo({\n ntpTimestamp,\n rtpTimestamp,\n packetCount,\n octetCount,\n });\n }\n}\n"]}
|
package/lib/rtp/src/rtp/rtp.d.ts
CHANGED
package/lib/rtp/src/rtp/rtp.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\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 * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n sequenceNumber: number = 0;\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\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 * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit */\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { RtcpHeader } from "../../rtcp/header";
|
|
3
|
+
import { RtpHeader } from "../../rtp/rtp";
|
|
4
|
+
import { CipherAesBase } from ".";
|
|
5
|
+
export declare class CipherAesCtr extends CipherAesBase {
|
|
6
|
+
private srtpSessionAuthTag;
|
|
7
|
+
private srtcpSessionAuthTag;
|
|
8
|
+
readonly authTagLength = 10;
|
|
9
|
+
constructor(srtpSessionKey: Buffer, srtpSessionSalt: Buffer, srtcpSessionKey: Buffer, srtcpSessionSalt: Buffer, srtpSessionAuthTag: Buffer, srtcpSessionAuthTag: Buffer);
|
|
10
|
+
encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number): Buffer;
|
|
11
|
+
decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader];
|
|
12
|
+
encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer;
|
|
13
|
+
decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
|
|
14
|
+
generateSrtcpAuthTag(buf: Buffer): Buffer;
|
|
15
|
+
generateCounter(sequenceNumber: number, rolloverCounter: number, ssrc: number, sessionSalt: Buffer): Buffer;
|
|
16
|
+
generateSrtpAuthTag(buf: Buffer, roc: number): Buffer;
|
|
17
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CipherAesCtr = void 0;
|
|
7
|
+
const big_integer_1 = __importDefault(require("big-integer"));
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
const lodash_1 = require("lodash");
|
|
10
|
+
const helper_1 = require("../../helper");
|
|
11
|
+
const header_1 = require("../../rtcp/header");
|
|
12
|
+
const rtp_1 = require("../../rtp/rtp");
|
|
13
|
+
const _1 = require(".");
|
|
14
|
+
class CipherAesCtr extends _1.CipherAesBase {
|
|
15
|
+
constructor(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt, srtpSessionAuthTag, srtcpSessionAuthTag) {
|
|
16
|
+
super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);
|
|
17
|
+
this.srtpSessionAuthTag = srtpSessionAuthTag;
|
|
18
|
+
this.srtcpSessionAuthTag = srtcpSessionAuthTag;
|
|
19
|
+
this.authTagLength = 10;
|
|
20
|
+
}
|
|
21
|
+
encryptRtp(header, payload, rolloverCounter) {
|
|
22
|
+
const dst = Buffer.alloc(header.serializeSize + payload.length + this.authTagLength);
|
|
23
|
+
header.serialize(dst.length).copy(dst);
|
|
24
|
+
const { payloadOffset } = header;
|
|
25
|
+
const counter = this.generateCounter(header.sequenceNumber, rolloverCounter, header.ssrc, this.srtpSessionSalt);
|
|
26
|
+
const cipher = crypto_1.createCipheriv("aes-128-ctr", this.srtpSessionKey, counter);
|
|
27
|
+
const enc = cipher.update(payload);
|
|
28
|
+
enc.copy(dst, payloadOffset);
|
|
29
|
+
const totalLength = payloadOffset + payload.length;
|
|
30
|
+
const authTag = this.generateSrtpAuthTag(dst.slice(0, totalLength), rolloverCounter);
|
|
31
|
+
authTag.copy(dst, totalLength);
|
|
32
|
+
return dst;
|
|
33
|
+
}
|
|
34
|
+
decryptRtp(cipherText, rolloverCounter) {
|
|
35
|
+
const header = rtp_1.RtpHeader.deSerialize(cipherText);
|
|
36
|
+
let dst = Buffer.from([]);
|
|
37
|
+
dst = helper_1.growBufferSize(dst, cipherText.length - this.authTagLength);
|
|
38
|
+
cipherText = cipherText.slice(0, cipherText.length - this.authTagLength);
|
|
39
|
+
cipherText.slice(0, header.payloadOffset).copy(dst);
|
|
40
|
+
const counter = this.generateCounter(header.sequenceNumber, rolloverCounter, header.ssrc, this.srtpSessionSalt);
|
|
41
|
+
const cipher = crypto_1.createDecipheriv("aes-128-ctr", this.srtpSessionKey, counter);
|
|
42
|
+
const payload = cipherText.slice(header.payloadOffset);
|
|
43
|
+
const buf = cipher.update(payload);
|
|
44
|
+
buf.copy(dst, header.payloadOffset);
|
|
45
|
+
return [dst, header];
|
|
46
|
+
}
|
|
47
|
+
encryptRTCP(rtcpPacket, srtcpIndex) {
|
|
48
|
+
let out = Buffer.from(rtcpPacket);
|
|
49
|
+
const ssrc = out.readUInt32BE(4);
|
|
50
|
+
const counter = this.generateCounter(srtcpIndex & 0xffff, srtcpIndex >> 16, ssrc, this.srtcpSessionSalt);
|
|
51
|
+
const cipher = crypto_1.createCipheriv("aes-128-ctr", this.srtcpSessionKey, counter);
|
|
52
|
+
// Encrypt everything after header
|
|
53
|
+
const buf = cipher.update(out.slice(8));
|
|
54
|
+
buf.copy(out, 8);
|
|
55
|
+
out = Buffer.concat([out, Buffer.alloc(4)]);
|
|
56
|
+
out.writeUInt32BE(srtcpIndex, out.length - 4);
|
|
57
|
+
out[out.length - 4] |= 0x80;
|
|
58
|
+
const authTag = this.generateSrtcpAuthTag(out);
|
|
59
|
+
out = Buffer.concat([out, authTag]);
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
decryptRTCP(encrypted) {
|
|
63
|
+
const header = header_1.RtcpHeader.deSerialize(encrypted);
|
|
64
|
+
const tailOffset = encrypted.length - (this.authTagLength + srtcpIndexSize);
|
|
65
|
+
const out = Buffer.from(encrypted).slice(0, tailOffset);
|
|
66
|
+
const isEncrypted = encrypted[tailOffset] >> 7;
|
|
67
|
+
if (isEncrypted === 0)
|
|
68
|
+
return [out, header];
|
|
69
|
+
let srtcpIndex = encrypted.readUInt32BE(tailOffset);
|
|
70
|
+
srtcpIndex &= ~(1 << 31);
|
|
71
|
+
const ssrc = encrypted.readUInt32BE(4);
|
|
72
|
+
// todo impl compare
|
|
73
|
+
const actualTag = encrypted.slice(encrypted.length - 10);
|
|
74
|
+
const counter = this.generateCounter(srtcpIndex & 0xffff, srtcpIndex >> 16, ssrc, this.srtcpSessionSalt);
|
|
75
|
+
const cipher = crypto_1.createDecipheriv("aes-128-ctr", this.srtcpSessionKey, counter);
|
|
76
|
+
const buf = cipher.update(out.slice(8));
|
|
77
|
+
buf.copy(out, 8);
|
|
78
|
+
return [out, header];
|
|
79
|
+
}
|
|
80
|
+
generateSrtcpAuthTag(buf) {
|
|
81
|
+
const srtcpSessionAuth = crypto_1.createHmac("sha1", this.srtcpSessionAuthTag);
|
|
82
|
+
return srtcpSessionAuth.update(buf).digest().slice(0, 10);
|
|
83
|
+
}
|
|
84
|
+
generateCounter(sequenceNumber, rolloverCounter, ssrc, sessionSalt) {
|
|
85
|
+
const counter = Buffer.alloc(16);
|
|
86
|
+
counter.writeUInt32BE(ssrc, 4);
|
|
87
|
+
counter.writeUInt32BE(rolloverCounter, 8);
|
|
88
|
+
counter.writeUInt32BE(big_integer_1.default(sequenceNumber).shiftLeft(16).toJSNumber(), 12);
|
|
89
|
+
lodash_1.range(sessionSalt.length).forEach((i) => {
|
|
90
|
+
counter[i] = counter[i] ^ sessionSalt[i];
|
|
91
|
+
});
|
|
92
|
+
return counter;
|
|
93
|
+
}
|
|
94
|
+
generateSrtpAuthTag(buf, roc) {
|
|
95
|
+
const srtpSessionAuth = crypto_1.createHmac("sha1", this.srtpSessionAuthTag);
|
|
96
|
+
const rocRaw = Buffer.alloc(4);
|
|
97
|
+
rocRaw.writeUInt32BE(roc);
|
|
98
|
+
return srtpSessionAuth.update(buf).update(rocRaw).digest().slice(0, 10);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.CipherAesCtr = CipherAesCtr;
|
|
102
|
+
const srtcpIndexSize = 4;
|
|
103
|
+
//# sourceMappingURL=ctr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctr.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/ctr.ts"],"names":[],"mappings":"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","sourcesContent":["import bigInt from \"big-integer\";\nimport { createCipheriv, createDecipheriv, createHmac } from \"crypto\";\nimport { range } from \"lodash\";\n\nimport { growBufferSize } from \"../../helper\";\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { CipherAesBase } from \".\";\n\nexport class CipherAesCtr extends CipherAesBase {\n readonly authTagLength = 10;\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n private srtpSessionAuthTag: Buffer,\n private srtcpSessionAuthTag: Buffer\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const dst = Buffer.alloc(\n header.serializeSize + payload.length + this.authTagLength\n );\n header.serialize(dst.length).copy(dst);\n\n const { payloadOffset } = header;\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtpSessionKey, counter);\n const enc = cipher.update(payload);\n enc.copy(dst, payloadOffset);\n const totalLength = payloadOffset + payload.length;\n\n const authTag = this.generateSrtpAuthTag(\n dst.slice(0, totalLength),\n rolloverCounter\n );\n authTag.copy(dst, totalLength);\n return dst;\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, cipherText.length - this.authTagLength);\n\n cipherText = cipherText.slice(0, cipherText.length - this.authTagLength);\n\n cipherText.slice(0, header.payloadOffset).copy(dst);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtpSessionKey,\n counter\n );\n const payload = cipherText.slice(header.payloadOffset);\n const buf = cipher.update(payload);\n buf.copy(dst, header.payloadOffset);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n let out = Buffer.from(rtcpPacket);\n const ssrc = out.readUInt32BE(4);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtcpSessionKey, counter);\n // Encrypt everything after header\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n out = Buffer.concat([out, Buffer.alloc(4)]);\n out.writeUInt32BE(srtcpIndex, out.length - 4);\n out[out.length - 4] |= 0x80;\n const authTag = this.generateSrtcpAuthTag(out);\n out = Buffer.concat([out, authTag]);\n\n return out;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n\n const tailOffset = encrypted.length - (this.authTagLength + srtcpIndexSize);\n const out = Buffer.from(encrypted).slice(0, tailOffset);\n\n const isEncrypted = encrypted[tailOffset] >> 7;\n if (isEncrypted === 0) return [out, header];\n\n let srtcpIndex = encrypted.readUInt32BE(tailOffset);\n srtcpIndex &= ~(1 << 31);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n // todo impl compare\n const actualTag = encrypted.slice(encrypted.length - 10);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtcpSessionKey,\n counter\n );\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n return [out, header];\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n const srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n generateCounter(\n sequenceNumber: number,\n rolloverCounter: number,\n ssrc: number,\n sessionSalt: Buffer\n ) {\n const counter = Buffer.alloc(16);\n counter.writeUInt32BE(ssrc, 4);\n counter.writeUInt32BE(rolloverCounter, 8);\n counter.writeUInt32BE(\n bigInt(sequenceNumber).shiftLeft(16).toJSNumber(),\n 12\n );\n\n range(sessionSalt.length).forEach((i) => {\n counter[i] = counter[i] ^ sessionSalt[i];\n });\n return counter;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n const srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return srtpSessionAuth.update(buf).update(rocRaw).digest().slice(0, 10);\n }\n}\n\nconst srtcpIndexSize = 4;\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { RtcpHeader } from "../../rtcp/header";
|
|
3
|
+
import { RtpHeader } from "../../rtp/rtp";
|
|
4
|
+
import { CipherAesBase } from ".";
|
|
5
|
+
export declare class CipherAesGcm extends CipherAesBase {
|
|
6
|
+
readonly aeadAuthTagLen = 16;
|
|
7
|
+
constructor(srtpSessionKey: Buffer, srtpSessionSalt: Buffer, srtcpSessionKey: Buffer, srtcpSessionSalt: Buffer);
|
|
8
|
+
encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number): Buffer;
|
|
9
|
+
decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader];
|
|
10
|
+
encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer;
|
|
11
|
+
decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
|
|
12
|
+
private rtpInitializationVector;
|
|
13
|
+
private rtcpInitializationVector;
|
|
14
|
+
private rtcpAdditionalAuthenticatedData;
|
|
15
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CipherAesGcm = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
|
+
const src_1 = require("../../../../common/src");
|
|
7
|
+
const helper_1 = require("../../helper");
|
|
8
|
+
const header_1 = require("../../rtcp/header");
|
|
9
|
+
const rtp_1 = require("../../rtp/rtp");
|
|
10
|
+
const _1 = require(".");
|
|
11
|
+
class CipherAesGcm extends _1.CipherAesBase {
|
|
12
|
+
constructor(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt) {
|
|
13
|
+
super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);
|
|
14
|
+
this.aeadAuthTagLen = 16;
|
|
15
|
+
}
|
|
16
|
+
encryptRtp(header, payload, rolloverCounter) {
|
|
17
|
+
const dst = Buffer.alloc(header.serializeSize + payload.length + this.aeadAuthTagLen);
|
|
18
|
+
const hdr = header.serialize(header.serializeSize);
|
|
19
|
+
hdr.copy(dst);
|
|
20
|
+
const { payloadOffset } = header;
|
|
21
|
+
const iv = this.rtpInitializationVector(header, rolloverCounter);
|
|
22
|
+
const cipher = crypto_1.createCipheriv("aes-128-gcm", this.srtpSessionKey, iv);
|
|
23
|
+
cipher.setAAD(hdr);
|
|
24
|
+
const enc = cipher.update(payload);
|
|
25
|
+
cipher.final();
|
|
26
|
+
enc.copy(dst, payloadOffset);
|
|
27
|
+
const authTag = cipher.getAuthTag();
|
|
28
|
+
authTag.copy(dst, payloadOffset + enc.length);
|
|
29
|
+
return dst;
|
|
30
|
+
}
|
|
31
|
+
decryptRtp(cipherText, rolloverCounter) {
|
|
32
|
+
const header = rtp_1.RtpHeader.deSerialize(cipherText);
|
|
33
|
+
let dst = Buffer.from([]);
|
|
34
|
+
dst = helper_1.growBufferSize(dst, cipherText.length - this.aeadAuthTagLen);
|
|
35
|
+
cipherText.slice(0, header.payloadOffset).copy(dst);
|
|
36
|
+
const iv = this.rtpInitializationVector(header, rolloverCounter);
|
|
37
|
+
const enc = cipherText.slice(header.payloadOffset, cipherText.length - this.aeadAuthTagLen);
|
|
38
|
+
const cipher = crypto_1.createDecipheriv("aes-128-gcm", this.srtpSessionKey, iv);
|
|
39
|
+
const dec = cipher.update(enc);
|
|
40
|
+
dec.copy(dst, header.payloadOffset);
|
|
41
|
+
return [dst, header];
|
|
42
|
+
}
|
|
43
|
+
encryptRTCP(rtcpPacket, srtcpIndex) {
|
|
44
|
+
const ssrc = rtcpPacket.readUInt32BE(4);
|
|
45
|
+
const addPos = rtcpPacket.length + this.aeadAuthTagLen;
|
|
46
|
+
let dst = Buffer.from([]);
|
|
47
|
+
dst = helper_1.growBufferSize(dst, addPos + srtcpIndexSize);
|
|
48
|
+
rtcpPacket.slice(0, 8).copy(dst);
|
|
49
|
+
const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);
|
|
50
|
+
const aad = this.rtcpAdditionalAuthenticatedData(rtcpPacket, srtcpIndex);
|
|
51
|
+
const cipher = crypto_1.createCipheriv("aes-128-gcm", this.srtcpSessionKey, iv);
|
|
52
|
+
cipher.setAAD(aad);
|
|
53
|
+
const enc = cipher.update(rtcpPacket.slice(8));
|
|
54
|
+
cipher.final();
|
|
55
|
+
enc.copy(dst, 8);
|
|
56
|
+
const authTag = cipher.getAuthTag();
|
|
57
|
+
authTag.copy(dst, 8 + enc.length);
|
|
58
|
+
aad.slice(8, 12).copy(dst, addPos);
|
|
59
|
+
return dst;
|
|
60
|
+
}
|
|
61
|
+
decryptRTCP(encrypted) {
|
|
62
|
+
const header = header_1.RtcpHeader.deSerialize(encrypted);
|
|
63
|
+
const aadPos = encrypted.length - srtcpIndexSize;
|
|
64
|
+
const dst = Buffer.alloc(aadPos - this.aeadAuthTagLen);
|
|
65
|
+
encrypted.slice(0, 8).copy(dst);
|
|
66
|
+
const ssrc = encrypted.readUInt32BE(4);
|
|
67
|
+
let srtcpIndex = encrypted.readUInt32BE(encrypted.length - 4);
|
|
68
|
+
srtcpIndex &= ~(rtcpEncryptionFlag << 24);
|
|
69
|
+
const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);
|
|
70
|
+
const aad = this.rtcpAdditionalAuthenticatedData(encrypted, srtcpIndex);
|
|
71
|
+
const cipher = crypto_1.createDecipheriv("aes-128-gcm", this.srtcpSessionKey, iv);
|
|
72
|
+
cipher.setAAD(aad);
|
|
73
|
+
const dec = cipher.update(encrypted.slice(8, aadPos));
|
|
74
|
+
dec.copy(dst, 8);
|
|
75
|
+
return [dst, header];
|
|
76
|
+
}
|
|
77
|
+
// https://tools.ietf.org/html/rfc7714#section-8.1
|
|
78
|
+
rtpInitializationVector(header, rolloverCounter) {
|
|
79
|
+
const iv = src_1.bufferWriter([2, 4, 4, 2], [0, header.ssrc, rolloverCounter, header.sequenceNumber]);
|
|
80
|
+
lodash_1.range(0, iv.length).forEach((i) => {
|
|
81
|
+
iv[i] = iv[i] ^ this.srtpSessionSalt[i];
|
|
82
|
+
});
|
|
83
|
+
return iv;
|
|
84
|
+
}
|
|
85
|
+
// https://tools.ietf.org/html/rfc7714#section-9.1
|
|
86
|
+
rtcpInitializationVector(ssrc, srtcpIndex) {
|
|
87
|
+
const iv = src_1.bufferWriter([2, 4, 2, 4], [0, ssrc, 0, srtcpIndex]);
|
|
88
|
+
lodash_1.range(0, iv.length).forEach((i) => {
|
|
89
|
+
iv[i] = iv[i] ^ this.srtcpSessionSalt[i];
|
|
90
|
+
});
|
|
91
|
+
return iv;
|
|
92
|
+
}
|
|
93
|
+
// https://datatracker.ietf.org/doc/html/rfc7714#section-17
|
|
94
|
+
rtcpAdditionalAuthenticatedData(rtcpPacket, srtcpIndex) {
|
|
95
|
+
const aad = Buffer.concat([
|
|
96
|
+
rtcpPacket.slice(0, 8),
|
|
97
|
+
src_1.bufferWriter([4], [srtcpIndex]),
|
|
98
|
+
]);
|
|
99
|
+
aad[8] |= rtcpEncryptionFlag;
|
|
100
|
+
return aad;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.CipherAesGcm = CipherAesGcm;
|
|
104
|
+
const srtcpIndexSize = 4;
|
|
105
|
+
const rtcpEncryptionFlag = 0x80;
|
|
106
|
+
//# sourceMappingURL=gcm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcm.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/gcm.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv } from \"crypto\";\nimport { range } from \"lodash\";\n\nimport { bufferWriter } from \"../../../../common/src\";\nimport { growBufferSize } from \"../../helper\";\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { CipherAesBase } from \".\";\n\nexport class CipherAesGcm extends CipherAesBase {\n readonly aeadAuthTagLen = 16;\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const dst = Buffer.alloc(\n header.serializeSize + payload.length + this.aeadAuthTagLen\n );\n const hdr = header.serialize(header.serializeSize);\n hdr.copy(dst);\n\n const { payloadOffset } = header;\n\n const iv = this.rtpInitializationVector(header, rolloverCounter);\n\n const cipher = createCipheriv(\"aes-128-gcm\", this.srtpSessionKey, iv);\n cipher.setAAD(hdr);\n const enc = cipher.update(payload);\n cipher.final();\n enc.copy(dst, payloadOffset);\n\n const authTag = cipher.getAuthTag();\n authTag.copy(dst, payloadOffset + enc.length);\n\n return dst;\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, cipherText.length - this.aeadAuthTagLen);\n cipherText.slice(0, header.payloadOffset).copy(dst);\n\n const iv = this.rtpInitializationVector(header, rolloverCounter);\n\n const enc = cipherText.slice(\n header.payloadOffset,\n cipherText.length - this.aeadAuthTagLen\n );\n\n const cipher = createDecipheriv(\"aes-128-gcm\", this.srtpSessionKey, iv);\n const dec = cipher.update(enc);\n\n dec.copy(dst, header.payloadOffset);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n const ssrc = rtcpPacket.readUInt32BE(4);\n\n const addPos = rtcpPacket.length + this.aeadAuthTagLen;\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, addPos + srtcpIndexSize);\n rtcpPacket.slice(0, 8).copy(dst);\n\n const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);\n const aad = this.rtcpAdditionalAuthenticatedData(rtcpPacket, srtcpIndex);\n\n const cipher = createCipheriv(\"aes-128-gcm\", this.srtcpSessionKey, iv);\n cipher.setAAD(aad);\n const enc = cipher.update(rtcpPacket.slice(8));\n cipher.final();\n enc.copy(dst, 8);\n\n const authTag = cipher.getAuthTag();\n authTag.copy(dst, 8 + enc.length);\n aad.slice(8, 12).copy(dst, addPos);\n\n return dst;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n const aadPos = encrypted.length - srtcpIndexSize;\n\n const dst = Buffer.alloc(aadPos - this.aeadAuthTagLen);\n encrypted.slice(0, 8).copy(dst);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n let srtcpIndex = encrypted.readUInt32BE(encrypted.length - 4);\n srtcpIndex &= ~(rtcpEncryptionFlag << 24);\n\n const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);\n const aad = this.rtcpAdditionalAuthenticatedData(encrypted, srtcpIndex);\n\n const cipher = createDecipheriv(\"aes-128-gcm\", this.srtcpSessionKey, iv);\n cipher.setAAD(aad);\n const dec = cipher.update(encrypted.slice(8, aadPos));\n\n dec.copy(dst, 8);\n\n return [dst, header];\n }\n\n // https://tools.ietf.org/html/rfc7714#section-8.1\n private rtpInitializationVector(header: RtpHeader, rolloverCounter: number) {\n const iv = bufferWriter(\n [2, 4, 4, 2],\n [0, header.ssrc, rolloverCounter, header.sequenceNumber]\n );\n range(0, iv.length).forEach((i) => {\n iv[i] = iv[i] ^ this.srtpSessionSalt[i];\n });\n return iv;\n }\n\n // https://tools.ietf.org/html/rfc7714#section-9.1\n private rtcpInitializationVector(ssrc: number, srtcpIndex: number) {\n const iv = bufferWriter([2, 4, 2, 4], [0, ssrc, 0, srtcpIndex]);\n range(0, iv.length).forEach((i) => {\n iv[i] = iv[i] ^ this.srtcpSessionSalt[i];\n });\n return iv;\n }\n\n // https://datatracker.ietf.org/doc/html/rfc7714#section-17\n private rtcpAdditionalAuthenticatedData(\n rtcpPacket: Buffer,\n srtcpIndex: number\n ) {\n const aad = Buffer.concat([\n rtcpPacket.slice(0, 8),\n bufferWriter([4], [srtcpIndex]),\n ]);\n aad[8] |= rtcpEncryptionFlag;\n return aad;\n }\n}\n\nconst srtcpIndexSize = 4;\nconst rtcpEncryptionFlag = 0x80;\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { RtcpHeader } from "../../rtcp/header";
|
|
3
|
+
import { RtpHeader } from "../../rtp/rtp";
|
|
4
|
+
export declare abstract class CipherAesBase {
|
|
5
|
+
srtpSessionKey: Buffer;
|
|
6
|
+
srtpSessionSalt: Buffer;
|
|
7
|
+
srtcpSessionKey: Buffer;
|
|
8
|
+
srtcpSessionSalt: Buffer;
|
|
9
|
+
constructor(srtpSessionKey: Buffer, srtpSessionSalt: Buffer, srtcpSessionKey: Buffer, srtcpSessionSalt: Buffer);
|
|
10
|
+
encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number): Buffer;
|
|
11
|
+
decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader];
|
|
12
|
+
encryptRTCP(rawRtcp: Buffer, srtcpIndex: number): Buffer;
|
|
13
|
+
decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
|
|
14
|
+
}
|